Changes On Branch 4afa81de466ae2b2
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch core-8-3-1-branch Through [4afa81de46] Excluding Merge-Ins

This is equivalent to a diff from 3429c5f93a to 4afa81de46

2001-08-08
03:28
BRANCH: core-8-3-1-branch Removed library/opt0.4/* . The files of the opt package moved to librar... check-in: 0989f0fe4f user: dgp tags: core-8-3-1-branch
03:25
BRANCH: core-8-3-1-branch Removed library/msgcat1.0/*. The msgcat package files moved to library... check-in: 4afa81de46 user: dgp tags: core-8-3-1-branch
03:23
BRANCH: core-8-3-1-branch Removed library/http2.3/* . The http package moved to library/http in ... check-in: e2ad95fa9c user: dgp tags: core-8-3-1-branch
2000-05-31
01:28
2000-05-29 Sandeep Tamhankar <sandeep@scriptics.com> * tests/http.test * doc/http.n * library/h... check-in: 43202241e2 user: sandeep tags: core-8-3-1-branch
2000-05-02
22:02
2000-05-02 Andreas Kupries <a.kupries@westend.com> * Overall changes: (1) Implementation of jo... check-in: cdf262856d user: kupries tags: trunk
2000-04-28
00:47
* doc/library.n: Added entries for auto_qualify and auto_import [Bug: 1271]. * doc/Init.3: Manual e... check-in: 3429c5f93a user: ericm tags: trunk
2000-04-27
01:46
* doc/memory.n: Man page for Tcl "memory" command, which is created when TCL_MEM_DEBUG is defined at... check-in: 9aabc80546 user: ericm tags: trunk

Changes to ChangeLog.

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
26
27
28
29

















30
31
32
33



































































































































































































































































































34
35
36
37
38
39
40

2000-04-27  Eric Melski  <ericm@scriptics.com>









































































































































































































	* doc/library.n: Added entries for auto_qualify and auto_import


	[Bug: 1271].













































































































































































































	* doc/Init.3: Manual entry for Tcl_Init [Bug: 1820].














































































































































































	* doc/expr.n: Added documentation for each of the math library



	functions that expr supports [Bug: 1054].




2000-04-26  Eric Melski  <ericm@scriptics.com>











































































































































































	* doc/memory.n: Man page for Tcl "memory" command, which is
	created when TCL_MEM_DEBUG is defined at compile time.

	* doc/TCL_MEM_DEBUG.3: Man page with overall information about
	TCL_MEM_DEBUG usage.

	* doc/DumpActiveMemory.3: Man page for Tcl_DumpActiveMemory,
	Tcl_InitMemory, and Tcl_ValidateAllMemory [Bug: 1816, 1835].


	* generic/tclCkalloc.c: Fixed some function headers.


	* unix/mkLinks: Regen'd with new mkLinks.tcl.

	* unix/mkLinks.tcl: Fixed indentation, made link setup more
	intelligent (only do one existance test per man page, instead of
	one per function).


















	* doc/library.n: Fixed .SH NAME macro to include each function
	documented on the page, so that mkLinks will know about the
	functions listed there, and so that the Windows help file index
	will get set up correctly [Bug: 1898, 5273].




































































































































































































































































































2000-04-26  Jeff Hobbs  <hobbs@scriptics.com>

	8.3.1 RELEASE

	* README:
	* mac/README:
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
|
>
>
>
|
>

>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>










>
|
>


<




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782

783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
2001-08-07  Miguel Sofer <msofer@users.sourceforge.net>

	* generic/tclExecute.c: Avoid panic when there are extra items in
	  the tcl stack [Bugs #406709 and 439843, Patch #414470]
	* tests/foreach.test: test to exercise the patch

2001-08-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclCmdMZ.c (Tcl_RegexpObjCmd, Tcl_RegsubObjCmd):
	reordered the retrieval of arguments to avoid shimmering bug when
	the pattern and string referenced the same object.

	* unix/configure: regenerated
	* unix/tcl.m4: added GNU (HURD) configuration target. (brinkmann)
	[Patch: #442974]

2001-08-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/configure: regenerated
	* win/tcl.m4: fixed DLLSUFFIX definition to always be ${DBGX}.dll.
	This is necessary for TEA compliant builds that build shared
	against a static-built Tcl.
	* win/Makefile.in ($(TCLSH)): added $(TCL_STUB_LIB_FILE) to build
	target, otherwise it wouldn't get generated in a static build.

2001-08-06  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIOCmd.c (Tcl_GetsObjCmd): Applied patch from SF item
	  [442665] to fix the bug reported by it. The function can corrupt
	  a freed object if it is called with objc == 3. This is because
	  it retrieves resultPtr and does not increment its reference
	  count, but then calls Tcl_ObjSetVar2, which causes the retrieved
	  resultPtr object to be released.

2001-07-18  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* doc/bgerror.n: Fixed Tk! Bug #415757.

2001-07-18  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIO.c: Aftermath to [SF #427196]. Squash empty buffers
	  if they are smaller than the requested buffersize, to prevent
	  reusage of old buffers and to honor changes in the requested
	  buffersize made by the user.

2001-07-17  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* generic/tclIO.c (GetInput): Fixed [SF #427196]. Memory was
	  overwritten because a buffer was used after a change of the
	  requested buffersize together with that requested buffersize and
	  not its actual size, which was smaller. Note that the continous
	  reuse of the smaller buffer negatively impacts performance. The
	  system never allocates a buffer with the newly requested bigger
	  buffersize.

2001-07-16  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/tclWinPipe.c (PipeClose2Proc): constrained the mutex lock to
	just the TerminateThread call and waiting for termination. (jsmith)

2001-07-02  Jeff Hobbs  <jeffh@ActiveState.com>

	* tests/util.test: added util-4.6
	* generic/tclUtil.c (Tcl_ConcatObj): Corrected walking backwards
	over utf-8 chars. [Bug #227512]

2001-06-27  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclUtf.c (Tcl_UtfBackslash): Corrected backslash
	handling of multibyte utf-8 chars. [Bug #217987]

	* generic/tclCmdIL.c (InfoProcsCmd): fixed potential mem leak in
	info procs that created objects without using them.

	* generic/tclCompCmds.c (TclCompileStringCmd): fixed mem leak when
	string command failed to parse the subcommand.

2001-05-22  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclObj.c (TclAllocateFreeObjects): simplified
	objSizePlusPadding to use sizeof(Tcl_Obj) (max)

2001-05-04  Daniel Steffen <das@users.sourceforge.net>

        ** Mac 8.3.3 binary release 

	**  detailed change log for changes to mac code for 8.3.3 
	**  (expands on log entries below marked 2001-04-04  Jeff Hobbs)

	* generic/tcl.h: MAC_TCL: addition of ConditionalMacros.h and use of
	DLLIMPORT and DLLEXPORT like on other platforms.  ( => no longer need
	the .exp files and can remove use of #pragma export that never worked
	well)

	* mac/tclMacShLib.exp:
	* mac/tclMacOSA.exp:
	* mac/tclMacMSLPrefix.h: removed files

	* mac/MW_TclBuildLibHeader.h:
	* mac/MW_TclBuildLibHeader.pch:
	* mac/MW_TclHeaderCommon.h:
	* mac/MW_TclStaticHeader.h:
	* mac/MW_TclStaticHeader.pch: new precompiled header files

	* mac/MW_TclAppleScriptHeader.pch:
	* mac/MW_TclHeader.pch:
	* mac/MW_TclTestHeader.pch:
	* mac/tclMacCommonPch.h: revised precompiled header handling: now
	include a common header file 'MW_TclHeaderCommon.h' from all .pch
	files, the .pch files themselves now only setup #defines (e.g.
	BUILD_tcl, STATIC_BUILD, TCL_DEBUG, TCL_THREADS) like in makefiles on
	other platforms.

	* mac/tclMac.h:
	* mac/tclMacPort.h:
	* mac/tclMacInt.h: use of BUILD_tcl and TCL_STORAGE_CLASS like on other
	platforms, standardize #include'd files to what's done on other
	platforms, removed use of #pragma export.

	* mac/tcltkMacBuildSupport.sea.hqx: new archive of mac build support
	files & suggested build environment directory hierarchy: 
	- 'Building MacTclTk' & 'CW Pro6 changes' readme's.
	- projects for MoreFiles 1.5.1 static & shared libraries.
	- project & sources for 'pseudoCarbonSupport', see below.

	* mac/tclMacProjects.sea.hqx: updated mac build project files:
	- build support for CodeWarrior Pro6, UnivIntf 3.4 & shared runtime
	libraries: the MSL libraries and MoreFiles are no longer compiled into
	Tcl.shlb, all non-static binaries now use the Pro6 shared runtime
	libraries and MoreFiles.shlb.  These shlbs are merged into the standard
	Wish and TclShell, but 3rd party applications linking with Tcl.shlb or
	Tk.shlb need to setup access to them.  (see the "(sh-ppc)" targets
	for how to do this.)
	- Merging the full MSL.shlb and the other shlbs into Wish & TclShell
	makes them a bit larger than before, use unmerged binaries to avoid
	copying the shared code with every application, e.g. when deploying
	numerous Wish based droplets.
	- Note that using CW Pro5 to compile extensions is in principle still
	possible, but need to link with Pro6 runtime libraries.
	- Tclapplescript now loads and runs on CFM68k.
	- Highly experimental "pseudoCarbon" support for Tcl only on OS 8/9:
	binaries in "Build:(Carbon):" link against CarbonLib instead of
	InterfaceLib, however the actual code has not been carbonized! i.e. it
	will not run on OSX and may not even run properly with CarbonLib. 
	This should in principle allow you to build & test OS9 CFM Carbon
	binaries that need to link with Tcl.shlb.  On OSX you can use the
	native Tcl.framework, but you have to build a MachO binary as there
	is no CFM glue lib for Tcl.framework.
	the library pseudoCarbonSupport.shlb manually loads the symbols
	from InterfaceLib that are not in CarbonLib but are needed by the
	uncarbonized code in Tcl.shlb and TclShell.

	* generic/tclMain.c: MAC_TCL: workaround for broken/non-standard isatty
	on MW Pro6, #include <unistd.h> instead of defining isatty

	* mac/tclMacPort.h: MW Pro6 changes for MSL fcntl.h, stat.h & isatty

	* mac/tclMacAppInit.c: add EXTERN to InstallConsole to enable DLL
	export via the TCL_STORAGE_CLASS mechanism.

	* mac/tclMacFCmd.c: fix for FSpDirectoryCopy API change

	* mac/tclMacLibrary.c: emit compile time error when
	TCL_REGISTER_LIBRARY and USE_TCL_STUBS are both defined at the same
	time in an extension, this use is not currently supported and will
	result in a crash when dynamically loading the extension.

	* mac/tclMacApplication.r:
	* mac/tclMacLibrary.r:
	* mac/tclMacOSA.r:
	* mac/tclMacResource.r: fixed obsolete copyrights/dates in version
	strings; updated version strings to standard usage; added support for
	'(Support Libraries)' subfolder for shared runtime libraries in
	unmerged binaries; commented out demo setting of "Tcl Environment
	Variables"

	* mac/tclMacChan.c:
	* mac/tclMacSock.c: cast for *BlockMode

	* mac/tclMacUtil.c:
	* mac/tclMacMath.h: removed obsolete hypot() definition

	* generic/tclIntPlatDecls.h:
	* generic/tclInt.decls:
	* generic/tclStubInit.c:
	* mac/tclMacNotify.c:
	* mac/tclMacOSA.c:
	* mac/tclMacUtil.c:
	* generic/tclThreadTest.c: renamed routines conflicting with standard
	Apple or MoreFiles headers (at compile or link time):
	    GetGlobalMouse         -> GetGlobalMouseTcl
    	FSpGetDirectoryID      -> FSpGetDirectoryIDTcl
    	FSpOpenResFileCompat   -> FSpOpenResFileCompatTcl
    	FSpCreateResFileCompat -> FSpCreateResFileCompatTcl
		NewThread              -> NewTestThread
	the renamed MoreFiles *Tcl routines are just wrappers calling into the
	MoreFiles DLL.

	* mac/tclMacCommonPch.h:
	* mac/tclMacThrd.c:
	* mac/tclMacPanic.c: removed OLDROUTINENAMES define, renamed obsolete
	apple API names to modern equivalents; UH3.4 support: added #include
	<ControlDefinitions.h>, updated New*Proc() calls to New*UPP().

	* mac/tclMacUnix.c: added missing (Tcl_Obj ***) cast to
	Tcl_ListObjGetElements call

	* mac/tclMacAlloc.c: modernized TclpSysAlloc() to use temporary
	memory instead of system heap memory when available (MacOS
	>= 7.5 and possibly earlier, use of system heap has been
	discouraged for a long time and has many disadvantages, e.g. memory
	isn't paged out, and errors can very easily bring the system down);
	fixed crashing bug in TclpSysRealloc() and CleanUpExitProc() where
	memory was being accessed after having been deallocated; fixed
	memory leak in (de)allocation code (for every block ever allocated
	with TclpSysAlloc, a Ptr was leaked), if temporary memory is
	available, don't track allocated memory, instead use
	RecoverHandle() to get Handle from Ptr, otherwise use doubly linked
	list to correctly track memory and free all allocated memory; added
	new option for ConfigureMemory: MEMORY_DONT_USE_TEMPMEM, disables
	use of temporary memory even when it would be available, only
	necessary when writing e.g. a driver (using tcl??); increased
	fraction of application heap reserved for OS routines to 512K

2001-04-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* unix/install-sh: added -S option
	* unix/tcl.m4: added Rhapsody/Darwin target
	* unix/tclLoadDyld.c (TclpLoadFile): 
	* unix/tclMtherr.c (matherr): added support for Mac OS X

2001-04-05  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclObj.c (TclAllocateFreeObjects): simplified
	objSizePlusPadding to use sizeof(Tcl_Obj) (max)

	* win/README:
	* win/README.binary: removed note about use of registry (hasn't
	been used for loading since 8.0).

	* win/configure:
	* win/tcl.m4: added -link50compat

	* mac/tclMacProjects.sea.hqx: fixed accidental swap with Tk
	project files.

2001-04-04  Jeff Hobbs  <jeffh@ActiveState.com>

	** Start changes for improved mac build (steffen)  **

	* mac/tclMacShLib.exp:
	* mac/tclMacMSLPrefix.h: removed files

	* generic/tcl.h: addition of ConditionalMacros.h and use of
	DLLIMPORT and DLLEXPORT.

	* generic/tclIntPlatDecls.h:
	* generic/tclInt.decls:
	* generic/tclMain.c:
	* generic/tclStubInit.c:
	* generic/tclThreadTest.c: NewThread -> NewTestThread
	* mac/MW_TclAppleScriptHeader.pch:
	* mac/MW_TclHeader.pch:
	* mac/MW_TclTestHeader.pch:
	* mac/tclMac.h:
	* mac/tclMacAppInit.c:
	* mac/tclMacApplication.r:
	* mac/tclMacChan.c: cast for *BlockMode
	* mac/tclMacCommonPch.h:
	* mac/tclMacFCmd.c:
	* mac/tclMacInt.h:
	* mac/tclMacLibrary.c:
	* mac/tclMacLibrary.r:
	* mac/tclMacMath.h:
	* mac/tclMacNotify.c:
	* mac/tclMacOSA.c:
	* mac/tclMacOSA.r:
	* mac/tclMacPanic.c:
	* mac/tclMacPort.h:
	* mac/tclMacResource.r:
	* mac/tclMacSock.c: cast for *BlockMode
	* mac/tclMacThrd.c:
	* mac/tclMacUnix.c:
	* mac/tclMacUtil.c: changed mac declarations to use Tcl ending,
	fixed copyrights, updated headers, fixed comments, updated
	resource files.  Mac builds are now meant to be build with
	MetroWerks CW 6.

	* mac/MW_TclBuildLibHeader.h:
	* mac/MW_TclBuildLibHeader.pch:
	* mac/MW_TclHeaderCommon.h:
	* mac/MW_TclStaticHeader.h:
	* mac/MW_TclStaticHeader.pch:
	* mac/tcltkMacBuildSupport.sea.hqx: new files

	* mac/tclMacProjects.sea.hqx: new mac build project files.

	** End changes for improved mac build (steffen) **

	* unix/configure:
	* unix/tcl.m4: extended test of termios vs. termio vs. sgtty to
	better detect result on Linux and when certain configure
	redirections are being used. (max) [Patch #402923; Bug #227412,
	#219194]

2001-04-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclListObj.c (Tcl_SetListObj): set objPtr->length = 0 in
	empty object case to maintain sanctity of Tcl_Obj bytes/length
	pairing. (porter) [Patch #405998]

	* README:
	* mac/README:
	* win/README:
	* win/README.binary:
	* unix/README: updated patchlevel information to 8.3.3 and
	updated links and notes.

	* generic/tcl.h:
	* tools/tcl.wse.in:
	* win/configure.in (TCL_PATCH_LEVEL):
	* win/configure:
	* unix/configure:
	* unix/configure.in (TCL_PATCH_LEVEL):
	* unix/tcl.spec: updated patchlevel information to 8.3.3

	***************************************************************
	** START OF ASYNC BACKPORT LOG (8.4aCVS 2001-04-03 -> 8.3.3) **
	***************************************************************

	* doc/CrtChannel.3:
	* doc/CrtSlave.3:
	* doc/DetachPids.3:
	* doc/Eval.3:
	* doc/ObjectType.3:
	* doc/StrMatch.3:
	* doc/after.n:
	* doc/append.n:
	* doc/bgerror.n:
	* doc/binary.n:
	* doc/break.n:
	* doc/case.n:
	* doc/cd.n:
	* doc/close.n:
	* doc/concat.n:
	* doc/continue.n:
	* doc/dde.n:
	* doc/encoding.n:
	* doc/eof.n:
	* doc/error.n:
	* doc/eval.n:
	* doc/exec.n:
	* doc/exit.n:
	* doc/fblocked.n:
	* doc/fileevent.n:
	* doc/filename.n:
	* doc/flush.n:
	* doc/for.n:
	* doc/foreach.n:
	* doc/format.n:
	* doc/gets.n:
	* doc/glob.n:
	* doc/global.n:
	* doc/http.n:
	* doc/if.n:
	* doc/incr.n:
	* doc/join.n:
	* doc/lappend.n:
	* doc/library.n:
	* doc/lindex.n:
	* doc/linsert.n:
	* doc/list.n:
	* doc/llength.n:
	* doc/load.n:
	* doc/lrange.n:
	* doc/lreplace.n:
	* doc/lsort.n:
	* doc/man.macros:
	* doc/memory.n:
	* doc/open.n:
	* doc/package.n:
	* doc/packagens.n:
	* doc/pid.n:
	* doc/pkgMkIndex.n:
	* doc/proc.n:
	* doc/puts.n:
	* doc/pwd.n:
	* doc/read.n:
	* doc/regexp.n:
	* doc/regsub.n:
	* doc/rename.n:
	* doc/resource.n:
	* doc/return.n:
	* doc/scan.n:
	* doc/seek.n:
	* doc/set.n:
	* doc/split.n:
	* doc/string.n:
	* doc/subst.n:
	* doc/switch.n:
	* doc/tclvars.n:
	* doc/tell.n:
	* doc/time.n:
	* doc/unknown.n:
	* doc/update.n:
	* doc/uplevel.n:
	* doc/upvar.n:
	* doc/variable.n:
	* doc/vwait.n:
	* doc/while.n: doc clarifications and cleanup from 8.4aCVS docs

2001-04-02  Jeff Hobbs  <jeffh@ActiveState.com>

	* win/configure:
	* win/tcl.m4 (SHLIB_LD):  added -incremental:no. [Bug #219381]

2001-03-30  Jeff Hobbs  <jeffh@ActiveState.com>

	* generic/tclCkalloc.c (TclFinalizeMemorySubsystem): set curTagPtr
	to NULL to allow for reuse.
	* generic/tclEvent.c (Tcl_Finalize): moved the tsdPtr
	initialization inside the subsystemsInitialized check to prevent
	it potentially getting called twice during finalization.  (wu)
	[Patch #403532, Bug #219391]

	* win/tclWinSock.c (SocketEventProc): Fixed race condition in
	readability of socket on Windows.
	[Patch #410674, Bug #219205 #219333]

	* win/tcl.m4: added imm32.lib to LIBS_GUI for Tk IME support.

	* win/Makefile.in (install-doc): improved install-* targets to use
	their base build dependency.

2001-03-29  Mo DeJong  <mdejong@redhat.com>

	* tests/interp.test: Print out warning when
	testinterpdelete command is not defined.
	Add tests that checks to make sure a
	child interp inherits the parent's cwd.

2001-03-29  Jeff Hobbs  <jeffh@activestate.com>

	* unix/tclUnixPipe.c (TclpCreateTempFile): prevent potential race
	condition and security leak in tmp filename creation.
 	(max) [Patch #402924]

	* unix/configure:
	* unix/tcl.m4: corrected IRIX-5.x config to not use -n32.
 	(english) [Patch #403626]

	* unix/tclUnixThrd.c (Tcl_ConditionWait): fixed handling of
	timeout for threads (corrects excessive CPU usage issue for Tk on
	Unix in threaded Tcl environment). (ruppert) [Bug #411603]

2001-03-26  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* win/tclWinInt.h (tclWinTCharEncoding): Removed as now a static
	variable in win/tclWin32Dll.c instead.

2001-03-23  Jeff Hobbs  <jeffh@activestate.com>

	* generic/tclVar.c (Tcl_ArrayObjCmd): Corrected retrieval of
	resultPtr to prevent possible corruption.

	* generic/tclNamesp.c (Tcl_Import): Correctly freed a DString.
 	(lavana) [Patch #403755]

2001-03-14  Don Porter  <dgp@users.sourceforge.net>
	* library/package.tcl (pkg_mkIndex):  Added patch from Vince
	Darley to make [pkg_mkIndex -verbose] even more verbose.
	[Bug 219349, Patch 403529]

2001-03-13  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdMZ.c (Tcl_StringObjCmd): A missing
	{return TCL_OK;} was causing memory corruption.  [Bug #408002]

	* generic/tclExecute.c (TclDeleteExecEnv, GrowEvaluationStack,
	TclExecuteByteCode): Added some casts to ClientData that are
	apparently needed on some architectures.

2001-03-02  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclExecute.c (TclExecuteByteCode): Fixed bug that could
	pass pointers to freed memory to command implementations, which
	most obviously caused some weird behaviour with [info level], but
	could have caused problems with user code and command traces too.
	[Bug 404865, Patch 405436]

2001-02-15  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdMZ.c (Tcl_SplitObjCmd): Improved efficiency of
	splitting strings into individual characters by adding hash so
	that only one Tcl_Obj per character is created.  Improves
	performance of splitting of short strings and makes a huge
	difference to splitting of long strings, such as is done in the
	mime package in tcllib.  [Bug #131523]

2001-01-30  Don Porter  <dgp@users.sourceforge.net>
	* generic/tclIO.c (CopyData): Moved code that updates the count
	of how many bytes are left to copy.  Corrects bug that when
	writing occurs in the background, the copy loop could be
	escaped without updating the count, causing CopyData() to try
	to copy more bytes than the toRead value originally passed to
	TclCopyChannel(), leading to hangs and misreporting of number
	of bytes copied. [Bug 118203, Patch 103432]

2001-01-04  Don Porter  <dgp@users.sourceforge.net>
	* tests/unixInit.test:
	* unix/tclUnixInit.c (TclpInitLibraryPath):
	* win/tclWinInit.c (TclpInitLibraryPath):  Several entries in
	the library path ($tcl_libPath) are determined relative to the
	absolute path of the executable.  When the executable is
	installed in or near the root directory of the file system,
	relative pathnames were being incorrectly generated, and in
	the worst case, memory access violations were crashing the program.
	[Bug 119416, Patch 102972]

2000-12-14  Don Porter  <dgp@users.sourceforge.net>

	* generic/tclExecute.c:
	* tests/expr-old.test:  Re-wrote Tcl's [expr rand()] and
	[expr srand($seed)] implementations, fixing a range error
	on some 64-bit platforms.  Added tests that detect the bug.
	The rewrite changes the seed -> sequence map on 64-bit
	platforms, only for seed >= 2^31, a slight incompatibility.
	[Bug 121072, Patch 102781]

2000-12-10  Don Porter  <dgp@users.sourceforge.net>

	* library/init.tcl:
	* library/msgcat/msgcat.tcl:
	* library/msgcat/pkgIndex.tcl:
	* library/opt/optparse.tcl:
	* library/opt/pkgIndex.tcl: Where [uplevel] is used in a proc
	to evaluate a Tcl built-in command in the caller's context,
	the built-in commands are now fully namespace-qualified.  This
	prevents problems when the caller context is in a namespace where
	the built-in command name has been used by a command in the
	namespace.  (For example, [::ns::set] might be called instead
	of the intended [::set]).  [Bug #119422, Patch #102545]

2000-12-09  jeff hobbs  <jhobbs@interwoven.com>

	* docs/scan.n:
	* tests/scan.test:
	* generic/tclScan.c (Tcl_ScanObjCmd): changed %o and %x to use
	strtoul instead of strtol to correctly preserve scan<>format
	conversion of large integers.  [Patch #102663, Bug #124600]

	* generic/tclExecute.c (TclExecuteByteCode): Commited patch fixing
	handling of {!<boolean>} in expressions. [Patch #102702]

2000-12-08  jeff hobbs  <jhobbs@interwoven.com>

	* library/init.tcl: Added support for PATHEXT variable in
	auto_execok, recognizing the proper set of executable extensions
	on Windows.  [Patch #102719]

2000-12-08  Andreas Kupries  <a.kupries@westend.com>

	* generic/tclEncoding.c (LoadTableEncoding): Changed dangerous
	  code to something less critical. This fixes bug 119417, part A
	  without affecting the speed when loading encodings.

2000-11-24  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclExecute.c (TclExecuteByteCode): Logical negation "!"
	  can now handle string booleans, provided those values are placed
	  in variables.

	* tests/expr.test (expr-13.17): Check that [expr {!$var}] can
	  negate the string-versions of booleans "yes", "false", etc.

	* library/tcltest/tcltest.tcl (getMatchingFiles,
	  getMatchingDirectories):
	* tools/man2html.tcl (doDir): 
	* tools/man2help.tcl (doDir): 
	* library/package.tcl (tclPkgUnknown,tclMacPkgSearch): 
	* library/safe.tcl (AddSubDirs): [glob] uses -directory instead of
	  unsafe [file join] to fix Bug #123313

	* generic/tclIndexObj.c:
	* generic/tclTestObj.c (TestindexobjCmd): Changed internal
	  representation of index objects to fix Bug #119082; fix
	  shouldn't be visible to outside world...

	* generic/tclTest.c (TestGetIndexFromObjStructObjCmd): 
	* tests/indexObj.test: (indexObj-6.*) Added to test for presence
	  of Bug #119082.

2000-11-23  Donal K. Fellows  <fellowsd@cs.man.ac.uk>

	* generic/tclCmdIL.c (Tcl_LsortObjCmd): Fixed memory leak from Bug
	  #119398

	* library/init.tcl (unknown): Added specific level parameters to
	  all uplevel invokations to boost performance; didn't dare touch
	  the "namespace inscope" stuff though, since it looks sensitive
	  to me!  Should fix Bug #123217, though testing is tricky...

2000-11-16  Andreas Kupries  <a.kupries@westend.com>

	* win/tclWinPort.h (line 69): Changed reference to winsock2.h into
 	  winsock.h. This was a leftover from a foray into using winsock
 	  version 2 (History lesson from Scott Redman and Jeff
 	  Hobbs). This code was no problem when compiling Tcl itself, but
 	  could trip extensions. Fixes bug 122568.

2000-11-02  David Gravereaux  <davygrvy@ajubasolutions.com>

	* generic/tclEvent.c: tclLibraryPath Tcl_Obj didn't have a way
	to share its data among threads.  This caused Tcl_Init() to
	always fail in threads.  Added a way to pass the data around
	with a global char*.  [BUG: 5301]

2000-11-02  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/configure:
	* unix/dltest/configure:
	* win/configure:
	* tools/configure: checked in configure scripts so people doing
	CVS checkouts aren't required to have autoconf.  Changes to
	configure.in in the future will require the corresponding
	configure script to also be re-autoconf'ed and checked in.

	* win/makefile.vc:
	* win/tcl.m4: makefile fixes for Win64 support

	* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): minor cast
	changes.

2000-11-01  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/tcl.m4: removed use of -lbsd and -ldl for AIX-5.

	* tests/subst.test: added tests for non-zero return code handling
	by subst.
	* generic/tclParse.c (Tcl_EvalEx): corrected handling of non-zero,
	non-error return code cases for subst. [BUG: 119829]

	* generic/tclVar.c (TclVarTraceExists): Corrected excessive mem
	use when info exists was called on a non-existent array element.
	[BUG: 119213, 119336]

2000-10-30  David Gravereaux  <davygrvy@ajubasolutions.com>

	* win/configure.in:
	* win/Makefile.in:
	* win/makefile.vc:
	* win/tcl.rc:
	* win/tclsh.rc: Added logic to derive filenames better in the resource
	scripts based on compile options.

2000-10-30  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/tclUnixInit.c: added default encoding map from
	"ja_JP.eucJP" to "euc-jp". (takahashi)

	* tests/clock.test: corrected clock-2.* test numbering

	* unix/configure.in (SC_TCL_LINK_LIBS): removed code that was
	commented out (it had been moved to tcl.m4's SC_TCL_LINK_LIBS
	already).

	* unix/tcl.m4: consolidated gettimeofday check for AIX.

2000-10-27  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* unix/configure.in:
	* unix/tcl.m4: added support for AIX-5.

	* generic/tclIO.c (Tcl_NotifyChannel): removed #ifdef around code
	for old channel structures, placed preserve/release around statePtr
	* generic/tclIO.c (CloseChannel): the statePtr for a channel was
	not being freed when the last channel in a stack was freed,
	causing a mem leak.

	* unix/tclUnixChan.c: updated channel types to strict
	TCL_CHANNEL_VERSION_2 style to avoid compiler warnings.  They work
	either way, but this avoids compiler warnings (that worries people).

2000-10-26  David Gravereaux <davygrvy@ajubasolutions.com>

	* win/tclWinFile.c (TclpMatchFilesTypes): NULL was being set to
	"attr" which was a DWORD.  Changed NULL to zero because a 'void *'
	can't be set to a DWORD to avoid the compiler warning.

2000-10-20  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* win/tclWinFile.c (TclpMatchFilesTypes): made the stat call only
	occur when necessary (for 'glob' command).  Significantly speeds
	up glob command from 8.3. [BUG: 6216]

2000-10-06  David Gravereaux  <davygrvy@ajubasolutions.com>

	* win/tclWinChan.c: moved Win2K bug case test with GetStdHandle()
	from TclpGetDefaultStdChannel into Tcl_MakeFileChannel to enable
	a more general method in detecting invalid OS handles rather than
	just a specific known case. [BUG: 5971]

2000-10-06  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* tests/cmdAH.test: extra tests for 'file channels' that include
	multiple interpreter tests and channel sharing
	* generic/tclIO.c (Tcl_GetChannelNamesEx): corrected function (and
	consequently 'file channels') to return channels that are actually
	registered for this specific interp, rather than this thread.

2000-09-29  Jeff Hobbs  <hobbs@scriptics.com>

	* win/tclWinSerial.c (SerialGetOptionProc): corrected reporting of
	space parity on Windows (Eason) [Bug 6057].

	* win/Makefile.in: commented use of TESTFLAGS
	* unix/Makefile.in: added TESTFLAGS to test target to
	conform with Windows makefile and TEA style.

	* tests/stack.test: prevented possible crash on systems with low
	default stacksize (Tru64, AIX) in infinite recursion test.  A
	solution to check remaining stack space in the core is best, but
	hard to do in a cross-platform manner.

	* generic/tclIOGT.c (FLUSH_DELAY): renamed DELAY define to
	FLUSH_DELAY to avoid defn conflict using Tru64's cc.

2000-09-28  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* tools/tcl.wse.in: added tclPlatDecls.h and tkPlatDecls.h to the
	Windows .exe install.

	* tests/fCmd.test (fCmd-6.20): corrected test to remove
	c:/tcl8975@ after creating it.

	* tests/fileName.test: cleaned up the testing of glob patterns for
	c:/globTest (Windows) to directly create/remove directory.
2000-09-27  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* generic/tclIO.c (StopCopy): fixed a bug introduced by a partial
	fix in 8.3.2 that didn't set nonBlocking correctly when resetting
	the flags for the write side.  [Bug: 6261]

	***************************************************************
	**  END OF ASYNC BACKPORT LOG (8.4aCVS 2001-04-03 -> 8.3.3)  **
	***************************************************************

2000-08-08  Jeff Hobbs  <hobbs@ajubasolutions.com>

	8.3.2 RELEASE finalized

	* changes: updated for release notes version of ChangeLog

	* library/msgcat1.0/pkgIndex.tcl: 
	* library/msgcat1.0/msgcat.tcl: bumped msgcat version to 1.1.

2000-08-07  Jeff Hobbs  <hobbs@ajubasolutions.com>

	* doc/ChnlStack.3:
	* doc/CrtChannel.3: updated the docs to be aware of the
	TCL_CHANNEL_VERSION_2 style of Tcl channels.

	* generic/tclIO.c (Tcl_CreateChannel): added assertion to verify
	that the new channel versioning will be binary compatible with
	older channel drivers.

	* BACKPORTED FROM 8.4 (HEAD) BRANCH:

	* doc/memory.n: Man page for Tcl "memory" command, which is
	created when TCL_MEM_DEBUG is defined at compile time.

	* doc/TCL_MEM_DEBUG.3: Man page with overall information about
	TCL_MEM_DEBUG usage.

	* doc/DumpActiveMemory.3: Man page for Tcl_DumpActiveMemory,
	Tcl_InitMemory, and Tcl_ValidateAllMemory [Bug: 1816, 1835].

	* doc/Init.3: Man page for Tcl_Init [Bug: 1820].

	* unix/Makefile.in: add tclsh.ico and tcl.spec to dist target

	* unix/mkLinks: Regen'd with new mkLinks.tcl.

	* unix/mkLinks.tcl: Fixed indentation, made link setup more
	intelligent (only do one existance test per man page, instead of
	one per function).

	* doc/AddErrInfo.3:
	* doc/ChnlStack.3:
	* doc/Exit.3:
	* doc/GetIndex.3:
	* doc/Notifier.3:
	* doc/Object.3:
	* doc/RegExp.3:
	* doc/SetResult.3:
	* doc/SplitList.3:
	* doc/Thread.3:  Added missing entries to NAME section.

	* doc/AddErrInfo.3:
	* doc/CrtObjCmd.3:
	* doc/RecEvalObj.3: Changed Tcl_EvalObj to Tcl_EvalObjEx

	* doc/library.n: Added entries for auto_qualify and auto_import
	[Bug: 1271].
	* doc/library.n: Fixed .SH NAME macro to include each function
	documented on the page, so that mkLinks will know about the
	functions listed there, and so that the Windows help file index
	will get set up correctly [Bug: 1898, 5273].

	* doc/expr.n: Added documentation for each of the math library
	functions that expr supports [Bug: 1054].

	* doc/regsub.n: correct regsub docs [Bug: 5346]

	* doc/scan.n: minor doc fixes [Bug: 5396]

	* doc/RegExp.3: Replaced instances of "Tcl_GetRegExpInfo" with
	"Tcl_RegExpGetInfo", the correct name of the function [Bug: 5901].

	* doc/package.n: Corrected information about [package forget]
	arguments [Bug: 5418].

	* generic/tclCkalloc.c: Fixed some function headers.

	* tests/clock.test: Added test for "2 days 2 hours ago" style
	specifications.

	* generic/tclDate.c: Regenerated from tclGetDate.y.

	* generic/tclGetDate.y: Tweaked grammar to properly handle the
	"ago" keyword when it follows multiple relative unit specifiers,
	as in "2 days 2 hours ago".  [Bug: 5497].

	* generic/tclClock.c (FormatClock): correct code to handle locale
	specific return values from strftime, if any. [Bug: 3345]

	* unix/tclUnixInit.c (TclpSetInitialEncodings): attempt to
	correct setlocale calls for XIM support and locale issues.
	[BUG: 5422 3345 4236 2522 2521]

	* library/init.tcl (auto_import): added check to see if a valid
	pattern was coming in, to avoid simple error cases [Bug: 3326]

	* library/history.tcl: Corrected an off-by-one error in HistIndex,
	which was causing [history redo] to start its search at the wrong
	event index. [Bug: 1269].

	* generic/tclPosixStr.c (Tcl_SignalMsg): clarified #defines for
	Linux on Sparc to compile correctly. [Bug: 5364]

	* generic/tclEnv.c: cast cleanup [Bug: 5624]
	* win/tclWinFCmd.c: cast cleanup [Bug: 5627]

	* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): Corrected
	caching of the index ptr to account for offsets != sizeof(char *).
	[Bug: 5153]

	* tests/opt.test:
	* library/opt0.4/optparse.tcl: Applied patch from [Bug: 5922], which 
	corrected an incorrect use of [string match].

	* tests/stringObj.test: Tweaked tests to avoid hardcoded
	high-ASCII characters (which will fail in multibyte locales);
	instead used \uXXXX syntax. [Bug: 3842].

2000-08-05  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIOGT.c (TclChannelTransform): fixed segfault that
	would occur when transforming a channel with a proc that did not
	yet exist. (Kupries)

	* generic/tclTest.c (TestChannelCmd): added some lint init'ing of
	statePtr and chan vars.

2000-07-28  Mo DeJong  <mdejong@redhat.com>

	* win/Makefile.in:
	* win/configure.in:
	* win/tcl.m4:
	* win/tclConfig.sh.in: Back port of gcc for windows
	build system from 8.4.

2000-07-26  Jeff Hobbs  <hobbs@scriptics.com>

	* merged core-8-3-1-io-rewrite back into core-8-3-1-branch.
	The core-8-3-1-io-rewrite branch should now be considered defunct.

	* generic/tclStubInit.c:
	* generic/tclDecls.h:
	* generic/tcl.decls:
	* generic/tcl.h:
	* generic/tclIO.c: moved the Tcl_Channel* macros from tcl.h to
	tclIO.c and made them proper stubbed functions.  These are:
	Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc,
	Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc,
	Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc,
	Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc,
	Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc,
	and Tcl_ChannelHandlerProc.  These should be used to access the
	Tcl_ChannelType structure instead of direct pointer dereferencing.

	* unix/Makefile.in: undid 07-25 Makefile.in changes because we
	don't really want to force all private makefiles on everyone.
	This needs to be addressed again in the future.  Best possible
	solution is to create a tcl/ subdir in the installing include dir
	(as is done already with the lib dir).

	* tests/iogt.test: added RCS string, marked tests 2.* to be
	unixOnly due to underlying system differences.

	* tests/all.tcl: corrected additional sets by Kupries for testing.

2000-07-25 Brent Welch	<welch@ajubasolutions.com>

	* unix/Makefile.in: Need to install all the Tcl headers because
	Itcl depends on internal headers.

2000-07-25 Andreas Kupries <a.kupries@westend.com>

	* tests/iogt.test: (line 866f) New tests iogt-6.[01], highlighting
 	  buffering trouble when stacking and unstacking transformations.
	  iogt-6.0 is solved, see the changes below. iogt-6.1 remains, for
 	  now, due to the perceived complexity of solutions.

	* generic/tclIO.h: (line 139f) struct Channel, added a buffer
	  queue, to hold data pushed back when stacking a transformation.

	* generic/tclIO.c:
	  (line 91f, line 7434f) New internal function 'CopyBuffer'.
	  Derived from 'CopyAndTranslateBuffer', with translation
	  removed.
	  (line 1025f, line 1212f): Initialization of new queue.
	  (line 1164f, Tcl_StackChannel): Pushback of input queue.
	  (line 1293f, Tcl_UnstackChannel): Discard input and pushback.
	  (line 3748f, Tcl_ReadRaw): Modified to use data in the push back
	  area before going to the driver. Uses 'CopyBuffer', s.a.
	  (line 4702f, GetInput): Modified to use data in the push back
	  area before going to the driver.
 	  (line 4867f, Tcl_Seek): Modified to take pushback of the topmost
	  channel in a stack into account.
	  (line 5620f, Tcl_InputBuffered): See above. Added
	  'Tcl_ChannelBuffered'. Analogue to 'Tcl_InputBuffered' but for
	  the buffer area in the channel.

	* generic/tcl.decls: New public API 'Tcl_ChannelBuffered'. S.a.

2000-07-19  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/socket.test: removed doTestsWithRemoteServer constraint
	from socket-12.*.  It requires 'exec', not a remote server.
	Cleaned up some coding errors.

2000-07-18 Brent Welch	<welch@ajubasolutions.com>

	* win/Makefile.in: Added rules for static tcldde and tclreg libraries.

2000-07-17  Jeff Hobbs  <hobbs@scriptics.com>

	* README:
	* win/README:
	* win/README.binary:
	* win/configure.in:
	* unix/configure.in:
	* unix/tcl.spec:
	* tools/tcl.wse.in:
	* generic/tcl.h (TCL_RELEASE_SERIAL): updated to patchlevel 8.3.2

	* unix/Makefile.in:
	* win/Makefile.in:
	* win/makefile.vc: added tclIOGT.c to objects list to compile.

	* generic/tclStubInit.c:
	* generic/tclIntDecls.h:
	* generic/tclInt.decls: commented out internal decls for
	TclTestChannelCmd and TclTestChannelEventCmd as they were moved to
	tclTest.c.  Added new decls for TclChannelEventScriptInvoker and
	TclChannelTransform.

	* generic/tclIO.h: new file that contains the main internal
	structures of Tcl_Channel code to allow for multiple files to
	access them.
	* generic/tclTest.c:
	* generic/tclIO.c: broke into 3 files - tclIO.c core code, tclIO.h
	header code, and tclIOGT.c - the giot test code from Kupries.  The
	channel test code also moved to tclTest.c.
	* generic/tclIO.c (CloseChannel): stopped masking out of the
	TCL_READABLE|TCL_WRITABLE bits from the state flags in
	CloseChannel, instead adding extra intelligence to
	CheckChannelErrors with a new CHANNEL_RAW_MODE bit for special
	behavior when called from Raw channel APIs.

2000-07-13  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (StackSetBlockMode): moved set of chanPtr
	outside of blockModeProc check to avoid infinite loop when
	blockModeProc was NULL (Kupries).  updated TransformSeekProc to
	not call Tcl_Seek directly (Kupries).

	* win/tclWinChan.c: updated fileChannelType to v2 channel struct
	* win/tclWinConsole.c: updated consoleChannelType to v2 channel struct
	* win/tclWinPipe.c: updated pipeChannelType to v2 channel struct
	* win/tclWinSerial.c: updated serialChannelType to v2 channel struct
	* win/tclWinSock.c: updated tcpChannelType to v2 channel struct

2000-07-11  Brent Welch	<welch@ajubasolutions.com>

	* win/tclConfig.sh.in: Cleaned up unix-specific autoconf variables.

2000-07-11  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/iogt.test: made tests [345].0 not run by default as they
	were failing in the new design, but I'm not convinced that the
	returned result isn't correct.

	* generic/tclDecls.h:
	* generic/tclStubInit.c:
	* generic/tcl.decls: added Tcl_GetTopChannel C API that returns
	the current top channel of a channel stack.  Tcl_GetChannel was
	changed earlier to return the bottommost channel of a stack
	because that is the one that is guaranteed to stay around the
	longest, and this was needed to compensate for certain
	operations that want to look at the state of the main channel.
	Most channel APIs already compensate for grabbing the top, so it
	shouldn't be needed often.

	* generic/tclIO.c (Tcl_StackChannel, Tcl_UnstackChannel): Added
	flushing of buffers (Kupries), removed use of DownChannel macro,
	added Tcl_GetTopChannel public API to get to the top channel of
	the channel stack (necessary for TLS).  Rewrote Tcl_NotifyChannel
	for new channel design (Kupries).  Did some code cleanup in the
	transform code.  tclIO.c must still be broken into bits (separate
	out test code and giot code, create tclIO.h).

2000-07-10  Andreas Kupries <a.kupries@westend.com>

	* tests/iogt.test: Reverted some earlier changes as a fix by Jeff
	  revived the original and correct behaviour. IOW, the tests showed
	  a genuine error and I didn't see it :(.

	* generic/tclIO.c (Tcl_Read|Write_Raw): Changed to directly use
 	  the drivers and not DoRead|DoWrite. The latter use the buffering
 	  system, encoding and eol-translation and this wreaks havoc with
 	  the data going through the transformations. Both procedures use
 	  CheckForchannelErrors and let it believe that there is no
 	  background copy in progress or else stacked channels could not
	  be used for that.

	* generic/tclIO.c (TclCopyChannel, CopyData): Moved access to the
 	  topmost channel from the first to the second procedure to make
 	  the decision about that at the last possible time (Callbacks can
 	  change the stacking).

	test suite: failures of iogt-[345].0
	
2000-07-06  Jeff Hobbs  <hobbs@scriptics.com>

	* tests/iogt.test: new tests for stacked channel stuff based off
	new 'testchannel transform|unstack' code (Kupries IOGT extension).
	* generic/tcl.decls:
	* generic/tcl.h:
	* generic/tclDecls.h:
	* generic/tclStubsInit.c:
	* generic/tclIO.c: complete rewrite of Tcl Channel code for
	stacked channels.  Channels are now designed to work in a more
	stacked fashion with a shared ChannelState data structure.

2000-06-02  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (CloseChannel): removed the &ing out of
	(TCL_READABLE|TCL_WRITABLE) from the flags, as CloseChannel does
	this on the next pass through for the top channel, and it appeared
	to be causing hangs by not allowing the final flush.

2000-06-01  Jeff Hobbs  <hobbs@scriptics.com>

	* generic/tclIO.c (CloseChannel): Rewrote CloseChannel code to
	unstack a channel during the close process.  Fixed a refcount bug
	in Tcl_UnstackChannel.  [Bug: 5623]
	(CloseChannel): further extended CloseChannel in the stacked case
	to effect certain operations on the next channel that would have
	been done in Tcl_Close.  Also added CHANNEL_CLOSED and removed
	(TCL_READABLE|TCL_WRITABLE) bits from chanPtr->flags.  Changed
	final reset of the WatchProc to check the chanDownPtr's (next)
	interestMask.

2000-05-29  Sandeep Tamhankar <sandeep@scriptics.com>

	* tests/http.test
	* doc/http.n
	* library/http2.3/http.tcl: Fixed bug 5741, where unsuccessful
	geturl calls sometimes leaked memory and resources (sockets).  
	Also, switched around some of the logic so that http::wait never 
	throws an exception.  This is because in an asynchronous geturl, 
	the command callback will probably end up doing all the error 
	handling anyway, and in an asynchronous situation, the user
	expects to check the state when the transaction completes, as
	opposed to being thrown an exception.	For the http package, this
	menas the user can check http::status for "error" and http::error
	for the error message after doing the http::wait.

2000-04-26  Jeff Hobbs  <hobbs@scriptics.com>

	8.3.1 RELEASE

	* README:
	* mac/README:
Changes to README.
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
26
27
28
29
30
31
32
33

34

35

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
README:  Tcl
    This is the Tcl 8.3.1 source distribution.
    You can get any release of Tcl from:
        http://dev.scriptics.com/registration/<version>.tml
    Tcl/Tk is also available through NetCVS:
	http://dev.scriptics.com/software/tcltk/netcvs.html

RCS: @(#) $Id: README,v 1.31 2000/04/26 17:31:19 hobbs Exp $

Contents
--------
    1. Introduction
    2. Documentation
    3. Compiling and installing Tcl
    4. Development tools
    5. Tcl newsgroup
    6. Tcl contributed archive
    7. Tcl Resource Center
    8. Mailing lists
    9. Support and Training
    10. Thank You

1. Introduction
---------------
Tcl provides a powerful platform for creating integration
applications that tie together diverse applications, protocols,
devices, and frameworks.  When paired with the Tk toolkit, Tcl
provides the fastest and most powerful way to create GUI applications
that run on PCs, Unix, and the Macintosh.  Tcl can also be used for a
variety of web-related tasks and for creating powerful command
languages for applications.

Tcl is maintained, enhanced, and distributed freely as a

service to the Tcl community by Scriptics Corporation.

The official home for Tcl/Tk is on the Scriptics Web site:


	http://dev.scriptics.com

Tcl is a freely available open source package.  You can do virtually
anything you like with it, such as modifying it, redistributing it,
and selling it either in whole or in part.  See the file
"license.terms" for complete information.

2. Documentation
---------------

Extensive documentation is available at our website.
The home page for this release, including new features, is
	http://dev.scriptics.com/software/tcltk/8.3.html

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.1.txt

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/


|

|

|

|
















|
|
|
<
|
|
|

|
>
|
>
|
>

|







|






|







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
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
README:  Tcl
    This is the Tcl 8.3.3 source distribution.
    You can get any release of Tcl from:
        ftp://ftp.scriptics.com/pub/tcl/
    Tcl/Tk is also available through NetCVS:
	http://tcl.sourceforge.net/

RCS: @(#) $Id: README,v 1.31.2.2 2001/04/03 22:08:32 hobbs Exp $

Contents
--------
    1. Introduction
    2. Documentation
    3. Compiling and installing Tcl
    4. Development tools
    5. Tcl newsgroup
    6. Tcl contributed archive
    7. Tcl Resource Center
    8. Mailing lists
    9. Support and Training
    10. Thank You

1. Introduction
---------------
Tcl provides a powerful platform for creating integration applications that
tie together diverse applications, protocols, devices, and frameworks.
When paired with the Tk toolkit, Tcl provides the fastest and most powerful

way to create GUI applications that run on PCs, Unix, and the Macintosh.
Tcl can also be used for a variety of web-related tasks and for creating
powerful command languages for applications.

Tcl is maintained, enhanced, and distributed freely by the Tcl community.
The home for Tcl/Tk sources and bug/patch database is on SourceForge:

	http://tcl.sourceforge.net/

with the Tcl Developer Xchange hosted at:

	http://dev.scriptics.com/

Tcl is a freely available open source package.  You can do virtually
anything you like with it, such as modifying it, redistributing it,
and selling it either in whole or in part.  See the file
"license.terms" for complete information.

2. Documentation
----------------

Extensive documentation is available at our website.
The home page for this release, including new features, is
	http://dev.scriptics.com/software/tcltk/8.3.html

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.3.txt

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

98
99
100
101
102
103
104
105
106
107
108
109

110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
commands.  The file "doc/Tcl.n" gives a quick summary of the Tcl
language syntax.  To print any of the man pages on Unix, cd to the
"doc" directory and invoke your favorite variant of troff using the
normal -man macros, for example

		ditroff -man Tcl.n

to print Tcl.n.  If Tcl has been installed correctly and your "man"
program supports it, you should be able to access the Tcl manual entries
using the normal "man" mechanisms, such as

		man Tcl

2b. Windows Documentation
-------------------------

The "doc" subdirectory in this release contains a complete set of
Windows help files for Tcl.  Once you install this Tcl release, a
shortcut to the Windows help Tcl documentation will appear in the
"Start" menu:

	Start | Programs | Tcl | Tcl Help

3. Compiling and installing Tcl
-------------------------------

There are brief notes in the unix/README, win/README, and mac/README
about compiling on these different platforms.  There is additional
information about building Tcl from sources at
    http://dev.scriptics.com/support/howto/compile.html



4. TclPro Development tools
--------------------

A high quality set of commercial development tools is now available to
accelerate your Tcl application development.  Scriptics' TclPro
product provides a debugger, static code checker, packaging utility,
and bytecode compiler.  Visit the Scriptics Web site at:

	http://dev.scriptics.com/tclpro

for more information on TclPro and for a free evaluation download.


5. Tcl newsgroup
----------------

There is a network news group "comp.lang.tcl" intended for the
exchange of information about Tcl, Tk, and related applications.  The
newsgroup is a great place to ask general information questions.  For
bug reports, please see the "Support and bug fixes" section below.

6. Tcl contributed archive
--------------------------

Many people have created exciting packages and applications based on Tcl
and/or Tk and made them freely available to the Tcl community.  An archive
of these contributions is kept on the machine ftp.neosoft.com.  You







|
|
|






|
|
|
<






|
|
|
<

>




|
|
|
|
|
<

<
>




|
|
|
|







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

88
89
90
91
92
93
94
95
96

97
98
99
100
101
102
103
104
105
106
107

108

109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
commands.  The file "doc/Tcl.n" gives a quick summary of the Tcl
language syntax.  To print any of the man pages on Unix, cd to the
"doc" directory and invoke your favorite variant of troff using the
normal -man macros, for example

		ditroff -man Tcl.n

to print Tcl.n.  If Tcl has been installed correctly and your "man" program
supports it, you should be able to access the Tcl manual entries using the
normal "man" mechanisms, such as

		man Tcl

2b. Windows Documentation
-------------------------

The "doc" subdirectory in this release contains a complete set of Windows
help files for Tcl.  Once you install this Tcl release, a shortcut to the
Windows help Tcl documentation will appear in the "Start" menu:


	Start | Programs | Tcl | Tcl Help

3. Compiling and installing Tcl
-------------------------------

There are brief notes in the unix/README, win/README, and mac/README about
compiling on these different platforms.  There is additional information
about building Tcl from sources at


	http://dev.scriptics.com/doc/howto/compile.html

4. TclPro Development tools
--------------------

A high quality set of commercial quality development tools is available to
accelerate your Tcl application development.  The TclPro product provides a
debugger, static code checker, packaging utility, and bytecode compiler.
TclPro was open-sourced when Scriptics/Ajuba was acquired by Interwoven.
Visit its home at SourceForge for more information and source/binaries:



	http://tclpro.sourceforge.net/

5. Tcl newsgroup
----------------

There is a network news group "comp.lang.tcl" intended for the exchange of
information about Tcl, Tk, and related applications.  The newsgroup is a
great place to ask general information questions.  For bug reports, please
see the "Support and bug fixes" section below.

6. Tcl contributed archive
--------------------------

Many people have created exciting packages and applications based on Tcl
and/or Tk and made them freely available to the Tcl community.  An archive
of these contributions is kept on the machine ftp.neosoft.com.  You
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168

169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
applications, binary releases, and patches.  You can also recommend
additional URLs for the resource center using the forms labeled "Add a
Resource".

8. Mailing lists
----------------

A couple of  Mailing List have been set up to discuss Macintosh or
Windows related Tcl issues.  To subscribe send a message to:
	
	wintcl-request@tclconsortium.org
	mactcl-request@tclconsortium.org
	
In the body of the message (the subject will be ignored) put:
	
	subscribe mactcl Joe Smith
	
Replace Joe Smith with your real name, of course.  (Use wintcl
instead of mactcl if you're interested in the Windows list.)  If you
would just like to receive more information about the list without
subscribing put the line:

	information mactcl
	
(or wintcl) in the body instead.

9. Support and Training
------------------------

Scriptics is very interested in receiving bug reports, patches, and
suggestions for improvements.  We prefer that you send this
information to us via the bug form on the Scriptics Web site, rather
than emailing us directly.  The bug form is at:


	http://dev.scriptics.com/ticket/

The bug form was designed to give uniform structure to bug reports as
well as to solicit enough information to minimize followup questions.
The bug form also includes an option to automatically post your report
on comp.lang.tcl.  We strongly recommend that you select this option
because someone else who reads comp.lang.tcl may be able to offer a
solution.

We will log and follow-up on each bug, although we cannot promise a
specific turn-around time.  Enhancements may take longer and may not
happen at all unless there is widespread support for them (we're
trying to slow the rate at which Tcl/Tk turns into a kitchen sink).
It's very difficult to make incompatible changes to Tcl/Tk at this
point, due to the size of the installed base.

The Tcl community is too large for us to provide much individual
support for users.  If you need help we suggest that you post
questions to comp.lang.tcl.  We read the newsgroup and will attempt to
answer esoteric questions for which no-one else is likely to know the
answer.  In addition, Tcl/Tk support and training are available
commercially from Scriptics at:

	http://dev.scriptics.com/training

Also see the following Web site for links to other organizations that
offer Tcl/Tk training:

	http://www.scriptics.com/resource/community/commercial/training

10. Thank You
-------------

We'd like to express our thanks to the Tcl community for all the
helpful suggestions, bug reports, and patches we have received.
Tcl/Tk has improved vastly and will continue to do so with your help.







<
<
|
<
<
|
|
|
<
|
<
<
<
<

<
|
<




|
|
<
|
>

|



<
<
<
<


|
|
|
|
|

|
|
|
|
<
<
<
<
<
|
|









136
137
138
139
140
141
142


143


144
145
146

147




148

149

150
151
152
153
154
155

156
157
158
159
160
161
162




163
164
165
166
167
168
169
170
171
172
173
174





175
176
177
178
179
180
181
182
183
184
185
applications, binary releases, and patches.  You can also recommend
additional URLs for the resource center using the forms labeled "Add a
Resource".

8. Mailing lists
----------------



Several mailing lists are hosted at SourceForge to discuss development or


use issues (like Macintosh and Windows topics).  For more information and
to subscribe, visit:


	http://sourceforge.net/projects/tcl/






and go to the Mailing Lists page.


9. Support and Training
------------------------

We are very interested in receiving bug reports, patches, and suggestions
for improvements.  We prefer that you send this information to us via the

bug form at SourceForge, rather than emailing us directly.  The bug
database is at:

	http://tcl.sourceforge.net/

The bug form was designed to give uniform structure to bug reports as
well as to solicit enough information to minimize followup questions.





We will log and follow-up on each bug, although we cannot promise a
specific turn-around time.  Enhancements may take longer and may not happen
at all unless there is widespread support for them (we're trying to slow
the rate at which Tcl/Tk turns into a kitchen sink).  It's very difficult
to make incompatible changes to Tcl/Tk at this point, due to the size of
the installed base.

The Tcl community is too large for us to provide much individual support
for users.  If you need help we suggest that you post questions to
comp.lang.tcl.  We read the newsgroup and will attempt to answer esoteric
questions for which no-one else is likely to know the answer.  In addition,





see the following Web site for links to other organizations that offer
Tcl/Tk training:

	http://www.scriptics.com/resource/community/commercial/training

10. Thank You
-------------

We'd like to express our thanks to the Tcl community for all the
helpful suggestions, bug reports, and patches we have received.
Tcl/Tk has improved vastly and will continue to do so with your help.
Changes to changes.
1
2
3
4
5
6
7
8
9
10
Recent user-visible changes to Tcl:

RCS: @(#) $Id: changes,v 1.56 2000/04/26 00:24:19 hobbs Exp $

1. No more [command1] [command2] construct for grouping multiple
commands on a single command line.

2. Semi-colon now available for grouping commands on a line.

3. For a command to span multiple lines, must now use backslash-return


|







1
2
3
4
5
6
7
8
9
10
Recent user-visible changes to Tcl:

RCS: @(#) $Id: changes,v 1.56.2.3 2001/04/04 23:05:06 hobbs Exp $

1. No more [command1] [command2] construct for grouping multiple
commands on a single command line.

2. Semi-colon now available for grouping commands on a line.

3. For a command to span multiple lines, must now use backslash-return
4869
4870
4871
4872
4873
4874
4875


































































































2000-04-23 (bug fix) several Mac socket fixes (ingham)

2000-04-24 (bug fix) fixed hang in threaded Unix case when backgrounded
exec process was running (dejong)

--- Released 8.3.1, April 26, 2000 --- See ChangeLog for details ---








































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972

2000-04-23 (bug fix) several Mac socket fixes (ingham)

2000-04-24 (bug fix) fixed hang in threaded Unix case when backgrounded
exec process was running (dejong)

--- Released 8.3.1, April 26, 2000 --- See ChangeLog for details ---

2000-05-29 (bug fix) corrected resource cleanup in http error cases.
Improved handling of error cases in http. (tamhankar)

2000-07 (feature rewrite) complete rewrite of the Tcl IO channel subsystem
to correct problems (hangs, core dumps) with the initial stacked channel
implementation.  The new system has many more tests for robustness and
scalability.  There are new C APIs (see Tcl_CreateChannel), but only
stacked channel drivers are affected (ie: TLS, Trf, iogt).  The iogt
extension has been added to the core test code to test the system.
(hobbs, kupries)
	**** POTENTIAL INCOMPATABILITY ****

2000-07 (build improvements) cleanup of the makefiles and configure scripts
to correct support for building under gcc for Windows. (dejong)

2000-08-07 (bug fix) corrected sizeof error in Tcl_GetIndexFromObjStruct.
(perkins)

2000-08-07 (bug fix) correct off-by-one error in HistIndex, which was
causing [history redo] to start its search at the wrong event index. (melski)

2000-08-07 (bug fix) corrected setlocale calls for XIM support and locale
issues in startup. (takahashi)

2000-08-07 (bug fix) correct code to handle locale specific return values
from strftime, if any. (wagner)

2000-08-07 (bug fix) tweaked grammar to properly handle the "ago" keyword
when it follows multiple relative unit specifiers, as in
"2 days 2 hours ago". (melski)

2000-08-07 (doc fixes) numerous doc fixes to correct SEE ALSO and NAME
sections. (english)

2000-08-07 (bug fix) new man pages memory.n, TCL_MEM_DEBUG.3, Init.3 and
DumpActiveMemory.3. (melski)

--- Released 8.3.2, August 9, 2000 --- See ChangeLog for details ---

2001-04-04 (build improvements) redid Mac build structure (steffen)
Corrected IRIX-5* configure (english).  Added support for AIX-5 (hobbs).
Added support for Win64 (hobbs).

2001-04-03 (doc fixes) numerous doc corrections and clarifications.
Update of READMEs.

2001-03-30 (bug fix) corrected Windows memory error on exit (wu)
Fixed race condition in	readability of socket on Windows.

2001-03-29 (bug fix) prevent potential race condition and security leak in
tmp filename creation on Unix. (max)
Fixed handling of timeout for threads (corrects excessive CPU usage issue
for Tk on Unix in threaded Tcl environment). (ruppert)

2001-03-13 (bug fix) Correctly possible memory corruption in string map {}
$str (fellows)

2001-02-15 (feature enhancement) improved efficiency of [string split]
(fellows)

2001-01-30 (bug fix) Fixed possible hangs in fcopy. (porter)

2001-01-04 (bug fix) corrected parsing of $tcl_libPath at startup on
Windows (porter)

2000-12-14 (feature enhancement) improved (s)rand for 64-bit platforms
(porter)

2000-12-09 (feature enhancement) changed %o and %x to use strtoul instead
of strtol to correctly preserve scan<>format conversion of large integers
(hobbs)
Fixed handling of {!<boolean>} in expressions (hobbs, fellows)

2000-11-23 (mem leak) fixed potential memory leak in error case of lsort
(fellows)

2000-11-02 (bug fix) Corrected sharing of tclLibraryPath in threaded
environment (gravereaux)

2000-11-01 (mem leak) Corrected excessive mem use of info exists on a
non-existent array element (hobbs)

2000-10-20 (feature enhancement) call stat only when necessary in 'glob' to
speed up command significantly in base cases (hobbs)

2000-10-06 (bug fix) corrected [file channels] to only return channels in
the current interpreter (hobbs)

2000-09-29 (bug fix) corrected reporting of space parity on Windows (Eason)

2000-09-27 (bug fix) fixed a bug introduced by a partial fix in 8.3.2 that
didn't set nonBlocking correctly when resetting the flags for the write
side (mem leak) Correct mem leak in channels when statePtr was released
(hobbs)

--- Released 8.3.3, April 6, 2001 --- See ChangeLog for details ---
Changes to compat/string.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * string.h --
 *
 *	Declarations of ANSI C library procedures for string handling.
 *
 * Copyright (c) 1991-1993 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: string.h,v 1.3 1999/04/16 00:46:30 stanton Exp $
 */

#ifndef _STRING
#define _STRING

#include <tcl.h>












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * string.h --
 *
 *	Declarations of ANSI C library procedures for string handling.
 *
 * Copyright (c) 1991-1993 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: string.h,v 1.3.12.1 2001/04/03 22:54:36 hobbs Exp $
 */

#ifndef _STRING
#define _STRING

#include <tcl.h>

55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
70
			    CONST char *s2, size_t n));
extern char *		strncat _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern int		strncmp _ANSI_ARGS_((CONST char *s1, CONST char *s2,
			    size_t nChars));
extern char *		strncpy _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern char *		strpbrk _ANSI_ARGS_((CONST char *string, char *chars));

extern char *		strrchr _ANSI_ARGS_((CONST char *string, int c));
extern size_t		strspn _ANSI_ARGS_((CONST char *string,
			    CONST char *chars));
extern char *		strstr _ANSI_ARGS_((CONST char *string,
			    CONST char *substring));
extern char *		strtok _ANSI_ARGS_((CONST char *s, CONST char *delim));

#endif /* _STRING */







|
>





|


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
			    CONST char *s2, size_t n));
extern char *		strncat _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern int		strncmp _ANSI_ARGS_((CONST char *s1, CONST char *s2,
			    size_t nChars));
extern char *		strncpy _ANSI_ARGS_((char *dst, CONST char *src,
			    size_t numChars));
extern char *		strpbrk _ANSI_ARGS_((CONST char *string,
			    CONST char *chars));
extern char *		strrchr _ANSI_ARGS_((CONST char *string, int c));
extern size_t		strspn _ANSI_ARGS_((CONST char *string,
			    CONST char *chars));
extern char *		strstr _ANSI_ARGS_((CONST char *string,
			    CONST char *substring));
extern char *		strtok _ANSI_ARGS_((char *s, CONST char *delim));

#endif /* _STRING */
Changes to doc/AddErrInfo.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: AddErrInfo.3,v 1.4 2000/04/26 17:00:43 ericm Exp $
'\" 
.so man.macros
.TH Tcl_AddErrorInfo 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_AddObjErrorInfo, Tcl_AddErrorInfo, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_PosixError, Tcl_LogCommandInfo \- record information about errors
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_AddObjErrorInfo\fR(\fIinterp, message, length\fR)
.sp
\fBTcl_AddErrorInfo\fR(\fIinterp, message\fR)







|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: AddErrInfo.3,v 1.4.2.1 2000/08/07 21:29:36 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_AddErrorInfo 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_AddObjErrorInfo, Tcl_AddErrorInfo, Tcl_SetObjErrorCode, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_PosixError, Tcl_LogCommandInfo \- record information about errors
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_AddObjErrorInfo\fR(\fIinterp, message, length\fR)
.sp
\fBTcl_AddErrorInfo\fR(\fIinterp, message\fR)
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
and additional elements in \fBerrorCode\fR hold additional pieces
of information that depend on the class.
See the Tcl overview manual entry for details on the various
formats for \fBerrorCode\fR.
.PP
The \fBerrorInfo\fR variable is gradually built up as an
error unwinds through the nested operations.
Each time an error code is returned to \fBTcl_EvalObj\fR
(or \fBTcl_Eval\fR, which calls \fBTcl_EvalObj\fR)
it calls the procedure \fBTcl_AddObjErrorInfo\fR to add
additional text to \fBerrorInfo\fR describing the
command that was being executed when the error occurred.
By the time the error has been passed all the way back
to the application, it will contain a complete trace
of the activity in progress when the error occurred.
.PP
It is sometimes useful to add additional information to
\fBerrorInfo\fR beyond what can be supplied automatically
by \fBTcl_EvalObj\fR.
\fBTcl_AddObjErrorInfo\fR may be used for this purpose:
its \fImessage\fR and \fIlength\fR arguments describe an additional
string to be appended to \fBerrorInfo\fR.
For example, the \fBsource\fR command calls \fBTcl_AddObjErrorInfo\fR
to record the name of the file being processed and the
line number on which the error occurred;
for Tcl procedures, the procedure name and line number
within the procedure are recorded, and so on.
The best time to call \fBTcl_AddObjErrorInfo\fR is just after
\fBTcl_EvalObj\fR has returned \fBTCL_ERROR\fR.
In calling \fBTcl_AddObjErrorInfo\fR, you may find it useful to
use the \fBerrorLine\fR field of the interpreter (see the
\fBTcl_Interp\fR manual entry for details).
.PP
\fBTcl_AddErrorInfo\fR resembles \fBTcl_AddObjErrorInfo\fR
but differs in initializing \fBerrorInfo\fR from the string
value of the interpreter's result







|
|









|









|







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
and additional elements in \fBerrorCode\fR hold additional pieces
of information that depend on the class.
See the Tcl overview manual entry for details on the various
formats for \fBerrorCode\fR.
.PP
The \fBerrorInfo\fR variable is gradually built up as an
error unwinds through the nested operations.
Each time an error code is returned to \fBTcl_EvalObjEx\fR
(or \fBTcl_Eval\fR, which calls \fBTcl_EvalObjEx\fR)
it calls the procedure \fBTcl_AddObjErrorInfo\fR to add
additional text to \fBerrorInfo\fR describing the
command that was being executed when the error occurred.
By the time the error has been passed all the way back
to the application, it will contain a complete trace
of the activity in progress when the error occurred.
.PP
It is sometimes useful to add additional information to
\fBerrorInfo\fR beyond what can be supplied automatically
by \fBTcl_EvalObjEx\fR.
\fBTcl_AddObjErrorInfo\fR may be used for this purpose:
its \fImessage\fR and \fIlength\fR arguments describe an additional
string to be appended to \fBerrorInfo\fR.
For example, the \fBsource\fR command calls \fBTcl_AddObjErrorInfo\fR
to record the name of the file being processed and the
line number on which the error occurred;
for Tcl procedures, the procedure name and line number
within the procedure are recorded, and so on.
The best time to call \fBTcl_AddObjErrorInfo\fR is just after
\fBTcl_EvalObjEx\fR has returned \fBTCL_ERROR\fR.
In calling \fBTcl_AddObjErrorInfo\fR, you may find it useful to
use the \fBerrorLine\fR field of the interpreter (see the
\fBTcl_Interp\fR manual entry for details).
.PP
\fBTcl_AddErrorInfo\fR resembles \fBTcl_AddObjErrorInfo\fR
but differs in initializing \fBerrorInfo\fR from the string
value of the interpreter's result
Changes to doc/ChnlStack.3.
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
26
27
28
29
'\"
'\" Copyright (c) 1999 Scriptics Corporation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: ChnlStack.3,v 1.1 1999/07/02 19:51:14 welch Exp $
.so man.macros
.TH Tcl_StackChannel 3 8.2 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_StackChannel, Tcl_UnstackChannel \- stack an I/O channel on top of another, and undo it
.SH SYNOPSIS
.nf
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_StackChannel\fR(\fIinterp, typePtr, clientData, mask, channel\fR)
.sp
void
\fBTcl_UnstackChannel\fR(\fIinterp, channel\fR)
.sp
Tcl_Channel
\fBTcl_GetStackedChannel\fR(\fIchannel\fR)
.sp
.SH ARGUMENTS
.AS Tcl_ChannelType

|




|

|



|








|







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
26
27
28
29
'\"
'\" Copyright (c) 1999-2000 Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: ChnlStack.3,v 1.1.10.2 2000/08/08 00:57:52 hobbs Exp $
.so man.macros
.TH Tcl_StackChannel 3 8.3 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_StackChannel, Tcl_UnstackChannel, Tcl_GetStackedChannel \- stack an I/O channel on top of another, and undo it
.SH SYNOPSIS
.nf
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_StackChannel\fR(\fIinterp, typePtr, clientData, mask, channel\fR)
.sp
int
\fBTcl_UnstackChannel\fR(\fIinterp, channel\fR)
.sp
Tcl_Channel
\fBTcl_GetStackedChannel\fR(\fIchannel\fR)
.sp
.SH ARGUMENTS
.AS Tcl_ChannelType
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

73
74




75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96


97
98
99
100
101
102
This can be a subset of the operations currently allowed on \fIchannel\fP.
.AP Tcl_Channel channel in
An existing Tcl channel such as returned by \fBTcl_CreateChannel\fR.
.BE

.SH DESCRIPTION
.PP
These functions are for use by extensions that add processing
layers to Tcl I/O channels.  Examples include compression
and encryption modules.  These functions transparently stack and unstack
a new channel on top of an existing one.
Any number of channels can be stacked together.
.PP

\fBTcl_StackChannel\fR
replaces an existing \fIchannel\fP with a new channel by
the same name that was registered for \fIchannel\fP
with \fBTcl_RegisterChannel\fP.
.PP
\fBTcl_StackChannel\fR
works by creating a new channel structure under the existing
\fIchannel\fP and pushing the existing channel functions
down to the newly created channel.
The hidden channel does no buffering, newline translations,
or character set encoding.
Instead, 
the buffering, newline translations, and
encoding functions all remain at the top of the channel stack.
The top-most channel gets changed to use the 
I/O channel functions
defined in \fItypePtr\fP, and the channel functions are passed
the new \fIclientData\fP.
The existing \fIchannel\fP structure is modified in place,
so C applications that continue to use \fIchannel\fP will
also see the effects of the new processing module.

A pointer to a new channel structure is returned,
although this new data structure is the one that has been




pushed down below the top of the channel module stack.
(This pointer can also be obtained with the
\fBTcl_GetStackedChannel\fP call.)
If an error occurs when stacking the channel,
NULL is returned instead. 
.PP
The \fImask\fP parameter specifies the operations that
are allowed on the new channel.
These can be a subset of the operations allowed on the original channel.
For example, a read-write channel may become
read-only after the \fBTcl_StackChannel\fR call.
.PP
Closing a channel closes the channels stacked below it.
The close of stacked channels is executed in a way that
allows buffered data to be properly flushed.
.PP
\fBTcl_UnstackChannel\fP reverses the process.
The old channel is associated with the channel name,
and the processing module added by
\fBTcl_StackChannel\fR is destroyed.
If there is no old channel, then \fBTcl_UnstackChannel\fP 
is equivalent to \fBTcl_Close\fP .



.SH "SEE ALSO"
Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n).

.SH KEYWORDS
channel, compression







|
|
|
<
|

>
|
|
|
|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
>
|
<
>
>
>
>
|
<
<
|
|

|
<
|
|
|

|
|
|

|
<
|
|
<
|
>
>






39
40
41
42
43
44
45
46
47
48

49
50
51
52
53
54
55
56
57













58
59
60
61

62
63
64
65
66


67
68
69
70

71
72
73
74
75
76
77
78
79

80
81

82
83
84
85
86
87
88
89
90
This can be a subset of the operations currently allowed on \fIchannel\fP.
.AP Tcl_Channel channel in
An existing Tcl channel such as returned by \fBTcl_CreateChannel\fR.
.BE

.SH DESCRIPTION
.PP
These functions are for use by extensions that add processing layers to Tcl
I/O channels.  Examples include compression and encryption modules.  These
functions transparently stack and unstack a new channel on top of an

existing one.  Any number of channels can be stacked together.
.PP
The implementation of the Tcl channel code was rewritten in 8.3.2 to
correct some problems with the previous implementation with regard to
stacked channels.  Anyone using stacked channels or creating stacked
channel drivers should update to the new \fBTCL_CHANNEL_VERSION_2\fR
\fBTcl_ChannelType\fR structure.  See \fBTcl_CreateChannel\fR for details.
.PP
\fBTcl_StackChannel\fR stacks a new \fIchannel\fP on an existing channel













with the same name that was registered for \fIchannel\fP by
\fBTcl_RegisterChannel\fP.
.PP
\fBTcl_StackChannel\fR works by creating a new channel structure and

placing itself on top of the channel stack.  EOL translation, encoding and
buffering options are shared between all channels in the stack.  The hidden
channel does no buffering, newline translations, or character set encoding.
Instead, the buffering, newline translations, and encoding functions all
remain at the top of the channel stack.  A pointer to the new top channel


structure is returned.  If an error occurs when stacking the channel, NULL
is returned instead.
.PP
The \fImask\fP parameter specifies the operations that are allowed on the

new channel.  These can be a subset of the operations allowed on the
original channel.  For example, a read-write channel may become read-only
after the \fBTcl_StackChannel\fR call.
.PP
Closing a channel closes the channels stacked below it.  The close of
stacked channels is executed in a way that allows buffered data to be
properly flushed.
.PP
\fBTcl_UnstackChannel\fP reverses the process.  The old channel is

associated with the channel name, and the processing module added by
\fBTcl_StackChannel\fR is destroyed.  If there is no old channel, then

\fBTcl_UnstackChannel\fP is equivalent to \fBTcl_Close\fP.  If an error
occurs unstacking the channel, \fBTCL_ERROR\fR is returned, otherwise
\fBTCL_OK\fR is returned.

.SH "SEE ALSO"
Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n).

.SH KEYWORDS
channel, compression
Changes to doc/CrtChannel.3.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44











































45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.

'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: CrtChannel.3,v 1.5 2000/04/14 23:01:49 hobbs Exp $
.so man.macros
.TH Tcl_CreateChannel 3 8.0 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption \- procedures for creating and manipulating channels
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR)
.sp
ClientData
\fBTcl_GetChannelInstanceData\fR(\fIchannel\fR)
.sp
Tcl_ChannelType *
\fBTcl_GetChannelType\fR(\fIchannel\fR)
.sp
char *
\fBTcl_GetChannelName\fR(\fIchannel\fR)
.VS
.sp
int
\fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR)
.VE
.sp
int
\fBTcl_GetChannelBufferSize\fR(\fIchannel\fR)
.sp
\fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR)
.sp
.VS
\fBTcl_NotifyChannel\fR(\fIchannel, mask\fR)
.sp
int
\fBTcl_BadChannelOption\fR(\fIinterp, optionName, optionList\fR)











































.VE
.sp
.SH ARGUMENTS
.AS Tcl_EolTranslation *channelName in
.AP Tcl_ChannelType *typePtr in
Points to a structure containing the addresses of procedures that
can be called to perform I/O and other functions on the channel.
.AP char *channelName in
The name of this channel, such as \fBfile3\fR; must not be in use
by any other channel. Can be NULL, in which case the channel is
created without a name.
.AP ClientData instanceData in
Arbitrary one-word value to be associated with this channel.  This
value is passed to procedures in \fItypePtr\fR when they are invoked.
.AP int mask in
OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate
whether a channel is readable and writable.
.AP Tcl_Channel channel in
The channel to operate on.
.VS
.AP int direction in
\fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR
means the output handle is wanted.
.AP ClientData *handlePtr out
Points to the location where the desired OS-specific handle should be
stored.
.VE
.AP Tcl_EolTranslation transMode in
The translation mode; one of the constants \fBTCL_TRANSLATE_AUTO\fR,
\fBTCL_TRANSLATE_CR\fR, \fBTCL_TRANSLATE_LF\fR and \fBTCL_TRANSLATE_CRLF\fR.
.AP int size in
The size, in bytes, of buffers to allocate in this channel.
.VS
.AP int mask in
An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR that indicates events that have occurred on
this channel.
.AP Tcl_Interp *interp in
Current interpreter. (can be NULL)
.AP char *optionName in
Name of the invalid option.
.AP char *optionList in
Specific options list (space separated words, without "-") 
to append to the standard generic options list.
Can be NULL for generic options error message only.
.VE

.BE

.SH DESCRIPTION
.PP
Tcl uses a two-layered channel architecture. It provides a generic upper
layer to enable C and Tcl programs to perform input and output using the


>




|

|



|















<



<






<




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



















<






<





<












<







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
26
27
28
29

30
31
32

33
34
35
36
37
38

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

105
106
107
108
109
110

111
112
113
114
115

116
117
118
119
120
121
122
123
124
125
126
127

128
129
130
131
132
133
134
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1997-2000 Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: CrtChannel.3,v 1.5.2.2 2001/04/03 22:06:43 hobbs Exp $
.so man.macros
.TH Tcl_CreateChannel 3 8.3 Tcl "Tcl Library Procedures"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption, Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc, Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc, Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc, Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc, Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc, Tcl_ChannelHandlerProc, \- procedures for creating and manipulating channels
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Channel
\fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR)
.sp
ClientData
\fBTcl_GetChannelInstanceData\fR(\fIchannel\fR)
.sp
Tcl_ChannelType *
\fBTcl_GetChannelType\fR(\fIchannel\fR)
.sp
char *
\fBTcl_GetChannelName\fR(\fIchannel\fR)

.sp
int
\fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR)

.sp
int
\fBTcl_GetChannelBufferSize\fR(\fIchannel\fR)
.sp
\fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR)
.sp

\fBTcl_NotifyChannel\fR(\fIchannel, mask\fR)
.sp
int
\fBTcl_BadChannelOption\fR(\fIinterp, optionName, optionList\fR)
.VS 8.3.2
.sp
char *
\fBTcl_ChannelName\fR(\fItypePtr\fR)
.sp
Tcl_ChannelTypeVersion
\fBTcl_ChannelVersion\fR(\fItypePtr\fR)
.sp
Tcl_DriverBlockModeProc *
\fBTcl_ChannelBlockModeProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverCloseProc *
\fBTcl_ChannelCloseProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverClose2Proc *
\fBTcl_ChannelClose2Proc\fR(\fItypePtr\fR)
.sp
Tcl_DriverInputProc *
\fBTcl_ChannelInputProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverOutputProc *
\fBTcl_ChannelOutputProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverSeekProc *
\fBTcl_ChannelSeekProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverSetOptionProc *
\fBTcl_ChannelSetOptionProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverGetOptionProc *
\fBTcl_ChannelGetOptionProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverWatchProc *
\fBTcl_ChannelWatchProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverGetHandleProc *
\fBTcl_ChannelGetHandleProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverFlushProc *
\fBTcl_ChannelFlushProc\fR(\fItypePtr\fR)
.sp
Tcl_DriverHandlerProc *
\fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR)
.VE
.sp
.SH ARGUMENTS
.AS Tcl_EolTranslation *channelName in
.AP Tcl_ChannelType *typePtr in
Points to a structure containing the addresses of procedures that
can be called to perform I/O and other functions on the channel.
.AP char *channelName in
The name of this channel, such as \fBfile3\fR; must not be in use
by any other channel. Can be NULL, in which case the channel is
created without a name.
.AP ClientData instanceData in
Arbitrary one-word value to be associated with this channel.  This
value is passed to procedures in \fItypePtr\fR when they are invoked.
.AP int mask in
OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate
whether a channel is readable and writable.
.AP Tcl_Channel channel in
The channel to operate on.

.AP int direction in
\fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR
means the output handle is wanted.
.AP ClientData *handlePtr out
Points to the location where the desired OS-specific handle should be
stored.

.AP Tcl_EolTranslation transMode in
The translation mode; one of the constants \fBTCL_TRANSLATE_AUTO\fR,
\fBTCL_TRANSLATE_CR\fR, \fBTCL_TRANSLATE_LF\fR and \fBTCL_TRANSLATE_CRLF\fR.
.AP int size in
The size, in bytes, of buffers to allocate in this channel.

.AP int mask in
An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR that indicates events that have occurred on
this channel.
.AP Tcl_Interp *interp in
Current interpreter. (can be NULL)
.AP char *optionName in
Name of the invalid option.
.AP char *optionList in
Specific options list (space separated words, without "-") 
to append to the standard generic options list.
Can be NULL for generic options error message only.


.BE

.SH DESCRIPTION
.PP
Tcl uses a two-layered channel architecture. It provides a generic upper
layer to enable C and Tcl programs to perform input and output using the
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197


198
199
200

201
202
203
204
205
206
207
208
209
210
211
212
213



214
215
216
217
218
219
220
221
222
223
224
225



















226
227
228
229
230
231



















232
233
234
235
236
237
238
the same as the \fItypePtr\fR argument in the call to
\fBTcl_CreateChannel\fR that created this channel.
.PP
\fBTcl_GetChannelName\fR returns a string containing the name associated
with the channel, or NULL if the \fIchannelName\fR argument to
\fBTcl_CreateChannel\fR was NULL.
.PP
.VS
\fBTcl_GetChannelHandle\fR places the OS-specific device handle
associated with \fIchannel\fR for the given \fIdirection\fR in the
location specified by \fIhandlePtr\fR and returns \fBTCL_OK\fR.  If
the channel does not have a device handle for the specified direction,
then \fBTCL_ERROR\fR is returned instead.  Different channel drivers
will return different types of handle.  Refer to the manual entries
for each driver to determine what type of handle is returned.
.VE
.PP
\fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR
and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input
and output.
.PP
 \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers
allocated to store input or output in \fIchan\fR. If the value was not set
by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then
the default value of 4096 is returned.
.PP
\fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that
will be allocated in subsequent operations on the channel to store input or
output. The \fIsize\fR argument should be between ten and one million,
allowing buffers of ten bytes to one million bytes. If \fIsize\fR is
outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to
4096.
.PP
.VS
\fBTcl_NotifyChannel\fR is called by a channel driver to indicate to
the generic layer that the events specified by \fImask\fR have
occurred on the channel.  Channel drivers are responsible for invoking
this function whenever the channel handlers need to be called for the
channel.  See \fBWATCHPROC\fR below for more details.
.VE
.PP
.VS
\fBTcl_BadChannelOption\fR is called from driver specific set or get option
procs to generate a complete error message.
.VE

.SH TCL_CHANNELTYPE
.PP
A channel driver provides a \fBTcl_ChannelType\fR structure that contains
pointers to functions that implement the various operations on a channel;
these operations are invoked as needed by the generic layer. The


\fBTcl_ChannelType\fR structure contains the following fields:
.PP
.VS

.CS
typedef struct Tcl_ChannelType {
	char *\fItypeName\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_DriverCloseProc *\fIcloseProc\fR;
	Tcl_DriverInputProc *\fIinputProc\fR;
	Tcl_DriverOutputProc *\fIoutputProc\fR;
	Tcl_DriverSeekProc *\fIseekProc\fR;
	Tcl_DriverSetOptionProc *\fIsetOptionProc\fR;
	Tcl_DriverGetOptionProc *\fIgetOptionProc\fR;
	Tcl_DriverWatchProc *\fIwatchProc\fR;
	Tcl_DriverGetHandleProc *\fIgetHandleProc\fR;
	Tcl_DriverClose2Proc *\fIclose2Proc\fR;



} Tcl_ChannelType;
.CE
.VE
.PP
The driver must provide implementations for all functions except
\fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR,
.VS
\fIgetOptionProc\fR, and \fIclose2Proc\fR, which may be specified as
.VE
NULL.  Other functions that can not be implemented for this type of
device should return \fBEINVAL\fR when invoked to indicate that they
are not implemented.




















.SH TYPENAME
.PP
The \fItypeName\fR field contains a null-terminated string that
identifies the type of the device implemented by this driver, e.g.
\fBfile\fR or \fBsocket\fR.




















.SH BLOCKMODEPROC
.PP
The \fIblockModeProc\fR field contains the address of a function called by
the generic layer to set blocking and nonblocking mode on the device.
\fIBlockModeProc\fR should match the following prototype:
.PP







<







<

















<





<

<


<





|
>
>
|

<
>



|









>
>
>


<



<

<


|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







184
185
186
187
188
189
190

191
192
193
194
195
196
197

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214

215
216
217
218
219

220

221
222

223
224
225
226
227
228
229
230
231
232

233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

252
253
254

255

256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
the same as the \fItypePtr\fR argument in the call to
\fBTcl_CreateChannel\fR that created this channel.
.PP
\fBTcl_GetChannelName\fR returns a string containing the name associated
with the channel, or NULL if the \fIchannelName\fR argument to
\fBTcl_CreateChannel\fR was NULL.
.PP

\fBTcl_GetChannelHandle\fR places the OS-specific device handle
associated with \fIchannel\fR for the given \fIdirection\fR in the
location specified by \fIhandlePtr\fR and returns \fBTCL_OK\fR.  If
the channel does not have a device handle for the specified direction,
then \fBTCL_ERROR\fR is returned instead.  Different channel drivers
will return different types of handle.  Refer to the manual entries
for each driver to determine what type of handle is returned.

.PP
\fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR
and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input
and output.
.PP
 \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers
allocated to store input or output in \fIchan\fR. If the value was not set
by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then
the default value of 4096 is returned.
.PP
\fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that
will be allocated in subsequent operations on the channel to store input or
output. The \fIsize\fR argument should be between ten and one million,
allowing buffers of ten bytes to one million bytes. If \fIsize\fR is
outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to
4096.
.PP

\fBTcl_NotifyChannel\fR is called by a channel driver to indicate to
the generic layer that the events specified by \fImask\fR have
occurred on the channel.  Channel drivers are responsible for invoking
this function whenever the channel handlers need to be called for the
channel.  See \fBWATCHPROC\fR below for more details.

.PP

\fBTcl_BadChannelOption\fR is called from driver specific set or get option
procs to generate a complete error message.


.SH TCL_CHANNELTYPE
.PP
A channel driver provides a \fBTcl_ChannelType\fR structure that contains
pointers to functions that implement the various operations on a channel;
these operations are invoked as needed by the generic layer.  The structure
was versioned starting in Tcl 8.3.2/8.4 to correct a problem with stacked
channel drivers.  See the \fBOLD_CHANNEL\fR section below for details about
the old structure.
.PP

The \fBTcl_ChannelType\fR structure contains the following fields:
.CS
typedef struct Tcl_ChannelType {
	char *\fItypeName\fR;
	Tcl_ChannelTypeVersion \fIversion\fR;
	Tcl_DriverCloseProc *\fIcloseProc\fR;
	Tcl_DriverInputProc *\fIinputProc\fR;
	Tcl_DriverOutputProc *\fIoutputProc\fR;
	Tcl_DriverSeekProc *\fIseekProc\fR;
	Tcl_DriverSetOptionProc *\fIsetOptionProc\fR;
	Tcl_DriverGetOptionProc *\fIgetOptionProc\fR;
	Tcl_DriverWatchProc *\fIwatchProc\fR;
	Tcl_DriverGetHandleProc *\fIgetHandleProc\fR;
	Tcl_DriverClose2Proc *\fIclose2Proc\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_DriverFlushProc *\fIflushProc\fR;	
	Tcl_DriverHandlerProc *\fIhandlerProc\fR;	
} Tcl_ChannelType;
.CE

.PP
The driver must provide implementations for all functions except
\fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR,

\fIgetOptionProc\fR, and \fIclose2Proc\fR, which may be specified as

NULL.  Other functions that can not be implemented for this type of
device should return \fBEINVAL\fR when invoked to indicate that they
are not implemented, except in the case of \fIflushProc\fR and
\fIhandlerProc\fR, which should specified as NULL if not otherwise defined.
.PP
.VS 8.3.2
The user should only use the above structure for \fBTcl_ChannelType\fR
instantiation.  When referencing fields in a \fBTcl_ChannelType\fR
structure, the following functions should be used to obtain the values:
\fBTcl_ChannelName\fR, \fBTcl_ChannelVersion\fR,
\fBTcl_ChannelBlockModeProc\fR, \fBTcl_ChannelCloseProc\fR,
\fBTcl_ChannelClose2Proc\fR, \fBTcl_ChannelInputProc\fR,
\fBTcl_ChannelOutputProc\fR, \fBTcl_ChannelSeekProc\fR,
\fBTcl_ChannelSetOptionProc\fR, \fBTcl_ChannelGetOptionProc\fR,
\fBTcl_ChannelWatchProc\fR, \fBTcl_ChannelGetHandleProc\fR,
\fBTcl_ChannelFlushProc\fR, or \fBTcl_ChannelHandlerProc\fR.
.PP
The change to the structures was made in such a way that standard channel
types are binary compatible.  However, channel types that use stacked
channels (ie: TLS, Trf) have new versions to correspond to the above change
since the previous code for stacked channels had problems.
.VE

.SH TYPENAME
.PP
The \fItypeName\fR field contains a null-terminated string that
identifies the type of the device implemented by this driver, e.g.
\fBfile\fR or \fBsocket\fR.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelName\fR, which returns
a pointer to the string.
.VE

.VS 8.3.2
.SH VERSION
.PP
The \fIversion\fR field should be set to \fBTCL_CHANNEL_VERSION_2\fR.
If it is not set to this value \fBTCL_CHANNEL_VERSION_2\fR, then this
\fBTcl_ChannelType\fR is assumed to have the older structure.  See
\fBOLD_CHANNEL\fR for more details.  While Tcl will recognize and
function with either structure, stacked channels must be of the newer
style to function correctly.
.PP
This value can be retrieved with \fBTcl_ChannelVersion\fR, which returns
either \fBTCL_CHANNEL_VERSION_2\fR or \fBTCL_CHANNEL_VERSION_1\fR.
.VE

.SH BLOCKMODEPROC
.PP
The \fIblockModeProc\fR field contains the address of a function called by
the generic layer to set blocking and nonblocking mode on the device.
\fIBlockModeProc\fR should match the following prototype:
.PP
251
252
253
254
255
256
257





258
259
260
261
262
263
264
.PP
If the operation is successful, the function can modify the supplied
\fIinstanceData\fR to record that the channel entered blocking or
nonblocking mode and to implement the blocking or nonblocking behavior.
For some device types, the blocking and nonblocking behavior can be
implemented by the underlying operating system; for other device types, the
behavior must be emulated in the channel driver.






.SH "CLOSEPROC AND CLOSE2PROC"
.PP
The \fIcloseProc\fR field contains the address of a function called by the
generic layer to clean up driver-related information when the channel is
closed. \fICloseProc\fR must match the following prototype:
.PP







>
>
>
>
>







322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
.PP
If the operation is successful, the function can modify the supplied
\fIinstanceData\fR to record that the channel entered blocking or
nonblocking mode and to implement the blocking or nonblocking behavior.
For some device types, the blocking and nonblocking behavior can be
implemented by the underlying operating system; for other device types, the
behavior must be emulated in the channel driver.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelBlockModeProc\fR, which returns
a pointer to the function.
.VE

.SH "CLOSEPROC AND CLOSE2PROC"
.PP
The \fIcloseProc\fR field contains the address of a function called by the
generic layer to clean up driver-related information when the channel is
closed. \fICloseProc\fR must match the following prototype:
.PP
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
output will have been flushed to the device before this function is called,
and no further driver operations will be invoked on this instance after
calling the \fIcloseProc\fR. If the close operation is successful, the
procedure should return zero; otherwise it should return a nonzero POSIX
error code. In addition, if an error occurs and \fIinterp\fR is not NULL,
the procedure should store an error message in the interpreter's result.
.PP
.VS
Alternatively, channels that support closing the read and write sides
independently may set \fIcloseProc\fR to \fBTCL_CLOSE2PROC\fR and set
\fIclose2Proc\fR to the address of a function that matches the
following prototype:
.PP
.CS
typedef int Tcl_DriverClose2Proc(







<







351
352
353
354
355
356
357

358
359
360
361
362
363
364
output will have been flushed to the device before this function is called,
and no further driver operations will be invoked on this instance after
calling the \fIcloseProc\fR. If the close operation is successful, the
procedure should return zero; otherwise it should return a nonzero POSIX
error code. In addition, if an error occurs and \fIinterp\fR is not NULL,
the procedure should store an error message in the interpreter's result.
.PP

Alternatively, channels that support closing the read and write sides
independently may set \fIcloseProc\fR to \fBTCL_CLOSE2PROC\fR and set
\fIclose2Proc\fR to the address of a function that matches the
following prototype:
.PP
.CS
typedef int Tcl_DriverClose2Proc(
302
303
304
305
306
307
308





309
310
311
312
313
314
315
described above for \fIcloseProc\fR.  No further operations will be
invoked on this instance after \fIclose2Proc\fR is called with all
flags cleared.  In all cases, the \fIclose2Proc\fR function should
return zero if the close operation was successful; otherwise it should
return a nonzero POSIX error code. In addition, if an error occurs and
\fIinterp\fR is not NULL, the procedure should store an error message
in the interpreter's result.





.VE

.SH INPUTPROC
.PP
The \fIinputProc\fR field contains the address of a function called by the
generic layer to read data from the file or device and store it in an
internal buffer. \fIInputProc\fR must match the following prototype:







>
>
>
>
>







377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
described above for \fIcloseProc\fR.  No further operations will be
invoked on this instance after \fIclose2Proc\fR is called with all
flags cleared.  In all cases, the \fIclose2Proc\fR function should
return zero if the close operation was successful; otherwise it should
return a nonzero POSIX error code. In addition, if an error occurs and
\fIinterp\fR is not NULL, the procedure should store an error message
in the interpreter's result.
.PP
.VS 8.3.2
These value can be retrieved with \fBTcl_ChannelCloseProc\fR or
\fBTcl_ChannelClose2Proc\fR, which returns a pointer to the respective
function.
.VE

.SH INPUTPROC
.PP
The \fIinputProc\fR field contains the address of a function called by the
generic layer to read data from the file or device and store it in an
internal buffer. \fIInputProc\fR must match the following prototype:
345
346
347
348
349
350
351





352
353
354
355
356
357
358
return without blocking. If the input device has no data available
whatsoever and the channel is in nonblocking mode, the function should
return an \fBEAGAIN\fR error. If the input device has no data available
whatsoever and the channel is in blocking mode, the function should block
for the shortest possible time until at least one byte of data can be read
from the device; then, it should return as much data as it can read without
blocking.






.SH OUTPUTPROC
.PP
The \fIoutputProc\fR field contains the address of a function called by the
generic layer to transfer data from an internal buffer to the output device.
\fIOutputProc\fR must match the following prototype:
.PP







>
>
>
>
>







425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
return without blocking. If the input device has no data available
whatsoever and the channel is in nonblocking mode, the function should
return an \fBEAGAIN\fR error. If the input device has no data available
whatsoever and the channel is in blocking mode, the function should block
for the shortest possible time until at least one byte of data can be read
from the device; then, it should return as much data as it can read without
blocking.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelInputProc\fR, which returns
a pointer to the function.
.VE

.SH OUTPUTPROC
.PP
The \fIoutputProc\fR field contains the address of a function called by the
generic layer to transfer data from an internal buffer to the output device.
\fIOutputProc\fR must match the following prototype:
.PP
381
382
383
384
385
386
387





388
389
390
391
392
393
394
less in some cases such as if the output operation is interrupted by a
signal. If an error occurs the function should return -1.  In case of
error, some data may have been written to the device.
.PP
If the channel is nonblocking and the output device is unable to absorb any
data whatsoever, the function should return -1 with an \fBEAGAIN\fR error
without writing any data.






.SH SEEKPROC
.PP
The \fIseekProc\fR field contains the address of a function called by the
generic layer to move the access point at which subsequent input or output
operations will be applied. \fISeekProc\fR must match the following
prototype:







>
>
>
>
>







466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
less in some cases such as if the output operation is interrupted by a
signal. If an error occurs the function should return -1.  In case of
error, some data may have been written to the device.
.PP
If the channel is nonblocking and the output device is unable to absorb any
data whatsoever, the function should return -1 with an \fBEAGAIN\fR error
without writing any data.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelOutputProc\fR, which returns
a pointer to the function.
.VE

.SH SEEKPROC
.PP
The \fIseekProc\fR field contains the address of a function called by the
generic layer to move the access point at which subsequent input or output
operations will be applied. \fISeekProc\fR must match the following
prototype:
410
411
412
413
414
415
416





417
418
419
420
421
422
423
the generic layer for returning \fBerrno\fR values from the function.  The
function should set this variable to a POSIX error code if an error occurs.
The function should store an \fBEINVAL\fR error code if the channel type
does not implement seeking.
.PP
The return value is the new access point or -1 in case of error. If an
error occurred, the function should not move the access point.






.SH SETOPTIONPROC
.PP
The \fIsetOptionProc\fR field contains the address of a function called by
the generic layer to set a channel type specific option on a channel.
\fIsetOptionProc\fR must match the following prototype:
.PP







>
>
>
>
>







500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
the generic layer for returning \fBerrno\fR values from the function.  The
function should set this variable to a POSIX error code if an error occurs.
The function should store an \fBEINVAL\fR error code if the channel type
does not implement seeking.
.PP
The return value is the new access point or -1 in case of error. If an
error occurred, the function should not move the access point.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelSeekProc\fR, which returns
a pointer to the function.
.VE

.SH SETOPTIONPROC
.PP
The \fIsetOptionProc\fR field contains the address of a function called by
the generic layer to set a channel type specific option on a channel.
\fIsetOptionProc\fR must match the following prototype:
.PP
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457





458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496





497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529





530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556




557
558




































559

560
561
562
563
564
565
566
each channel type and the \fIsetOptionProc\fR procedure of the channel
driver will get called to implement them. The \fIsetOptionProc\fR field can
be NULL, which indicates that this channel type supports no type specific
options. 
.PP
If the option value is successfully modified to the new value, the function
returns \fBTCL_OK\fR.
.VS
It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. 
.VE
If \fIoptionValue\fR specifies a value for the option that
is not supported or if a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.






.SH GETOPTIONPROC
.PP
The \fIgetOptionProc\fR field contains the address of a function called by
the generic layer to get the value of a channel type specific option on a
channel. \fIgetOptionProc\fR must match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetOptionProc(
	ClientData \fIinstanceData\fR,
.VS
	Tcl_Interp *\fIinterp\fR,
.VE
	char *\fIoptionName\fR,
	Tcl_DString *\fIdsPtr\fR);
.CE
.PP
\fIOptionName\fR is the name of an option supported by this type of
channel. If the option name is not NULL, the function stores its current
value, as a string, in the Tcl dynamic string \fIdsPtr\fR.
If \fIoptionName\fR is NULL, the function stores in \fIdsPtr\fR an
alternating list of all supported options and their current values.
On success, the function returns \fBTCL_OK\fR. 
.VS
It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. If a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.
.VE
.PP
Some options are handled by the generic code and this function is never
called to retrieve their value, e.g. \fB-blockmode\fR. Other options are
specific to each channel type and the \fIgetOptionProc\fR procedure of the
channel driver will get called to implement them. The \fIgetOptionProc\fR
field can be NULL, which indicates that this channel type supports no type
specific options.






.SH WATCHPROC
.VS
.PP
The \fIwatchProc\fR field contains the address of a function called
by the generic layer to initialize the event notification mechanism to
notice events of interest on this channel.
\fIWatchProc\fR should match the following prototype:
.PP
.CS
typedef void Tcl_DriverWatchProc(
	ClientData \fIinstanceData\fR,
	int \fImask\fR);
.CE
.VE
.PP
The \fIinstanceData\fR is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fImask\fR
argument is an OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR; it indicates events the caller is interested in
noticing on this channel.
.PP
.VS
The function should initialize device type specific mechanisms to
notice when an event of interest is present on the channel.  When one
or more of the designated events occurs on the channel, the channel
driver is responsible for calling \fBTcl_NotifyChannel\fR to inform
the generic channel module.  The driver should take care not to starve
other channel drivers or sources of callbacks by invoking
Tcl_NotifyChannel too frequently.  Fairness can be insured by using
the Tcl event queue to allow the channel event to be scheduled in sequence
with other events.  See the description of \fBTcl_QueueEvent\fR for
details on how to queue an event.






.SH GETHANDLEPROC
.PP
The \fIgetHandleProc\fR field contains the address of a function called by
the generic layer to retrieve a device-specific handle from the channel.
\fIGetHandleProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetHandleProc(
	ClientData \fIinstanceData\fR,
	int \fIdirection\fR,
	ClientData *\fIhandlePtr\fR);
.CE
.PP
\fIInstanceData is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fIdirection\fR
argument is either \fBTCL_READABLE\fR to retrieve the handle used
for input, or \fBTCL_WRITABLE\fR to retrieve the handle used for
output.
.PP
If the channel implementation has device-specific handles, the
function should retrieve the appropriate handle associated with the
channel, according the \fIdirection\fR argument.  The handle should be
stored in the location referred to by \fIhandlePtr\fR, and
\fBTCL_OK\fR should be returned.  If the channel is not open for the
specified direction, or if the channel implementation does not use
device handles, the function should return \fBTCL_ERROR\fR.




.VE





































.VS

.SH TCL_BADCHANNELOPTION
.PP
This procedure generates a "bad option" error message in an
(optional) interpreter.  It is used by channel drivers when 
a invalid Set/Get option is requested. Its purpose is to concatenate
the generic options list to the specific ones and factorize
the generic options error message string.







<



<






>
>
>
>
>










<

<










<







<







>
>
>
>
>


<











<







<










>
>
>
>
>














|












>
>
>
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>







535
536
537
538
539
540
541

542
543
544

545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565

566

567
568
569
570
571
572
573
574
575
576

577
578
579
580
581
582
583

584
585
586
587
588
589
590
591
592
593
594
595
596
597

598
599
600
601
602
603
604
605
606
607
608

609
610
611
612
613
614
615

616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
each channel type and the \fIsetOptionProc\fR procedure of the channel
driver will get called to implement them. The \fIsetOptionProc\fR field can
be NULL, which indicates that this channel type supports no type specific
options. 
.PP
If the option value is successfully modified to the new value, the function
returns \fBTCL_OK\fR.

It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. 

If \fIoptionValue\fR specifies a value for the option that
is not supported or if a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelSetOptionProc\fR, which returns
a pointer to the function.
.VE

.SH GETOPTIONPROC
.PP
The \fIgetOptionProc\fR field contains the address of a function called by
the generic layer to get the value of a channel type specific option on a
channel. \fIgetOptionProc\fR must match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetOptionProc(
	ClientData \fIinstanceData\fR,

	Tcl_Interp *\fIinterp\fR,

	char *\fIoptionName\fR,
	Tcl_DString *\fIdsPtr\fR);
.CE
.PP
\fIOptionName\fR is the name of an option supported by this type of
channel. If the option name is not NULL, the function stores its current
value, as a string, in the Tcl dynamic string \fIdsPtr\fR.
If \fIoptionName\fR is NULL, the function stores in \fIdsPtr\fR an
alternating list of all supported options and their current values.
On success, the function returns \fBTCL_OK\fR. 

It should call \fBTcl_BadChannelOption\fR which itself returns
\fBTCL_ERROR\fR if the \fIoptionName\fR is
unrecognized. If a system call error occurs,
the function should leave an error message in the
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
error code.

.PP
Some options are handled by the generic code and this function is never
called to retrieve their value, e.g. \fB-blockmode\fR. Other options are
specific to each channel type and the \fIgetOptionProc\fR procedure of the
channel driver will get called to implement them. The \fIgetOptionProc\fR
field can be NULL, which indicates that this channel type supports no type
specific options.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelGetOptionProc\fR, which returns
a pointer to the function.
.VE

.SH WATCHPROC

.PP
The \fIwatchProc\fR field contains the address of a function called
by the generic layer to initialize the event notification mechanism to
notice events of interest on this channel.
\fIWatchProc\fR should match the following prototype:
.PP
.CS
typedef void Tcl_DriverWatchProc(
	ClientData \fIinstanceData\fR,
	int \fImask\fR);
.CE

.PP
The \fIinstanceData\fR is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fImask\fR
argument is an OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR
and \fBTCL_EXCEPTION\fR; it indicates events the caller is interested in
noticing on this channel.
.PP

The function should initialize device type specific mechanisms to
notice when an event of interest is present on the channel.  When one
or more of the designated events occurs on the channel, the channel
driver is responsible for calling \fBTcl_NotifyChannel\fR to inform
the generic channel module.  The driver should take care not to starve
other channel drivers or sources of callbacks by invoking
Tcl_NotifyChannel too frequently.  Fairness can be insured by using
the Tcl event queue to allow the channel event to be scheduled in sequence
with other events.  See the description of \fBTcl_QueueEvent\fR for
details on how to queue an event.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelWatchProc\fR, which returns
a pointer to the function.
.VE

.SH GETHANDLEPROC
.PP
The \fIgetHandleProc\fR field contains the address of a function called by
the generic layer to retrieve a device-specific handle from the channel.
\fIGetHandleProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverGetHandleProc(
	ClientData \fIinstanceData\fR,
	int \fIdirection\fR,
	ClientData *\fIhandlePtr\fR);
.CE
.PP
\fIInstanceData\fR is the same as the value passed to
\fBTcl_CreateChannel\fR when this channel was created. The \fIdirection\fR
argument is either \fBTCL_READABLE\fR to retrieve the handle used
for input, or \fBTCL_WRITABLE\fR to retrieve the handle used for
output.
.PP
If the channel implementation has device-specific handles, the
function should retrieve the appropriate handle associated with the
channel, according the \fIdirection\fR argument.  The handle should be
stored in the location referred to by \fIhandlePtr\fR, and
\fBTCL_OK\fR should be returned.  If the channel is not open for the
specified direction, or if the channel implementation does not use
device handles, the function should return \fBTCL_ERROR\fR.
.PP
.VS 8.3.2
This value can be retrieved with \fBTcl_ChannelGetHandleProc\fR, which returns
a pointer to the function.
.VE

.VS 8.3.2
.SH FLUSHPROC
.PP
The \fIflushProc\fR field is currently reserved for future use.
It should be set to NULL.
\fIFlushProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverFlushProc(
	ClientData \fIinstanceData\fR);
.CE
.PP
This value can be retrieved with \fBTcl_ChannelFlushProc\fR, which returns
a pointer to the function.

.SH HANDLERPROC
.PP
The \fIhandlerProc\fR field contains the address of a function called by
the generic layer to notify the channel that an event occured.  It should
be defined for stacked channel drivers that wish to be notified of events
that occur on the underlying (stacked) channel.
\fIHandlerProc\fR should match the following prototype:
.PP
.CS
typedef int Tcl_DriverHandlerProc(
	ClientData \fIinstanceData\fR,
	int \fIinterestMask\fR);
.CE
.PP
\fIInstanceData\fR is the same as the value passed to \fBTcl_CreateChannel\fR
when this channel was created.  The \fIinterestMask\fR is an OR-ed
combination of \fBTCL_READABLE\fR or \fBTCL_WRITABLE\fR; it indicates what
type of event occured on this channel.
.PP
This value can be retrieved with \fBTcl_ChannelHandlerProc\fR, which returns
a pointer to the function.
.VE

.SH TCL_BADCHANNELOPTION
.PP
This procedure generates a "bad option" error message in an
(optional) interpreter.  It is used by channel drivers when 
a invalid Set/Get option is requested. Its purpose is to concatenate
the generic options list to the specific ones and factorize
the generic options error message string.
575
576
577
578
579
580
581
582
583
584
585
586

587

























588
589
590
591
592
    <...generic options...>+<...specific options...>
so you get for instance:
    bad option "-blah": should be one of -blocking,
    -buffering, -buffersize, -eofchar, -translation,
    -peername, or -sockname
when called with optionList="peername sockname"
.CE
"blah" is the optionName argument and "<specific options>"
is a space separated list of specific option words.
The function takes good care of inserting minus signs before
each option, commas after, and an "or" before the last option.
.VE



























.SH "SEE ALSO"
Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3)

.SH KEYWORDS
blocking, channel driver, channel registration, channel type, nonblocking







|


|
|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|



717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
    <...generic options...>+<...specific options...>
so you get for instance:
    bad option "-blah": should be one of -blocking,
    -buffering, -buffersize, -eofchar, -translation,
    -peername, or -sockname
when called with optionList="peername sockname"
.CE
``blah'' is the optionName argument and ``<specific options>''
is a space separated list of specific option words.
The function takes good care of inserting minus signs before
each option, commas after, and an ``or'' before the last option.

.SH OLD_CHANNEL

The original (8.3.1 and below) \fBTcl_ChannelType\fR structure contains
the following fields:
.PP
.CS
typedef struct Tcl_ChannelType {
	char *\fItypeName\fR;
	Tcl_DriverBlockModeProc *\fIblockModeProc\fR;	
	Tcl_DriverCloseProc *\fIcloseProc\fR;
	Tcl_DriverInputProc *\fIinputProc\fR;
	Tcl_DriverOutputProc *\fIoutputProc\fR;
	Tcl_DriverSeekProc *\fIseekProc\fR;
	Tcl_DriverSetOptionProc *\fIsetOptionProc\fR;
	Tcl_DriverGetOptionProc *\fIgetOptionProc\fR;
	Tcl_DriverWatchProc *\fIwatchProc\fR;
	Tcl_DriverGetHandleProc *\fIgetHandleProc\fR;
	Tcl_DriverClose2Proc *\fIclose2Proc\fR;
} Tcl_ChannelType;
.CE
.PP
It is still possible to create channel with the above structure.  The
internal channel code will determine the version.  It is imperative to use
the new \fBTcl_ChannelType\fR structure if you are creating a stacked
channel driver, due to problems with the earlier stacked channel
implementation (in 8.2.0 to 8.3.1).

.SH "SEE ALSO"
Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3), Tcl_StackChannel(3)

.SH KEYWORDS
blocking, channel driver, channel registration, channel type, nonblocking
Changes to doc/CrtObjCmd.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.3 1999/04/16 00:46:30 stanton Exp $
'\" 
.so man.macros
.TH Tcl_CreateObjCommand 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateObjCommand, Tcl_DeleteCommand, Tcl_DeleteCommandFromToken, Tcl_GetCommandInfo, Tcl_SetCommandInfo, Tcl_GetCommandName \- implement new commands in C
.SH SYNOPSIS






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.3.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_CreateObjCommand 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateObjCommand, Tcl_DeleteCommand, Tcl_DeleteCommandFromToken, Tcl_GetCommandInfo, Tcl_SetCommandInfo, Tcl_GetCommandName \- implement new commands in C
.SH SYNOPSIS
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Tcl command.
.BE
.SH DESCRIPTION
.PP
\fBTcl_CreateObjCommand\fR defines a new command in \fIinterp\fR
and associates it with procedure \fIproc\fR
such that whenever \fIname\fR is
invoked as a Tcl command (e.g., via a call to \fBTcl_EvalObj\fR)
the Tcl interpreter will call \fIproc\fR to process the command.
.PP
\fBTcl_CreateObjCommand\fR deletes any existing command
\fIname\fR already associated with the interpreter
(however see below for an exception where the existing command
is not deleted).
It returns a token that may be used to refer







|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Tcl command.
.BE
.SH DESCRIPTION
.PP
\fBTcl_CreateObjCommand\fR defines a new command in \fIinterp\fR
and associates it with procedure \fIproc\fR
such that whenever \fIname\fR is
invoked as a Tcl command (e.g., via a call to \fBTcl_EvalObjEx\fR)
the Tcl interpreter will call \fIproc\fR to process the command.
.PP
\fBTcl_CreateObjCommand\fR deletes any existing command
\fIname\fR already associated with the interpreter
(however see below for an exception where the existing command
is not deleted).
It returns a token that may be used to refer
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
return \fBTCL_OK\fR or \fBTCL_ERROR\fR.
In addition, if \fIproc\fR needs to return a non-empty result,
it can call \fBTcl_SetObjResult\fR to set the interpreter's result.
In the case of a \fBTCL_OK\fR return code this gives the result
of the command,
and in the case of \fBTCL_ERROR\fR this gives an error message.
Before invoking a command procedure,
\fBTcl_EvalObj\fR sets interpreter's result to
point to an object representing an empty string, so simple
commands can return an empty result by doing nothing at all.
.PP
The contents of the \fIobjv\fR array belong to Tcl and are not
guaranteed to persist once \fIproc\fR returns: \fIproc\fR should
not modify them.
Call \fBTcl_SetObjResult\fR if you want







|







116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
return \fBTCL_OK\fR or \fBTCL_ERROR\fR.
In addition, if \fIproc\fR needs to return a non-empty result,
it can call \fBTcl_SetObjResult\fR to set the interpreter's result.
In the case of a \fBTCL_OK\fR return code this gives the result
of the command,
and in the case of \fBTCL_ERROR\fR this gives an error message.
Before invoking a command procedure,
\fBTcl_EvalObjEx\fR sets interpreter's result to
point to an object representing an empty string, so simple
commands can return an empty result by doing nothing at all.
.PP
The contents of the \fIobjv\fR array belong to Tcl and are not
guaranteed to persist once \fIproc\fR returns: \fIproc\fR should
not modify them.
Call \fBTcl_SetObjResult\fR if you want
248
249
250
251
252
253
254
255
256
257
258
259
260
261
was created, then \fBTcl_GetCommandName\fR returns the current name.
This name does not include any \fB::\fR namespace qualifiers.
The command corresponding to \fItoken\fR must not have been deleted.
The string returned by \fBTcl_GetCommandName\fR is in dynamic memory
owned by Tcl and is only guaranteed to retain its value as long as the
command isn't deleted or renamed;  callers should copy the string if
they need to keep it for a long time.
.PP

.SH "SEE ALSO"
Tcl_CreateCommand, Tcl_ResetResult, Tcl_SetObjResult

.SH KEYWORDS
bind, command, create, delete, namespace, object







<






248
249
250
251
252
253
254

255
256
257
258
259
260
was created, then \fBTcl_GetCommandName\fR returns the current name.
This name does not include any \fB::\fR namespace qualifiers.
The command corresponding to \fItoken\fR must not have been deleted.
The string returned by \fBTcl_GetCommandName\fR is in dynamic memory
owned by Tcl and is only guaranteed to retain its value as long as the
command isn't deleted or renamed;  callers should copy the string if
they need to keep it for a long time.


.SH "SEE ALSO"
Tcl_CreateCommand, Tcl_ResetResult, Tcl_SetObjResult

.SH KEYWORDS
bind, command, create, delete, namespace, object
Changes to doc/CrtSlave.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtSlave.3,v 1.3 1999/08/21 19:40:47 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_IsSafe, Tcl_MakeSafe, Tcl_CreateSlave, Tcl_GetSlave, Tcl_GetMaster, Tcl_GetInterpPath, Tcl_CreateAlias, Tcl_CreateAliasObj, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_ExposeCommand, Tcl_HideCommand \- manage multiple Tcl interpreters, aliases and hidden commands.
.SH SYNOPSIS






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: CrtSlave.3,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_IsSafe, Tcl_MakeSafe, Tcl_CreateSlave, Tcl_GetSlave, Tcl_GetMaster, Tcl_GetInterpPath, Tcl_CreateAlias, Tcl_CreateAliasObj, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_ExposeCommand, Tcl_HideCommand \- manage multiple Tcl interpreters, aliases and hidden commands.
.SH SYNOPSIS
216
217
218
219
220
221
222
223
224
225


226
227
228
229
230
If a hidden command whose name is \fIhiddenCmdName\fR already
exists, the operation also returns \fBTCL_ERROR\fR and the \fIresult\fR
field in \fIinterp\fR contains an error message.
If the operation succeeds, it returns \fBTCL_OK\fR.
After executing this command, attempts to use \fIcmdName\fR in a call to
\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will fail.
.PP
.SH "SEE ALSO"
For a description of the Tcl interface to multiple interpreters, see
\fIinterp(n)\fR.



.SH KEYWORDS
alias, command, exposed commands, hidden commands, interpreter, invoke,
master, slave, 








<


>
>





216
217
218
219
220
221
222

223
224
225
226
227
228
229
230
231
If a hidden command whose name is \fIhiddenCmdName\fR already
exists, the operation also returns \fBTCL_ERROR\fR and the \fIresult\fR
field in \fIinterp\fR contains an error message.
If the operation succeeds, it returns \fBTCL_OK\fR.
After executing this command, attempts to use \fIcmdName\fR in a call to
\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will fail.
.PP

For a description of the Tcl interface to multiple interpreters, see
\fIinterp(n)\fR.
.SH "SEE ALSO"
interp

.SH KEYWORDS
alias, command, exposed commands, hidden commands, interpreter, invoke,
master, slave, 

Changes to doc/DetachPids.3.
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
26
27







28
29
30
31
32
33
34
35
36
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: DetachPids.3,v 1.2 1998/09/14 18:39:48 stanton Exp $
'\" 
.so man.macros
.TH Tcl_DetachPids 3 "" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_DetachPids, Tcl_ReapDetachedProcs \- manage child processes in background
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_DetachPids\fR(\fInumPids, pidPtr\fR)
.sp
\fBTcl_ReapDetachedProcs\fR()



.SH ARGUMENTS
.AS int *statusPtr
.AP int numPids in
Number of process ids contained in the array pointed to by \fIpidPtr\fR.
.AP int *pidPtr in
Address of array containing \fInumPids\fR process ids.







.BE

.SH DESCRIPTION
.PP
\fBTcl_DetachPids\fR and \fBTcl_ReapDetachedProcs\fR provide a
mechanism for managing subprocesses that are running in background.
These procedures are needed because the parent of a process must
eventually invoke the \fBwaitpid\fR kernel call (or one of a few other
similar kernel calls) to wait for the child to exit.  Until the







|





|







>
>
>






>
>
>
>
>
>
>

<







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
26
27
28
29
30
31
32
33
34
35
36
37
38

39
40
41
42
43
44
45
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: DetachPids.3,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_DetachPids 3 "" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_DetachPids, Tcl_ReapDetachedProcs, Tcl_WaitPid \- manage child processes in background
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_DetachPids\fR(\fInumPids, pidPtr\fR)
.sp
\fBTcl_ReapDetachedProcs\fR()
.sp
Tcl_Pid
\fBTcl_WaitPid\fR(\fIpid, statPtr, options\fR)
.SH ARGUMENTS
.AS int *statusPtr
.AP int numPids in
Number of process ids contained in the array pointed to by \fIpidPtr\fR.
.AP int *pidPtr in
Address of array containing \fInumPids\fR process ids.
.AP Tcl_Pid pid in
The id of the process (pipe) to wait for.
.AP int* statPtr out
The result of waiting on a process (pipe). Either 0 or ECHILD.
.AP int options
The options controlling the wait. WNOHANG specifies not to wait when
checking the process.
.BE

.SH DESCRIPTION
.PP
\fBTcl_DetachPids\fR and \fBTcl_ReapDetachedProcs\fR provide a
mechanism for managing subprocesses that are running in background.
These procedures are needed because the parent of a process must
eventually invoke the \fBwaitpid\fR kernel call (or one of a few other
similar kernel calls) to wait for the child to exit.  Until the
53
54
55
56
57
58
59






60
61
62
Tcl automatically calls \fBTcl_ReapDetachedProcs\fR each time the
\fBexec\fR command is executed, so in most cases it isn't necessary
for any code outside of Tcl to invoke \fBTcl_ReapDetachedProcs\fR.
However, if you call \fBTcl_DetachPids\fR in situations where the
\fBexec\fR command may never get executed, you may wish to call
\fBTcl_ReapDetachedProcs\fR from time to time so that background
processes can be cleaned up.







.SH KEYWORDS
background, child, detach, process, wait







>
>
>
>
>
>



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Tcl automatically calls \fBTcl_ReapDetachedProcs\fR each time the
\fBexec\fR command is executed, so in most cases it isn't necessary
for any code outside of Tcl to invoke \fBTcl_ReapDetachedProcs\fR.
However, if you call \fBTcl_DetachPids\fR in situations where the
\fBexec\fR command may never get executed, you may wish to call
\fBTcl_ReapDetachedProcs\fR from time to time so that background
processes can be cleaned up.
.PP
\fBTcl_WaitPid\fR is a thin wrapper around the facilities provided by
the operating system to wait on the end of a spawned process and to
check a whether spawned process is still running. It is used by
\fBTcl_ReapDetachedProcs\fR and the channel system to portably access
the operating system.

.SH KEYWORDS
background, child, detach, process, wait
Changes to doc/Eval.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Eval.3,v 1.6 2000/04/14 23:01:50 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Eval 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_EvalObjEx, Tcl_EvalFile, Tcl_EvalObjv, Tcl_Eval, Tcl_EvalEx, Tcl_GlobalEval, Tcl_GlobalEvalObj, Tcl_VarEval, Tcl_VarEvalVA \- execute Tcl scripts
.SH SYNOPSIS







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Eval.3,v 1.6.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Eval 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_EvalObjEx, Tcl_EvalFile, Tcl_EvalObjv, Tcl_Eval, Tcl_EvalEx, Tcl_GlobalEval, Tcl_GlobalEvalObj, Tcl_VarEval, Tcl_VarEvalVA \- execute Tcl scripts
.SH SYNOPSIS
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Points to an array of pointers to objects; each object holds the
value of a single word in the command to execute.
.AP int numBytes in
The number of bytes in \fIscript\fR, not including any
null terminating character.  If \-1, then all characters up to the
first null byte are used.
.AP char *script in
Points to first byte of script to execute.  This script must be in
writable memory: temporary modifications are made to it during
parsing.
.AP char *string in
String forming part of a Tcl script.
.AP va_list argList in
An argument list which must have been initialised using
\fBTCL_VARARGS_START\fR, and cleared using \fBva_end\fR.
.BE








|
|
|







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Points to an array of pointers to objects; each object holds the
value of a single word in the command to execute.
.AP int numBytes in
The number of bytes in \fIscript\fR, not including any
null terminating character.  If \-1, then all characters up to the
first null byte are used.
.AP char *script in
Points to first byte of script to execute (NULL terminated and UTF-8).
This script must be in writable memory: temporary modifications are made
to it during parsing.
.AP char *string in
String forming part of a Tcl script.
.AP va_list argList in
An argument list which must have been initialised using
\fBTCL_VARARGS_START\fR, and cleared using \fBva_end\fR.
.BE

106
107
108
109
110
111
112



113
114
115
116
117
118
119
120
121
122
123
124
script.  The \fIobjc\fR and \fIobjv\fR arguments contain the values
of the words for the Tcl command, one word in each object in
\fIobjv\fR.  \fBTcl_EvalObjv\fR evaluates the command and returns
a completion code and result just like \fBTcl_EvalObjEx\fR.
.PP
\fBTcl_Eval\fR is similar to \fBTcl_EvalObjEx\fR except that the script to
be executed is supplied as a string instead of an object and no compilation



occurs.  The string is parsed and executed directly (using
\fBTcl_EvalObjv\fR) instead of compiling it and executing the bytecodes.
In situations where it is known that the script will never be executed
again, \fBTcl_Eval\fR may be faster than \fBTcl_EvalObjEx\fR.
\fBTcl_Eval\fR returns a completion code and result just like
\fBTcl_EvalObjEx\fR.  Note: for backward compatibility with versions before
Tcl 8.0, \fBTcl_Eval\fR copies the object result in \fIinterp\fR to
\fIinterp->result\fR (use is deprecated) where it can be accessed directly.
This makes \fBTcl_Eval\fR somewhat slower than \fBTcl_EvalEx\fR, which
doesn't do the copy.
.PP
\fBTcl_EvalEx\fR is an extended version of \fBTcl_Eval\fR that takes







>
>
>
|
|
|
|
|







106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
script.  The \fIobjc\fR and \fIobjv\fR arguments contain the values
of the words for the Tcl command, one word in each object in
\fIobjv\fR.  \fBTcl_EvalObjv\fR evaluates the command and returns
a completion code and result just like \fBTcl_EvalObjEx\fR.
.PP
\fBTcl_Eval\fR is similar to \fBTcl_EvalObjEx\fR except that the script to
be executed is supplied as a string instead of an object and no compilation
occurs.  The string should be a proper UTF-8 string as converted by
\fBTcl_ExternalToUtfDString\fR or \fBTcl_ExternalToUtf\fR when it is known
to possibly contain upper ascii characters who's possible combinations
might be a UTF-8 special code.  The string is parsed and executed directly
(using \fBTcl_EvalObjv\fR) instead of compiling it and executing the
bytecodes.  In situations where it is known that the script will never be
executed again, \fBTcl_Eval\fR may be faster than \fBTcl_EvalObjEx\fR.
\fBTcl_Eval\fR returns a completion code and result just like 
\fBTcl_EvalObjEx\fR.  Note: for backward compatibility with versions before
Tcl 8.0, \fBTcl_Eval\fR copies the object result in \fIinterp\fR to
\fIinterp->result\fR (use is deprecated) where it can be accessed directly.
This makes \fBTcl_Eval\fR somewhat slower than \fBTcl_EvalEx\fR, which
doesn't do the copy.
.PP
\fBTcl_EvalEx\fR is an extended version of \fBTcl_Eval\fR that takes
Changes to doc/Exit.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Exit.3,v 1.3 1999/04/16 00:46:31 stanton Exp $
'\" 
.so man.macros
.TH Tcl_Exit 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_Exit, Tcl_Finalize, Tcl_FinalizeThread, Tcl_CreateExitHandler, Tcl_DeleteExitHandler, Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler \- end the application or thread (and invoke exit handlers)
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_Exit\fR(\fIstatus\fR)
.sp
\fBTcl_Finalize\fR()






|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Exit.3,v 1.3.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Exit 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_Exit, Tcl_Finalize, Tcl_CreateExitHandler, Tcl_DeleteExitHandler, Tcl_ExitThread, Tcl_FinalizeThread, Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler \- end the application or thread (and invoke exit handlers)
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_Exit\fR(\fIstatus\fR)
.sp
\fBTcl_Finalize\fR()
Changes to doc/GetIndex.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: GetIndex.3,v 1.5 1999/08/13 19:01:04 welch Exp $
'\" 
.so man.macros
.TH Tcl_GetIndexFromObj 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_GetIndexFromObj \- lookup string in table of keywords
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_GetIndexFromObj\fR(\fIinterp, objPtr, tablePtr, msg, flags,
indexPtr\fR)






|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: GetIndex.3,v 1.5.8.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_GetIndexFromObj 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct \- lookup string in table of keywords
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_GetIndexFromObj\fR(\fIinterp, objPtr, tablePtr, msg, flags,
indexPtr\fR)
Changes to doc/Notifier.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1998-1999 Scriptics Corporation
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Notifier.3,v 1.7 1999/05/06 20:13:22 stanton Exp $
'\" 
.so man.macros
.TH Notifier 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateEventSource, Tcl_DeleteEventSource, Tcl_SetMaxBlockTime, Tcl_QueueEvent, Tcl_ThreadQueueEvent, Tcl_ThreadAlert, Tcl_GetCurrentThread, Tcl_DeleteEvents, Tcl_InitNotifier, Tcl_FinalizeNotifier, Tcl_WaitForEvent, Tcl_AlertNotifier, Tcl_SetTimer, Tcl_ServiceAll, Tcl_ServiceEvent, Tcl_GetServiceMode, Tcl_SetServiceMode \- the event queue and notifier interfaces
.SH SYNOPSIS







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1998-1999 Scriptics Corporation
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Notifier.3,v 1.7.12.1 2000/08/07 21:29:37 hobbs Exp $
'\" 
.so man.macros
.TH Notifier 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_CreateEventSource, Tcl_DeleteEventSource, Tcl_SetMaxBlockTime, Tcl_QueueEvent, Tcl_ThreadQueueEvent, Tcl_ThreadAlert, Tcl_GetCurrentThread, Tcl_DeleteEvents, Tcl_InitNotifier, Tcl_FinalizeNotifier, Tcl_WaitForEvent, Tcl_AlertNotifier, Tcl_SetTimer, Tcl_ServiceAll, Tcl_ServiceEvent, Tcl_GetServiceMode, Tcl_SetServiceMode \- the event queue and notifier interfaces
.SH SYNOPSIS
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
more information on memory management issues).  Each event source can
define its own event structure with whatever information is relevant
to that event source.  However, the first element of the structure
must be a structure of type \fBTcl_Event\fR, and the address of this
structure is used when communicating between the event source and the
rest of the notifier.  A \fBTcl_Event\fR has the following definition:
.CS
typedef struct Tcl_Event {
    Tcl_EventProc *\fIproc\fR;
    struct Tcl_Event *\fInextPtr\fR;
};
.CE
The event source must fill in the \fIproc\fR field of
the event before calling \fBTcl_QueueEvent\fR.
The \fInextPtr\fR is used to link together the events in the queue
and should not be modified by the event source.
.PP
An event may be added to the queue at any of three positions, depending







|


|







333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
more information on memory management issues).  Each event source can
define its own event structure with whatever information is relevant
to that event source.  However, the first element of the structure
must be a structure of type \fBTcl_Event\fR, and the address of this
structure is used when communicating between the event source and the
rest of the notifier.  A \fBTcl_Event\fR has the following definition:
.CS
typedef struct {
    Tcl_EventProc *\fIproc\fR;
    struct Tcl_Event *\fInextPtr\fR;
} Tcl_Event;
.CE
The event source must fill in the \fIproc\fR field of
the event before calling \fBTcl_QueueEvent\fR.
The \fInextPtr\fR is used to link together the events in the queue
and should not be modified by the event source.
.PP
An event may be added to the queue at any of three positions, depending
593
594
595
596
597
598
599
600
601
602
\fBTcl_SetServiceMode\fR returns the previous value of the service
mode, which should be restored when the recursive loop exits.
\fBTcl_GetServiceMode\fR returns the current value of the service
mode.
.VE
.SH "SEE ALSO"
\fBTcl_CreateFileHandler\fR, \fBTcl_DeleteFileHandler\fR, \fBTcl_Sleep\fR,
\fBTcl_DoOneEvent\fR, \fBThreads.3\fR
.SH KEYWORDS
event, notifier, event queue, event sources, file events, timer, idle, service mode, threads







|


593
594
595
596
597
598
599
600
601
602
\fBTcl_SetServiceMode\fR returns the previous value of the service
mode, which should be restored when the recursive loop exits.
\fBTcl_GetServiceMode\fR returns the current value of the service
mode.
.VE
.SH "SEE ALSO"
\fBTcl_CreateFileHandler\fR, \fBTcl_DeleteFileHandler\fR, \fBTcl_Sleep\fR,
\fBTcl_DoOneEvent\fR, \fBThread(3)\fR
.SH KEYWORDS
event, notifier, event queue, event sources, file events, timer, idle, service mode, threads
Changes to doc/Object.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Object.3,v 1.4 1999/08/09 16:30:34 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Obj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared \- manipulate Tcl objects
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Obj *
\fBTcl_NewObj\fR()
.sp






|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Object.3,v 1.4.10.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_Obj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared, Tcl_InvalidateStringRep \- manipulate Tcl objects
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
Tcl_Obj *
\fBTcl_NewObj\fR()
.sp
Changes to doc/ObjectType.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: ObjectType.3,v 1.2 1998/09/14 18:39:49 stanton Exp $
'\" 
.so man.macros
.TH Tcl_ObjType 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType  \- manipulate Tcl object types
.SH SYNOPSIS






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: ObjectType.3,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_ObjType 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType  \- manipulate Tcl object types
.SH SYNOPSIS
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
.PP
\fBTcl_RegisterObjType\fR registers a new Tcl object type
in the table of all object types supported by Tcl.
The argument \fItypePtr\fR points to a Tcl_ObjType structure that
describes the new type by giving its name
and by supplying pointers to four procedures
that implement the type.
If the type table already containes a type
with the same name as in \fItypePtr\fR,
it is replaced with the new type.
The Tcl_ObjType structure is described
in the section \fBTHE TCL_OBJTYPE STRUCTURE\fR below.
.PP
\fBTcl_GetObjType\fR returns a pointer to the Tcl_ObjType
with name \fItypeName\fR.







|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
.PP
\fBTcl_RegisterObjType\fR registers a new Tcl object type
in the table of all object types supported by Tcl.
The argument \fItypePtr\fR points to a Tcl_ObjType structure that
describes the new type by giving its name
and by supplying pointers to four procedures
that implement the type.
If the type table already contains a type
with the same name as in \fItypePtr\fR,
it is replaced with the new type.
The Tcl_ObjType structure is described
in the section \fBTHE TCL_OBJTYPE STRUCTURE\fR below.
.PP
\fBTcl_GetObjType\fR returns a pointer to the Tcl_ObjType
with name \fItypeName\fR.
Changes to doc/RecEvalObj.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RecEvalObj.3,v 1.2 1998/09/14 18:39:49 stanton Exp $
'\" 
.so man.macros
.TH Tcl_RecordAndEvalObj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RecordAndEvalObj \- save command on history list before evaluating
.SH SYNOPSIS






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RecEvalObj.3,v 1.2.18.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_RecordAndEvalObj 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RecordAndEvalObj \- save command on history list before evaluating
.SH SYNOPSIS
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
command but don't evaluate it.  TCL_EVAL_GLOBAL means evaluate
the command at global level instead of the current stack level.
.BE

.SH DESCRIPTION
.PP
\fBTcl_RecordAndEvalObj\fR is invoked to record a command as an event
on the history list and then execute it using \fBTcl_EvalObj\fR
(or \fBTcl_GlobalEvalObj\fR if the TCL_EVAL_GLOBAL bit is set
in \fIflags\fR).
It returns a completion code such as TCL_OK just like \fBTcl_EvalObj\fR,
as well as a result object containing additional information
(a result value or error message)
that can be retrieved using \fBTcl_GetObjResult\fR.
If you don't want the command recorded on the history list then
you should invoke \fBTcl_EvalObj\fR instead of \fBTcl_RecordAndEvalObj\fR.
Normally \fBTcl_RecordAndEvalObj\fR is only called with top-level
commands typed by the user, since the purpose of history is to
allow the user to re-issue recently-invoked commands.
If the \fIflags\fR argument contains the TCL_NO_EVAL bit then
the command is recorded without being evaluated.

.SH "SEE ALSO"
Tcl_EvalObj, Tcl_GetObjResult

.SH KEYWORDS
command, event, execute, history, interpreter, object, record







|


|




|







|



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
command but don't evaluate it.  TCL_EVAL_GLOBAL means evaluate
the command at global level instead of the current stack level.
.BE

.SH DESCRIPTION
.PP
\fBTcl_RecordAndEvalObj\fR is invoked to record a command as an event
on the history list and then execute it using \fBTcl_EvalObjEx\fR
(or \fBTcl_GlobalEvalObj\fR if the TCL_EVAL_GLOBAL bit is set
in \fIflags\fR).
It returns a completion code such as TCL_OK just like \fBTcl_EvalObjEx\fR,
as well as a result object containing additional information
(a result value or error message)
that can be retrieved using \fBTcl_GetObjResult\fR.
If you don't want the command recorded on the history list then
you should invoke \fBTcl_EvalObjEx\fR instead of \fBTcl_RecordAndEvalObj\fR.
Normally \fBTcl_RecordAndEvalObj\fR is only called with top-level
commands typed by the user, since the purpose of history is to
allow the user to re-issue recently-invoked commands.
If the \fIflags\fR argument contains the TCL_NO_EVAL bit then
the command is recorded without being evaluated.

.SH "SEE ALSO"
Tcl_EvalObjEx, Tcl_GetObjResult

.SH KEYWORDS
command, event, execute, history, interpreter, object, record
Changes to doc/RegExp.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1998-1999 Scriptics Corportation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RegExp.3,v 1.6 1999/12/21 23:57:33 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_RegExpMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegExpMatch, Tcl_RegExpCompile, Tcl_RegExpExec, Tcl_RegExpRange, Tcl_GetRegExpFromObj, Tcl_RegExpMatchObj, Tcl_GetRegExpInfo \- Pattern matching with regular expressions
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_RegExpMatchObj\fR(\fIinterp\fR, \fIstrObj\fR, \fIpatObj\fR)
.sp








|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1998-1999 Scriptics Corportation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: RegExp.3,v 1.6.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_RegExpMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_RegExpMatch, Tcl_RegExpCompile, Tcl_RegExpExec, Tcl_RegExpRange, Tcl_GetRegExpFromObj, Tcl_RegExpMatchObj, Tcl_RegExpExecObj, Tcl_RegExpGetInfo \- Pattern matching with regular expressions
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_RegExpMatchObj\fR(\fIinterp\fR, \fIstrObj\fR, \fIpatObj\fR)
.sp
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.sp
Tcl_RegExp
\fBTcl_GetRegExpFromObj\fR(\fIinterp\fR, \fIpatObj\fR, \fIcflags\fR)
.sp
int
\fBTcl_RegExpExecObj\fR(\fIinterp\fR, \fIregexp\fR, \fIobjPtr\fR, \fIoffset\fR, \fInmatches\fR, \fIeflags\fR)
.sp
\fBTcl_GetRegExpInfo\fR(\fIregexp\fR, \fIinfoPtr\fR)
.VE 8.1

.SH ARGUMENTS
.AS Tcl_Interp *interp
.AP Tcl_Interp *interp in
Tcl interpreter to use for error reporting.  The interpreter may be
NULL if no error reporting is desired.







|







34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.sp
Tcl_RegExp
\fBTcl_GetRegExpFromObj\fR(\fIinterp\fR, \fIpatObj\fR, \fIcflags\fR)
.sp
int
\fBTcl_RegExpExecObj\fR(\fIinterp\fR, \fIregexp\fR, \fIobjPtr\fR, \fIoffset\fR, \fInmatches\fR, \fIeflags\fR)
.sp
\fBTcl_RegExpGetInfo\fR(\fIregexp\fR, \fIinfoPtr\fR)
.VE 8.1

.SH ARGUMENTS
.AS Tcl_Interp *interp
.AP Tcl_Interp *interp in
Tcl interpreter to use for error reporting.  The interpreter may be
NULL if no error reporting is desired.
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
value will be taken as the maximum number of subexpressions to
remember.
.AP int eflags in
OR-ed combination of the values TCL_REG_NOTBOL and TCL_REG_NOTEOL.
See below for more information.
.AP Tcl_RegExpInfo *infoPtr out
The address of the location where information about a previous match
should be stored by \fBTcl_GetRegExpInfo\fR.
.VE 8.1
.BE

.SH DESCRIPTION
.PP
\fBTcl_RegExpMatch\fR determines whether its \fIpattern\fR argument
matches \fIregexp\fR, where \fIregexp\fR is interpreted







|







95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
value will be taken as the maximum number of subexpressions to
remember.
.AP int eflags in
OR-ed combination of the values TCL_REG_NOTBOL and TCL_REG_NOTEOL.
See below for more information.
.AP Tcl_RegExpInfo *infoPtr out
The address of the location where information about a previous match
should be stored by \fBTcl_RegExpGetInfo\fR.
.VE 8.1
.BE

.SH DESCRIPTION
.PP
\fBTcl_RegExpMatch\fR determines whether its \fIpattern\fR argument
matches \fIregexp\fR, where \fIregexp\fR is interpreted
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
information is returned about the range of characters that matched the
\fIindex\fR'th parenthesized subexpression within the pattern.
If there is no range corresponding to \fIindex\fR then NULL
is stored in \fI*firstPtr\fR and \fI*lastPtr\fR.
.PP
.VS 8.1
\fBTcl_GetRegExpFromObj\fR, \fBTcl_RegExpExecObj\fR, and
\fBTcl_GetRegExpInfo\fR are object interfaces that provide the most
direct control of Henry Spencer's regular expression library.  For
users that need to modify compilation and execution options directly,
it is recommended that you use these interfaces instead of calling the
internal regexp functions.  These interfaces handle the details of UTF
to Unicode translations as well as providing improved performance
through caching in the pattern and string objects.
.PP
\fBTcl_GetRegExpFromObj\fR attepts to return a compiled regular
expression from the \fIpatObj\fR.  If the object does not already
contain a compiled regular expression it will attempt to create one
from the string in the object and assign it to the internal
representation of the \fIpatObj\fR.  The return value of this function
is of type \fBTcl_RegExp\fR.  The return value is a token for this
compiled form, which can be used in subsequent calls to
\fBTcl_RegExpExecObj\fR or \fBTcl_GetRegExpInfo\fR.  If an error
occurs while compiling the regular expression then
\fBTcl_GetRegExpFromObj\fR returns NULL and leaves an error message in
the interpreter result.  The regular expression token can be used as
long as the internal representation of \fIpatObj\fR refers to the
compiled form.  The \fIeflags\fR argument is a bitwise OR of
zero or more of the following flags that control the compilation of
\fIpatObj\fR:







|














|







166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
information is returned about the range of characters that matched the
\fIindex\fR'th parenthesized subexpression within the pattern.
If there is no range corresponding to \fIindex\fR then NULL
is stored in \fI*firstPtr\fR and \fI*lastPtr\fR.
.PP
.VS 8.1
\fBTcl_GetRegExpFromObj\fR, \fBTcl_RegExpExecObj\fR, and
\fBTcl_RegExpGetInfo\fR are object interfaces that provide the most
direct control of Henry Spencer's regular expression library.  For
users that need to modify compilation and execution options directly,
it is recommended that you use these interfaces instead of calling the
internal regexp functions.  These interfaces handle the details of UTF
to Unicode translations as well as providing improved performance
through caching in the pattern and string objects.
.PP
\fBTcl_GetRegExpFromObj\fR attepts to return a compiled regular
expression from the \fIpatObj\fR.  If the object does not already
contain a compiled regular expression it will attempt to create one
from the string in the object and assign it to the internal
representation of the \fIpatObj\fR.  The return value of this function
is of type \fBTcl_RegExp\fR.  The return value is a token for this
compiled form, which can be used in subsequent calls to
\fBTcl_RegExpExecObj\fR or \fBTcl_RegExpGetInfo\fR.  If an error
occurs while compiling the regular expression then
\fBTcl_GetRegExpFromObj\fR returns NULL and leaves an error message in
the interpreter result.  The regular expression token can be used as
long as the internal representation of \fIpatObj\fR refers to the
compiled form.  The \fIeflags\fR argument is a bitwise OR of
zero or more of the following flags that control the compilation of
\fIpatObj\fR:
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
`[^' bracket expressions and `.'.  In this mode `^' matches an empty string
after any newline in addition to its normal function, and `$' matches
an empty string before any newline in addition to its normal function.
.TP
\fBTCL_REG_NOSUB\fR
Compile for matching that reports only success or failure,
not what was matched.  This reduces compile overhead and may improve
performance.  Subsequent calls to \fBTcl_GetRegExpInfo\fR or
\fBTcl_RegExpRange\fR will not report any match information.
.TP
\fBTCL_REG_CANMATCH\fR
Compile for matching that reports the potential to complete a partial
match given more text (see below).
.RE
.PP







|







247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
`[^' bracket expressions and `.'.  In this mode `^' matches an empty string
after any newline in addition to its normal function, and `$' matches
an empty string before any newline in addition to its normal function.
.TP
\fBTCL_REG_NOSUB\fR
Compile for matching that reports only success or failure,
not what was matched.  This reduces compile overhead and may improve
performance.  Subsequent calls to \fBTcl_RegExpGetInfo\fR or
\fBTcl_RegExpRange\fR will not report any match information.
.TP
\fBTCL_REG_CANMATCH\fR
Compile for matching that reports the potential to complete a partial
match given more text (see below).
.RE
.PP
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
.TP
\fBTCL_REG_NOTEOL\fR
The last character in the string will not be treated as the end of a
line or the end of the string, so '$' will not match there.
Note that this flag has no effect on how `\fB\eZ\fR' matches.
.RE
.PP
\fBTcl_GetRegExpInfo\fR retrieves information about the last match
performed with a given regular expression \fIregexp\fR.  The
\fIinfoPtr\fR argument contains a pointer to a structure that is
defined as follows:
.PP
.CS
typedef struct Tcl_RegExpInfo {
	int \fInsubs\fR;







|







290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
.TP
\fBTCL_REG_NOTEOL\fR
The last character in the string will not be treated as the end of a
line or the end of the string, so '$' will not match there.
Note that this flag has no effect on how `\fB\eZ\fR' matches.
.RE
.PP
\fBTcl_RegExpGetInfo\fR retrieves information about the last match
performed with a given regular expression \fIregexp\fR.  The
\fIinfoPtr\fR argument contains a pointer to a structure that is
defined as follows:
.PP
.CS
typedef struct Tcl_RegExpInfo {
	int \fInsubs\fR;
Changes to doc/SetResult.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SetResult.3,v 1.5 2000/04/14 23:01:53 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SetObjResult, Tcl_GetObjResult, Tcl_SetResult, Tcl_GetStringResult, Tcl_AppendResult, Tcl_AppendResultVA, Tcl_AppendElement, Tcl_ResetResult \- manipulate Tcl result
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_SetObjResult\fR(\fIinterp, objPtr\fR)
.sp
Tcl_Obj *







|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SetResult.3,v 1.5.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SetObjResult, Tcl_GetObjResult, Tcl_SetResult, Tcl_GetStringResult, Tcl_AppendResult, Tcl_AppendResultVA, Tcl_AppendElement, Tcl_ResetResult, Tcl_FreeResult \- manipulate Tcl result
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_SetObjResult\fR(\fIinterp, objPtr\fR)
.sp
Tcl_Obj *
Changes to doc/SplitList.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SplitList.3,v 1.3 2000/04/14 23:01:53 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SplitList 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement \- manipulate Tcl lists
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_SplitList\fR(\fIinterp, list, argcPtr, argvPtr\fR)
.sp







|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: SplitList.3,v 1.3.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_SplitList 3 8.0 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement, Tcl_ScanCountedElement, Tcl_ConvertCountedElement \- manipulate Tcl lists
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_SplitList\fR(\fIinterp, list, argcPtr, argvPtr\fR)
.sp
Changes to doc/StrMatch.3.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: StrMatch.3,v 1.3 1999/05/22 01:20:11 stanton Exp $
'\" 
.so man.macros
.TH Tcl_StringMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_StringMatch, Tcl_StringCaseMatch \- test whether a string matches a pattern
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_StringMatch\fR(\fIstring\fR, \fIpattern\fR)
.VS 8.1
.sp

\fBTcl_StringCaseMatch\fR(\fIstring, pattern, nocase\fR)
.VE 8.1
.SH ARGUMENTS
.AP char *string in
String to test.
.AP char *pattern in
Pattern to match against string.  May contain special
characters from the set *?\e[].
.VS 8.1
.AP int nocase in
Specifies whether the match should be done case-sensitive (0) or
case-insensitive (1).
.VE 8.1
.BE

.SH DESCRIPTION
.PP
This utility procedure determines whether a string matches
a given pattern.  If it does, then \fBTcl_StringMatch\fR returns
1.  Otherwise \fBTcl_StringMatch\fR returns 0.  The algorithm







|












<

>
|
<






<



<







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
26
27
28
29

30
31
32

33
34
35
36
37
38
39
'\"
'\" Copyright (c) 1989-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: StrMatch.3,v 1.3.10.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH Tcl_StringMatch 3 8.1 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_StringMatch, Tcl_StringCaseMatch \- test whether a string matches a pattern
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
int
\fBTcl_StringMatch\fR(\fIstring\fR, \fIpattern\fR)

.sp
int
\fBTcl_StringCaseMatch\fR(\fIstring\fR, \fIpattern\fR, \fInocase\fR)

.SH ARGUMENTS
.AP char *string in
String to test.
.AP char *pattern in
Pattern to match against string.  May contain special
characters from the set *?\e[].

.AP int nocase in
Specifies whether the match should be done case-sensitive (0) or
case-insensitive (1).

.BE

.SH DESCRIPTION
.PP
This utility procedure determines whether a string matches
a given pattern.  If it does, then \fBTcl_StringMatch\fR returns
1.  Otherwise \fBTcl_StringMatch\fR returns 0.  The algorithm
Changes to doc/Thread.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1999 Scriptics Corporation
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Thread.3,v 1.11 2000/04/25 23:03:53 hobbs Exp $
'\" 
.so man.macros
.TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize \- Tcl thread support.
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
void
\fBTcl_ConditionNotify\fR(\fIcondPtr\fR)
.sp







|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'\"
'\" Copyright (c) 1999 Scriptics Corporation
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: Thread.3,v 1.11.2.1 2000/08/07 21:29:38 hobbs Exp $
'\" 
.so man.macros
.TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread \- Tcl thread support.
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
void
\fBTcl_ConditionNotify\fR(\fIcondPtr\fR)
.sp
55
56
57
58
59
60
61


62
63
64
65
66
67
68
69
70
71



72
73
74
75
76
77
78
.AP int *size in
The size of the thread local storage block.  This amount of data
is allocated and initialized to zero the first time each thread
calls \fBTcl_GetThreadData\fR.
.AP Tcl_ThreadId *idPtr out
The refered storage will contain the id of the newly created thread as
returned by the operating system.


.AP Tcl_ThreadCreateProc threadProc in
This procedure will act as the \fBmain()\fR of the newly created
thread. The specified \fIclientData\fR will be its sole argument.
.AP ClientData clientData in
Arbitrary information. Passed as sole argument to the \fIthreadProc\fR.
.AP int stackSize in
The size of the stack given to the new thread.
.AP int flags in
Bitmask containing flags allowing the caller to modify behaviour of
the new thread.



.BE
.SH INTRODUCTION
Beginning with the 8.1 release, the Tcl core is thread safe, which
allows you to incorporate Tcl into multithreaded applications without
customizing the Tcl core.  To enable Tcl multithreading support,
you must include the \fB--enable-threads\fR option to \fBconfigure\fR
when you configure and compile your Tcl core.







>
>










>
>
>







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
.AP int *size in
The size of the thread local storage block.  This amount of data
is allocated and initialized to zero the first time each thread
calls \fBTcl_GetThreadData\fR.
.AP Tcl_ThreadId *idPtr out
The refered storage will contain the id of the newly created thread as
returned by the operating system.
.AP Tcl_ThreadId id in
Id of the thread waited upon.
.AP Tcl_ThreadCreateProc threadProc in
This procedure will act as the \fBmain()\fR of the newly created
thread. The specified \fIclientData\fR will be its sole argument.
.AP ClientData clientData in
Arbitrary information. Passed as sole argument to the \fIthreadProc\fR.
.AP int stackSize in
The size of the stack given to the new thread.
.AP int flags in
Bitmask containing flags allowing the caller to modify behaviour of
the new thread.
.AP int *result out
The refered storage is used to place the exit code of the thread
waited upon into it.
.BE
.SH INTRODUCTION
Beginning with the 8.1 release, the Tcl core is thread safe, which
allows you to incorporate Tcl into multithreaded applications without
customizing the Tcl core.  To enable Tcl multithreading support,
you must include the \fB--enable-threads\fR option to \fBconfigure\fR
when you configure and compile your Tcl core.
Changes to doc/after.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: after.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH after n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
after \- Execute a command after a time delay







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: after.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH after n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
after \- Execute a command after a time delay
99
100
101
102
103
104
105
106
107
108
109
assume that the application is event driven:  the delayed commands
will not be executed unless the application enters the event loop.
In applications that are not normally event-driven, such as
\fBtclsh\fR, the event loop can be entered with the \fBvwait\fR
and \fBupdate\fR commands.

.SH "SEE ALSO"
bgerror

.SH KEYWORDS
cancel, delay, idle callback, sleep, time







|



99
100
101
102
103
104
105
106
107
108
109
assume that the application is event driven:  the delayed commands
will not be executed unless the application enters the event loop.
In applications that are not normally event-driven, such as
\fBtclsh\fR, the event loop can be entered with the \fBvwait\fR
and \fBupdate\fR commands.

.SH "SEE ALSO"
bgerror(n), concat(n), update(n), vwait(n)

.SH KEYWORDS
cancel, delay, idle callback, sleep, time
Changes to doc/append.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: append.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH append n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
append \- Append to variable







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: append.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH append n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
append \- Append to variable
24
25
26
27
28
29
30



31
32
it is given a value equal to the concatenation of all the
\fIvalue\fR arguments.
This command provides an efficient way to build up long
variables incrementally.
For example, ``\fBappend a $b\fR'' is much more efficient than
``\fBset a $a$b\fR'' if \fB$a\fR is long.




.SH KEYWORDS
append, variable







>
>
>


24
25
26
27
28
29
30
31
32
33
34
35
it is given a value equal to the concatenation of all the
\fIvalue\fR arguments.
This command provides an efficient way to build up long
variables incrementally.
For example, ``\fBappend a $b\fR'' is much more efficient than
``\fBset a $a$b\fR'' if \fB$a\fR is long.

.SH "SEE ALSO"
concat(n), lappend(n)

.SH KEYWORDS
append, variable
Changes to doc/bgerror.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: bgerror.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH bgerror n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
bgerror \- Command invoked to process background errors







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: bgerror.n,v 1.2.18.2 2001/08/06 22:24:11 andreas_kupries Exp $
'\" 
.so man.macros
.TH bgerror n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
bgerror \- Command invoked to process background errors
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65


66
67
68
A background error is one that occurs in an event handler or some
other command that didn't originate with the application.
For example, if an error occurs while executing a command specified
with the \fBafter\fR command, then it is a background error.
For a non-background error, the error can simply be returned up
through nested Tcl command evaluations until it reaches the top-level
code in the application; then the application can report the error
in whatever way it wishes.
When a background error occurs, the unwinding ends in
the Tcl library and there is no obvious way for Tcl to report
the error.
.PP
When Tcl detects a background error, it saves information about the
error and invokes the \fBbgerror\fR command later as an idle event handler.
Before invoking \fBbgerror\fR, Tcl restores the \fBerrorInfo\fR
and \fBerrorCode\fR variables to their values at the time the
error occurred, then it invokes \fBbgerror\fR with
the error message as its only argument.
Tcl assumes that the application has implemented the \fBbgerror\fR
command, and that the command will report the error in a way that
makes sense for the application.  Tcl will ignore any result returned
by the \fBbgerror\fR command as long as no error is generated.
.PP
If another Tcl error occurs within the \fBbgerror\fR command
(for example, because no \fBbgerror\fR command has been defined)
then Tcl reports the error itself by writing a message to stderr.
.PP
If several background errors accumulate before \fBbgerror\fR
is invoked to process them, \fBbgerror\fR will be invoked once
for each error, in the order they occurred.
However, if \fBbgerror\fR returns with a break exception, then
any remaining errors are skipped without calling \fBbgerror\fR.
.PP
Tcl has no default implementation for \fBbgerror\fR.
However, in applications using Tk there is a default
\fBbgerror\fR procedure
which posts a dialog box containing
the error message and offers the user a chance to see a stack
trace showing where the error occurred.



.SH KEYWORDS
background error, reporting







|
<
|
|


|
|
|
|
|
|
|
|
|

|
|
|

|
|
|
|
|

|
|
<
<
|
|
>
>



27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60


61
62
63
64
65
66
67
A background error is one that occurs in an event handler or some
other command that didn't originate with the application.
For example, if an error occurs while executing a command specified
with the \fBafter\fR command, then it is a background error.
For a non-background error, the error can simply be returned up
through nested Tcl command evaluations until it reaches the top-level
code in the application; then the application can report the error
in whatever way it wishes.  When a background error occurs, the

unwinding ends in the Tcl library and there is no obvious way for Tcl
to report the error.
.PP
When Tcl detects a background error, it saves information about the
error and invokes the \fBbgerror\fR command later as an idle event
handler. Before invoking \fBbgerror\fR, Tcl restores the
\fBerrorInfo\fR and \fBerrorCode\fR variables to their values at the
time the error occurred, then it invokes \fBbgerror\fR with the error
message as its only argument.  Tcl assumes that the application has
implemented the \fBbgerror\fR command, and that the command will
report the error in a way that makes sense for the application.  Tcl
will ignore any result returned by the \fBbgerror\fR command as long
as no error is generated.
.PP
If another Tcl error occurs within the \fBbgerror\fR command (for
example, because no \fBbgerror\fR command has been defined) then Tcl
reports the error itself by writing a message to stderr.
.PP
If several background errors accumulate before \fBbgerror\fR is
invoked to process them, \fBbgerror\fR will be invoked once for each
error, in the order they occurred.  However, if \fBbgerror\fR returns
with a break exception, then any remaining errors are skipped without
calling \fBbgerror\fR.
.PP
Tcl has no default implementation for \fBbgerror\fR. However, in
applications using Tk there is a default \fBbgerror\fR procedure which


posts a dialog box containing the error message and offers the user a
chance to see a stack trace showing where the error occurred.
.SH "SEE ALSO"
after(n), tclvars(n)

.SH KEYWORDS
background error, reporting
Changes to doc/binary.n.
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
26
27
28
29
30
31
32
33
34
35
36
'\"
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: binary.n,v 1.4 2000/04/08 02:35:17 hobbs Exp $
'\" 
.so man.macros
.TH binary n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
binary \- Insert and extract fields from binary strings
.SH SYNOPSIS
\fBbinary format \fIformatString \fR?\fIarg arg ...\fR?
.br
\fBbinary scan \fIstring formatString \fR?\fIvarName varName ...\fR?
.BE

.SH DESCRIPTION
.PP
This command provides facilities for manipulating binary data.  The
first form, \fBbinary format\fR, creates a binary string from normal
Tcl values.  For example, given the values 16 and 22, it might produce
an 8-byte binary string consisting of two 4-byte integers, one for
each of the numbers.  The second form of the command, 
\fBbinary scan\fR, does the opposite: it extracts data from a binary
string and returns it as ordinary Tcl string values.

.SH "BINARY FORMAT"
.PP
The \fBbinary format\fR command generates a binary string whose layout
is specified by the \fIformatString\fR and whose contents come from
the additional arguments.  The resulting binary value is returned.
.PP






|

















|
|
|
|
|







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
26
27
28
29
30
31
32
33
34
35
36
'\"
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: binary.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH binary n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
binary \- Insert and extract fields from binary strings
.SH SYNOPSIS
\fBbinary format \fIformatString \fR?\fIarg arg ...\fR?
.br
\fBbinary scan \fIstring formatString \fR?\fIvarName varName ...\fR?
.BE

.SH DESCRIPTION
.PP
This command provides facilities for manipulating binary data.  The
first form, \fBbinary format\fR, creates a binary string from normal
Tcl values.  For example, given the values 16 and 22, on a 32 bit
architecture, it might produce an 8-byte binary string consisting of
two 4-byte integers, one for each of the numbers.  The second form of
the command, \fBbinary scan\fR, does the opposite: it extracts data
from a binary string and returns it as ordinary Tcl string values.

.SH "BINARY FORMAT"
.PP
The \fBbinary format\fR command generates a binary string whose layout
is specified by the \fIformatString\fR and whose contents come from
the additional arguments.  The resulting binary value is returned.
.PP
538
539
540
541
542
543
544
545
546
547
548
.SH "PLATFORM ISSUES"
Sometimes it is desirable to format or scan integer values in the
native byte order for the machine.  Refer to the \fBbyteOrder\fR
element of the \fBtcl_platform\fR array to decide which type character
to use when formatting or scanning integers.

.SH "SEE ALSO"
format, scan, tclvars

.SH KEYWORDS
binary, format, scan







|



538
539
540
541
542
543
544
545
546
547
548
.SH "PLATFORM ISSUES"
Sometimes it is desirable to format or scan integer values in the
native byte order for the machine.  Refer to the \fBbyteOrder\fR
element of the \fBtcl_platform\fR array to decide which type character
to use when formatting or scanning integers.

.SH "SEE ALSO"
format(n), scan(n), tclvars(n)

.SH KEYWORDS
binary, format, scan
Changes to doc/break.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: break.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH break n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
break \- Abort looping command







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: break.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH break n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
break \- Abort looping command
26
27
28
29
30
31
32



33
34
The exception causes the current script to be aborted
out to the innermost containing loop command, which then
aborts its execution and returns normally.
Break exceptions are also handled in a few other situations, such
as the \fBcatch\fR command, Tk event bindings, and the outermost
scripts of procedure bodies.




.SH KEYWORDS
abort, break, loop







>
>
>


26
27
28
29
30
31
32
33
34
35
36
37
The exception causes the current script to be aborted
out to the innermost containing loop command, which then
aborts its execution and returns normally.
Break exceptions are also handled in a few other situations, such
as the \fBcatch\fR command, Tk event bindings, and the outermost
scripts of procedure bodies.

.SH "SEE ALSO"
catch(n), continue(n), for(n), foreach(n), while(n)

.SH KEYWORDS
abort, break, loop
Changes to doc/case.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: case.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH case n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
case \- Evaluate one of several scripts, depending on a given value







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: case.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH case n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
case \- Evaluate one of several scripts, depending on a given value
50
51
52
53
54
55
56



57
58
59
The second form makes it easy to construct multi-line case commands,
since the braces around the whole list make it unnecessary to include a
backslash at the end of each line.
Since the \fIpatList\fR arguments are in braces in the second form,
no command or variable substitutions are performed on them;  this makes
the behavior of the second form different than the first form in some
cases.




.SH KEYWORDS
case, match, regular expression







>
>
>



50
51
52
53
54
55
56
57
58
59
60
61
62
The second form makes it easy to construct multi-line case commands,
since the braces around the whole list make it unnecessary to include a
backslash at the end of each line.
Since the \fIpatList\fR arguments are in braces in the second form,
no command or variable substitutions are performed on them;  this makes
the behavior of the second form different than the first form in some
cases.

.SH "SEE ALSO"
switch(n)

.SH KEYWORDS
case, match, regular expression
Changes to doc/cd.n.
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
26



27
28
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: cd.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH cd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
cd \- Change working directory
.SH SYNOPSIS
\fBcd \fR?\fIdirName\fR?
.BE

.SH DESCRIPTION
.PP
Change the current working directory to \fIdirName\fR, or to the
home directory (as specified in the HOME environment variable) if
\fIdirName\fR is not given.
Returns an empty string.




.SH KEYWORDS
working directory







|


















>
>
>


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
26
27
28
29
30
31
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: cd.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH cd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
cd \- Change working directory
.SH SYNOPSIS
\fBcd \fR?\fIdirName\fR?
.BE

.SH DESCRIPTION
.PP
Change the current working directory to \fIdirName\fR, or to the
home directory (as specified in the HOME environment variable) if
\fIdirName\fR is not given.
Returns an empty string.

.SH "SEE ALSO"
filename(n), glob(n), pwd(n)

.SH KEYWORDS
working directory
Changes to doc/close.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: close.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH close n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
close \- Close an open channel.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: close.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH close n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
close \- Close an open channel.
51
52
53
54
55
56
57



58
59
when the process exits.  Channels are switched to blocking mode, to ensure
that all output is correctly flushed before the process exits.
.VE
.PP
The command returns an empty string, and may generate an error if
an error occurs while flushing output.




.SH KEYWORDS
blocking, channel, close, nonblocking







>
>
>


51
52
53
54
55
56
57
58
59
60
61
62
when the process exits.  Channels are switched to blocking mode, to ensure
that all output is correctly flushed before the process exits.
.VE
.PP
The command returns an empty string, and may generate an error if
an error occurs while flushing output.

.SH "SEE ALSO"
file(n), open(n), socket(n), eof(n)

.SH KEYWORDS
blocking, channel, close, nonblocking
Changes to doc/concat.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: concat.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH concat n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
concat \- Join lists together







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: concat.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH concat n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
concat \- Join lists together
32
33
34
35
36
37
38



39
40
.CS
\fBa b c d e f {g h}\fR
.CE
as its result.
.PP
If no \fIarg\fRs are supplied, the result is an empty string.




.SH KEYWORDS
concatenate, join, lists







>
>
>


32
33
34
35
36
37
38
39
40
41
42
43
.CS
\fBa b c d e f {g h}\fR
.CE
as its result.
.PP
If no \fIarg\fRs are supplied, the result is an empty string.

.SH "SEE ALSO"
append(n), eval(n)

.SH KEYWORDS
concatenate, join, lists
Changes to doc/continue.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: continue.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH continue n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
continue \- Skip to the next iteration of a loop







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: continue.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH continue n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
continue \- Skip to the next iteration of a loop
26
27
28
29
30
31
32



33
34
The exception causes the current script to be aborted
out to the innermost containing loop command, which then
continues with the next iteration of the loop.
Catch exceptions are also handled in a few other situations, such
as the \fBcatch\fR command and the outermost scripts of procedure
bodies.




.SH KEYWORDS
continue, iteration, loop







>
>
>


26
27
28
29
30
31
32
33
34
35
36
37
The exception causes the current script to be aborted
out to the innermost containing loop command, which then
continues with the next iteration of the loop.
Catch exceptions are also handled in a few other situations, such
as the \fBcatch\fR command and the outermost scripts of procedure
bodies.

.SH "SEE ALSO"
break(n), for(n), foreach(n), while(n)

.SH KEYWORDS
continue, iteration, loop
Changes to doc/dde.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: dde.n,v 1.5 2000/04/12 18:41:54 hobbs Exp $
'\" 
.so man.macros
.TH dde n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
dde \- Execute a Dynamic Data Exchange command






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: dde.n,v 1.5.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH dde n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
dde \- Execute a Dynamic Data Exchange command
124
125
126
127
128
129
130

131
132

133
134
When using DDE, be careful to ensure that the event queue is flushed
using either \fBupdate\fR or \fBvwait\fR.  This happens by default
when using \fBwish\fR unless a blocking command is called (such as \fBexec\fR
without adding the \fB&\fR to place the process in the background).
If for any reason the event queue is not flushed, DDE commands may
hang until the event queue is flushed.  This can create a deadlock
situation.

.SH "SEE ALSO"
tk, winfo, send

.SH KEYWORDS
application, dde, name, remote execution







>

|
>


124
125
126
127
128
129
130
131
132
133
134
135
136
When using DDE, be careful to ensure that the event queue is flushed
using either \fBupdate\fR or \fBvwait\fR.  This happens by default
when using \fBwish\fR unless a blocking command is called (such as \fBexec\fR
without adding the \fB&\fR to place the process in the background).
If for any reason the event queue is not flushed, DDE commands may
hang until the event queue is flushed.  This can create a deadlock
situation.

.SH "SEE ALSO"
tk(n), winfo(n), send(n)

.SH KEYWORDS
application, dde, name, remote execution
Changes to doc/encoding.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1998 by Scriptics Corporation.
'\" 
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: encoding.n,v 1.2 1999/04/16 00:46:34 stanton Exp $
'\" 
.so man.macros
.TH encoding n "8.1" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
encoding \- Manipulate encodings
.SH SYNOPSIS






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1998 by Scriptics Corporation.
'\" 
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: encoding.n,v 1.2.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH encoding n "8.1" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
encoding \- Manipulate encodings
.SH SYNOPSIS
69
70
71
72
73
74
75
76
77
78
79
.CS
	set s [encoding convertfrom euc-jp "\\xA4\\xCF"]
.CE
would return the Unicode string "\\u306F", which is the Hiragana
letter HA.

.SH "SEE ALSO"
Tcl_GetEncoding

.SH KEYWORDS
encoding







|



69
70
71
72
73
74
75
76
77
78
79
.CS
	set s [encoding convertfrom euc-jp "\\xA4\\xCF"]
.CE
would return the Unicode string "\\u306F", which is the Hiragana
letter HA.

.SH "SEE ALSO"
Tcl_GetEncoding(3)

.SH KEYWORDS
encoding
Changes to doc/eof.n.
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



26
27
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eof.n,v 1.2 1998/09/14 18:39:51 stanton Exp $
'\" 
.so man.macros
.TH eof n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eof \- Check for end of file condition on channel
.SH SYNOPSIS
\fBeof \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
Returns 1 if an end of file condition occurred during the most
recent input operation on \fIchannelId\fR (such as \fBgets\fR),
0 otherwise.




.SH KEYWORDS
channel, end of file







|

















>
>
>


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
26
27
28
29
30
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eof.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH eof n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eof \- Check for end of file condition on channel
.SH SYNOPSIS
\fBeof \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
Returns 1 if an end of file condition occurred during the most
recent input operation on \fIchannelId\fR (such as \fBgets\fR),
0 otherwise.

.SH "SEE ALSO"
file(n), open(n), close(n), fblocked(n)

.SH KEYWORDS
channel, end of file
Changes to doc/error.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: error.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH error n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
error \- Generate an error







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: error.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH error n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
error \- Generate an error
50
51
52
53
54
55
56



57
58
such information is available; see the \fBtclvars\fR manual
page for information on the proper format for the variable.
If the \fIcode\fR argument is not
present, then \fBerrorCode\fR is automatically reset to
``NONE'' by the Tcl interpreter as part of processing the
error generated by the command.




.SH KEYWORDS
error, errorCode, errorInfo







>
>
>


50
51
52
53
54
55
56
57
58
59
60
61
such information is available; see the \fBtclvars\fR manual
page for information on the proper format for the variable.
If the \fIcode\fR argument is not
present, then \fBerrorCode\fR is automatically reset to
``NONE'' by the Tcl interpreter as part of processing the
error generated by the command.

.SH "SEE ALSO"
catch(n), tclvars(n)

.SH KEYWORDS
error, errorCode, errorInfo
Changes to doc/eval.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eval.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH eval n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eval \- Evaluate a Tcl script







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: eval.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH eval n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
eval \- Evaluate a Tcl script
24
25
26
27
28
29
30



\fBEval\fR concatenates all its arguments in the same
fashion as the \fBconcat\fR command, passes the concatenated string to the
Tcl interpreter recursively, and returns the result of that
evaluation (or any error generated by it).

.SH KEYWORDS
concatenate, evaluate, script










>
>
>
24
25
26
27
28
29
30
31
32
33
\fBEval\fR concatenates all its arguments in the same
fashion as the \fBconcat\fR command, passes the concatenated string to the
Tcl interpreter recursively, and returns the result of that
evaluation (or any error generated by it).

.SH KEYWORDS
concatenate, evaluate, script

.SH "SEE ALSO"
catch(n), concat(n), error(n), subs(n), tclvars(n)
Changes to doc/exec.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exec.n,v 1.4 1999/12/09 14:43:47 hobbs Exp $
'\" 
.so man.macros
.TH exec n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exec \- Invoke subprocess(es)







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exec.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH exec n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exec \- Invoke subprocess(es)
297
298
299
300
301
302
303
304
305
306
307
308
309
\fBMacintosh\fR
The \fBexec\fR command is not implemented and does not exist under Macintosh.
.TP
\fBUnix\fR\0\0\0\0\0\0\0
The \fBexec\fR command is fully functional and works as described.

.SH "SEE ALSO"
open(n)
.VE

.SH KEYWORDS
execute, pipeline, redirection, subprocess








|
<



<
297
298
299
300
301
302
303
304

305
306
307

\fBMacintosh\fR
The \fBexec\fR command is not implemented and does not exist under Macintosh.
.TP
\fBUnix\fR\0\0\0\0\0\0\0
The \fBexec\fR command is fully functional and works as described.

.SH "SEE ALSO"
error(n), open(n)


.SH KEYWORDS
execute, pipeline, redirection, subprocess

Changes to doc/exit.n.
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
26



27
28
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exit.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH exit n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exit \- End the application
.SH SYNOPSIS
\fBexit \fR?\fIreturnCode\fR?
.BE

.SH DESCRIPTION
.PP
Terminate the process, returning \fIreturnCode\fR to the
system as the exit status.
If \fIreturnCode\fR isn't specified then it defaults
to 0.




.SH KEYWORDS
exit, process







|


















>
>
>


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
26
27
28
29
30
31
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: exit.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH exit n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
exit \- End the application
.SH SYNOPSIS
\fBexit \fR?\fIreturnCode\fR?
.BE

.SH DESCRIPTION
.PP
Terminate the process, returning \fIreturnCode\fR to the
system as the exit status.
If \fIreturnCode\fR isn't specified then it defaults
to 0.

.SH "SEE ALSO"
exec(n), tclvars(n)

.SH KEYWORDS
exit, process
Changes to doc/expr.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: expr.n,v 1.3 2000/04/28 00:47:49 ericm Exp $
'\" 
.so man.macros
.TH expr n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
expr \- Evaluate an expression
.SH SYNOPSIS
\fBexpr \fIarg \fR?\fIarg arg ...\fR?
.BE


|




|


|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: expr.n,v 1.2.18.1 2000/08/07 21:29:39 hobbs Exp $
'\" 
.so man.macros
.TH expr n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
expr \- Evaluate an expression
.SH SYNOPSIS
\fBexpr \fIarg \fR?\fIarg arg ...\fR?
.BE
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
.CE
both return 1.  The first comparison is done using integer
comparison, and the second is done using string comparison after
the second operand is converted to the string \fB18\fR.
Because of Tcl's tendency to treat values as numbers whenever
possible, it isn't generally a good idea to use operators like \fB==\fR
when you really want string comparison and the values of the
operands could be arbitrary;  it's better in these cases to use the
\fBstring compare\fR command instead.

.SH "PERFORMANCE CONSIDERATIONS"
.VS
.PP
Enclose expressions in braces for the best speed and the smallest
storage requirements.
This allows the Tcl bytecode compiler to generate the best code.
.PP
As mentioned above, expressions are substituted twice:
once by the Tcl parser and once by the \fBexpr\fR command.







|
|


<







344
345
346
347
348
349
350
351
352
353
354

355
356
357
358
359
360
361
.CE
both return 1.  The first comparison is done using integer
comparison, and the second is done using string comparison after
the second operand is converted to the string \fB18\fR.
Because of Tcl's tendency to treat values as numbers whenever
possible, it isn't generally a good idea to use operators like \fB==\fR
when you really want string comparison and the values of the
operands could be arbitrary;  it's better in these cases to use
the \fBstring\fR command instead.

.SH "PERFORMANCE CONSIDERATIONS"

.PP
Enclose expressions in braces for the best speed and the smallest
storage requirements.
This allows the Tcl bytecode compiler to generate the best code.
.PP
As mentioned above, expressions are substituted twice:
once by the Tcl parser and once by the \fBexpr\fR command.
379
380
381
382
383
384
385
386
387
388
389
need two rounds of substitutions,
the bytecode compiler must emit
additional instructions to handle this situation.
The most expensive code is required for
unbraced expressions that contain command substitutions.
These expressions must be implemented by generating new code
each time the expression is executed.
.VE

.SH KEYWORDS
arithmetic, boolean, compare, expression, fuzzy comparison







<



378
379
380
381
382
383
384

385
386
387
need two rounds of substitutions,
the bytecode compiler must emit
additional instructions to handle this situation.
The most expensive code is required for
unbraced expressions that contain command substitutions.
These expressions must be implemented by generating new code
each time the expression is executed.


.SH KEYWORDS
arithmetic, boolean, compare, expression, fuzzy comparison
Changes to doc/fblocked.n.
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
26
27

28
29
30
31
32
'\" 
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: fblocked.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
.so man.macros
.TH fblocked n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fblocked \- Test whether the last input operation exhausted all available input
.SH SYNOPSIS
\fBfblocked \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
The \fBfblocked\fR command returns 1 if the most recent input operation
on \fIchannelId\fR returned less information than requested because all
available input was exhausted.
For example, if \fBgets\fR is invoked when there are only three
characters available for input and no end-of-line sequence, \fBgets\fR
returns an empty string and a subsequent call to \fBfblocked\fR will
return 1.
.PP

.SH "SEE ALSO"
gets(n), read(n)

.SH KEYWORDS
blocking, nonblocking






|




















>

|



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
26
27
28
29
30
31
32
33
'\" 
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: fblocked.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
.so man.macros
.TH fblocked n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fblocked \- Test whether the last input operation exhausted all available input
.SH SYNOPSIS
\fBfblocked \fIchannelId\fR
.BE

.SH DESCRIPTION
.PP
The \fBfblocked\fR command returns 1 if the most recent input operation
on \fIchannelId\fR returned less information than requested because all
available input was exhausted.
For example, if \fBgets\fR is invoked when there are only three
characters available for input and no end-of-line sequence, \fBgets\fR
returns an empty string and a subsequent call to \fBfblocked\fR will
return 1.
.PP

.SH "SEE ALSO"
gets(n), open(n), read(n)

.SH KEYWORDS
blocking, nonblocking
Changes to doc/fileevent.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: fileevent.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH fileevent n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fileevent \- Execute a script when a channel becomes readable or writable







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: fileevent.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH fileevent n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
fileevent \- Execute a script when a channel becomes readable or writable
98
99
100
101
102
103
104
105
106
107
108
109

.SH CREDITS
.PP
\fBfileevent\fR is based on the \fBaddinput\fR command created
by Mark Diekhans.

.SH "SEE ALSO"
bgerror, fconfigure, gets, puts, read

.SH KEYWORDS
asynchronous I/O, blocking, channel, event handler, nonblocking, readable,
script, writable.







|




98
99
100
101
102
103
104
105
106
107
108
109

.SH CREDITS
.PP
\fBfileevent\fR is based on the \fBaddinput\fR command created
by Mark Diekhans.

.SH "SEE ALSO"
bgerror(n), fconfigure(n), gets(n), puts(n), read(n)

.SH KEYWORDS
asynchronous I/O, blocking, channel, event handler, nonblocking, readable,
script, writable.
Changes to doc/filename.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: filename.n,v 1.3 1999/08/21 19:40:48 hobbs Exp $
'\" 
.so man.macros
.TH filename n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
filename \- File name conventions supported by Tcl commands






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: filename.n,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH filename n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
filename \- File name conventions supported by Tcl commands
191
192
193
194
195
196
197



alphanumeric characters only.  Also Windows 3.1 only supports file
names with a root of no more than 8 characters and an extension of no
more than 3 characters.

.SH KEYWORDS
current directory, absolute file name, relative file name,
volume-relative file name, portability










>
>
>
191
192
193
194
195
196
197
198
199
200
alphanumeric characters only.  Also Windows 3.1 only supports file
names with a root of no more than 8 characters and an extension of no
more than 3 characters.

.SH KEYWORDS
current directory, absolute file name, relative file name,
volume-relative file name, portability

.SH "SEE ALSO"
file(n), glob(n)
Changes to doc/flush.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: flush.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH flush n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
flush \- Flush buffered output for a channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: flush.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH flush n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
flush \- Flush buffered output for a channel
25
26
27
28
29
30
31
32
33
34
35
If the channel is in blocking mode the command does not return until all the
buffered output has been flushed to the channel. If the channel is in
nonblocking mode, the command may return before all buffered output has been
flushed; the remainder will be flushed in the background as fast as the
underlying file or device is able to absorb it.

.SH "SEE ALSO"
open(n), socket(n)

.SH KEYWORDS
blocking, buffer, channel, flush, nonblocking, output







|



25
26
27
28
29
30
31
32
33
34
35
If the channel is in blocking mode the command does not return until all the
buffered output has been flushed to the channel. If the channel is in
nonblocking mode, the command may return before all buffered output has been
flushed; the remainder will be flushed in the background as fast as the
underlying file or device is able to absorb it.

.SH "SEE ALSO"
file(n), open(n), socket(n)

.SH KEYWORDS
blocking, buffer, channel, flush, nonblocking, output
Changes to doc/for.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: for.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH for n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
for \- ``For'' loop







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: for.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH for n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
for \- ``For'' loop
52
53
54
55
56
57
58



59
60
around \fB$x<10\fR:
.CS
for {set x 0} {$x<10} {incr x} {
	puts "x is $x"
}
.CE




.SH KEYWORDS
for, iteration, looping







>
>
>


52
53
54
55
56
57
58
59
60
61
62
63
around \fB$x<10\fR:
.CS
for {set x 0} {$x<10} {incr x} {
	puts "x is $x"
}
.CE

.SH "SEE ALSO"
break, continue, foreach, while

.SH KEYWORDS
for, iteration, looping
Changes to doc/foreach.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: foreach.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH foreach n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
foreach \- Iterate over all elements in one or more lists







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: foreach.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH foreach n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
foreach \- Iterate over all elements in one or more lists
78
79
80
81
82
83
84




85
86
set x {}
foreach i {a b c} {j k} {d e f g} {
    lappend x $i $j $k
}
# The value of x is "a d e b f g c {} {}"
# There are 3 iterations of the loop.
.DE




.SH KEYWORDS
foreach, iteration, list, looping







>
>
>
>


78
79
80
81
82
83
84
85
86
87
88
89
90
set x {}
foreach i {a b c} {j k} {d e f g} {
    lappend x $i $j $k
}
# The value of x is "a d e b f g c {} {}"
# There are 3 iterations of the loop.
.DE

.SH "SEE ALSO"
for(n), while(n), break(n), continue(n)

.SH KEYWORDS
foreach, iteration, list, looping
Changes to doc/format.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: format.n,v 1.4 1999/11/19 06:33:58 hobbs Exp $
'\" 
.so man.macros
.TH format n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
format \- Format a string in the style of sprintf







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: format.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH format n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
format \- Format a string in the style of sprintf
206
207
208
209
210
211
212



213
214
The \fBl\fR modifier is ignored;  integer values are always converted
as if there were no modifier present and real values are always
converted as if the \fBl\fR modifier were present (i.e. type
\fBdouble\fR is used for the internal representation).
If the \fBh\fR modifier is specified then integer values are truncated
to \fBshort\fR before conversion.




.SH KEYWORDS
conversion specifier, format, sprintf, string, substitution







>
>
>


206
207
208
209
210
211
212
213
214
215
216
217
The \fBl\fR modifier is ignored;  integer values are always converted
as if there were no modifier present and real values are always
converted as if the \fBl\fR modifier were present (i.e. type
\fBdouble\fR is used for the internal representation).
If the \fBh\fR modifier is specified then integer values are truncated
to \fBshort\fR before conversion.

.SH "SEE ALSO"
sprintf(3), string(n)

.SH KEYWORDS
conversion specifier, format, sprintf, string, substitution
Changes to doc/gets.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: gets.n,v 1.2 1998/09/14 18:39:52 stanton Exp $
'\" 
.so man.macros
.TH gets n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
gets \- Read a line from a channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: gets.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH gets n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
gets \- Read a line from a channel
40
41
42
43
44
45
46
47
48
49
50
and no-full-line-available cases can
produce the same results as if there were an input line consisting
only of the end-of-line character(s).
The \fBeof\fR and \fBfblocked\fR commands can be used to distinguish
these three cases.

.SH "SEE ALSO"
eof(n), fblocked(n)

.SH KEYWORDS
blocking, channel, end of file, end of line, line, nonblocking, read







|



40
41
42
43
44
45
46
47
48
49
50
and no-full-line-available cases can
produce the same results as if there were an input line consisting
only of the end-of-line character(s).
The \fBeof\fR and \fBfblocked\fR commands can be used to distinguish
these three cases.

.SH "SEE ALSO"
file(n), eof(n), fblocked(n)

.SH KEYWORDS
blocking, channel, end of file, end of line, line, nonblocking, read
Changes to doc/glob.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: glob.n,v 1.7 2000/01/26 03:37:30 hobbs Exp $
'\" 
.so man.macros
.TH glob n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
glob \- Return names of files that match patterns







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: glob.n,v 1.7.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH glob n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
glob \- Return names of files that match patterns
150
151
152
153
154
155
156


157
158
159
\fBMacintosh\fR 
. 
When using the options, \fB\-dir\fR, \fB\-join\fR or \fB\-path\fR, glob
assumes the directory separator for the entire pattern is the standard
``:''.  When not using these options, glob examines each pattern argument
and uses ``/'' unless the pattern contains a ``:''.




.SH KEYWORDS
exist, file, glob, pattern







>
>



150
151
152
153
154
155
156
157
158
159
160
161
\fBMacintosh\fR 
. 
When using the options, \fB\-dir\fR, \fB\-join\fR or \fB\-path\fR, glob
assumes the directory separator for the entire pattern is the standard
``:''.  When not using these options, glob examines each pattern argument
and uses ``/'' unless the pattern contains a ``:''.

.SH "SEE ALSO"
file(n)

.SH KEYWORDS
exist, file, glob, pattern
Changes to doc/global.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: global.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH global n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
global \- Access global variables







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: global.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH global n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
global \- Access global variables
23
24
25
26
27
28
29




30
31
32
33
34
35
If so then it declares the given \fIvarname\fR's to be global variables
rather than local ones.
Global variables are variables in the global namespace.
For the duration of the current procedure
(and only while executing in the current procedure),
any reference to any of the \fIvarname\fRs
will refer to the global variable by the same name.





.SH "SEE ALSO"
namespace(n), variable(n)

.SH KEYWORDS
global, namespace, procedure, variable







>
>
>
>


|



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
If so then it declares the given \fIvarname\fR's to be global variables
rather than local ones.
Global variables are variables in the global namespace.
For the duration of the current procedure
(and only while executing in the current procedure),
any reference to any of the \fIvarname\fRs
will refer to the global variable by the same name.
.PP
Please note that this is done by creating local variables that are
linked to the global variables, and therefore that these variables
will be listed by \fBinfo locals\fR like all other local variables.

.SH "SEE ALSO"
namespace(n), upvar(n), variable(n)

.SH KEYWORDS
global, namespace, procedure, variable
Changes to doc/http.n.
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
26
27
28
29
30
31
32
33
34


35


36
37
38
39
40
41
42
'\"
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1999 by Scriptics Corporation.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: http.n,v 1.10 2000/04/09 23:55:54 welch Exp $
'\" 
.so man.macros
.TH "Http" n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Http \- Client-side implementation of the HTTP/1.0 protocol.
.SH SYNOPSIS
\fBpackage require http ?2.2?\fP
.sp
\fB::http::config \fI?options?\fR
.sp
\fB::http::geturl \fIurl ?options?\fR
.sp
\fB::http::formatQuery \fIlist\fR
.sp
\fB::http::reset \fItoken\fR
.sp
\fB::http::wait \fItoken\fR
.sp
\fB::http::status \fItoken\fR
.sp
\fB::http::size \fItoken\fR
.sp
\fB::http::code \fItoken\fR
.sp


\fB::http::data \fItoken\fR


.sp
\fB::http::cleanup \fItoken\fR
.sp
\fB::http::register \fIproto port command\fR
.sp
\fB::http::unregister \fIproto\fR
.BE


|




|








|

















>
>

>
>







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'\"
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
'\" Copyright (c) 1998-2000 by Ajuba Solutions.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: http.n,v 1.10.2.2 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH "Http" n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Http \- Client-side implementation of the HTTP/1.0 protocol.
.SH SYNOPSIS
\fBpackage require http ?2.3?\fP
.sp
\fB::http::config \fI?options?\fR
.sp
\fB::http::geturl \fIurl ?options?\fR
.sp
\fB::http::formatQuery \fIlist\fR
.sp
\fB::http::reset \fItoken\fR
.sp
\fB::http::wait \fItoken\fR
.sp
\fB::http::status \fItoken\fR
.sp
\fB::http::size \fItoken\fR
.sp
\fB::http::code \fItoken\fR
.sp
\fB::http::ncode \fItoken\fR
.sp
\fB::http::data \fItoken\fR
.sp
\fB::http::error \fItoken\fR
.sp
\fB::http::cleanup \fItoken\fR
.sp
\fB::http::register \fIproto port command\fR
.sp
\fB::http::unregister \fIproto\fR
.BE
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
a custom \fBsocket\fR command, via \fBhttp::register\fR.
.PP
The \fB::http::geturl\fR procedure does a HTTP transaction.
Its \fIoptions \fR determine whether a GET, POST, or HEAD transaction
is performed.  
The return value of \fB::http::geturl\fR is a token for the transaction.
The value is also the name of an array in the ::http namespace
 that contains state
information about the transaction.  The elements of this array are
described in the STATE ARRAY section.
.PP
If the \fB-command\fP option is specified, then
the HTTP operation is done in the background.
\fB::http::geturl\fR returns immediately after generating the
HTTP request and the callback is invoked
when the transaction completes.  For this to work, the Tcl event loop
must be active.  In Tk applications this is always true.  For pure-Tcl







<
|
|







57
58
59
60
61
62
63

64
65
66
67
68
69
70
71
72
a custom \fBsocket\fR command, via \fBhttp::register\fR.
.PP
The \fB::http::geturl\fR procedure does a HTTP transaction.
Its \fIoptions \fR determine whether a GET, POST, or HEAD transaction
is performed.  
The return value of \fB::http::geturl\fR is a token for the transaction.
The value is also the name of an array in the ::http namespace

that contains state information about the transaction.  The elements
of this array are described in the STATE ARRAY section.
.PP
If the \fB-command\fP option is specified, then
the HTTP operation is done in the background.
\fB::http::geturl\fR returns immediately after generating the
HTTP request and the callback is invoked
when the transaction completes.  For this to work, the Tcl event loop
must be active.  In Tk applications this is always true.  For pure-Tcl
258
259
260
261
262
263
264
265




266
267
268
269




270
271
272
273
274
275
276
277
278




279
280
281

282
283
284
285
286
287




288
289
290
291
292
293
294
\fB::http::reset\fP \fItoken\fP ?\fIwhy\fP?
This command resets the HTTP transaction identified by \fItoken\fR, if
any.  This sets the \fBstate(status)\fP value to \fIwhy\fP, which defaults to \fBreset\fR, and then calls the registered \fB\-command\fR callback.
.TP
\fB::http::wait\fP \fItoken\fP
This is a convenience procedure that blocks and waits for the
transaction to complete.  This only works in trusted code because it
uses \fBvwait\fR.




.TP
\fB::http::data\fP \fItoken\fP
This is a convenience procedure that returns the \fBbody\fP element
(i.e., the URL data) of the state array.




.TP
\fB::http::status\fP \fItoken\fP
This is a convenience procedure that returns the \fBstatus\fP element of
the state array.
.TP
\fB::http::code\fP \fItoken\fP
This is a convenience procedure that returns the \fBhttp\fP element of the
state array.
.TP




\fB::http::size\fP \fItoken\fP
This is a convenience procedure that returns the \fBcurrentsize\fP
element of the state array.

.TP
\fB::http::cleanup\fP \fItoken\fP
This procedure cleans up the state associated with the connection
identified by \fItoken\fP.  After this call, the procedures
like \fB::http::data\fP cannot be used to get information
about the operation.




.TP
\fB::http::register\fP \fIproto port command\fP
This procedure allows one to provide custom HTTP transport types
such as HTTPS, by registering a prefix, the default port, and the
command to execute to create the Tcl \fBchannel\fR. E.g.:
.RS
.CS







|
>
>
>
>




>
>
>
>









>
>
>
>


|
>





|
>
>
>
>







261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
\fB::http::reset\fP \fItoken\fP ?\fIwhy\fP?
This command resets the HTTP transaction identified by \fItoken\fR, if
any.  This sets the \fBstate(status)\fP value to \fIwhy\fP, which defaults to \fBreset\fR, and then calls the registered \fB\-command\fR callback.
.TP
\fB::http::wait\fP \fItoken\fP
This is a convenience procedure that blocks and waits for the
transaction to complete.  This only works in trusted code because it
uses \fBvwait\fR.  Also, it's not useful for the case where
\fB::http::geturl\fP is called \fIwithout\fP the \fB-command\fP option
because in this case the \fB::http::geturl\fP call doesn't return
until the HTTP transaction is complete, and thus there's nothing to
wait for.
.TP
\fB::http::data\fP \fItoken\fP
This is a convenience procedure that returns the \fBbody\fP element
(i.e., the URL data) of the state array.
.TP
\fB::http::error\fP \fItoken\fP
This is a convenience procedure that returns the \fBerror\fP element
of the state array.
.TP
\fB::http::status\fP \fItoken\fP
This is a convenience procedure that returns the \fBstatus\fP element of
the state array.
.TP
\fB::http::code\fP \fItoken\fP
This is a convenience procedure that returns the \fBhttp\fP element of the
state array.
.TP
\fB::http::ncode\fP \fItoken\fP
This is a convenience procedure that returns just the numeric return
code (200, 404, etc.) from the \fBhttp\fP element of the state array.
.TP
\fB::http::size\fP \fItoken\fP
This is a convenience procedure that returns the \fBcurrentsize\fP
element of the state array, which represents the number of bytes
received from the URL in the \fB::http::geturl\fP call.
.TP
\fB::http::cleanup\fP \fItoken\fP
This procedure cleans up the state associated with the connection
identified by \fItoken\fP.  After this call, the procedures
like \fB::http::data\fP cannot be used to get information
about the operation.  It is \fIstrongly\fP recommended that you call
this function after you're done with a given HTTP request.  Not doing
so will result in memory not being freed, and if your app calls
\fB::http::geturl\fP enough times, the memory leak could cause a
performance hit...or worse.
.TP
\fB::http::register\fP \fIproto port command\fP
This procedure allows one to provide custom HTTP transport types
such as HTTPS, by registering a prefix, the default port, and the
command to execute to create the Tcl \fBchannel\fR. E.g.:
.RS
.CS
305
306
307
308
309
310
311
312

313
314
315
316






317
318



319
320







321
322


323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
This procedure unregisters a protocol handler that was previously
registered via \fBhttp::register\fR.

.SH "ERRORS"
The \fBhttp::geturl\fP procedure will raise errors in the following cases:
invalid command line options,
an invalid URL,
or a URL on a non-existent host,

These errors mean that it
cannot even start the network transaction.
It will also raise an error if it gets an I/O error while
writing out the HTTP request header.






.PP
The \fBhttp::wait\fP procedure will raise errors if an I/O error



occurs while reading the HTTP reply headers or data.  If the
\fB-command\fP flag is not passed to \fBhttp::geturl\fP,







then it will call \fBhttp::wait\fP and so these errors will
occur in \fBhttp::geturl\fP.


If you get an error from \fBhttp::wait\fP, you must still call
\fBhttp::cleanup\fP to delete the state array.
.PP
There are other possible results of the HTTP transaction
determined by examining the status from \fBhttp::status\fP.
These are described below.
.TP
ok
If the HTTP transaction completes entirely, then status will be \fBok\fP.
However, you should still check the \fBhttp::code\fP value to get
the HTTP status.  The \fBhttp::ncode\fP procedure provides just
the numeric error (e.g., 200, 404 or 500) while the \fBhttp::code\fP
procedure returns a value like "HTTP 404 File not found".
.TP
eof
If the server closes the socket without replying, then no error
is rasied, but the status of the transaction will be \fBeof\fP.
.TP
error
In this case \fBhttp::wait\fP should have raised an error.
The error message will also be stored in the \fBerror\fP status
array element.
.PP
Another error possibility is that \fBhttp::geturl\fP is unable to
write all the post query data to the server before the server
responds and closes the socket.
The error message is saved in the \fBposterror\fP status array
element and then  \fBhttp::geturl\fP attempts to complete the
transaction.







|
>




>
>
>
>
>
>

<
>
>
>
|
|
>
>
>
>
>
>
>
|
<
>
>
|
|














|


<

|







325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344

345
346
347
348
349
350
351
352
353
354
355
356
357

358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378

379
380
381
382
383
384
385
386
387
This procedure unregisters a protocol handler that was previously
registered via \fBhttp::register\fR.

.SH "ERRORS"
The \fBhttp::geturl\fP procedure will raise errors in the following cases:
invalid command line options,
an invalid URL,
a URL on a non-existent host,
or a URL at a bad port on an existing host.
These errors mean that it
cannot even start the network transaction.
It will also raise an error if it gets an I/O error while
writing out the HTTP request header.
For synchronous \fB::http::geturl\fP calls (where \fB-command\fP is
not specified), it will raise an error if it gets an I/O error while
reading the HTTP reply headers or data.  Because \fB::http::geturl\fP
doesn't return a token in these cases, it does all the required
cleanup and there's no issue of your app having to call
\fB::http::cleanup\fP.
.PP

For asynchronous \fB::http::geturl\fP calls, all of the above error
situations apply, except that if there's any error while 
reading the
HTTP reply headers or data, no exception is thrown.  This is because
after writing the HTTP headers, \fB::http::geturl\fP returns, and the
rest of the HTTP transaction occurs in the background.  The command
callback can check if any error occurred during the read by calling
\fB::http::status\fP to check the status and if it's \fIerror\fP,
calling \fB::http::error\fP to get the error message.
.PP
Alternatively, if the main program flow reaches a point where it needs
to know the result of the asynchronous HTTP request, it can call
\fB::http::wait\fP and then check status and error, just as the

callback does.
.PP
In any case, you must still call
\fBhttp::cleanup\fP to delete the state array when you're done.
.PP
There are other possible results of the HTTP transaction
determined by examining the status from \fBhttp::status\fP.
These are described below.
.TP
ok
If the HTTP transaction completes entirely, then status will be \fBok\fP.
However, you should still check the \fBhttp::code\fP value to get
the HTTP status.  The \fBhttp::ncode\fP procedure provides just
the numeric error (e.g., 200, 404 or 500) while the \fBhttp::code\fP
procedure returns a value like "HTTP 404 File not found".
.TP
eof
If the server closes the socket without replying, then no error
is raised, but the status of the transaction will be \fBeof\fP.
.TP
error

The error message will also be stored in the \fBerror\fP status
array element, accessible via \fB::http::error\fP.
.PP
Another error possibility is that \fBhttp::geturl\fP is unable to
write all the post query data to the server before the server
responds and closes the socket.
The error message is saved in the \fBposterror\fP status array
element and then  \fBhttp::geturl\fP attempts to complete the
transaction.
420
421
422
423
424
425
426

427
428
429
430
431
432
433
434
.TP
\fBposterror\fR
The error, if any, that occurred while writing
the post query data to the server.
.TP
\fBstatus\fR
Either \fBok\fR, for successful completion, \fBreset\fR for

user-reset, or \fBerror\fR for an error condition.  During the
transaction this value is the empty string.
.TP
\fBtotalsize\fR
A copy of the \fBContent-Length\fR meta-data value.
.TP
\fBtype\fR
A copy of the \fBContent-Type\fR meta-data value.







>
|







456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
.TP
\fBposterror\fR
The error, if any, that occurred while writing
the post query data to the server.
.TP
\fBstatus\fR
Either \fBok\fR, for successful completion, \fBreset\fR for
user-reset, \fBtimeout\fP if a timeout occurred before the transaction
could complete, or \fBerror\fR for an error condition.  During the
transaction this value is the empty string.
.TP
\fBtotalsize\fR
A copy of the \fBContent-Length\fR meta-data value.
.TP
\fBtype\fR
A copy of the \fBContent-Type\fR meta-data value.
464
465
466
467
468
469
470
471
472

473
474

475
476
477
478
    }

    return $token
}
proc ::http::Progress {args} {
    puts -nonewline stderr . ; flush stderr
}

.DE

.SH "SEE ALSO"
safe(n), socket(n), safesock(n)

.SH KEYWORDS
security policy, socket









<

>


>


<
<
501
502
503
504
505
506
507

508
509
510
511
512
513
514


    }

    return $token
}
proc ::http::Progress {args} {
    puts -nonewline stderr . ; flush stderr
}

.DE

.SH "SEE ALSO"
safe(n), socket(n), safesock(n)

.SH KEYWORDS
security policy, socket


Changes to doc/if.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: if.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH if n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
if \- Execute scripts conditionally







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: if.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH if n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
if \- Execute scripts conditionally
35
36
37
38
39
40
41



42
43
``noise words'' to make the command easier to read.
There may be any number of \fBelseif\fR clauses, including zero.
\fIBodyN\fR may also be omitted as long as \fBelse\fR is omitted too.
The return value from the command is the result of the body script
that was executed, or an empty string
if none of the expressions was non-zero and there was no \fIbodyN\fR.




.SH KEYWORDS
boolean, conditional, else, false, if, true







>
>
>


35
36
37
38
39
40
41
42
43
44
45
46
``noise words'' to make the command easier to read.
There may be any number of \fBelseif\fR clauses, including zero.
\fIBodyN\fR may also be omitted as long as \fBelse\fR is omitted too.
The return value from the command is the result of the body script
that was executed, or an empty string
if none of the expressions was non-zero and there was no \fIbodyN\fR.

.SH "SEE ALSO"
expr(n), for(n), foreach(n)

.SH KEYWORDS
boolean, conditional, else, false, if, true
Changes to doc/incr.n.
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
26
27
28



29
30
31
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: incr.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH incr n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
incr \- Increment the value of a variable
.SH SYNOPSIS
\fBincr \fIvarName \fR?\fIincrement\fR?
.BE

.SH DESCRIPTION
.PP
Increments the value stored in the variable whose name is \fIvarName\fR.
The value of the variable must be an integer.
If \fIincrement\fR is supplied then its value (which must be an
integer) is added to the value of variable \fIvarName\fR;  otherwise
1 is added to \fIvarName\fR.
The new value is stored as a decimal string in variable \fIvarName\fR
and also returned as result.




.SH KEYWORDS
add, increment, variable, value







|




















>
>
>



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
26
27
28
29
30
31
32
33
34
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: incr.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH incr n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
incr \- Increment the value of a variable
.SH SYNOPSIS
\fBincr \fIvarName \fR?\fIincrement\fR?
.BE

.SH DESCRIPTION
.PP
Increments the value stored in the variable whose name is \fIvarName\fR.
The value of the variable must be an integer.
If \fIincrement\fR is supplied then its value (which must be an
integer) is added to the value of variable \fIvarName\fR;  otherwise
1 is added to \fIvarName\fR.
The new value is stored as a decimal string in variable \fIvarName\fR
and also returned as result.

.SH "SEE ALSO"
expr(n)

.SH KEYWORDS
add, increment, variable, value
Changes to doc/join.n.
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
26
27



28
29
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: join.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH join n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
join \- Create a string by joining together list elements
.SH SYNOPSIS
\fBjoin \fIlist \fR?\fIjoinString\fR?
.BE

.SH DESCRIPTION
.PP
The \fIlist\fR argument must be a valid Tcl list.
This command returns the string
formed by joining all of the elements of \fIlist\fR together with
\fIjoinString\fR separating each adjacent pair of elements.
The \fIjoinString\fR argument defaults to a space character.




.SH KEYWORDS
element, join, list, separator







|



















>
>
>


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
26
27
28
29
30
31
32
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: join.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH join n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
join \- Create a string by joining together list elements
.SH SYNOPSIS
\fBjoin \fIlist \fR?\fIjoinString\fR?
.BE

.SH DESCRIPTION
.PP
The \fIlist\fR argument must be a valid Tcl list.
This command returns the string
formed by joining all of the elements of \fIlist\fR together with
\fIjoinString\fR separating each adjacent pair of elements.
The \fIjoinString\fR argument defaults to a space character.

.SH "SEE ALSO"
list(n), lappend(n)

.SH KEYWORDS
element, join, list, separator
Changes to doc/lappend.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lappend.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH lappend n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lappend \- Append list elements onto a variable







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lappend.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lappend n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lappend \- Append list elements onto a variable
27
28
29
30
31
32
33



34
35
\fBLappend\fR is similar to \fBappend\fR except that the \fIvalue\fRs
are appended as list elements rather than raw text.
This command provides a relatively efficient way to build up
large lists.  For example, ``\fBlappend a $b\fR'' is much
more efficient than ``\fBset a [concat $a [list $b]]\fR'' when
\fB$a\fR is long.




.SH KEYWORDS
append, element, list, variable







>
>
>


27
28
29
30
31
32
33
34
35
36
37
38
\fBLappend\fR is similar to \fBappend\fR except that the \fIvalue\fRs
are appended as list elements rather than raw text.
This command provides a relatively efficient way to build up
large lists.  For example, ``\fBlappend a $b\fR'' is much
more efficient than ``\fBset a [concat $a [list $b]]\fR'' when
\fB$a\fR is long.

.SH "SEE ALSO"
list(n), lindex(n), linsert(n), llength(n), lsort(n), lrange(n)

.SH KEYWORDS
append, element, list, variable
Changes to doc/library.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1991-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: library.n,v 1.13 2000/04/28 00:47:49 ericm Exp $
.so man.macros
.TH library n "8.0" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
auto_execok, auto_import, auto_load, auto_mkindex, auto_mkindex_old, auto_qualify, auto_reset, tcl_findLibrary, parray, tcl_endOfWord, tcl_startOfNextWord, tcl_startOfPreviousWord, tcl_wordBreakAfter, tcl_wordBreakBefore \- standard library of Tcl procedures
.SH SYNOPSIS
.nf







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1991-1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: library.n,v 1.11.2.2 2001/04/03 22:06:43 hobbs Exp $
.so man.macros
.TH library n "8.0" Tcl "Tcl Built-In Commands"
.BS
.SH NAME
auto_execok, auto_import, auto_load, auto_mkindex, auto_mkindex_old, auto_qualify, auto_reset, tcl_findLibrary, parray, tcl_endOfWord, tcl_startOfNextWord, tcl_startOfPreviousWord, tcl_wordBreakAfter, tcl_wordBreakBefore \- standard library of Tcl procedures
.SH SYNOPSIS
.nf
300
301
302
303
304
305
306
307
308
309
310
Used by \fBunknown\fR to record the command(s) for which it is
searching.
It is used to detect errors where \fBunknown\fR recurses on itself
infinitely.
The variable is unset before \fBunknown\fR returns.

.SH "SEE ALSO"
re_syntax(n)

.SH KEYWORDS
auto-exec, auto-load, library, unknown, word, whitespace 







|



300
301
302
303
304
305
306
307
308
309
310
Used by \fBunknown\fR to record the command(s) for which it is
searching.
It is used to detect errors where \fBunknown\fR recurses on itself
infinitely.
The variable is unset before \fBunknown\fR returns.

.SH "SEE ALSO"
info(n), re_syntax(n)

.SH KEYWORDS
auto-exec, auto-load, library, unknown, word, whitespace 
Changes to doc/lindex.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lindex.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" 
.so man.macros
.TH lindex n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lindex \- Retrieve an element from a list







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lindex.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lindex n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lindex \- Retrieve an element from a list
28
29
30
31
32
33
34



35
36
37
If \fIindex\fR is negative or greater than or equal to the number
of elements in \fIvalue\fR, then an empty
string is returned.
If \fIindex\fR has the value \fBend\fR, it refers to the last element
in the list, and \fBend\-\fIinteger\fR refers to the last element in
the list minus the specified integer offset.





.SH KEYWORDS
element, index, list







>
>
>



28
29
30
31
32
33
34
35
36
37
38
39
40
If \fIindex\fR is negative or greater than or equal to the number
of elements in \fIvalue\fR, then an empty
string is returned.
If \fIindex\fR has the value \fBend\fR, it refers to the last element
in the list, and \fBend\-\fIinteger\fR refers to the last element in
the list minus the specified integer offset.

.SH "SEE ALSO"
list(n), lappend(n), linsert(n), llength(n), lsearch(n), lsort(n),
lrange(n), lreplace(n)

.SH KEYWORDS
element, index, list
Changes to doc/linsert.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: linsert.n,v 1.3 1999/09/21 04:20:36 hobbs Exp $
'\" 
.so man.macros
.TH linsert n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
linsert \- Insert elements into a list







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: linsert.n,v 1.3.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH linsert n 8.2 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
linsert \- Insert elements into a list
25
26
27
28
29
30
31



32
33
the new list.  If \fIindex\fR is less than or equal to zero, then the new
elements are inserted at the beginning of the list.  If \fIindex\fR has the
value \fBend\fR, or if it is greater than or equal to the number of
elements in the list, then the new elements are appended to the list.
\fBend\-\fIinteger\fR refers to the last element in the list minus the
specified integer offset.




.SH KEYWORDS
element, insert, list







>
>
>


25
26
27
28
29
30
31
32
33
34
35
36
the new list.  If \fIindex\fR is less than or equal to zero, then the new
elements are inserted at the beginning of the list.  If \fIindex\fR has the
value \fBend\fR, or if it is greater than or equal to the number of
elements in the list, then the new elements are appended to the list.
\fBend\-\fIinteger\fR refers to the last element in the list minus the
specified integer offset.

.SH "SEE ALSO"
list(n), lappend(n), llength(n)

.SH KEYWORDS
element, insert, list
Changes to doc/list.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: list.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH list n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
list \- Create a list







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: list.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH list n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
list \- Create a list
37
38
39
40
41
42
43




44
45
\fBa b {c d e} {f {g h}}\fR
.CE
while \fBconcat\fR with the same arguments will return
.CS
\fBa b c d e f {g h}\fR
.CE





.SH KEYWORDS
element, list







>
>
>
>


37
38
39
40
41
42
43
44
45
46
47
48
49
\fBa b {c d e} {f {g h}}\fR
.CE
while \fBconcat\fR with the same arguments will return
.CS
\fBa b c d e f {g h}\fR
.CE

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), llength(n), lsearch(n), lsort(n),
lrange(n), lreplace(n)

.SH KEYWORDS
element, list
Changes to doc/llength.n.
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
26
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: llength.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH llength n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
llength \- Count the number of elements in a list
.SH SYNOPSIS
\fBllength \fIlist\fR
.BE

.SH DESCRIPTION
.PP
Treats \fIlist\fR as a list and returns a decimal string giving
the number of elements in it.




.SH KEYWORDS
element, list, length







|
















>
>
>


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
26
27
28
29
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: llength.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH llength n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
llength \- Count the number of elements in a list
.SH SYNOPSIS
\fBllength \fIlist\fR
.BE

.SH DESCRIPTION
.PP
Treats \fIlist\fR as a list and returns a decimal string giving
the number of elements in it.

.SH "SEE ALSO"
list(n), lindex(n), lrange(n)

.SH KEYWORDS
element, list, length
Changes to doc/load.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: load.n,v 1.5 2000/04/14 23:01:55 hobbs Exp $
'\" 
.so man.macros
.TH load n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
load \- Load machine code and initialize new commands.






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: load.n,v 1.5.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH load n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
load \- Load machine code and initialize new commands.
125
126
127
128
129
130
131
132
133
134
135
.PP
If the same file is \fBload\fRed by different \fIfileName\fRs, it will
be loaded into the process's address space multiple times.  The
behavior of this varies from system to system (some systems may
detect the redundant loads, others may not).

.SH "SEE ALSO"
\fBinfo sharedlibextension\fR, Tcl_StaticPackage, safe(n)

.SH KEYWORDS
binary code, loading, safe interpreter, shared library







|



125
126
127
128
129
130
131
132
133
134
135
.PP
If the same file is \fBload\fRed by different \fIfileName\fRs, it will
be loaded into the process's address space multiple times.  The
behavior of this varies from system to system (some systems may
detect the redundant loads, others may not).

.SH "SEE ALSO"
\fBinfo sharedlibextension\fR, Tcl_StaticPackage(3), safe(n)

.SH KEYWORDS
binary code, loading, safe interpreter, shared library
Changes to doc/lrange.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lrange.n,v 1.2 1998/09/14 18:39:53 stanton Exp $
'\" 
.so man.macros
.TH lrange n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lrange \- Return one or more adjacent elements from a list







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lrange.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lrange n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lrange \- Return one or more adjacent elements from a list
31
32
33
34
35
36
37



38
39
If \fIfirst\fR is greater than \fIlast\fR then an empty string
is returned.
Note: ``\fBlrange \fIlist first first\fR'' does not always produce the
same result as ``\fBlindex \fIlist first\fR'' (although it often does
for simple fields that aren't enclosed in braces); it does, however,
produce exactly the same results as ``\fBlist [lindex \fIlist first\fB]\fR''




.SH KEYWORDS
element, list, range, sublist







>
>
>


31
32
33
34
35
36
37
38
39
40
41
42
If \fIfirst\fR is greater than \fIlast\fR then an empty string
is returned.
Note: ``\fBlrange \fIlist first first\fR'' does not always produce the
same result as ``\fBlindex \fIlist first\fR'' (although it often does
for simple fields that aren't enclosed in braces); it does, however,
produce exactly the same results as ``\fBlist [lindex \fIlist first\fB]\fR''

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lreplace(n)

.SH KEYWORDS
element, list, range, sublist
Changes to doc/lreplace.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lreplace.n,v 1.4 2000/01/21 18:24:06 ericm Exp $
'\" 
.so man.macros
.TH lreplace n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lreplace \- Replace elements in a list with new elements







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lreplace.n,v 1.4.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lreplace n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lreplace \- Replace elements in a list with new elements
39
40
41
42
43
44
45




46
47
The \fIelement\fR arguments specify zero or more new arguments to
be added to the list in place of those that were deleted.
Each \fIelement\fR argument will become a separate element of
the list.  If no \fIelement\fR arguments are specified, then the elements
between \fIfirst\fR and \fIlast\fR are simply deleted.  If \fIlist\fR
is empty, any \fIelement\fR arguments are added to the end of the list.





.SH KEYWORDS
element, list, replace







>
>
>
>


39
40
41
42
43
44
45
46
47
48
49
50
51
The \fIelement\fR arguments specify zero or more new arguments to
be added to the list in place of those that were deleted.
Each \fIelement\fR argument will become a separate element of
the list.  If no \fIelement\fR arguments are specified, then the elements
between \fIfirst\fR and \fIlast\fR are simply deleted.  If \fIlist\fR
is empty, any \fIelement\fR arguments are added to the end of the list.

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lrange(n),
lsearch(n), lsort(n)

.SH KEYWORDS
element, list, replace
Changes to doc/lsort.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1999 Scriptics Corporation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lsort.n,v 1.5 1999/12/21 23:57:33 hobbs Exp $
'\" 
.so man.macros
.TH lsort n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lsort \- Sort the elements of a list








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 1999 Scriptics Corporation
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: lsort.n,v 1.5.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH lsort n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
lsort \- Sort the elements of a list
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89





















































































90
91
92
.CS
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}}
.CE
returns \fB{Second 18} {First 24} {Third 30}\fR.
This option is much more efficient than using \fB\-command\fR
to achieve the same effect.
.RE
.VS 8.3
.TP 20
\fB\-unique\fR
If this option is specified, then only the last set of duplicate
elements found in the list will be retained.  Note that duplicates are
determined relative to the comparison used in the sort.  Thus if 
\fI-index 0\fR is used, \fB{1 a}\fR and \fB{1 b}\fR would be
considered duplicates and only the second element, \fB{1 b}\fR, would
be retained.
.VE






















































































.SH KEYWORDS
element, list, order, sort







<








|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



73
74
75
76
77
78
79

80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
.CS
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}}
.CE
returns \fB{Second 18} {First 24} {Third 30}\fR.
This option is much more efficient than using \fB\-command\fR
to achieve the same effect.
.RE

.TP 20
\fB\-unique\fR
If this option is specified, then only the last set of duplicate
elements found in the list will be retained.  Note that duplicates are
determined relative to the comparison used in the sort.  Thus if 
\fI-index 0\fR is used, \fB{1 a}\fR and \fB{1 b}\fR would be
considered duplicates and only the second element, \fB{1 b}\fR, would
be retained.

.SH "NOTES"
.PP
The options to \fBlsort\fR only control what sort of comparison is
used, and do not necessarily constrain what the values themselves
actually are.  This distinction is only noticeable when the list to be
sorted has fewer than two elements.
.PP
The \fBlsort\fR command is reentrant, meaning it is safe to use as
part of the implementation of a command used in the \fB\-command\fR
option.

.SH "EXAMPLES"

.PP
Sorting a list using ASCII sorting:
.CS
% lsort {a10 B2 b1 a1 a2}
B2 a1 a10 a2 b1
.CE

.PP
Sorting a list using Dictionary sorting:
.CS
% lsort -dictionary {a10 B2 b1 a1 a2}
a1 a2 a10 b1 B2
.CE

.PP
Sorting lists of integers:
.CS
% lsort -integer {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -integer {1 2 0x5 7 0 4 -1}
-1 0 1 2 4 0x5 7
.CE

.PP
Sorting lists of floating-point numbers:
.CS
% lsort -real {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -real {.5 0.07e1 0.4 6e-1}
0.4 .5 6e-1 0.07e1
.CE

.PP
Sorting using indices:
.CS
% # Note the space character before the c
% lsort {{a 5} { c 3} {b 4} {e 1} {d 2}}
{ c 3} {a 5} {b 4} {d 2} {e 1}
% lsort -index 0 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{a 5} {b 4} { c 3} {d 2} {e 1}
% lsort -index 1 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{e 1} {d 2} { c 3} {b 4} {a 5}
.CE

.PP
Stripping duplicate values using sorting:
.CS
% lsort -unique {a b c a b c a b c}
a b c
.CE

.PP
More complex sorting using a comparison function:
.CS
% proc compare {a b} {
    set a0 [lindex $a 0]
    set b0 [lindex $b 0]
    if {$a0 < $b0} {
        return -1
    } elseif {$a0 > $b0} {
        return 1
    }
    return [string compare [lindex $a 1] [lindex $b 1]]
}
% lsort -command compare \\
        {{3 apple} {0x2 carrot} {1 dingo} {2 banana}}
{1 dingo} {2 banana} {0x2 carrot} {3 apple}
.CE

.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), list(n), llength(n), lrange(n),
lreplace(n), lsearch(n)

.SH KEYWORDS
element, list, order, sort
Changes to doc/man.macros.
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'\"	option's name as specified in the class command, dbName gives
'\"	the option's name in the option database, and dbClass gives
'\"	the option's class in the option database.
'\"
'\" .UL arg1 arg2
'\"	Print arg1 underlined, then print arg2 normally.
'\"
'\" RCS: @(#) $Id: man.macros,v 1.3 1999/04/16 00:46:35 stanton Exp $
'\"
'\"	# Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
.if t .wh -1.3i ^B
.nr ^l \n(.l
.ad b
'\"	# Start an argument description
.de AP







|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'\"	option's name as specified in the class command, dbName gives
'\"	the option's name in the option database, and dbClass gives
'\"	the option's class in the option database.
'\"
'\" .UL arg1 arg2
'\"	Print arg1 underlined, then print arg2 normally.
'\"
'\" RCS: @(#) $Id: man.macros,v 1.3.12.1 2001/04/03 22:06:43 hobbs Exp $
'\"
'\"	# Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
.if t .wh -1.3i ^B
.nr ^l \n(.l
.ad b
'\"	# Start an argument description
.de AP
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
.sp
..
'\"	# SO - start of list of standard options
.de SO
.SH "STANDARD OPTIONS"
.LP
.nf
.ta 4c 8c 12c
.ft B
..
'\"	# SE - end of list of standard options
.de SE
.fi
.ft R
.LP







|







195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
.sp
..
'\"	# SO - start of list of standard options
.de SO
.SH "STANDARD OPTIONS"
.LP
.nf
.ta 5.5c 11c
.ft B
..
'\"	# SE - end of list of standard options
.de SE
.fi
.ft R
.LP
Changes to doc/memory.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans
'\" Copyright (c) 2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: memory.n,v 1.2 2000/04/28 00:47:49 ericm Exp $
'\" 
.so man.macros
.TH memory n 8.1 Tcl "Tcl Built-In Commands"
.BS
.SH NAME
memory \- Control Tcl memory debugging capabilities.
.SH SYNOPSIS





|







1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans
'\" Copyright (c) 2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: memory.n,v 1.2.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH memory n 8.1 Tcl "Tcl Built-In Commands"
.BS
.SH NAME
memory \- Control Tcl memory debugging capabilities.
.SH SYNOPSIS
74
75
76
77
78
79
80
81
82
Write a list of all currently allocated memory to the specified file.

.SH "SEE ALSO"
ckalloc, ckfree, Tcl_ValidateAllMemory, Tcl_DumpActiveMemory, TCL_MEM_DEBUG

.SH KEYWORDS
memory, debug









<
<
74
75
76
77
78
79
80


Write a list of all currently allocated memory to the specified file.

.SH "SEE ALSO"
ckalloc, ckfree, Tcl_ValidateAllMemory, Tcl_DumpActiveMemory, TCL_MEM_DEBUG

.SH KEYWORDS
memory, debug


Changes to doc/open.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: open.n,v 1.9 1999/12/21 23:57:33 hobbs Exp $
'\" 
.so man.macros
.TH open n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
open \- Open a file-based or command pipeline channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: open.n,v 1.9.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH open n 7.6 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
open \- Open a file-based or command pipeline channel
104
105
106
107
108
109
110












111
112
113
114
115
116
117
\fBTRUNC\fR
If the file exists it is truncated to zero length.
.PP
If a new file is created as part of opening it, \fIpermissions\fR
(an integer) is used to set the permissions for the new file in
conjunction with the process's file mode creation mask.
\fIPermissions\fR defaults to 0666.












.SH "COMMAND PIPELINES"
.PP
If the first character of \fIfileName\fR is ``|'' then the
remaining characters of \fIfileName\fR are treated as a list of arguments
that describe a command pipeline to invoke, in the same style as the
arguments for \fBexec\fR.
In this case, the channel identifier returned by \fBopen\fR may be used







>
>
>
>
>
>
>
>
>
>
>
>







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
\fBTRUNC\fR
If the file exists it is truncated to zero length.
.PP
If a new file is created as part of opening it, \fIpermissions\fR
(an integer) is used to set the permissions for the new file in
conjunction with the process's file mode creation mask.
\fIPermissions\fR defaults to 0666.
.PP
'\" Not versioned as advice applies to all recent versions of Tcl.
'\" Prior to that, Tcl didn't really support binary files anyway...
.VS
Note that if you are going to be reading or writing binary data from
the channel created by this command, you should use the
\fBfconfigure\fR command to change the \fB-translation\fR option of
the channel to \fBbinary\fR before transferring any binary data.  This
is in contrast to the ``b'' character passed as part of the equivalent
of the \fIaccess\fR parameter to some versions of the C library
\fIfopen()\fR function.
.VE
.SH "COMMAND PIPELINES"
.PP
If the first character of \fIfileName\fR is ``|'' then the
remaining characters of \fIfileName\fR are treated as a list of arguments
that describe a command pipeline to invoke, in the same style as the
arguments for \fBexec\fR.
In this case, the channel identifier returned by \fBopen\fR may be used
247
248
249
250
251
252
253

254

255
256
257
258
259
same time.  If the command pipeline is started from a script, so that Tcl is
not accessing the console, or if the command pipeline does not use standard
input, but is redirected from a file, then the above problem does not occur.  
.LP
See the PORTABILITY ISSUES section of the \fBexec\fR command for additional
information not specific to command pipelines about executing
applications on the various platforms

.SH "SEE ALSO"

close(n), filename(n), gets(n), read(n), puts(n), exec(n)
.VE
.SH KEYWORDS
access mode, append, create, file, non-blocking, open, permissions,
pipeline, process, serial







>

>
|
|



259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
same time.  If the command pipeline is started from a script, so that Tcl is
not accessing the console, or if the command pipeline does not use standard
input, but is redirected from a file, then the above problem does not occur.  
.LP
See the PORTABILITY ISSUES section of the \fBexec\fR command for additional
information not specific to command pipelines about executing
applications on the various platforms

.SH "SEE ALSO"
file(n), close(n), filename(n), fconfigure(n), gets(n), read(n),
puts(n), exec(n), fopen(1)

.SH KEYWORDS
access mode, append, create, file, non-blocking, open, permissions,
pipeline, process, serial
Changes to doc/package.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: package.n,v 1.3 1999/03/10 05:52:45 stanton Exp $
'\" 
.so man.macros
.TH package n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
package \- Facilities for package loading and version control
.SH SYNOPSIS
.nf
\fBpackage forget \fIpackage\fR
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
\fBpackage names\fR
\fBpackage present \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage provide \fIpackage \fR?\fIversion\fR?
\fBpackage require \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage unknown \fR?\fIcommand\fR?
\fBpackage vcompare \fIversion1 version2\fR






|









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: package.n,v 1.3.14.2 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH package n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
package \- Facilities for package loading and version control
.SH SYNOPSIS
.nf
\fBpackage forget ?\fIpackage package ...\fR?
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
\fBpackage names\fR
\fBpackage present \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage provide \fIpackage \fR?\fIversion\fR?
\fBpackage require \fR?\fB\-exact\fR? \fIpackage \fR?\fIversion\fR?
\fBpackage unknown \fR?\fIcommand\fR?
\fBpackage vcompare \fIversion1 version2\fR
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Typically, only the \fBpackage require\fR and \fBpackage provide\fR
commands are invoked in normal Tcl scripts;  the other commands are used
primarily by system scripts that maintain the package database.
.PP
The behavior of the \fBpackage\fR command is determined by its first argument.
The following forms are permitted:
.TP
\fBpackage forget \fIpackage\fR
Removes all information about \fIpackage\fR from this interpreter,
including information provided by both \fBpackage ifneeded\fR and
\fBpackage provide\fR.
.TP
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
This command typically appears only in system configuration
scripts to set up the package database.
It indicates that a particular version of







|
|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Typically, only the \fBpackage require\fR and \fBpackage provide\fR
commands are invoked in normal Tcl scripts;  the other commands are used
primarily by system scripts that maintain the package database.
.PP
The behavior of the \fBpackage\fR command is determined by its first argument.
The following forms are permitted:
.TP
\fBpackage forget ?\fIpackage package ...\fR?
Removes all information about each specified package from this interpreter,
including information provided by both \fBpackage ifneeded\fR and
\fBpackage provide\fR.
.TP
\fBpackage ifneeded \fIpackage version\fR ?\fIscript\fR?
This command typically appears only in system configuration
scripts to set up the package database.
It indicates that a particular version of
185
186
187
188
189
190
191



192
193
The recommended way to use packages in Tcl is to invoke \fBpackage require\fR
and \fBpackage provide\fR commands in scripts, and use the procedure
\fBpkg_mkIndex\fR to create package index files.
Once you've done this, packages will be loaded automatically
in response to \fBpackage require\fR commands.
See the documentation for \fBpkg_mkIndex\fR for details.




.SH KEYWORDS
package, version







>
>
>


185
186
187
188
189
190
191
192
193
194
195
196
The recommended way to use packages in Tcl is to invoke \fBpackage require\fR
and \fBpackage provide\fR commands in scripts, and use the procedure
\fBpkg_mkIndex\fR to create package index files.
Once you've done this, packages will be loaded automatically
in response to \fBpackage require\fR commands.
See the documentation for \fBpkg_mkIndex\fR for details.

.SH "SEE ALSO"
msgcat(n), packagens(n), pkgMkIndex(n)

.SH KEYWORDS
package, version
Changes to doc/packagens.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: packagens.n,v 1.2 2000/02/10 10:09:18 hobbs Exp $
'\" 
.so man.macros
.TH pkg::create n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg::create \- Construct an appropriate \fBpackage ifneeded\fR




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
'\" All rights reserved.
'\" 
'\" RCS: @(#) $Id: packagens.n,v 1.2.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pkg::create n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg::create \- Construct an appropriate \fBpackage ifneeded\fR
43
44
45
46
47
48
49



50
51
52
\fB\-source\fR\0\fIfilespec\fR
This parameter is similar to the \fB\-load\fR parameter, except that it
specifies a Tcl library that must be loaded with the
\fBsource\fR command.  Any number of \fB\-source\fR parameters may be
specified.
.PP
At least one \fB\-load\fR or \fB\-source\fR paramter must be given.




.SH KEYWORDS
auto-load, index, package, version







>
>
>



43
44
45
46
47
48
49
50
51
52
53
54
55
\fB\-source\fR\0\fIfilespec\fR
This parameter is similar to the \fB\-load\fR parameter, except that it
specifies a Tcl library that must be loaded with the
\fBsource\fR command.  Any number of \fB\-source\fR parameters may be
specified.
.PP
At least one \fB\-load\fR or \fB\-source\fR paramter must be given.

.SH "SEE ALSO"
package(n)

.SH KEYWORDS
auto-load, index, package, version
Changes to doc/pid.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pid.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" 
.so man.macros
.TH pid n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pid \- Retrieve process id(s)







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pid.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pid n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pid \- Retrieve process id(s)
26
27
28
29
30
31
32



33
34
in order.
The list will be empty if \fIfileId\fR refers to an open file
that isn't a process pipeline.
If no \fIfileId\fR argument is given then \fBpid\fR returns the process
identifier of the current process.
All process identifiers are returned as decimal strings.




.SH KEYWORDS
file, pipeline, process identifier







>
>
>


26
27
28
29
30
31
32
33
34
35
36
37
in order.
The list will be empty if \fIfileId\fR refers to an open file
that isn't a process pipeline.
If no \fIfileId\fR argument is given then \fBpid\fR returns the process
identifier of the current process.
All process identifiers are returned as decimal strings.

.SH "SEE ALSO"
exec(n), open(n)

.SH KEYWORDS
file, pipeline, process identifier
Changes to doc/pkgMkIndex.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.9 2000/02/10 10:09:18 hobbs Exp $
'\" 
.so man.macros
.TH pkg_mkIndex n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg_mkIndex \- Build an index for automatic loading of packages






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.9.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pkg_mkIndex n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pkg_mkIndex \- Build an index for automatic loading of packages
227
228
229
230
231
232
233



234
235
236
If you have a package that is split across scripts and a binary file,
then you should avoid the \fB\-load\fP flag. The problem is that
if you load a package before computing the index it masks any
other files that provide part of the same package.
If you must use \fB\-load\fP,
then you must specify the scripts first; otherwise the package loaded from
the binary file may mask the package defined by the scripts.




.SH KEYWORDS
auto-load, index, package, version







>
>
>



227
228
229
230
231
232
233
234
235
236
237
238
239
If you have a package that is split across scripts and a binary file,
then you should avoid the \fB\-load\fP flag. The problem is that
if you load a package before computing the index it masks any
other files that provide part of the same package.
If you must use \fB\-load\fP,
then you must specify the scripts first; otherwise the package loaded from
the binary file may mask the package defined by the scripts.

.SH "SEE ALSO"
package(n)

.SH KEYWORDS
auto-load, index, package, version
Changes to doc/proc.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: proc.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" 
.so man.macros
.TH proc n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
proc \- Create a Tcl procedure







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: proc.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH proc n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
proc \- Create a Tcl procedure
66
67
68
69
70
71
72



73
74
invoked, the procedure's return value is the value specified in a
\fBreturn\fR command.  If the procedure doesn't execute an explicit
\fBreturn\fR, then its return value is the value of the last command
executed in the procedure's body.
If an error occurs while executing the procedure
body, then the procedure-as-a-whole will return that same error.




.SH KEYWORDS
argument, procedure







>
>
>


66
67
68
69
70
71
72
73
74
75
76
77
invoked, the procedure's return value is the value specified in a
\fBreturn\fR command.  If the procedure doesn't execute an explicit
\fBreturn\fR, then its return value is the value of the last command
executed in the procedure's body.
If an error occurs while executing the procedure
body, then the procedure-as-a-whole will return that same error.

.SH "SEE ALSO"
info(n), unknown(n)

.SH KEYWORDS
argument, procedure
Changes to doc/puts.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: puts.n,v 1.3 1999/04/16 00:46:35 stanton Exp $
'\" 
.so man.macros
.TH puts n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
puts \- Write to a channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: puts.n,v 1.3.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH puts n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
puts \- Write to a channel
59
60
61
62
63
64
65
66
67
68
69
large amount of memory.
To avoid wasting memory, nonblocking I/O should normally
be used in an event-driven fashion with the \fBfileevent\fR command
(don't invoke \fBputs\fR unless you have recently been notified
via a file event that the channel is ready for more output data).

.SH "SEE ALSO"
fileevent(n)

.SH KEYWORDS
channel, newline, output, write







|



59
60
61
62
63
64
65
66
67
68
69
large amount of memory.
To avoid wasting memory, nonblocking I/O should normally
be used in an event-driven fashion with the \fBfileevent\fR command
(don't invoke \fBputs\fR unless you have recently been notified
via a file event that the channel is ready for more output data).

.SH "SEE ALSO"
file(n), fileevent(n)

.SH KEYWORDS
channel, newline, output, write
Changes to doc/pwd.n.
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
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pwd.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" 
.so man.macros
.TH pwd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pwd \- Return the current working directory
.SH SYNOPSIS
\fBpwd\fR
.BE

.SH DESCRIPTION
.PP
Returns the path name of the current working directory.




.SH KEYWORDS
working directory







|















>
>
>


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
26
27
28
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: pwd.n,v 1.2.18.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH pwd n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
pwd \- Return the current working directory
.SH SYNOPSIS
\fBpwd\fR
.BE

.SH DESCRIPTION
.PP
Returns the path name of the current working directory.

.SH "SEE ALSO"
file(n), cd(n), glob(n), filename(n)

.SH KEYWORDS
working directory
Changes to doc/read.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: read.n,v 1.4 1999/05/05 01:19:42 stanton Exp $
'\" 
.so man.macros
.TH read n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
read \- Read from a channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: read.n,v 1.4.12.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH read n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
read \- Read from a channel
48
49
50
51
52
53
54
55
56
57
58
\fBRead\fR translates end-of-line sequences in the input into
newline characters according to the \fB\-translation\fR option
for the channel.
See the \fBfconfigure\fR manual entry for a discussion on ways in
which \fBfconfigure\fR will alter input.

.SH "SEE ALSO"
eof(n), fblocked(n), fconfigure(n)

.SH KEYWORDS
blocking, channel, end of line, end of file, nonblocking, read, translation, encoding







|



48
49
50
51
52
53
54
55
56
57
58
\fBRead\fR translates end-of-line sequences in the input into
newline characters according to the \fB\-translation\fR option
for the channel.
See the \fBfconfigure\fR manual entry for a discussion on ways in
which \fBfconfigure\fR will alter input.

.SH "SEE ALSO"
file(n), eof(n), fblocked(n), fconfigure(n)

.SH KEYWORDS
blocking, channel, end of line, end of file, nonblocking, read, translation, encoding
Changes to doc/regexp.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regexp.n,v 1.9 2000/04/14 06:42:32 hobbs Exp $
'\" 
.so man.macros
.TH regexp n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regexp \- Match a regular expression against a string






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1998 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regexp.n,v 1.9.2.1 2001/04/03 22:06:43 hobbs Exp $
'\" 
.so man.macros
.TH regexp n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regexp \- Match a regular expression against a string
123
124
125
126
127
128
129
130
131
132
133
subexpressions within \fIexp\fR, or if a particular subexpression
in \fIexp\fR doesn't match the string (e.g. because it was in a
portion of the expression that wasn't matched), then the corresponding
\fIsubMatchVar\fR will be set to ``\fB\-1 \-1\fR'' if \fB\-indices\fR
has been specified or to an empty string otherwise.

.SH "SEE ALSO"
re_syntax(n)

.SH KEYWORDS
match, regular expression, string







|



123
124
125
126
127
128
129
130
131
132
133
subexpressions within \fIexp\fR, or if a particular subexpression
in \fIexp\fR doesn't match the string (e.g. because it was in a
portion of the expression that wasn't matched), then the corresponding
\fIsubMatchVar\fR will be set to ``\fB\-1 \-1\fR'' if \fB\-indices\fR
has been specified or to an empty string otherwise.

.SH "SEE ALSO"
re_syntax(n), regsub(n)

.SH KEYWORDS
match, regular expression, string
Changes to doc/regsub.n.
1
2
3

4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.

'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regsub.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" 
.so man.macros
.TH regsub n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regsub \- Perform substitutions based on regular expression pattern matching



>




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2000 Scriptics Corporation.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: regsub.n,v 1.4.2.2 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH regsub n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
regsub \- Perform substitutions based on regular expression pattern matching
51
52
53
54
55
56
57

























58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83



84
85
All ranges in \fIstring\fR that match \fIexp\fR are found and
substitution is performed for each of these ranges.
Without this switch only the first
matching range is found and substituted.
If \fB\-all\fR is specified, then ``&'' and ``\e\fIn\fR''
sequences are handled for each substitution using the information
from the corresponding match.

























.TP 10
\fB\-nocase\fR
Upper-case characters in \fIstring\fR will be converted to lower-case
before matching against \fIexp\fR;  however, substitutions specified
by \fIsubSpec\fR use the original unconverted form of \fIstring\fR.
.VS 8.3
.TP 10
\fB\-start\fR \fIindex\fR
Specifies a character index offset into the string to start
matching the regular expression at.  When using this switch, `^'
will not match the beginning of the line, and \\A will still
match the start of the string at \fIindex\fR.  If \fB\-indices\fR
is specified, the indices will be indexed starting from the
absolute beginning of the input string.
\fIindex\fR will be constrained to the bounds of the input string.
.VE 8.3
.TP 10
\fB\-\|\-\fR
Marks the end of switches.  The argument following this one will
be treated as \fIexp\fR even if it starts with a \fB\-\fR.
.PP
The command returns a count of the number of matching ranges that
were found and replaced.
See the manual entry for \fBregexp\fR for details on the interpretation
of regular expressions.




.SH KEYWORDS
match, pattern, regular expression, substitute







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>











|
<
<












>
>
>


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
All ranges in \fIstring\fR that match \fIexp\fR are found and
substitution is performed for each of these ranges.
Without this switch only the first
matching range is found and substituted.
If \fB\-all\fR is specified, then ``&'' and ``\e\fIn\fR''
sequences are handled for each substitution using the information
from the corresponding match.
.TP 15
\fB\-expanded\fR
Enables use of the expanded regular expression syntax where
whitespace and comments are ignored.  This is the same as specifying
the \fB(?x)\fR embedded option (see METASYNTAX, below).
.TP 15
\fB\-line\fR
Enables newline-sensitive matching.  By default, newline is a
completely ordinary character with no special meaning.  With this
flag, `[^' bracket expressions and `.' never match newline, `^'
matches an empty string after any newline in addition to its normal
function, and `$' matches an empty string before any newline in
addition to its normal function.  This flag is equivalent to
specifying both \fB\-linestop\fR and \fB\-lineanchor\fR, or the
\fB(?n)\fR embedded option (see METASYNTAX, below).
.TP 15
\fB\-linestop\fR
Changes the behavior of `[^' bracket expressions and `.' so that they
stop at newlines.  This is the same as specifying the \fB(?p)\fR
embedded option (see METASYNTAX, below).
.TP 15
\fB\-lineanchor\fR
Changes the behavior of `^' and `$' (the ``anchors'') so they match the
beginning and end of a line respectively.  This is the same as
specifying the \fB(?w)\fR embedded option (see METASYNTAX, below).
.TP 10
\fB\-nocase\fR
Upper-case characters in \fIstring\fR will be converted to lower-case
before matching against \fIexp\fR;  however, substitutions specified
by \fIsubSpec\fR use the original unconverted form of \fIstring\fR.
.VS 8.3
.TP 10
\fB\-start\fR \fIindex\fR
Specifies a character index offset into the string to start
matching the regular expression at.  When using this switch, `^'
will not match the beginning of the line, and \\A will still
match the start of the string at \fIindex\fR.


\fIindex\fR will be constrained to the bounds of the input string.
.VE 8.3
.TP 10
\fB\-\|\-\fR
Marks the end of switches.  The argument following this one will
be treated as \fIexp\fR even if it starts with a \fB\-\fR.
.PP
The command returns a count of the number of matching ranges that
were found and replaced.
See the manual entry for \fBregexp\fR for details on the interpretation
of regular expressions.

.SH "SEE ALSO"
regexp(n), re_syntax(n)

.SH KEYWORDS
match, pattern, regular expression, substitute
Changes to doc/rename.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: rename.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" 
.so man.macros
.TH rename n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
rename \- Rename or delete a command







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: rename.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH rename n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
rename \- Rename or delete a command
24
25
26
27
28
29
30



31
32
If \fInewName\fR is an empty string then \fIoldName\fR is deleted.
\fIoldName\fR and \fInewName\fR may include namespace qualifiers
(names of containing namespaces).
If a command is renamed into a different namespace,
future invocations of it will execute in the new namespace.
The \fBrename\fR command returns an empty string as result.




.SH KEYWORDS
command, delete, namespace, rename







>
>
>


24
25
26
27
28
29
30
31
32
33
34
35
If \fInewName\fR is an empty string then \fIoldName\fR is deleted.
\fIoldName\fR and \fInewName\fR may include namespace qualifiers
(names of containing namespaces).
If a command is renamed into a different namespace,
future invocations of it will execute in the new namespace.
The \fBrename\fR command returns an empty string as result.

.SH "SEE ALSO"
namespace(n), proc(n)

.SH KEYWORDS
command, delete, namespace, rename
Changes to doc/resource.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" RCS: @(#) $Id: resource.n,v 1.5 1999/08/21 19:40:48 hobbs Exp $
'\" 
.so man.macros
.TH resource n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
resource \- Manipulate Macintosh resources





|







1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" RCS: @(#) $Id: resource.n,v 1.5.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH resource n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
resource \- Manipulate Macintosh resources
145
146
147
148
149
150
151
152
153
154
155
the \fBresource list\fR command will return names if they exist or
numbers if the name is NULL.

.SH "PORTABILITY ISSUES"
The resource command is only available on Macintosh.

.SH "SEE ALSO"
open

.SH KEYWORDS
open, resource







|



145
146
147
148
149
150
151
152
153
154
155
the \fBresource list\fR command will return names if they exist or
numbers if the name is NULL.

.SH "PORTABILITY ISSUES"
The resource command is only available on Macintosh.

.SH "SEE ALSO"
open(n)

.SH KEYWORDS
open, resource
Changes to doc/return.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: return.n,v 1.2 1998/09/14 18:39:54 stanton Exp $
'\" 
.so man.macros
.TH return n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
return \- Return from a procedure







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: return.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH return n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
return \- Return from a procedure
81
82
83
84
85
86
87



88
89
the procedure.
.PP
If the \fB\-errorcode\fR option is specified then \fIcode\fR provides
a value for the \fBerrorCode\fR variable.
If the option is not specified then \fBerrorCode\fR will
default to \fBNONE\fR.




.SH KEYWORDS
break, continue, error, procedure, return







>
>
>


81
82
83
84
85
86
87
88
89
90
91
92
the procedure.
.PP
If the \fB\-errorcode\fR option is specified then \fIcode\fR provides
a value for the \fBerrorCode\fR variable.
If the option is not specified then \fBerrorCode\fR will
default to \fBNONE\fR.

.SH "SEE ALSO"
break(n), continue(n), error(n), proc(n)

.SH KEYWORDS
break, continue, error, procedure, return
Changes to doc/scan.n.
1
2
3

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.

'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: scan.n,v 1.4 1999/11/19 06:33:59 hobbs Exp $
'\" 
.so man.macros
.TH scan n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
scan \- Parse string using conversion specifiers in the style of sscanf
.SH SYNOPSIS
\fBscan \fIstring format varName \fR?\fIvarName ...\fR?
.BE

.SH INTRODUCTION
.PP
This command parses fields from an input string in the same fashion as the
ANSI C \fBsscanf\fR procedure and returns a count of the number of
conversions performed, or -1 if the end of the input string is reached



>




|








|







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
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2000 Scriptics Corporation.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: scan.n,v 1.4.2.3 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH scan n 8.3 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
scan \- Parse string using conversion specifiers in the style of sscanf
.SH SYNOPSIS
\fBscan \fIstring format \fR?\fIvarName varName ...\fR?
.BE

.SH INTRODUCTION
.PP
This command parses fields from an input string in the same fashion as the
ANSI C \fBsscanf\fR procedure and returns a count of the number of
conversions performed, or -1 if the end of the input string is reached
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84





85
86
87
88
89




90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
zero).
Otherwise, if it isn't a \fB%\fR character then it 
must match the next character of \fIstring\fR.
When a \fB%\fR is encountered in \fIformat\fR, it indicates
the start of a conversion specifier.
A conversion specifier contains up to four fields after the \fB%\fR:
a \fB*\fR, which indicates that the converted value is to be discarded 
.VS 8.1
instead of assigned to a variable; a XPG3 position specifier; a number
.VE 8.1
indicating a maximum field width; and a conversion character.
All of these fields are optional except for the conversion character.
The fields that are present must appear in the order given above.
.PP
When \fBscan\fR finds a conversion specifier in \fIformat\fR, it
first skips any white-space characters in \fIstring\fR (unless the
specifier is \fB[\fR or \fBc\fR).
Then it converts the next input characters according to the 
conversion specifier and stores the result in the variable given
by the next argument to \fBscan\fR.
.VS 8.1
.PP
If the \fB%\fR is followed by a decimal number and a \fB$\fR, as in
``\fB%2$d\fR'', then the variable to use is not taken from the next
sequential argument.  Instead, it is taken from the argument indicated
by the number, where 1 corresponds to the first \fIvarName\fR.  If
there are any positional specifiers in \fIformat\fR then all of the
specifiers must be positional.  Every \fIvarName\fR on the argument
list must correspond to exactly one conversion specifier or an error
is generated, or in the inline case, any position can be specified
at most once and the empty positions will be filled in with empty strings.
.VE 8.1
.PP
The following conversion characters are supported:
.TP 10
\fBd\fR
The input field must be a decimal integer.
It is read in and the value is stored in the variable as a decimal string.
.TP 10
\fBo\fR
The input field must be an octal integer. It is read in and the 
value is stored in the variable as a decimal string.





.TP 10
\fBx\fR
The input field must be a hexadecimal integer. It is read in 
and the value is stored in the variable as a decimal string.
.VS 8.1




.TP 10
\fBu\fR
The input field must be a decimal integer.  The value is stored in the
variable as an unsigned decimal integer string.
.TP 10
\fBi\fR 
The input field must be an integer.  The base (i.e. decimal, octal, or
hexadecimal) is determined in the same fashion as described in
\fBexpr\fR.  The value is stored in the variable as a decimal string.
.VE 8.1
.TP 10
\fBc\fR
A single character is read in and its binary value is stored in 
the variable as a decimal string.
Initial white space is not skipped in this case, so the input
field may be a white-space character.
This conversion is different from the ANSI standard in that the







<

<










<










<










>
>
>
>
>




|
>
>
>
>









<







44
45
46
47
48
49
50

51

52
53
54
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69
70
71

72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

105
106
107
108
109
110
111
zero).
Otherwise, if it isn't a \fB%\fR character then it 
must match the next character of \fIstring\fR.
When a \fB%\fR is encountered in \fIformat\fR, it indicates
the start of a conversion specifier.
A conversion specifier contains up to four fields after the \fB%\fR:
a \fB*\fR, which indicates that the converted value is to be discarded 

instead of assigned to a variable; a XPG3 position specifier; a number

indicating a maximum field width; and a conversion character.
All of these fields are optional except for the conversion character.
The fields that are present must appear in the order given above.
.PP
When \fBscan\fR finds a conversion specifier in \fIformat\fR, it
first skips any white-space characters in \fIstring\fR (unless the
specifier is \fB[\fR or \fBc\fR).
Then it converts the next input characters according to the 
conversion specifier and stores the result in the variable given
by the next argument to \fBscan\fR.

.PP
If the \fB%\fR is followed by a decimal number and a \fB$\fR, as in
``\fB%2$d\fR'', then the variable to use is not taken from the next
sequential argument.  Instead, it is taken from the argument indicated
by the number, where 1 corresponds to the first \fIvarName\fR.  If
there are any positional specifiers in \fIformat\fR then all of the
specifiers must be positional.  Every \fIvarName\fR on the argument
list must correspond to exactly one conversion specifier or an error
is generated, or in the inline case, any position can be specified
at most once and the empty positions will be filled in with empty strings.

.PP
The following conversion characters are supported:
.TP 10
\fBd\fR
The input field must be a decimal integer.
It is read in and the value is stored in the variable as a decimal string.
.TP 10
\fBo\fR
The input field must be an octal integer. It is read in and the 
value is stored in the variable as a decimal string.
.VS 8.4
If the value exceeds MAX_INT (017777777777 on platforms using 32-bit
integers), it will be truncated to a signed integer.  Hence, 037777777777
will appear as -1 on a 32-bit machine.
.VE 8.4
.TP 10
\fBx\fR
The input field must be a hexadecimal integer. It is read in 
and the value is stored in the variable as a decimal string.
.VS 8.4
If the value exceeds MAX_INT (0x7FFFFFFF on platforms using 32-bit
integers), it will be truncated to a signed integer.  Hence, 0xFFFFFFFF
will appear as -1 on a 32-bit machine.
.VE 8.4
.TP 10
\fBu\fR
The input field must be a decimal integer.  The value is stored in the
variable as an unsigned decimal integer string.
.TP 10
\fBi\fR 
The input field must be an integer.  The base (i.e. decimal, octal, or
hexadecimal) is determined in the same fashion as described in
\fBexpr\fR.  The value is stored in the variable as a decimal string.

.TP 10
\fBc\fR
A single character is read in and its binary value is stored in 
the variable as a decimal string.
Initial white space is not skipped in this case, so the input
field may be a white-space character.
This conversion is different from the ANSI standard in that the
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

188
189
190
191



192
193
\fB[\fIchars\fB]\fR
The input field consists of any number of characters in 
\fIchars\fR.
The matching string is stored in the variable.
If the first character between the brackets is a \fB]\fR then
it is treated as part of \fIchars\fR rather than the closing
bracket for the set.
.VS 8.1
If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will match.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.
.VE 8.1
.TP 10
\fB[^\fIchars\fB]\fR
The input field consists of any number of characters not in 
\fIchars\fR.
The matching string is stored in the variable.
If the character immediately following the \fB^\fR is a \fB]\fR then it is 
treated as part of the set rather than the closing bracket for 
the set.
.VS 8.1
If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will be excluded
from the set.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.
.TP 10
\fBn\fR
No input is consumed from the input string.  Instead, the total number
of chacters scanned from the input string so far is stored in the variable.
.VE 8.1
.LP
The number of characters read from the input for a conversion is the
largest number that makes sense for that particular conversion (e.g.
as many decimal digits as possible for \fB%d\fR, as 
many octal digits as possible for \fB%o\fR, and so on).
The input field for a given conversion terminates either when a
white-space character is encountered or when the maximum field 
width has been reached, whichever comes first.
If a \fB*\fR is present in the conversion specifier 
then no variable is assigned and the next scan argument is not consumed.

.SH "DIFFERENCES FROM ANSI SSCANF"
.PP
The behavior of the \fBscan\fR command is the same as the behavior of
the ANSI C \fBsscanf\fR procedure except for the following differences:
.VS 8.1
.IP [1]
\fB%p\fR conversion specifier is not currently supported.
.VE 8.1
.IP [2]
For \fB%c\fR conversions a single character value is
converted to a decimal string, which is then assigned to the
corresponding \fIvarName\fR;
no field width may be specified for this conversion.
.IP [3]
The \fBl\fR, \fBh\fR, and \fBL\fR modifiers are ignored;  integer
values are always converted as if there were no modifier present
and real values are always converted as if the \fBl\fR modifier
were present (i.e. type \fBdouble\fR is used for the internal
representation).
.VS 8.3
.IP [4]

If the end of the input string is reached before any conversions have been
performed and no variables are given, and empty string is returned.
.VE 8.3




.SH KEYWORDS
conversion specifier, parse, scan







<





<








<










<















<


<











<

>




>
>
>


127
128
129
130
131
132
133

134
135
136
137
138

139
140
141
142
143
144
145
146

147
148
149
150
151
152
153
154
155
156

157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

172
173

174
175
176
177
178
179
180
181
182
183
184

185
186
187
188
189
190
191
192
193
194
195
\fB[\fIchars\fB]\fR
The input field consists of any number of characters in 
\fIchars\fR.
The matching string is stored in the variable.
If the first character between the brackets is a \fB]\fR then
it is treated as part of \fIchars\fR rather than the closing
bracket for the set.

If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will match.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.

.TP 10
\fB[^\fIchars\fB]\fR
The input field consists of any number of characters not in 
\fIchars\fR.
The matching string is stored in the variable.
If the character immediately following the \fB^\fR is a \fB]\fR then it is 
treated as part of the set rather than the closing bracket for 
the set.

If \fIchars\fR
contains a sequence of the form \fIa\fB\-\fIb\fR then any
character between \fIa\fR and \fIb\fR (inclusive) will be excluded
from the set.
If the first or last character between the brackets is a \fB\-\fR, then
it is treated as part of \fIchars\fR rather than indicating a range.
.TP 10
\fBn\fR
No input is consumed from the input string.  Instead, the total number
of chacters scanned from the input string so far is stored in the variable.

.LP
The number of characters read from the input for a conversion is the
largest number that makes sense for that particular conversion (e.g.
as many decimal digits as possible for \fB%d\fR, as 
many octal digits as possible for \fB%o\fR, and so on).
The input field for a given conversion terminates either when a
white-space character is encountered or when the maximum field 
width has been reached, whichever comes first.
If a \fB*\fR is present in the conversion specifier 
then no variable is assigned and the next scan argument is not consumed.

.SH "DIFFERENCES FROM ANSI SSCANF"
.PP
The behavior of the \fBscan\fR command is the same as the behavior of
the ANSI C \fBsscanf\fR procedure except for the following differences:

.IP [1]
\fB%p\fR conversion specifier is not currently supported.

.IP [2]
For \fB%c\fR conversions a single character value is
converted to a decimal string, which is then assigned to the
corresponding \fIvarName\fR;
no field width may be specified for this conversion.
.IP [3]
The \fBl\fR, \fBh\fR, and \fBL\fR modifiers are ignored;  integer
values are always converted as if there were no modifier present
and real values are always converted as if the \fBl\fR modifier
were present (i.e. type \fBdouble\fR is used for the internal
representation).

.IP [4]
.VS 8.3
If the end of the input string is reached before any conversions have been
performed and no variables are given, and empty string is returned.
.VE 8.3

.SH "SEE ALSO"
format(n), sscanf(3)

.SH KEYWORDS
conversion specifier, parse, scan
Changes to doc/seek.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: seek.n,v 1.3 1999/05/05 01:19:43 stanton Exp $
'\" 
.so man.macros
.TH seek n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
seek \- Change the access position for an open channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: seek.n,v 1.3.12.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH seek n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
seek \- Change the access position for an open channel
53
54
55
56
57
58
59



60
61
.PP
.VS 8.1
Note that \fIoffset\fR values are byte offsets, not character
offsets.  Both \fBseek\fR and \fBtell\fR operate in terms of bytes,
not characters, unlike \fBread\fR.
.VE 8.1




.SH KEYWORDS
access position, file, seek







>
>
>


53
54
55
56
57
58
59
60
61
62
63
64
.PP
.VS 8.1
Note that \fIoffset\fR values are byte offsets, not character
offsets.  Both \fBseek\fR and \fBtell\fR operate in terms of bytes,
not characters, unlike \fBread\fR.
.VE 8.1

.SH "SEE ALSO"
file(n), open(n), close(n), gets(n), tell(n)
 
.SH KEYWORDS
access position, file, seek
Changes to doc/set.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: set.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" 
.so man.macros
.TH set n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
set \- Read and write variables







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: set.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH set n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
set \- Read and write variables
40
41
42
43
44
45
46



47
48
(global variable if the current namespace is the global namespace).
If a procedure is active, then \fIvarName\fR refers to a parameter
or local variable of the procedure unless the \fBglobal\fR command
was invoked to declare \fIvarName\fR to be global,
or unless a \fBvariable\fR command
was invoked to declare \fIvarName\fR to be a namespace variable.




.SH KEYWORDS
read, write, variable







>
>
>


40
41
42
43
44
45
46
47
48
49
50
51
(global variable if the current namespace is the global namespace).
If a procedure is active, then \fIvarName\fR refers to a parameter
or local variable of the procedure unless the \fBglobal\fR command
was invoked to declare \fIvarName\fR to be global,
or unless a \fBvariable\fR command
was invoked to declare \fIvarName\fR to be a namespace variable.

.SH "SEE ALSO"
expr(n), proc(n), trace(n), unset(n)

.SH KEYWORDS
read, write, variable
Changes to doc/split.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: split.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" 
.so man.macros
.TH split n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
split \- Split a string into a proper Tcl list







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: split.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH split n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
split \- Split a string into a proper Tcl list
36
37
38
39
40
41
42



43
44
.CE
returns \fB"comp unix misc"\fR and
.CS
\fBsplit "Hello world" {}\fR
.CE
returns \fB"H e l l o { } w o r l d"\fR.




.SH KEYWORDS
list, split, string







>
>
>


36
37
38
39
40
41
42
43
44
45
46
47
.CE
returns \fB"comp unix misc"\fR and
.CS
\fBsplit "Hello world" {}\fR
.CE
returns \fB"H e l l o { } w o r l d"\fR.

.SH "SEE ALSO"
join(n), list(n), string(n)

.SH KEYWORDS
list, split, string
Changes to doc/string.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: string.n,v 1.13 1999/12/21 23:57:34 hobbs Exp $
'\" 
.so man.macros
.TH string n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
string \- Manipulate strings







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: string.n,v 1.13.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH string n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
string \- Manipulate strings
330
331
332
333
334
335
336



337
338
character \fIcharIndex\fR of \fIstring\fR.  \fIcharIndex\fR may be
specified as for the \fBindex\fR method.  A word is considered to be any
contiguous range of alphanumeric (Unicode letters or decimal digits)
or underscore (Unicode connector punctuation) characters, or any
single character other than these.
.VE 8.1




.SH KEYWORDS
case conversion, compare, index, match, pattern, string, word, equal, ctype







>
>
>


330
331
332
333
334
335
336
337
338
339
340
341
character \fIcharIndex\fR of \fIstring\fR.  \fIcharIndex\fR may be
specified as for the \fBindex\fR method.  A word is considered to be any
contiguous range of alphanumeric (Unicode letters or decimal digits)
or underscore (Unicode connector punctuation) characters, or any
single character other than these.
.VE 8.1

.SH "SEE ALSO"
expr(n), list(n)

.SH KEYWORDS
case conversion, compare, index, match, pattern, string, word, equal, ctype
Changes to doc/subst.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: subst.n,v 1.2 1998/09/14 18:39:55 stanton Exp $
'\" 
.so man.macros
.TH subst n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
subst \- Perform backslash, command, and variable substitutions







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1994 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: subst.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH subst n 7.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
subst \- Perform backslash, command, and variable substitutions
39
40
41
42
43
44
45



46
47
48
give any special treatment to double quotes or curly braces.  For
example, the script
.CS
\fBset a 44
subst {xyz {$a}}\fR
.CE
returns ``\fBxyz {44}\fR'', not ``\fBxyz {$a}\fR''.




.SH KEYWORDS
backslash substitution, command substitution, variable substitution







>
>
>



39
40
41
42
43
44
45
46
47
48
49
50
51
give any special treatment to double quotes or curly braces.  For
example, the script
.CS
\fBset a 44
subst {xyz {$a}}\fR
.CE
returns ``\fBxyz {44}\fR'', not ``\fBxyz {$a}\fR''.

.SH "SEE ALSO"
eval(n)

.SH KEYWORDS
backslash substitution, command substitution, variable substitution
Changes to doc/switch.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: switch.n,v 1.4 1999/09/21 04:20:36 hobbs Exp $
'\" 
.so man.macros
.TH switch n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
switch \- Evaluate one of several scripts, depending on a given value







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: switch.n,v 1.4.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH switch n 7.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
switch \- Evaluate one of several scripts, depending on a given value
106
107
108
109
110
111
112



113
114
		{format 2}
	default
		{format 3}
}\fR
.CE
will return \fB3\fR.




.SH KEYWORDS
switch, match, regular expression







>
>
>


106
107
108
109
110
111
112
113
114
115
116
117
		{format 2}
	default
		{format 3}
}\fR
.CE
will return \fB3\fR.

.SH "SEE ALSO"
for(n), if(n), regexp(n)

.SH KEYWORDS
switch, match, regular expression
Changes to doc/tclvars.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tclvars.n,v 1.7 2000/01/21 02:25:06 hobbs Exp $
'\" 
.so man.macros
.TH tclvars n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tclvars \- Variables used by Tcl







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tclvars.n,v 1.7.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH tclvars n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tclvars \- Variables used by Tcl
389
390
391
392
393
394
395



396
397
398
When an interpreter is created Tcl initializes this variable to
hold the version number for this version of Tcl in the form \fIx.y\fR.
Changes to \fIx\fR represent major changes with probable
incompatibilities and changes to \fIy\fR represent small enhancements and
bug fixes that retain backward compatibility.
The value of this variable is returned by the \fBinfo tclversion\fR
command.




.SH KEYWORDS
arithmetic, bytecode, compiler, error, environment, POSIX, precision, subprocess, variables







>
>
>



389
390
391
392
393
394
395
396
397
398
399
400
401
When an interpreter is created Tcl initializes this variable to
hold the version number for this version of Tcl in the form \fIx.y\fR.
Changes to \fIx\fR represent major changes with probable
incompatibilities and changes to \fIy\fR represent small enhancements and
bug fixes that retain backward compatibility.
The value of this variable is returned by the \fBinfo tclversion\fR
command.

.SH "SEE ALSO"
eval(n)

.SH KEYWORDS
arithmetic, bytecode, compiler, error, environment, POSIX, precision, subprocess, variables
Changes to doc/tell.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tell.n,v 1.3 1999/05/05 01:19:43 stanton Exp $
'\" 
.so man.macros
.TH tell n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tell \- Return current access position for an open channel







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: tell.n,v 1.3.12.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH tell n 8.1 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
tell \- Return current access position for an open channel
24
25
26
27
28
29
30



31
32
\fIchannelId\fR.  This value returned is a byte offset that can be passed to
\fBseek\fR in order to set the channel to a particular position.  Note
that this value is in terms of bytes, not characters like \fBread\fR.
.VE 8.1
The value returned is -1 for channels that do not support
seeking.




.SH KEYWORDS
access position, channel, seeking







>
>
>


24
25
26
27
28
29
30
31
32
33
34
35
\fIchannelId\fR.  This value returned is a byte offset that can be passed to
\fBseek\fR in order to set the channel to a particular position.  Note
that this value is in terms of bytes, not characters like \fBread\fR.
.VE 8.1
The value returned is -1 for channels that do not support
seeking.

.SH "SEE ALSO"
file(n), open(n), close(n), gets(n), seek(n)

.SH KEYWORDS
access position, channel, seeking
Changes to doc/time.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: time.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" 
.so man.macros
.TH time n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
time \- Time the execution of a script







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: time.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH time n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
time \- Time the execution of a script
24
25
26
27
28
29
30



31
32
33
specified).  It will then return a string of the form
.CS
\fB503 microseconds per iteration\fR
.CE
which indicates the average amount of time required per iteration,
in microseconds.
Time is measured in elapsed time, not CPU time.




.SH KEYWORDS
script, time







>
>
>



24
25
26
27
28
29
30
31
32
33
34
35
36
specified).  It will then return a string of the form
.CS
\fB503 microseconds per iteration\fR
.CE
which indicates the average amount of time required per iteration,
in microseconds.
Time is measured in elapsed time, not CPU time.

.SH "SEE ALSO"
clock(n)

.SH KEYWORDS
script, time
Changes to doc/unknown.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: unknown.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" 
.so man.macros
.TH unknown n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
unknown \- Handle attempts to use non-existent commands







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: unknown.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH unknown n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
unknown \- Handle attempts to use non-existent commands
67
68
69
70
71
72
73



74
75
step is skipped.
If the global variable \fBauto_noexec\fR is defined then the
auto-exec step is skipped.
Under normal circumstances the return value from \fBunknown\fR
is the return value from the command that was eventually
executed.




.SH KEYWORDS
error, non-existent command







>
>
>


67
68
69
70
71
72
73
74
75
76
77
78
step is skipped.
If the global variable \fBauto_noexec\fR is defined then the
auto-exec step is skipped.
Under normal circumstances the return value from \fBunknown\fR
is the return value from the command that was eventually
executed.

.SH "SEE ALSO"
info(n), proc(n)

.SH KEYWORDS
error, non-existent command
Changes to doc/update.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1992 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: update.n,v 1.3 2000/04/14 06:42:32 hobbs Exp $
'\" 
.so man.macros
.TH update n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
update \- Process pending events and idle callbacks







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1990-1992 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: update.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH update n 7.5 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
update \- Process pending events and idle callbacks
40
41
42
43
44
45
46



47
48
.PP
The \fBupdate\fR command with no options is useful in scripts where
you are performing a long-running computation but you still want
the application to respond to events such as user interactions;  if
you occasionally call \fBupdate\fR then user input will be processed
during the next call to \fBupdate\fR.




.SH KEYWORDS
event, flush, handler, idle, update







>
>
>


40
41
42
43
44
45
46
47
48
49
50
51
.PP
The \fBupdate\fR command with no options is useful in scripts where
you are performing a long-running computation but you still want
the application to respond to events such as user interactions;  if
you occasionally call \fBupdate\fR then user input will be processed
during the next call to \fBupdate\fR.

.SH "SEE ALSO"
after(n), bgerror(n)

.SH KEYWORDS
event, flush, handler, idle, update
Changes to doc/uplevel.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: uplevel.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" 
.so man.macros
.TH uplevel n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
uplevel \- Execute a script in a different stack frame







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: uplevel.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH uplevel n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
uplevel \- Execute a script in a different stack frame
70
71
72
73
74
75
76
77
78
79
80
For example, \fBinfo level 1\fR will return a list
describing a command that is either
the outermost procedure call or the outermost \fBnamespace eval\fR command.
Also, \fBuplevel #0\fR evaluates a script
at top-level in the outermost namespace (the global namespace).

.SH "SEE ALSO"
namespace(n)

.SH KEYWORDS
context, level, namespace, stack frame, variables







|



70
71
72
73
74
75
76
77
78
79
80
For example, \fBinfo level 1\fR will return a list
describing a command that is either
the outermost procedure call or the outermost \fBnamespace eval\fR command.
Also, \fBuplevel #0\fR evaluates a script
at top-level in the outermost namespace (the global namespace).

.SH "SEE ALSO"
namespace(n), upvar(n)

.SH KEYWORDS
context, level, namespace, stack frame, variables
Changes to doc/upvar.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: upvar.n,v 1.3 2000/01/21 03:29:13 ericm Exp $
'\" 
.so man.macros
.TH upvar n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
upvar \- Create link to variable in a different stack frame







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: upvar.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH upvar n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
upvar \- Create link to variable in a different stack frame
102
103
104
105
106
107
108
109
110
111
112
traces set for the entire array will not be invoked when \fImyVar\fR
is accessed (but traces on the particular element will still be
invoked).  In particular, if the array is \fBenv\fR, then changes
made to \fImyVar\fR will not be passed to subprocesses correctly.
.VE

.SH "SEE ALSO"
namespace(n)

.SH KEYWORDS
context, frame, global, level, namespace, procedure, variable







|



102
103
104
105
106
107
108
109
110
111
112
traces set for the entire array will not be invoked when \fImyVar\fR
is accessed (but traces on the particular element will still be
invoked).  In particular, if the array is \fBenv\fR, then changes
made to \fImyVar\fR will not be passed to subprocesses correctly.
.VE

.SH "SEE ALSO"
global(n), namespace(n), uplevel(n), variable(n)

.SH KEYWORDS
context, frame, global, level, namespace, procedure, variable
Changes to doc/variable.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1997 Bell Labs Innovations for Lucent Technologies
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: variable.n,v 1.3 2000/01/26 21:36:35 ericm Exp $
'\" 
.so man.macros
.TH variable n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
variable \- create and initialize a namespace variable







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993-1997 Bell Labs Innovations for Lucent Technologies
'\" Copyright (c) 1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: variable.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH variable n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
variable \- create and initialize a namespace variable
38
39
40
41
42
43
44
45

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
If \fIname\fR includes any namespace qualifiers,
the variable is created in the specified namespace.  If the variable
is not defined, it will be visible to the \fBnamespace which\fR
command, but not to the \fBinfo exists\fR command.
.PP
If the \fBvariable\fR command is executed inside a Tcl procedure,
it creates local variables
linked to the corresponding namespace variables.

In this way the \fBvariable\fR command resembles the \fBglobal\fR command,
although the \fBglobal\fR command
only links to variables in the global namespace.
If any \fIvalue\fRs are given,
they are used to modify the values of the associated namespace variables.
If a namespace variable does not exist,
it is created and optionally initialized.
.PP
A \fIname\fR argument cannot reference an element within an array.
Instead, \fIname\fR should reference the entire array,
and the initialization \fIvalue\fR should be left off.
After the variable has been declared,
elements within the array can be set using ordinary
\fBset\fR or \fBarray\fR commands.

.SH "SEE ALSO"
global(n), namespace(n)

.SH KEYWORDS
global, namespace, procedure, variable







|
>
















|



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
If \fIname\fR includes any namespace qualifiers,
the variable is created in the specified namespace.  If the variable
is not defined, it will be visible to the \fBnamespace which\fR
command, but not to the \fBinfo exists\fR command.
.PP
If the \fBvariable\fR command is executed inside a Tcl procedure,
it creates local variables
linked to the corresponding namespace variables (and therefore these
variables are listed by \fBinfo locals\fR.)
In this way the \fBvariable\fR command resembles the \fBglobal\fR command,
although the \fBglobal\fR command
only links to variables in the global namespace.
If any \fIvalue\fRs are given,
they are used to modify the values of the associated namespace variables.
If a namespace variable does not exist,
it is created and optionally initialized.
.PP
A \fIname\fR argument cannot reference an element within an array.
Instead, \fIname\fR should reference the entire array,
and the initialization \fIvalue\fR should be left off.
After the variable has been declared,
elements within the array can be set using ordinary
\fBset\fR or \fBarray\fR commands.

.SH "SEE ALSO"
global(n), namespace(n), upvar(n)

.SH KEYWORDS
global, namespace, procedure, variable
Changes to doc/vwait.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: vwait.n,v 1.3 2000/01/21 02:25:06 hobbs Exp $
'\" 
.so man.macros
.TH vwait n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
vwait \- Process events until a variable is written






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
'\"
'\" Copyright (c) 1995-1996 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: vwait.n,v 1.3.2.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH vwait n 8.0 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
vwait \- Process events until a variable is written
31
32
33
34
35
36
37



38
39
40
after \fIvarName\fR is set.  This can happen if the event handler
that sets \fIvarName\fR does not complete immediately.  For example,
if an event handler sets \fIvarName\fR and then itself calls
\fBvwait\fR to wait for a different variable, then it may not return
for a long time.  During this time the top-level \fBvwait\fR is
blocked waiting for the event handler to complete, so it cannot
return either.




.SH KEYWORDS
event, variable, wait







>
>
>



31
32
33
34
35
36
37
38
39
40
41
42
43
after \fIvarName\fR is set.  This can happen if the event handler
that sets \fIvarName\fR does not complete immediately.  For example,
if an event handler sets \fIvarName\fR and then itself calls
\fBvwait\fR to wait for a different variable, then it may not return
for a long time.  During this time the top-level \fBvwait\fR is
blocked waiting for the event handler to complete, so it cannot
return either.

.SH "SEE ALSO"
global(n)

.SH KEYWORDS
event, variable, wait
Changes to doc/while.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: while.n,v 1.2 1998/09/14 18:39:56 stanton Exp $
'\" 
.so man.macros
.TH while n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
while \- Execute script repeatedly as long as a condition is met







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1997 Sun Microsystems, Inc.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\" 
'\" RCS: @(#) $Id: while.n,v 1.2.18.1 2001/04/03 22:06:44 hobbs Exp $
'\" 
.so man.macros
.TH while n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
while \- Execute script repeatedly as long as a condition is met
47
48
49
50
51
52
53



54
55
set x 0
while {$x<10} {
	puts "x is $x"
	incr x
}
.CE




.SH KEYWORDS
boolean value, loop, test, while







>
>
>


47
48
49
50
51
52
53
54
55
56
57
58
set x 0
while {$x<10} {
	puts "x is $x"
	incr x
}
.CE

.SH "SEE ALSO"
break(n), continue(n), for(n), foreach(n)

.SH KEYWORDS
boolean value, loop, test, while
Changes to generic/tcl.decls.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# tcl.decls --
#
#	This file contains the declarations for all supported public
#	functions that are exported by the Tcl library via the stubs table.
#	This file is used to generate the tclDecls.h, tclPlatDecls.h,
#	tclStub.c, and tclPlatStub.c files.
#	
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tcl.decls,v 1.33 2000/04/09 16:04:17 kupries Exp $

library tcl

# Define the tcl interface with several sub interfaces:
#     tclPlat	 - platform specific public
#     tclInt	 - generic private
#     tclPlatInt - platform specific private












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# tcl.decls --
#
#	This file contains the declarations for all supported public
#	functions that are exported by the Tcl library via the stubs table.
#	This file is used to generate the tclDecls.h, tclPlatDecls.h,
#	tclStub.c, and tclPlatStub.c files.
#	
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tcl.decls,v 1.33.2.1 2000/07/27 01:39:14 hobbs Exp $

library tcl

# Define the tcl interface with several sub interfaces:
#     tclPlat	 - platform specific public
#     tclInt	 - generic private
#     tclPlatInt - platform specific private
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997

declare 281 generic {
    Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, \
	    Tcl_ChannelType *typePtr, ClientData instanceData, \
	    int mask, Tcl_Channel prevChan)
}
declare 282 generic {
    void Tcl_UnstackChannel(Tcl_Interp *interp, Tcl_Channel chan)
}
declare 283 generic {
    Tcl_Channel Tcl_GetStackedChannel(Tcl_Channel chan)
}
# Reserved for future use (8.0.x vs. 8.1)
#  declare 284 generic {
#  }







|







983
984
985
986
987
988
989
990
991
992
993
994
995
996
997

declare 281 generic {
    Tcl_Channel Tcl_StackChannel(Tcl_Interp *interp, \
	    Tcl_ChannelType *typePtr, ClientData instanceData, \
	    int mask, Tcl_Channel prevChan)
}
declare 282 generic {
    int Tcl_UnstackChannel(Tcl_Interp *interp, Tcl_Channel chan)
}
declare 283 generic {
    Tcl_Channel Tcl_GetStackedChannel(Tcl_Channel chan)
}
# Reserved for future use (8.0.x vs. 8.1)
#  declare 284 generic {
#  }
1353
1354
1355
1356
1357
1358
1359




























































1360
1361
1362
1363
1364
1365
1366
declare 392 generic {
    void Tcl_MutexFinalize (Tcl_Mutex *mutex)
}
declare 393 generic {
    int Tcl_CreateThread (Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc proc, \
	    ClientData clientData, int stackSize, int flags)
}





























































##############################################################################

# Define the platform specific public Tcl interface.  These functions are
# only available on the designated platform.

interface tclPlat







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
declare 392 generic {
    void Tcl_MutexFinalize (Tcl_Mutex *mutex)
}
declare 393 generic {
    int Tcl_CreateThread (Tcl_ThreadId *idPtr, Tcl_ThreadCreateProc proc, \
	    ClientData clientData, int stackSize, int flags)
}

declare 394 generic {
    int Tcl_ReadRaw (Tcl_Channel chan, char *dst, int bytesToRead)
}
declare 395 generic {
    int Tcl_WriteRaw (Tcl_Channel chan, char *src, int srcLen)
}
declare 396 generic {
    Tcl_Channel Tcl_GetTopChannel (Tcl_Channel chan)
}
declare 397 generic {
    int Tcl_ChannelBuffered (Tcl_Channel chan)
}
declare 398 generic {
    char * Tcl_ChannelName(Tcl_ChannelType *chanTypePtr)
}
declare 399 generic {
    Tcl_ChannelTypeVersion Tcl_ChannelVersion(Tcl_ChannelType *chanTypePtr)
}
declare 400 generic {
    Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 401 generic {
    Tcl_DriverCloseProc * Tcl_ChannelCloseProc(Tcl_ChannelType *chanTypePtr)
}
declare 402 generic {
    Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc(Tcl_ChannelType *chanTypePtr)
}
declare 403 generic {
    Tcl_DriverInputProc * Tcl_ChannelInputProc(Tcl_ChannelType *chanTypePtr)
}
declare 404 generic {
    Tcl_DriverOutputProc * Tcl_ChannelOutputProc(Tcl_ChannelType *chanTypePtr)
}
declare 405 generic {
    Tcl_DriverSeekProc * Tcl_ChannelSeekProc(Tcl_ChannelType *chanTypePtr)
}
declare 406 generic {
    Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 407 generic {
    Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 408 generic {
    Tcl_DriverWatchProc * Tcl_ChannelWatchProc(Tcl_ChannelType *chanTypePtr)
}
declare 409 generic {
    Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc(Tcl_ChannelType \
	    *chanTypePtr)
}
declare 410 generic {
    Tcl_DriverFlushProc * Tcl_ChannelFlushProc(Tcl_ChannelType *chanTypePtr)
}
declare 411 generic {
    Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc(Tcl_ChannelType \
	    *chanTypePtr)
}

##############################################################################

# Define the platform specific public Tcl interface.  These functions are
# only available on the designated platform.

interface tclPlat
Changes to generic/tcl.h.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 * Copyright (c) 1993-1996 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tcl.h,v 1.70 2000/04/19 08:32:44 hobbs Exp $
 */

#ifndef _TCL
#define _TCL

/*
 * For C++ compilers, use extern "C"







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 * Copyright (c) 1993-1996 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tcl.h,v 1.70.2.3 2001/04/04 21:22:17 hobbs Exp $
 */

#ifndef _TCL
#define _TCL

/*
 * For C++ compilers, use extern "C"
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 * tools/tcl.wse.in	(for windows installer)
 * tools/tclSplash.bmp	(not patchlevel)
 */

#define TCL_MAJOR_VERSION   8
#define TCL_MINOR_VERSION   3
#define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL  1

#define TCL_VERSION	    "8.3"
#define TCL_PATCH_LEVEL	    "8.3.1"

/*
 * The following definitions set up the proper options for Windows
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifndef __WIN32__







|


|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 * tools/tcl.wse.in	(for windows installer)
 * tools/tclSplash.bmp	(not patchlevel)
 */

#define TCL_MAJOR_VERSION   8
#define TCL_MINOR_VERSION   3
#define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL  3

#define TCL_VERSION	    "8.3"
#define TCL_PATCH_LEVEL	    "8.3.3"

/*
 * The following definitions set up the proper options for Windows
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifndef __WIN32__
101
102
103
104
105
106
107

108
109
110
111
112
113
114

/*
 * The following definitions set up the proper options for Macintosh
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifdef MAC_TCL

#   ifndef HAS_STDARG
#	define HAS_STDARG 1
#   endif
#   ifndef USE_TCLALLOC
#	define USE_TCLALLOC 1
#   endif
#   ifndef NO_STRERROR







>







101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

/*
 * The following definitions set up the proper options for Macintosh
 * compilers.  We use this method because there is no autoconf equivalent.
 */

#ifdef MAC_TCL
#include <ConditionalMacros.h>
#   ifndef HAS_STDARG
#	define HAS_STDARG 1
#   endif
#   ifndef USE_TCLALLOC
#	define USE_TCLALLOC 1
#   endif
#   ifndef NO_STRERROR
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
 * macro STATIC_BUILD should be defined.
 */

#ifdef STATIC_BUILD
# define DLLIMPORT
# define DLLEXPORT
#else
# if defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec)))
#   define DLLIMPORT __declspec(dllimport)
#   define DLLEXPORT __declspec(dllexport)
# else
#  define DLLIMPORT
#  define DLLEXPORT
# endif
#endif







|







222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
 * macro STATIC_BUILD should be defined.
 */

#ifdef STATIC_BUILD
# define DLLIMPORT
# define DLLEXPORT
#else
# if (defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec)))) || (defined(MAC_TCL) && FUNCTION_DECLSPEC)
#   define DLLIMPORT __declspec(dllimport)
#   define DLLEXPORT __declspec(dllexport)
# else
#  define DLLIMPORT
#  define DLLEXPORT
# endif
#endif
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
 * class.  If the symbol is beind declared for a static build or for use from a
 * stub library, then the storage class should be empty.
 *
 * The convention is that a macro called BUILD_xxxx, where xxxx is the
 * name of a library we are building, is set on the compile line for sources
 * that are to be placed in the library.  When this macro is set, the
 * storage class will be set to DLLEXPORT.  At the end of the header file, the
 * storage class will be reset to DLLIMPORt.
 */

#undef TCL_STORAGE_CLASS
#ifdef BUILD_tcl
# define TCL_STORAGE_CLASS DLLEXPORT
#else
# ifdef USE_TCL_STUBS







|







244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
 * class.  If the symbol is beind declared for a static build or for use from a
 * stub library, then the storage class should be empty.
 *
 * The convention is that a macro called BUILD_xxxx, where xxxx is the
 * name of a library we are building, is set on the compile line for sources
 * that are to be placed in the library.  When this macro is set, the
 * storage class will be set to DLLEXPORT.  At the end of the header file, the
 * storage class will be reset to DLLIMPORT.
 */

#undef TCL_STORAGE_CLASS
#ifdef BUILD_tcl
# define TCL_STORAGE_CLASS DLLEXPORT
#else
# ifdef USE_TCL_STUBS
382
383
384
385
386
387
388

389
390
391
392
393
394
395
typedef struct Tcl_Pid_ *Tcl_Pid;
typedef struct Tcl_RegExp_ *Tcl_RegExp;
typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey;
typedef struct Tcl_ThreadId_ *Tcl_ThreadId;
typedef struct Tcl_TimerToken_ *Tcl_TimerToken;
typedef struct Tcl_Trace_ *Tcl_Trace;
typedef struct Tcl_Var_ *Tcl_Var;


/*
 * Definition of the interface to procedures implementing threads.
 * A procedure following this definition is given to each call of
 * 'Tcl_CreateThread' and will be called as the main fuction of
 * the new thread created by that call.
 */







>







383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
typedef struct Tcl_Pid_ *Tcl_Pid;
typedef struct Tcl_RegExp_ *Tcl_RegExp;
typedef struct Tcl_ThreadDataKey_ *Tcl_ThreadDataKey;
typedef struct Tcl_ThreadId_ *Tcl_ThreadId;
typedef struct Tcl_TimerToken_ *Tcl_TimerToken;
typedef struct Tcl_Trace_ *Tcl_Trace;
typedef struct Tcl_Var_ *Tcl_Var;
typedef struct Tcl_ChannelTypeVersion_ *Tcl_ChannelTypeVersion;

/*
 * Definition of the interface to procedures implementing threads.
 * A procedure following this definition is given to each call of
 * 'Tcl_CreateThread' and will be called as the main fuction of
 * the new thread created by that call.
 */
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151







1152
1153
1154
1155
1156
1157
1158

/*
 * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel
 * should be closed.
 */

#define TCL_CLOSE_READ		(1<<1)
#define TCL_CLOSE_WRITE	(1<<2)

/*
 * Value to use as the closeProc for a channel that supports the
 * close2Proc interface.
 */

#define TCL_CLOSE2PROC	((Tcl_DriverCloseProc *)1)








/*
 * Typedefs for the various operations in a channel type:
 */

typedef int	(Tcl_DriverBlockModeProc) _ANSI_ARGS_((
		    ClientData instanceData, int mode));
typedef int	(Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData,







|








>
>
>
>
>
>
>







1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167

/*
 * Bits passed to Tcl_DriverClose2Proc to indicate which side of a channel
 * should be closed.
 */

#define TCL_CLOSE_READ		(1<<1)
#define TCL_CLOSE_WRITE		(1<<2)

/*
 * Value to use as the closeProc for a channel that supports the
 * close2Proc interface.
 */

#define TCL_CLOSE2PROC	((Tcl_DriverCloseProc *)1)

/*
 * Channel version tag.  This was introduced in 8.3.2/8.4.
 */

#define TCL_CHANNEL_VERSION_1	((Tcl_ChannelTypeVersion) 0x1)
#define TCL_CHANNEL_VERSION_2	((Tcl_ChannelTypeVersion) 0x2)

/*
 * Typedefs for the various operations in a channel type:
 */

typedef int	(Tcl_DriverBlockModeProc) _ANSI_ARGS_((
		    ClientData instanceData, int mode));
typedef int	(Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData,
1172
1173
1174
1175
1176
1177
1178




1179
1180
1181
1182
1183
1184
1185
		    ClientData instanceData, Tcl_Interp *interp,
		    char *optionName, Tcl_DString *dsPtr));
typedef void	(Tcl_DriverWatchProc) _ANSI_ARGS_((
		    ClientData instanceData, int mask));
typedef int	(Tcl_DriverGetHandleProc) _ANSI_ARGS_((
		    ClientData instanceData, int direction,
		    ClientData *handlePtr));





/*
 * The following declarations either map ckalloc and ckfree to
 * malloc and free, or they map them to procedures with all sorts
 * of debugging hooks defined in tclCkalloc.c.
 */








>
>
>
>







1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
		    ClientData instanceData, Tcl_Interp *interp,
		    char *optionName, Tcl_DString *dsPtr));
typedef void	(Tcl_DriverWatchProc) _ANSI_ARGS_((
		    ClientData instanceData, int mask));
typedef int	(Tcl_DriverGetHandleProc) _ANSI_ARGS_((
		    ClientData instanceData, int direction,
		    ClientData *handlePtr));
typedef int	(Tcl_DriverFlushProc) _ANSI_ARGS_((
		    ClientData instanceData));
typedef int	(Tcl_DriverHandlerProc) _ANSI_ARGS_((
		    ClientData instanceData, int interestMask));

/*
 * The following declarations either map ckalloc and ckfree to
 * malloc and free, or they map them to procedures with all sorts
 * of debugging hooks defined in tclCkalloc.c.
 */

1220
1221
1222
1223
1224
1225
1226



1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258











1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275

/*
 * struct Tcl_ChannelType:
 *
 * One such structure exists for each type (kind) of channel.
 * It collects together in one place all the functions that are
 * part of the specific channel type.



 */

typedef struct Tcl_ChannelType {
    char *typeName;			/* The name of the channel type in Tcl
                                         * commands. This storage is owned by
                                         * channel type. */
    Tcl_DriverBlockModeProc *blockModeProc;
    					/* Set blocking mode for the
                                         * raw channel. May be NULL. */
    Tcl_DriverCloseProc *closeProc;	/* Procedure to call to close the
                                         * channel, or TCL_CLOSE2PROC if the
                                         * close2Proc should be used
                                         * instead. */
    Tcl_DriverInputProc *inputProc;	/* Procedure to call for input
                                         * on channel. */
    Tcl_DriverOutputProc *outputProc;	/* Procedure to call for output
                                         * on channel. */
    Tcl_DriverSeekProc *seekProc;	/* Procedure to call to seek
                                         * on the channel. May be NULL. */
    Tcl_DriverSetOptionProc *setOptionProc;
    					/* Set an option on a channel. */
    Tcl_DriverGetOptionProc *getOptionProc;
    					/* Get an option from a channel. */
    Tcl_DriverWatchProc *watchProc;	/* Set up the notifier to watch
                                         * for events on this channel. */
    Tcl_DriverGetHandleProc *getHandleProc;
					/* Get an OS handle from the channel
                                         * or NULL if not supported. */
    Tcl_DriverClose2Proc *close2Proc;   /* Procedure to call to close the
					 * channel if the device supports
					 * closing the read & write sides
					 * independently. */











} Tcl_ChannelType;

/*
 * The following flags determine whether the blockModeProc above should
 * set the channel into blocking or nonblocking mode. They are passed
 * as arguments to the blockModeProc procedure in the above structure.
 */

#define TCL_MODE_BLOCKING 0		/* Put channel into blocking mode. */
#define TCL_MODE_NONBLOCKING 1		/* Put channel into nonblocking
					 * mode. */

/*
 * Enum for different types of file paths.
 */

typedef enum Tcl_PathType {







>
>
>




|
|
<
<
|

|
|
|

|

|

|

|

|

|


|
|



>
>
>
>
>
>
>
>
>
>
>








|
|







1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248


1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300

/*
 * struct Tcl_ChannelType:
 *
 * One such structure exists for each type (kind) of channel.
 * It collects together in one place all the functions that are
 * part of the specific channel type.
 *
 * It is recommend that the Tcl_Channel* functions are used to access
 * elements of this structure, instead of direct accessing.
 */

typedef struct Tcl_ChannelType {
    char *typeName;			/* The name of the channel type in Tcl
					 * commands. This storage is owned by
					 * channel type. */


    Tcl_ChannelTypeVersion version;	/* Version of the channel type. */
    Tcl_DriverCloseProc *closeProc;	/* Procedure to call to close the
					 * channel, or TCL_CLOSE2PROC if the
					 * close2Proc should be used
					 * instead. */
    Tcl_DriverInputProc *inputProc;	/* Procedure to call for input
					 * on channel. */
    Tcl_DriverOutputProc *outputProc;	/* Procedure to call for output
					 * on channel. */
    Tcl_DriverSeekProc *seekProc;	/* Procedure to call to seek
					 * on the channel. May be NULL. */
    Tcl_DriverSetOptionProc *setOptionProc;
					/* Set an option on a channel. */
    Tcl_DriverGetOptionProc *getOptionProc;
					/* Get an option from a channel. */
    Tcl_DriverWatchProc *watchProc;	/* Set up the notifier to watch
					 * for events on this channel. */
    Tcl_DriverGetHandleProc *getHandleProc;
					/* Get an OS handle from the channel
					 * or NULL if not supported. */
    Tcl_DriverClose2Proc *close2Proc;	/* Procedure to call to close the
					 * channel if the device supports
					 * closing the read & write sides
					 * independently. */
    Tcl_DriverBlockModeProc *blockModeProc;
					/* Set blocking mode for the
					 * raw channel. May be NULL. */
    /*
     * Only valid in TCL_CHANNEL_VERSION_2 channels
     */
    Tcl_DriverFlushProc *flushProc;	/* Procedure to call to flush a
					 * channel. May be NULL. */
    Tcl_DriverHandlerProc *handlerProc;	/* Procedure to call to handle a
					 * channel event.  This will be passed
					 * up the stacked channel chain. */
} Tcl_ChannelType;

/*
 * The following flags determine whether the blockModeProc above should
 * set the channel into blocking or nonblocking mode. They are passed
 * as arguments to the blockModeProc procedure in the above structure.
 */

#define TCL_MODE_BLOCKING	0	/* Put channel into blocking mode. */
#define TCL_MODE_NONBLOCKING	1	/* Put channel into nonblocking
					 * mode. */

/*
 * Enum for different types of file paths.
 */

typedef enum Tcl_PathType {
Changes to generic/tclCkalloc.c.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * This code contributed by Karl Lehenbauer and Mark Diekhans
 *
 * RCS: @(#) $Id: tclCkalloc.c,v 1.8 2000/04/27 01:47:01 ericm Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#define FALSE	0
#define TRUE	1







|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * This code contributed by Karl Lehenbauer and Mark Diekhans
 *
 * RCS: @(#) $Id: tclCkalloc.c,v 1.7.2.2 2001/04/03 22:54:36 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#define FALSE	0
#define TRUE	1
1012
1013
1014
1015
1016
1017
1018

1019
1020
1021
1022
1023
1024
1025
1026
1027
#ifdef TCL_MEM_DEBUG
    Tcl_MutexLock(ckallocMutexPtr);
    if (tclMemDumpFileName != NULL) {
	Tcl_DumpActiveMemory(tclMemDumpFileName);
    }
    if (curTagPtr != NULL) {
	TclpFree((char *) curTagPtr);

    }
    allocHead = NULL;
    Tcl_MutexUnlock(ckallocMutexPtr);
#endif

#if USE_TCLALLOC
    TclFinalizeAllocSubsystem(); 
#endif
}







>









1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
#ifdef TCL_MEM_DEBUG
    Tcl_MutexLock(ckallocMutexPtr);
    if (tclMemDumpFileName != NULL) {
	Tcl_DumpActiveMemory(tclMemDumpFileName);
    }
    if (curTagPtr != NULL) {
	TclpFree((char *) curTagPtr);
	curTagPtr = NULL;
    }
    allocHead = NULL;
    Tcl_MutexUnlock(ckallocMutexPtr);
#endif

#if USE_TCLALLOC
    TclFinalizeAllocSubsystem(); 
#endif
}
Changes to generic/tclClock.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclClock.c --
 *
 *	Contains the time and date related commands.  This code
 *	is derived from the time and date facilities of TclX,
 *	by Mark Diekhans and Karl Lehenbauer.
 *
 * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclClock.c,v 1.9 2000/03/30 04:36:11 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"

/*













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclClock.c --
 *
 *	Contains the time and date related commands.  This code
 *	is derived from the time and date facilities of TclX,
 *	by Mark Diekhans and Karl Lehenbauer.
 *
 * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclClock.c,v 1.9.2.1 2000/08/07 21:30:56 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"

/*
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
FormatClock(interp, clockVal, useGMT, format)
    Tcl_Interp *interp;			/* Current interpreter. */
    unsigned long clockVal;	       	/* Time in seconds. */
    int useGMT;				/* Boolean */
    char *format;			/* Format string */
{
    struct tm *timeDataPtr;
    Tcl_DString buffer;
    int bufSize;
    char *p;
    int result;
    time_t tclockVal;
#ifndef HAVE_TM_ZONE
    int savedTimeZone = 0;	/* lint. */
    char *savedTZEnv = NULL;	/* lint. */







|







254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
FormatClock(interp, clockVal, useGMT, format)
    Tcl_Interp *interp;			/* Current interpreter. */
    unsigned long clockVal;	       	/* Time in seconds. */
    int useGMT;				/* Boolean */
    char *format;			/* Format string */
{
    struct tm *timeDataPtr;
    Tcl_DString buffer, uniBuffer;
    int bufSize;
    char *p;
    int result;
    time_t tclockVal;
#ifndef HAVE_TM_ZONE
    int savedTimeZone = 0;	/* lint. */
    char *savedTZEnv = NULL;	/* lint. */
356
357
358
359
360
361
362







363


364
365
366
367
	 * format string is above.
	 */
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"bad format string \"", format, "\"", (char *) NULL);
	return TCL_ERROR;
    }








    Tcl_SetStringObj(Tcl_GetObjResult(interp), buffer.string, -1);


    Tcl_DStringFree(&buffer);
    return TCL_OK;
}








>
>
>
>
>
>
>
|
>
>




356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
	 * format string is above.
	 */
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"bad format string \"", format, "\"", (char *) NULL);
	return TCL_ERROR;
    }

    /*
     * Convert the time to external encoding, in case we asked for
     * a localized return value.  [Bug: 3345]
     */
    Tcl_DStringInit(&uniBuffer);
    Tcl_ExternalToUtfDString(NULL, buffer.string, -1, &uniBuffer);

    Tcl_SetStringObj(Tcl_GetObjResult(interp), uniBuffer.string, -1);

    Tcl_DStringFree(&uniBuffer);
    Tcl_DStringFree(&buffer);
    return TCL_OK;
}

Changes to generic/tclCmdIL.c.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdIL.c,v 1.24 2000/04/04 08:04:41 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"








|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdIL.c,v 1.24.2.2 2001/07/16 23:14:13 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"

1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521








1522
1523
1524
1525
1526
1527
1528
	entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search);
	while (entryPtr != NULL) {
	    cmdName = Tcl_GetHashKey(&nsPtr->cmdTable, entryPtr);
	    if ((simplePattern == NULL)
	            || Tcl_StringMatch(cmdName, simplePattern)) {
		cmdPtr = (Command *) Tcl_GetHashValue(entryPtr);

		if (specificNsInPattern) {
		    elemObjPtr = Tcl_NewObj();
		    Tcl_GetCommandFullName(interp, (Tcl_Command) cmdPtr,
		            elemObjPtr);
		} else {
		    elemObjPtr = Tcl_NewStringObj(cmdName, -1);
		}

		realCmdPtr = (Command *)
		    TclGetOriginalCommand((Tcl_Command) cmdPtr);

		if (TclIsProc(cmdPtr)
		        || ((realCmdPtr != NULL) && TclIsProc(realCmdPtr))) {








		    Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr);
		}
	    }
	    entryPtr = Tcl_NextHashEntry(&search);
	}

	/*







<
<
<
<
<
<
<
<





>
>
>
>
>
>
>
>







1502
1503
1504
1505
1506
1507
1508








1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
	entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search);
	while (entryPtr != NULL) {
	    cmdName = Tcl_GetHashKey(&nsPtr->cmdTable, entryPtr);
	    if ((simplePattern == NULL)
	            || Tcl_StringMatch(cmdName, simplePattern)) {
		cmdPtr = (Command *) Tcl_GetHashValue(entryPtr);









		realCmdPtr = (Command *)
		    TclGetOriginalCommand((Tcl_Command) cmdPtr);

		if (TclIsProc(cmdPtr)
		        || ((realCmdPtr != NULL) && TclIsProc(realCmdPtr))) {
		    if (specificNsInPattern) {
			elemObjPtr = Tcl_NewObj();
			Tcl_GetCommandFullName(interp, (Tcl_Command) cmdPtr,
				elemObjPtr);
		    } else {
			elemObjPtr = Tcl_NewStringObj(cmdName, -1);
		    }

		    Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr);
		}
	    }
	    entryPtr = Tcl_NextHashEntry(&search);
	}

	/*
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040






2041
2042
2043



2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092



2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
int
Tcl_LinsertObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    register int objc;		/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    Tcl_Obj *listPtr, *resultPtr;
    Tcl_ObjType *typePtr;
    int index, isDuplicate, len, result;
   
    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv, "list index element ?element ...?");
	return TCL_ERROR;
    }

    /*
     * Get the index first since, if a conversion to int is needed, it
     * will invalidate the list's internal representation.
     */

    result = Tcl_ListObjLength(interp, objv[1], &len);
    if (result != TCL_OK) {
	return result;
    }







    result = TclGetIntForIndex(interp, objv[2], /*endValue*/ len, &index);
    if (result != TCL_OK) {
	return result;



    }

    /*
     * If the list object is unshared we can modify it directly. Otherwise
     * we create a copy to modify: this is "copy on write". We create the
     * duplicate directly in the interpreter's object result.
     */
    
    listPtr = objv[1];
    isDuplicate = 0;
    if (Tcl_IsShared(listPtr)) {
	/*
	 * The following code must reflect the logic in Tcl_DuplicateObj()
	 * except that it must duplicate the list object directly into the
	 * interpreter's result.
	 */
	
	Tcl_ResetResult(interp);
	resultPtr = Tcl_GetObjResult(interp);
	typePtr = listPtr->typePtr;
	if (listPtr->bytes == NULL) {
	    resultPtr->bytes = NULL;
	} else if (listPtr->bytes != tclEmptyStringRep) {
	    len = listPtr->length;
	    TclInitStringRep(resultPtr, listPtr->bytes, len);
	}
	if (typePtr != NULL) {
	    if (typePtr->dupIntRepProc == NULL) {
		resultPtr->internalRep = listPtr->internalRep;
		resultPtr->typePtr = typePtr;
	    } else {
		(*typePtr->dupIntRepProc)(listPtr, resultPtr);
	    }
	}
	listPtr = resultPtr;
	isDuplicate = 1;
    }
    
    if ((objc == 4) && (index == INT_MAX)) {
	/*
	 * Special case: insert one element at the end of the list.
	 */

	result = Tcl_ListObjAppendElement(interp, listPtr, objv[3]);
    } else if (objc > 3) {
	result = Tcl_ListObjReplace(interp, listPtr, index, 0,
				    (objc-3), &(objv[3]));
    }
    if (result != TCL_OK) {



	return result;
    }
    
    /*
     * Set the interpreter's object result.
     */

    if (!isDuplicate) {
	Tcl_SetObjResult(interp, listPtr);
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjCmd --







|
<

















>
>
>
>
>
>
|


>
>
>




|
<

|



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|


|
|



<






>
>
>


|




<
|
<







2015
2016
2017
2018
2019
2020
2021
2022

2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056

2057
2058
2059
2060
2061























2062
2063
2064
2065
2066
2067
2068
2069

2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085

2086

2087
2088
2089
2090
2091
2092
2093
int
Tcl_LinsertObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    register int objc;		/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    Tcl_Obj *listPtr;

    int index, isDuplicate, len, result;
   
    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv, "list index element ?element ...?");
	return TCL_ERROR;
    }

    /*
     * Get the index first since, if a conversion to int is needed, it
     * will invalidate the list's internal representation.
     */

    result = Tcl_ListObjLength(interp, objv[1], &len);
    if (result != TCL_OK) {
	return result;
    }

    /*
     * Get the index.  "end" is interpreted to be the index after the last
     * element, such that using it will cause any inserted elements to be
     * appended to the list.
     */

    result = TclGetIntForIndex(interp, objv[2], /*end*/ len, &index);
    if (result != TCL_OK) {
	return result;
    }
    if (index > len) {
	index = len;
    }

    /*
     * If the list object is unshared we can modify it directly. Otherwise
     * we create a copy to modify: this is "copy on write".

     */

    listPtr = objv[1];
    isDuplicate = 0;
    if (Tcl_IsShared(listPtr)) {























	listPtr = Tcl_DuplicateObj(listPtr);
	isDuplicate = 1;
    }

    if ((objc == 4) && (index == len)) {
	/*
	 * Special case: insert one element at the end of the list.
	 */

	result = Tcl_ListObjAppendElement(interp, listPtr, objv[3]);
    } else if (objc > 3) {
	result = Tcl_ListObjReplace(interp, listPtr, index, 0,
				    (objc-3), &(objv[3]));
    }
    if (result != TCL_OK) {
	if (isDuplicate) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	return result;
    }

    /*
     * Set the interpreter's object result.
     */


    Tcl_SetObjResult(interp, listPtr);

    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjCmd --
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340


2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358








2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375











2376
2377
2378
2379
2380
2381
2382
2383



2384
2385
2386
2387
2388
2389
2390
2391
Tcl_LreplaceObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    int objc;			/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    register Tcl_Obj *listPtr;
    int createdNewObj, first, last, listLen, numToDelete;
    int firstArgLen, result;
    char *firstArg;

    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv,
		"list first last ?element element ...?");
	return TCL_ERROR;
    }

    /*
     * If the list object is unshared we can modify it directly, otherwise
     * we create a copy to modify: this is "copy on write".
     */
    
    listPtr = objv[1];
    createdNewObj = 0;
    if (Tcl_IsShared(listPtr)) {
	listPtr = Tcl_DuplicateObj(listPtr);
	createdNewObj = 1;
    }
    result = Tcl_ListObjLength(interp, listPtr, &listLen);
    if (result != TCL_OK) {
        errorReturn:
	if (createdNewObj) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	return result;
    }

    /*
     * Get the first and last indexes.


     */

    result = TclGetIntForIndex(interp, objv[2], /*endValue*/ (listLen - 1),
	    &first);
    if (result != TCL_OK) {
	goto errorReturn;
    }
    firstArg = Tcl_GetStringFromObj(objv[2], &firstArgLen);

    result = TclGetIntForIndex(interp, objv[3], /*endValue*/ (listLen - 1),
	    &last);
    if (result != TCL_OK) {
	goto errorReturn;
    }

    if (first < 0)  {
    	first = 0;
    }








    if ((first >= listLen) && (listLen > 0)
	    && (strncmp(firstArg, "end", (unsigned) firstArgLen) != 0)) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"list doesn't contain element ",
		Tcl_GetString(objv[2]), (int *) NULL);
	result = TCL_ERROR;
	goto errorReturn;
    }
    if (last >= listLen) {
    	last = (listLen - 1);
    }
    if (first <= last) {
	numToDelete = (last - first + 1);
    } else {
	numToDelete = 0;
    }












    if (objc > 4) {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
	        (objc-4), &(objv[4]));
    } else {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
		0, NULL);
    }
    if (result != TCL_OK) {



	goto errorReturn;
    }

    /*
     * Set the interpreter's object result. 
     */

    Tcl_SetObjResult(interp, listPtr);







|
<
<







<
<
<
<
<
<
<
<
<
<
<
|

<
<
<
<




|
>
>


|
<

|

<

|
<

|





>
>
>
>
>
>
>
>
|
<



|
<










>
>
>
>
>
>
>
>
>
>
>








>
>
>
|







2286
2287
2288
2289
2290
2291
2292
2293


2294
2295
2296
2297
2298
2299
2300











2301
2302




2303
2304
2305
2306
2307
2308
2309
2310
2311
2312

2313
2314
2315

2316
2317

2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333

2334
2335
2336
2337

2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
Tcl_LreplaceObjCmd(dummy, interp, objc, objv)
    ClientData dummy;		/* Not used. */
    Tcl_Interp *interp;		/* Current interpreter. */
    int objc;			/* Number of arguments. */
    Tcl_Obj *CONST objv[];	/* Argument objects. */
{
    register Tcl_Obj *listPtr;
    int isDuplicate, first, last, listLen, numToDelete, result;



    if (objc < 4) {
	Tcl_WrongNumArgs(interp, 1, objv,
		"list first last ?element element ...?");
	return TCL_ERROR;
    }












    result = Tcl_ListObjLength(interp, objv[1], &listLen);
    if (result != TCL_OK) {




	return result;
    }

    /*
     * Get the first and last indexes.  "end" is interpreted to be the index
     * for the last element, such that using it will cause that element to
     * be included for deletion.
     */

    result = TclGetIntForIndex(interp, objv[2], /*end*/ (listLen - 1), &first);

    if (result != TCL_OK) {
	return result;
    }


    result = TclGetIntForIndex(interp, objv[3], /*end*/ (listLen - 1), &last);

    if (result != TCL_OK) {
	return result;
    }

    if (first < 0)  {
    	first = 0;
    }

    /*
     * Complain if the user asked for a start element that is greater than the
     * list length.  This won't ever trigger for the "end*" case as that will
     * be properly constrained by TclGetIntForIndex because we use listLen-1
     * (to allow for replacing the last elem).
     */

    if ((first >= listLen) && (listLen > 0)) {

	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
		"list doesn't contain element ",
		Tcl_GetString(objv[2]), (int *) NULL);
	return TCL_ERROR;

    }
    if (last >= listLen) {
    	last = (listLen - 1);
    }
    if (first <= last) {
	numToDelete = (last - first + 1);
    } else {
	numToDelete = 0;
    }

    /*
     * If the list object is unshared we can modify it directly, otherwise
     * we create a copy to modify: this is "copy on write".
     */

    listPtr = objv[1];
    isDuplicate = 0;
    if (Tcl_IsShared(listPtr)) {
	listPtr = Tcl_DuplicateObj(listPtr);
	isDuplicate = 1;
    }
    if (objc > 4) {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
	        (objc-4), &(objv[4]));
    } else {
	result = Tcl_ListObjReplace(interp, listPtr, first, numToDelete,
		0, NULL);
    }
    if (result != TCL_OK) {
	if (isDuplicate) {
	    Tcl_DecrRefCount(listPtr); /* free unneeded obj */
	}
	return result;
    }

    /*
     * Set the interpreter's object result. 
     */

    Tcl_SetObjResult(interp, listPtr);
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
			    -1);
		    return TCL_ERROR;
		}
		if (TclGetIntForIndex(interp, objv[i+1], -2, &sortInfo.index)
			!= TCL_OK) {
		    return TCL_ERROR;
		}
		cmdPtr = objv[i+1];
		i++;
		break;
	    case 6:			/* -integer */
		sortInfo.sortMode = SORTMODE_INTEGER;
		break;
	    case 7:			/* -real */
		sortInfo.sortMode = SORTMODE_REAL;







<







2560
2561
2562
2563
2564
2565
2566

2567
2568
2569
2570
2571
2572
2573
			    -1);
		    return TCL_ERROR;
		}
		if (TclGetIntForIndex(interp, objv[i+1], -2, &sortInfo.index)
			!= TCL_OK) {
		    return TCL_ERROR;
		}

		i++;
		break;
	    case 6:			/* -integer */
		sortInfo.sortMode = SORTMODE_INTEGER;
		break;
	    case 7:			/* -real */
		sortInfo.sortMode = SORTMODE_REAL;
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
	}
	Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj());
	sortInfo.compareCmdPtr = newCommandPtr;
    }

    sortInfo.resultCode = Tcl_ListObjGetElements(interp, objv[objc-1],
	    &length, &listObjPtrs);
    if (sortInfo.resultCode != TCL_OK) {
	goto done;
    }
    if (length <= 0) {
        return TCL_OK;
    }
    elementArray = (SortElement *) ckalloc(length * sizeof(SortElement));
    for (i=0; i < length; i++){
	elementArray[i].objPtr = listObjPtrs[i];
	elementArray[i].count = 0;
	elementArray[i].nextPtr = &elementArray[i+1];
    }
    elementArray[length-1].nextPtr = NULL;







|


<
<
<







2597
2598
2599
2600
2601
2602
2603
2604
2605
2606



2607
2608
2609
2610
2611
2612
2613
	}
	Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj());
	sortInfo.compareCmdPtr = newCommandPtr;
    }

    sortInfo.resultCode = Tcl_ListObjGetElements(interp, objv[objc-1],
	    &length, &listObjPtrs);
    if (sortInfo.resultCode != TCL_OK || length <= 0) {
	goto done;
    }



    elementArray = (SortElement *) ckalloc(length * sizeof(SortElement));
    for (i=0; i < length; i++){
	elementArray[i].objPtr = listObjPtrs[i];
	elementArray[i].count = 0;
	elementArray[i].nextPtr = &elementArray[i+1];
    }
    elementArray[length-1].nextPtr = NULL;
Changes to generic/tclCmdMZ.c.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdMZ.c,v 1.26 2000/04/10 21:08:26 ericm Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"








|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclCmdMZ.c,v 1.26.2.2 2001/08/07 00:51:12 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclCompile.h"
#include "tclRegexp.h"

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    indices	= 0;
    about	= 0;
    cflags	= TCL_REG_ADVANCED;
    eflags	= 0;
    offset	= 0;
    all		= 0;
    doinline	= 0;
    
    for (i = 1; i < objc; i++) {
	char *name;
	int index;

	name = Tcl_GetString(objv[i]);
	if (name[0] != '-') {
	    break;







|







145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    indices	= 0;
    about	= 0;
    cflags	= TCL_REG_ADVANCED;
    eflags	= 0;
    offset	= 0;
    all		= 0;
    doinline	= 0;

    for (i = 1; i < objc; i++) {
	char *name;
	int index;

	name = Tcl_GetString(objv[i]);
	if (name[0] != '-') {
	    break;
231
232
233
234
235
236
237








238
239
240
241
242
243
244
245
246
247
248
249
	 * User requested -inline, but specified match variables - a no-no.
	 */
	Tcl_AppendResult(interp, "regexp match variables not allowed",
		" when using -inline", (char *) NULL);
	return TCL_ERROR;
    }









    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }
    objPtr = objv[1];

    if (about) {
	if (TclRegAbout(interp, regExpr) < 0) {
	    return TCL_ERROR;
	}
	return TCL_OK;
    }







>
>
>
>
>
>
>
>




<







231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

250
251
252
253
254
255
256
	 * User requested -inline, but specified match variables - a no-no.
	 */
	Tcl_AppendResult(interp, "regexp match variables not allowed",
		" when using -inline", (char *) NULL);
	return TCL_ERROR;
    }

    /*
     * Get the length of the string that we are matching against so
     * we can do the termination test for -all matches.  Do this before
     * getting the regexp to avoid shimmering problems.
     */
    objPtr = objv[1];
    stringLength = Tcl_GetCharLength(objPtr);

    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }


    if (about) {
	if (TclRegAbout(interp, regExpr) < 0) {
	    return TCL_ERROR;
	}
	return TCL_OK;
    }
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
	 * Save only enough subexpressions for matches we want to keep,
	 * expect in the case of -all, where we need to keep at least
	 * one to know where to move the offset.
	 */
	numMatchesSaved = (objc == 0) ? all : objc;
    }

    /*
     * Get the length of the string that we are matching against so
     * we can do the termination test for -all matches.
     */
    stringLength = Tcl_GetCharLength(objPtr);
    
    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match.  If "-all"
     * hasn't been specified then the loop body only gets executed once.
     * We terminate the loop when the starting offset is past the end of the
     * string.
     */







<
<
<
<
<
<







277
278
279
280
281
282
283






284
285
286
287
288
289
290
	 * Save only enough subexpressions for matches we want to keep,
	 * expect in the case of -all, where we need to keep at least
	 * one to know where to move the offset.
	 */
	numMatchesSaved = (objc == 0) ? all : objc;
    }







    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match.  If "-all"
     * hasn't been specified then the loop body only gets executed once.
     * We terminate the loop when the starting offset is past the end of the
     * string.
     */
398
399
400
401
402
403
404

405
406
407
408
409
410
411
	 * length of the match is 0, so offset never changes).
	 */
	if (info.matches[0].end == 0) {
	    offset++;
	}
	offset += info.matches[0].end;
	all++;

	if (offset >= stringLength) {
	    break;
	}
    }

    /*
     * Set the interpreter's object result to an integer object







>







399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
	 * length of the match is 0, so offset never changes).
	 */
	if (info.matches[0].end == 0) {
	    offset++;
	}
	offset += info.matches[0].end;
	all++;
	eflags |= TCL_REG_NOTBOL;
	if (offset >= stringLength) {
	    break;
	}
    }

    /*
     * Set the interpreter's object result to an integer object
525
526
527
528
529
530
531











532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
	Tcl_WrongNumArgs(interp, 1, objv,
		"?switches? exp string subSpec varName");
	return TCL_ERROR;
    }

    objv += i;












    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }

    result = TCL_OK;
    resultPtr = Tcl_NewObj();
    Tcl_IncrRefCount(resultPtr);

    objPtr = objv[1];
    wlen = Tcl_GetCharLength(objPtr);
    wstring = Tcl_GetUnicode(objPtr);
    subspec = Tcl_GetString(objv[2]);
    varPtr = objv[3];

    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match and its
     * corresponding substitution.  If "-all" hasn't been specified
     * then the loop body only gets executed once.
     */








>
>
>
>
>
>
>
>
>
>
>









<
<
<
<
<
<







527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553






554
555
556
557
558
559
560
	Tcl_WrongNumArgs(interp, 1, objv,
		"?switches? exp string subSpec varName");
	return TCL_ERROR;
    }

    objv += i;

    /*
     * Get the length of the string that we are matching before
     * getting the regexp to avoid shimmering problems.
     */

    objPtr = objv[1];
    wlen = Tcl_GetCharLength(objPtr);
    wstring = Tcl_GetUnicode(objPtr);
    subspec = Tcl_GetString(objv[2]);
    varPtr = objv[3];

    regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
    if (regExpr == NULL) {
	return TCL_ERROR;
    }

    result = TCL_OK;
    resultPtr = Tcl_NewObj();
    Tcl_IncrRefCount(resultPtr);







    /*
     * The following loop is to handle multiple matches within the
     * same source string;  each iteration handles one match and its
     * corresponding substitution.  If "-all" hasn't been specified
     * then the loop body only gets executed once.
     */

904
905
906
907
908
909
910




911
912





913
914

915
916



917





918
919

920
921
922
923
924
925
926
    listPtr = Tcl_GetObjResult(interp);
    
    if (stringLen == 0) {
	/*
	 * Do nothing.
	 */
    } else if (splitCharLen == 0) {




	/*
	 * Handle the special case of splitting on every character.





	 */


	for ( ; string < end; string += len) {
	    len = Tcl_UtfToUniChar(string, &ch);



	    objPtr = Tcl_NewStringObj(string, len);





	    Tcl_ListObjAppendElement(NULL, listPtr, objPtr);
	}

    } else {
	char *element, *p, *splitEnd;
	int splitLen;
	Tcl_UniChar splitChar;
	
	/*
	 * Normal case: split on any of a given set of characters.







>
>
>
>


>
>
>
>
>


>


>
>
>
|
>
>
>
>
>


>







911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
    listPtr = Tcl_GetObjResult(interp);
    
    if (stringLen == 0) {
	/*
	 * Do nothing.
	 */
    } else if (splitCharLen == 0) {
	Tcl_HashTable charReuseTable;
	Tcl_HashEntry *hPtr;
	int isNew;

	/*
	 * Handle the special case of splitting on every character.
	 *
	 * Uses a hash table to ensure that each kind of character has
	 * only one Tcl_Obj instance (multiply-referenced) in the
	 * final list.  This is a *major* win when splitting on a long
	 * string (especially in the megabyte range!) - DKF
	 */

	Tcl_InitHashTable(&charReuseTable, TCL_ONE_WORD_KEYS);
	for ( ; string < end; string += len) {
	    len = Tcl_UtfToUniChar(string, &ch);
	    /* Assume Tcl_UniChar is an integral type... */
	    hPtr = Tcl_CreateHashEntry(&charReuseTable, (char*)0 + ch, &isNew);
	    if (isNew) {
		objPtr = Tcl_NewStringObj(string, len);
		/* Don't need to fiddle with refcount... */
		Tcl_SetHashValue(hPtr, (ClientData) objPtr);
	    } else {
		objPtr = (Tcl_Obj*) Tcl_GetHashValue(hPtr);
	    }
	    Tcl_ListObjAppendElement(NULL, listPtr, objPtr);
	}
	Tcl_DeleteHashTable(&charReuseTable);
    } else {
	char *element, *p, *splitEnd;
	int splitLen;
	Tcl_UniChar splitChar;
	
	/*
	 * Normal case: split on any of a given set of characters.
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
				 "?-nocase? ?-length int? string1 string2");
		return TCL_ERROR;
	    }

	    for (i = 2; i < objc-2; i++) {
		string2 = Tcl_GetStringFromObj(objv[i], &length2);
		if ((length2 > 1)
			&& strncmp(string2, "-nocase", (size_t) length2) == 0) {
		    nocase = 1;
		} else if ((length2 > 1)
			&& strncmp(string2, "-length", (size_t) length2) == 0) {
		    if (i+1 >= objc-2) {
			goto str_cmp_args;
		    }
		    if (Tcl_GetIntFromObj(interp, objv[++i],
			    &reqlength) != TCL_OK) {
			return TCL_ERROR;
		    }







|


|







1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
				 "?-nocase? ?-length int? string1 string2");
		return TCL_ERROR;
	    }

	    for (i = 2; i < objc-2; i++) {
		string2 = Tcl_GetStringFromObj(objv[i], &length2);
		if ((length2 > 1)
			&& strncmp(string2, "-nocase", (size_t)length2) == 0) {
		    nocase = 1;
		} else if ((length2 > 1)
			&& strncmp(string2, "-length", (size_t)length2) == 0) {
		    if (i+1 >= objc-2) {
			goto str_cmp_args;
		    }
		    if (Tcl_GetIntFromObj(interp, objv[++i],
			    &reqlength) != TCL_OK) {
			return TCL_ERROR;
		    }
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210

1211
1212

1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
	     * If we have a ByteArray object, avoid indexing in the
	     * Utf string since the byte array contains one byte per
	     * character.  Otherwise, use the Unicode string rep to
	     * get the index'th char.
	     */

	    if (objv[2]->typePtr == &tclByteArrayType) {

		string1 = (char *)Tcl_GetByteArrayFromObj(objv[2], &length1);

		if (TclGetIntForIndex(interp, objv[3], length1 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}

		Tcl_SetByteArrayObj(resultPtr,
			(unsigned char *)(&string1[index]), 1);

	    } else {
		string1 = Tcl_GetStringFromObj(objv[2], &length1);
		
		/*
		 * convert to Unicode internal rep to calulate what
		 * 'end' really means.
		 */

		length2 = Tcl_GetCharLength(objv[2]);
    
		if (TclGetIntForIndex(interp, objv[3], length2 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}
		if ((index >= 0) && (index < length2)) {
		    unichar = Tcl_GetUniChar(objv[2], index);
		    length2 = Tcl_UniCharToUtf((int)unichar, buf);







<






>
|
|
>


|






|







1223
1224
1225
1226
1227
1228
1229

1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
	     * If we have a ByteArray object, avoid indexing in the
	     * Utf string since the byte array contains one byte per
	     * character.  Otherwise, use the Unicode string rep to
	     * get the index'th char.
	     */

	    if (objv[2]->typePtr == &tclByteArrayType) {

		string1 = (char *)Tcl_GetByteArrayFromObj(objv[2], &length1);

		if (TclGetIntForIndex(interp, objv[3], length1 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}
		if ((index >= 0) && (index < length1)) {
		    Tcl_SetByteArrayObj(resultPtr,
			    (unsigned char *)(&string1[index]), 1);
		}
	    } else {
		string1 = Tcl_GetStringFromObj(objv[2], &length1);

		/*
		 * convert to Unicode internal rep to calulate what
		 * 'end' really means.
		 */

		length2 = Tcl_GetCharLength(objv[2]);

		if (TclGetIntForIndex(interp, objv[3], length2 - 1,
			&index) != TCL_OK) {
		    return TCL_ERROR;
		}
		if ((index >= 0) && (index < length2)) {
		    unichar = Tcl_GetUniChar(objv[2], index);
		    length2 = Tcl_UniCharToUtf((int)unichar, buf);
1641
1642
1643
1644
1645
1646
1647

1648
1649
1650
1651
1652
1653
1654
		return TCL_ERROR;
	    }
	    if (mapElemc == 0) {
		/*
		 * empty charMap, just return whatever string was given
		 */
		Tcl_SetObjResult(interp, objv[objc-1]);

	    } else if (mapElemc & 1) {
		/*
		 * The charMap must be an even number of key/value items
		 */
		Tcl_SetStringObj(resultPtr, "char map list unbalanced", -1);
		return TCL_ERROR;
	    }







>







1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
		return TCL_ERROR;
	    }
	    if (mapElemc == 0) {
		/*
		 * empty charMap, just return whatever string was given
		 */
		Tcl_SetObjResult(interp, objv[objc-1]);
		return TCL_OK;
	    } else if (mapElemc & 1) {
		/*
		 * The charMap must be an even number of key/value items
		 */
		Tcl_SetStringObj(resultPtr, "char map list unbalanced", -1);
		return TCL_ERROR;
	    }
Changes to generic/tclDate.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in
 *	the file tclGetDate.y.  It should not be edited directly.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDate.c,v 1.17 2000/02/28 18:49:42 ericm Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#ifdef MAC_TCL
#   define EPOCH           1904












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in
 *	the file tclGetDate.y.  It should not be edited directly.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDate.c,v 1.17.2.1 2000/08/07 21:30:36 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

#ifdef MAC_TCL
#   define EPOCH           1904
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973

974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
	0, -1,
	-2, 0,
	};
# define YYNPROD 56
# define YYLAST 261
static CONST TclDatetabelem TclDateact[]={

    24,    39,    23,    35,    55,    83,    40,    27,    54,    25,
    36,    41,    59,    37,    57,    27,    26,    25,    27,    32,
    25,    31,    62,    50,    26,    82,    78,    26,    51,    77,
    76,    75,    29,    74,    73,    72,    70,    52,    49,    48,
    47,    44,    38,    63,    80,    46,    45,    81,    69,    21,
    66,    61,    68,    67,    56,    43,    64,    11,    10,     9,
     8,     7,    34,     6,     5,     4,     3,     2,    42,     1,
    20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    53,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    58,     0,     0,    60,     0,     0,    79,     0,     0,
     0,     0,     0,     0,     0,     0,     0,    71,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,    19,    14,     0,     0,     0,
    16,    27,    22,    25,     0,    12,    13,    17,     0,    15,
    26,    18,    30,     0,     0,    28,     0,    33,    27,     0,
    25,     0,     0,     0,     0,     0,     0,    26,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    65,
    65 };
static CONST TclDatetabelem TclDatepact[]={

-10000000,   -43,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
-10000000,-10000000,   -26,  -268,-10000000,  -259,  -226,-10000000,  -257,    11,
  -227,  -212,  -228,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,  -229,
-10000000,  -230,  -240,  -231,  -212,-10000000,  -264,-10000000,    10,-10000000,
-10000000,  -249,-10000000,-10000000,  -246,-10000000,-10000000,     5,    -2,     3,
     8,     7,-10000000,-10000000,-10000000,   -10,  -232,-10000000,-10000000,-10000000,
  -212,  -233,-10000000,  -234,  -235,-10000000,  -237,  -238,  -239,  -242,
-10000000,-10000000,-10000000,-10000000,    -1,-10000000,-10000000,-10000000,   -11,-10000000,
  -243,  -263,-10000000,-10000000 };
static CONST TclDatetabelem TclDatepgo[]={

     0,    49,    46,    70,    22,    69,    67,    66,    65,    64,
    63,    61,    60,    59,    58,    57 };
static CONST TclDatetabelem TclDater1[]={


     0,     5,     5,     6,     6,     6,     6,     6,     6,     6,
     6,     6,     7,     7,     7,     7,     7,     8,     8,     8,
    11,    11,    11,    11,    11,     9,     9,     9,     9,     9,
     9,     9,     9,     9,     9,    10,    10,    13,    13,    13,
    14,    12,    12,    12,    12,    12,     3,     3,     1,     1,
     1,     2,     2,    15,     4,     4 };
static CONST TclDatetabelem TclDater2[]={

     0,     0,     4,     3,     3,     3,     3,     3,     3,     3,
     3,     2,     5,     9,    11,    13,    15,     5,     3,     3,
     3,     5,     5,     7,     5,     7,    11,     3,    11,    11,
     5,     9,     5,     3,     7,     5,     7,     7,    15,     5,
     9,     9,     7,     5,     7,     5,     3,     3,     3,     3,
     3,     3,     1,     3,     1,     3 };
static CONST TclDatetabelem TclDatechk[]={

-10000000,    -5,    -6,    -7,    -8,    -9,   -10,   -11,   -12,   -13,
   -14,   -15,   268,   269,   259,   272,   263,   270,   274,   258,
    -3,    -1,   265,    45,    43,   266,   273,   264,   261,    58,
   258,    47,    45,   263,    -1,   271,   269,   272,   268,   258,
   263,   268,    -1,    44,   268,    -2,   257,   268,   268,   268,
   263,   268,   268,    -2,   272,   268,    44,   263,    -1,   258,
    -1,    46,    -4,    45,    58,   261,    47,    45,    45,    58,
   268,    -2,   268,   268,   268,   268,   268,   268,   268,    -4,
    45,    58,   268,   268 };
static CONST TclDatetabelem TclDatedef[]={

     1,    -2,     2,     3,     4,     5,     6,     7,     8,     9,
    10,    11,    53,    18,    19,    27,     0,    33,     0,    20,
     0,    52,     0,    46,    47,    48,    49,    50,    12,     0,
    22,     0,     0,    32,    52,    17,     0,    39,    30,    24,
    35,     0,    43,    21,     0,    45,    51,     0,    54,    25,
     0,     0,    34,    42,    37,     0,     0,    36,    44,    23,
    52,     0,    13,     0,     0,    55,     0,     0,     0,     0,
    31,    41,    40,    14,    54,    26,    28,    29,     0,    15,
     0,     0,    16,    38 };
typedef struct
#ifdef __cplusplus
	TclDatetoktype
#endif
{ char *t_name; int t_val; } TclDatetoktype;
#ifndef YYDEBUG
#	define YYDEBUG	0	/* don't allow debugging */







|
|
|
|
|
|
|

|
|
|











|
|
|
|
|



|
|
|
|
|
|
|
|


|
|


>
|
|
|
|
|
<






|
|


|
|
|
|
|
|
|
|
|




|
|
|
|
|
|
|







923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979

980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
	0, -1,
	-2, 0,
	};
# define YYNPROD 56
# define YYLAST 261
static CONST TclDatetabelem TclDateact[]={

    24,    40,    23,    36,    54,    81,    41,    28,    53,    26,
    37,    42,    58,    38,    56,    28,    27,    26,    28,    33,
    26,    32,    61,    50,    27,    80,    76,    27,    51,    75,
    74,    73,    30,    72,    71,    70,    69,    52,    49,    48,
    47,    45,    39,    62,    78,    46,    79,    68,    25,    65,
    60,    67,    66,    55,    44,    21,    63,    11,    10,     9,
     8,    35,     7,     6,     5,     4,     3,    43,     2,     1,
    20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,    57,     0,     0,    59,    77,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     0,     0,     0,    19,    14,     0,     0,     0,
    16,    28,    22,    26,     0,    12,    13,    17,     0,    15,
    27,    18,    31,     0,     0,    29,     0,    34,    28,     0,
    26,     0,     0,     0,     0,     0,     0,    27,     0,     0,
     0,     0,     0,     0,     0,     0,     0,     0,     0,    64,
    64 };
static CONST TclDatetabelem TclDatepact[]={

-10000000,   -43,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
-10000000,-10000000,   -26,  -268,-10000000,  -259,  -226,-10000000,  -257,    10,
  -227,  -212,  -228,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
  -229,-10000000,  -230,  -240,  -231,-10000000,-10000000,  -264,-10000000,     9,
-10000000,-10000000,  -249,-10000000,-10000000,  -246,-10000000,     4,    -2,     2,
     7,     6,-10000000,-10000000,   -11,  -232,-10000000,-10000000,-10000000,-10000000,
  -233,-10000000,  -234,  -235,-10000000,  -237,  -238,  -239,  -242,-10000000,
-10000000,-10000000,    -1,-10000000,-10000000,-10000000,   -12,-10000000,  -243,  -263,
-10000000,-10000000 };
static CONST TclDatetabelem TclDatepgo[]={

     0,    48,    70,    22,    69,    68,    66,    65,    64,    63,
    62,    60,    59,    58,    57,    55 };
static CONST TclDatetabelem TclDater1[]={

     0,     4,     4,     5,     5,     5,     5,     5,     5,     5,
     5,     5,     6,     6,     6,     6,     6,     7,     7,     7,
    10,    10,    10,    10,    10,     8,     8,     8,     8,     8,
     8,     8,     8,     8,     8,     9,     9,    12,    12,    12,
    13,    11,    11,    15,    15,    15,    15,    15,     2,     2,
     1,     1,     1,    14,     3,     3 };

static CONST TclDatetabelem TclDater2[]={

     0,     0,     4,     3,     3,     3,     3,     3,     3,     3,
     3,     2,     5,     9,    11,    13,    15,     5,     3,     3,
     3,     5,     5,     7,     5,     7,    11,     3,    11,    11,
     5,     9,     5,     3,     7,     5,     7,     7,    15,     5,
     9,     5,     2,     7,     5,     5,     7,     3,     3,     3,
     3,     3,     3,     3,     1,     3 };
static CONST TclDatetabelem TclDatechk[]={

-10000000,    -4,    -5,    -6,    -7,    -8,    -9,   -10,   -11,   -12,
   -13,   -14,   268,   269,   259,   272,   263,   270,   274,   258,
    -2,   -15,   265,    45,    43,    -1,   266,   273,   264,   261,
    58,   258,    47,    45,   263,    -1,   271,   269,   272,   268,
   258,   263,   268,    -1,    44,   268,   257,   268,   268,   268,
   263,   268,   268,   272,   268,    44,   263,    -1,   258,    -1,
    46,    -3,    45,    58,   261,    47,    45,    45,    58,   268,
   268,   268,   268,   268,   268,   268,   268,    -3,    45,    58,
   268,   268 };
static CONST TclDatetabelem TclDatedef[]={

     1,    -2,     2,     3,     4,     5,     6,     7,     8,     9,
    10,    11,    53,    18,    19,    27,     0,    33,     0,    20,
     0,    42,     0,    48,    49,    47,    50,    51,    52,    12,
     0,    22,     0,     0,    32,    44,    17,     0,    39,    30,
    24,    35,     0,    45,    21,     0,    41,     0,    54,    25,
     0,     0,    34,    37,     0,     0,    36,    46,    23,    43,
     0,    13,     0,     0,    55,     0,     0,     0,     0,    31,
    40,    14,    54,    26,    28,    29,     0,    15,     0,     0,
    16,    38 };
typedef struct
#ifdef __cplusplus
	TclDatetoktype
#endif
{ char *t_name; int t_val; } TclDatetoktype;
#ifndef YYDEBUG
#	define YYDEBUG	0	/* don't allow debugging */
1080
1081
1082
1083
1084
1085
1086


1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
	"date : tUNUMBER tMONTH tUNUMBER",
	"ordMonth : tNEXT tMONTH",
	"ordMonth : tNEXT tUNUMBER tMONTH",
	"iso : tISOBASE tZONE tISOBASE",
	"iso : tISOBASE tZONE tUNUMBER ':' tUNUMBER ':' tUNUMBER",
	"iso : tISOBASE tISOBASE",
	"trek : tSTARDATE tUNUMBER '.' tUNUMBER",


	"relspec : sign tUNUMBER unit ago",
	"relspec : tUNUMBER unit ago",
	"relspec : tNEXT unit",
	"relspec : tNEXT tUNUMBER unit",
	"relspec : unit ago",
	"sign : '-'",
	"sign : '+'",
	"unit : tSEC_UNIT",
	"unit : tDAY_UNIT",
	"unit : tMONTH_UNIT",
	"ago : tAGO",
	"ago : /* empty */",
	"number : tUNUMBER",
	"o_merid : /* empty */",
	"o_merid : tMERIDIAN",
};
#endif /* YYDEBUG */
/*
 * Copyright (c) 1993 by Sun Microsystems, Inc.







>
>
|
|
|
|
|





<
<







1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098


1099
1100
1101
1102
1103
1104
1105
	"date : tUNUMBER tMONTH tUNUMBER",
	"ordMonth : tNEXT tMONTH",
	"ordMonth : tNEXT tUNUMBER tMONTH",
	"iso : tISOBASE tZONE tISOBASE",
	"iso : tISOBASE tZONE tUNUMBER ':' tUNUMBER ':' tUNUMBER",
	"iso : tISOBASE tISOBASE",
	"trek : tSTARDATE tUNUMBER '.' tUNUMBER",
	"relspec : relunits tAGO",
	"relspec : relunits",
	"relunits : sign tUNUMBER unit",
	"relunits : tUNUMBER unit",
	"relunits : tNEXT unit",
	"relunits : tNEXT tUNUMBER unit",
	"relunits : unit",
	"sign : '-'",
	"sign : '+'",
	"unit : tSEC_UNIT",
	"unit : tDAY_UNIT",
	"unit : tMONTH_UNIT",


	"number : tUNUMBER",
	"o_merid : /* empty */",
	"o_merid : tMERIDIAN",
};
#endif /* YYDEBUG */
/*
 * Copyright (c) 1993 by Sun Microsystems, Inc.
1808
1809
1810
1811
1812
1813
1814
1815




1816

1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
	     */
            TclDateYear = TclDatepvt[-2].Number/1000 + 2323 - 377;
            TclDateDay  = 1;
	    TclDateMonth = 1;
	    TclDateRelDay += ((TclDatepvt[-2].Number%1000)*(365 + IsLeapYear(TclDateYear)))/1000;
	    TclDateRelSeconds += TclDatepvt[-0].Number * 144 * 60;
        } break;
case 41:{ *TclDateRelPointer += TclDatepvt[-3].Number * TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;




case 42:{ *TclDateRelPointer += TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;

case 43:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 44:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 45:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 46:{ TclDateval.Number = -1; } break;
case 47:{ TclDateval.Number =  1; } break;
case 48:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelSeconds; } break;
case 49:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelDay; } break;
case 50:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelMonth; } break;
case 51:{ TclDateval.Number = -1; } break;
case 52:{ TclDateval.Number = 1; } break;
case 53:{
	if (TclDateHaveTime && TclDateHaveDate && !TclDateHaveRel) {
	    TclDateYear = TclDatepvt[-0].Number;
	} else {
	    TclDateHaveTime++;
	    if (TclDatepvt[-0].Number < 100) {
		TclDateHour = TclDatepvt[-0].Number;







|
>
>
>
>
|
>
|
|
|
|
|
|
|
|
<
<







1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829


1830
1831
1832
1833
1834
1835
1836
	     */
            TclDateYear = TclDatepvt[-2].Number/1000 + 2323 - 377;
            TclDateDay  = 1;
	    TclDateMonth = 1;
	    TclDateRelDay += ((TclDatepvt[-2].Number%1000)*(365 + IsLeapYear(TclDateYear)))/1000;
	    TclDateRelSeconds += TclDatepvt[-0].Number * 144 * 60;
        } break;
case 41:{
	    TclDateRelSeconds *= -1;
	    TclDateRelMonth *= -1;
	    TclDateRelDay *= -1;
	} break;
case 43:{ *TclDateRelPointer += TclDatepvt[-2].Number * TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 44:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 45:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 46:{ *TclDateRelPointer += TclDatepvt[-1].Number * TclDatepvt[-0].Number; } break;
case 47:{ *TclDateRelPointer += TclDatepvt[-0].Number; } break;
case 48:{ TclDateval.Number = -1; } break;
case 49:{ TclDateval.Number =  1; } break;
case 50:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelSeconds; } break;
case 51:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelDay; } break;
case 52:{ TclDateval.Number = TclDatepvt[-0].Number; TclDateRelPointer = &TclDateRelMonth; } break;


case 53:{
	if (TclDateHaveTime && TclDateHaveDate && !TclDateHaveRel) {
	    TclDateYear = TclDatepvt[-0].Number;
	} else {
	    TclDateHaveTime++;
	    if (TclDatepvt[-0].Number < 100) {
		TclDateHour = TclDatepvt[-0].Number;
Changes to generic/tclDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclDecls.h --
 *
 *	Declarations of functions in the platform independent public Tcl API.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDecls.h,v 1.34 2000/04/09 16:04:17 kupries Exp $
 */

#ifndef _TCLDECLS
#define _TCLDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclDecls.h --
 *
 *	Declarations of functions in the platform independent public Tcl API.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclDecls.h,v 1.34.2.1 2000/07/27 01:39:15 hobbs Exp $
 */

#ifndef _TCLDECLS
#define _TCLDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
EXTERN void		Tcl_InitMemory _ANSI_ARGS_((Tcl_Interp * interp));
/* 281 */
EXTERN Tcl_Channel	Tcl_StackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_ChannelType * typePtr, 
				ClientData instanceData, int mask, 
				Tcl_Channel prevChan));
/* 282 */
EXTERN void		Tcl_UnstackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_Channel chan));
/* 283 */
EXTERN Tcl_Channel	Tcl_GetStackedChannel _ANSI_ARGS_((Tcl_Channel chan));
/* Slot 284 is reserved */
/* Slot 285 is reserved */
/* 286 */
EXTERN void		Tcl_AppendObjToObj _ANSI_ARGS_((Tcl_Obj * objPtr, 







|







905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
EXTERN void		Tcl_InitMemory _ANSI_ARGS_((Tcl_Interp * interp));
/* 281 */
EXTERN Tcl_Channel	Tcl_StackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_ChannelType * typePtr, 
				ClientData instanceData, int mask, 
				Tcl_Channel prevChan));
/* 282 */
EXTERN int		Tcl_UnstackChannel _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_Channel chan));
/* 283 */
EXTERN Tcl_Channel	Tcl_GetStackedChannel _ANSI_ARGS_((Tcl_Channel chan));
/* Slot 284 is reserved */
/* Slot 285 is reserved */
/* 286 */
EXTERN void		Tcl_AppendObjToObj _ANSI_ARGS_((Tcl_Obj * objPtr, 
1224
1225
1226
1227
1228
1229
1230




















































1231
1232
1233
1234
1235
1236
1237
/* 392 */
EXTERN void		Tcl_MutexFinalize _ANSI_ARGS_((Tcl_Mutex * mutex));
/* 393 */
EXTERN int		Tcl_CreateThread _ANSI_ARGS_((Tcl_ThreadId * idPtr, 
				Tcl_ThreadCreateProc proc, 
				ClientData clientData, int stackSize, 
				int flags));





















































typedef struct TclStubHooks {
    struct TclPlatStubs *tclPlatStubs;
    struct TclIntStubs *tclIntStubs;
    struct TclIntPlatStubs *tclIntPlatStubs;
} TclStubHooks;








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
/* 392 */
EXTERN void		Tcl_MutexFinalize _ANSI_ARGS_((Tcl_Mutex * mutex));
/* 393 */
EXTERN int		Tcl_CreateThread _ANSI_ARGS_((Tcl_ThreadId * idPtr, 
				Tcl_ThreadCreateProc proc, 
				ClientData clientData, int stackSize, 
				int flags));
/* 394 */
EXTERN int		Tcl_ReadRaw _ANSI_ARGS_((Tcl_Channel chan, 
				char * dst, int bytesToRead));
/* 395 */
EXTERN int		Tcl_WriteRaw _ANSI_ARGS_((Tcl_Channel chan, 
				char * src, int srcLen));
/* 396 */
EXTERN Tcl_Channel	Tcl_GetTopChannel _ANSI_ARGS_((Tcl_Channel chan));
/* 397 */
EXTERN int		Tcl_ChannelBuffered _ANSI_ARGS_((Tcl_Channel chan));
/* 398 */
EXTERN char *		Tcl_ChannelName _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 399 */
EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 400 */
EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 401 */
EXTERN Tcl_DriverCloseProc * Tcl_ChannelCloseProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 402 */
EXTERN Tcl_DriverClose2Proc * Tcl_ChannelClose2Proc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 403 */
EXTERN Tcl_DriverInputProc * Tcl_ChannelInputProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 404 */
EXTERN Tcl_DriverOutputProc * Tcl_ChannelOutputProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 405 */
EXTERN Tcl_DriverSeekProc * Tcl_ChannelSeekProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 406 */
EXTERN Tcl_DriverSetOptionProc * Tcl_ChannelSetOptionProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 407 */
EXTERN Tcl_DriverGetOptionProc * Tcl_ChannelGetOptionProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 408 */
EXTERN Tcl_DriverWatchProc * Tcl_ChannelWatchProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 409 */
EXTERN Tcl_DriverGetHandleProc * Tcl_ChannelGetHandleProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 410 */
EXTERN Tcl_DriverFlushProc * Tcl_ChannelFlushProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));
/* 411 */
EXTERN Tcl_DriverHandlerProc * Tcl_ChannelHandlerProc _ANSI_ARGS_((
				Tcl_ChannelType * chanTypePtr));

typedef struct TclStubHooks {
    struct TclPlatStubs *tclPlatStubs;
    struct TclIntStubs *tclIntStubs;
    struct TclIntPlatStubs *tclIntPlatStubs;
} TclStubHooks;

1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
#endif /* __WIN32__ */
#ifdef MAC_TCL
    void *reserved278;
#endif /* MAC_TCL */
    void (*tcl_GetVersion) _ANSI_ARGS_((int * major, int * minor, int * patchLevel, int * type)); /* 279 */
    void (*tcl_InitMemory) _ANSI_ARGS_((Tcl_Interp * interp)); /* 280 */
    Tcl_Channel (*tcl_StackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_ChannelType * typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan)); /* 281 */
    void (*tcl_UnstackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 282 */
    Tcl_Channel (*tcl_GetStackedChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 283 */
    void *reserved284;
    void *reserved285;
    void (*tcl_AppendObjToObj) _ANSI_ARGS_((Tcl_Obj * objPtr, Tcl_Obj * appendObjPtr)); /* 286 */
    Tcl_Encoding (*tcl_CreateEncoding) _ANSI_ARGS_((Tcl_EncodingType * typePtr)); /* 287 */
    void (*tcl_CreateThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 288 */
    void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 289 */







|







1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
#endif /* __WIN32__ */
#ifdef MAC_TCL
    void *reserved278;
#endif /* MAC_TCL */
    void (*tcl_GetVersion) _ANSI_ARGS_((int * major, int * minor, int * patchLevel, int * type)); /* 279 */
    void (*tcl_InitMemory) _ANSI_ARGS_((Tcl_Interp * interp)); /* 280 */
    Tcl_Channel (*tcl_StackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_ChannelType * typePtr, ClientData instanceData, int mask, Tcl_Channel prevChan)); /* 281 */
    int (*tcl_UnstackChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 282 */
    Tcl_Channel (*tcl_GetStackedChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 283 */
    void *reserved284;
    void *reserved285;
    void (*tcl_AppendObjToObj) _ANSI_ARGS_((Tcl_Obj * objPtr, Tcl_Obj * appendObjPtr)); /* 286 */
    Tcl_Encoding (*tcl_CreateEncoding) _ANSI_ARGS_((Tcl_EncodingType * typePtr)); /* 287 */
    void (*tcl_CreateThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 288 */
    void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 289 */
1685
1686
1687
1688
1689
1690
1691


















1692
1693
1694
1695
1696
1697
1698
    Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */
    int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 388 */
    int (*tcl_GetChannelNamesEx) _ANSI_ARGS_((Tcl_Interp * interp, char * pattern)); /* 389 */
    int (*tcl_ProcObjCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])); /* 390 */
    void (*tcl_ConditionFinalize) _ANSI_ARGS_((Tcl_Condition * condPtr)); /* 391 */
    void (*tcl_MutexFinalize) _ANSI_ARGS_((Tcl_Mutex * mutex)); /* 392 */
    int (*tcl_CreateThread) _ANSI_ARGS_((Tcl_ThreadId * idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 393 */


















} TclStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclStubs *tclStubsPtr;
#ifdef __cplusplus







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
    Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */
    int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 388 */
    int (*tcl_GetChannelNamesEx) _ANSI_ARGS_((Tcl_Interp * interp, char * pattern)); /* 389 */
    int (*tcl_ProcObjCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])); /* 390 */
    void (*tcl_ConditionFinalize) _ANSI_ARGS_((Tcl_Condition * condPtr)); /* 391 */
    void (*tcl_MutexFinalize) _ANSI_ARGS_((Tcl_Mutex * mutex)); /* 392 */
    int (*tcl_CreateThread) _ANSI_ARGS_((Tcl_ThreadId * idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 393 */
    int (*tcl_ReadRaw) _ANSI_ARGS_((Tcl_Channel chan, char * dst, int bytesToRead)); /* 394 */
    int (*tcl_WriteRaw) _ANSI_ARGS_((Tcl_Channel chan, char * src, int srcLen)); /* 395 */
    Tcl_Channel (*tcl_GetTopChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 396 */
    int (*tcl_ChannelBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 397 */
    char * (*tcl_ChannelName) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 398 */
    Tcl_ChannelTypeVersion (*tcl_ChannelVersion) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 399 */
    Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 400 */
    Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 401 */
    Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 402 */
    Tcl_DriverInputProc * (*tcl_ChannelInputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 403 */
    Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 404 */
    Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 405 */
    Tcl_DriverSetOptionProc * (*tcl_ChannelSetOptionProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 406 */
    Tcl_DriverGetOptionProc * (*tcl_ChannelGetOptionProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 407 */
    Tcl_DriverWatchProc * (*tcl_ChannelWatchProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 408 */
    Tcl_DriverGetHandleProc * (*tcl_ChannelGetHandleProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 409 */
    Tcl_DriverFlushProc * (*tcl_ChannelFlushProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 410 */
    Tcl_DriverHandlerProc * (*tcl_ChannelHandlerProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 411 */
} TclStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclStubs *tclStubsPtr;
#ifdef __cplusplus
3306
3307
3308
3309
3310
3311
3312








































































3313
3314
3315
3316
3317
3318
3319
#define Tcl_MutexFinalize \
	(tclStubsPtr->tcl_MutexFinalize) /* 392 */
#endif
#ifndef Tcl_CreateThread
#define Tcl_CreateThread \
	(tclStubsPtr->tcl_CreateThread) /* 393 */
#endif









































































#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLDECLS */








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
#define Tcl_MutexFinalize \
	(tclStubsPtr->tcl_MutexFinalize) /* 392 */
#endif
#ifndef Tcl_CreateThread
#define Tcl_CreateThread \
	(tclStubsPtr->tcl_CreateThread) /* 393 */
#endif
#ifndef Tcl_ReadRaw
#define Tcl_ReadRaw \
	(tclStubsPtr->tcl_ReadRaw) /* 394 */
#endif
#ifndef Tcl_WriteRaw
#define Tcl_WriteRaw \
	(tclStubsPtr->tcl_WriteRaw) /* 395 */
#endif
#ifndef Tcl_GetTopChannel
#define Tcl_GetTopChannel \
	(tclStubsPtr->tcl_GetTopChannel) /* 396 */
#endif
#ifndef Tcl_ChannelBuffered
#define Tcl_ChannelBuffered \
	(tclStubsPtr->tcl_ChannelBuffered) /* 397 */
#endif
#ifndef Tcl_ChannelName
#define Tcl_ChannelName \
	(tclStubsPtr->tcl_ChannelName) /* 398 */
#endif
#ifndef Tcl_ChannelVersion
#define Tcl_ChannelVersion \
	(tclStubsPtr->tcl_ChannelVersion) /* 399 */
#endif
#ifndef Tcl_ChannelBlockModeProc
#define Tcl_ChannelBlockModeProc \
	(tclStubsPtr->tcl_ChannelBlockModeProc) /* 400 */
#endif
#ifndef Tcl_ChannelCloseProc
#define Tcl_ChannelCloseProc \
	(tclStubsPtr->tcl_ChannelCloseProc) /* 401 */
#endif
#ifndef Tcl_ChannelClose2Proc
#define Tcl_ChannelClose2Proc \
	(tclStubsPtr->tcl_ChannelClose2Proc) /* 402 */
#endif
#ifndef Tcl_ChannelInputProc
#define Tcl_ChannelInputProc \
	(tclStubsPtr->tcl_ChannelInputProc) /* 403 */
#endif
#ifndef Tcl_ChannelOutputProc
#define Tcl_ChannelOutputProc \
	(tclStubsPtr->tcl_ChannelOutputProc) /* 404 */
#endif
#ifndef Tcl_ChannelSeekProc
#define Tcl_ChannelSeekProc \
	(tclStubsPtr->tcl_ChannelSeekProc) /* 405 */
#endif
#ifndef Tcl_ChannelSetOptionProc
#define Tcl_ChannelSetOptionProc \
	(tclStubsPtr->tcl_ChannelSetOptionProc) /* 406 */
#endif
#ifndef Tcl_ChannelGetOptionProc
#define Tcl_ChannelGetOptionProc \
	(tclStubsPtr->tcl_ChannelGetOptionProc) /* 407 */
#endif
#ifndef Tcl_ChannelWatchProc
#define Tcl_ChannelWatchProc \
	(tclStubsPtr->tcl_ChannelWatchProc) /* 408 */
#endif
#ifndef Tcl_ChannelGetHandleProc
#define Tcl_ChannelGetHandleProc \
	(tclStubsPtr->tcl_ChannelGetHandleProc) /* 409 */
#endif
#ifndef Tcl_ChannelFlushProc
#define Tcl_ChannelFlushProc \
	(tclStubsPtr->tcl_ChannelFlushProc) /* 410 */
#endif
#ifndef Tcl_ChannelHandlerProc
#define Tcl_ChannelHandlerProc \
	(tclStubsPtr->tcl_ChannelHandlerProc) /* 411 */
#endif

#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLDECLS */

Changes to generic/tclEncoding.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclEncoding.c --
 *
 *	Contains the implementation of the encoding conversion package.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEncoding.c,v 1.5 2000/01/21 02:25:26 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

typedef size_t (LengthProc)_ANSI_ARGS_((CONST char *src));











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclEncoding.c --
 *
 *	Contains the implementation of the encoding conversion package.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEncoding.c,v 1.5.2.1 2001/04/03 22:54:36 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

typedef size_t (LengthProc)_ANSI_ARGS_((CONST char *src));

1324
1325
1326
1327
1328
1329
1330
1331





1332



1333
1334











1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
    char *line;
    int i, hi, lo, numPages, symbol, fallback;
    unsigned char used[256];
    unsigned int size;
    TableEncodingData *dataPtr;
    unsigned short *pageMemPtr;
    Tcl_EncodingType encType;
    char *hex;





    static char staticHex[] = {



	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0,
	10, 11, 12, 13, 14, 15











    };

    hex = staticHex - '0';

    Tcl_DStringInit(&lineString);
    Tcl_Gets(chan, &lineString);
    line = Tcl_DStringValue(&lineString);

    fallback = (int) strtol(line, &line, 16);
    symbol = (int) strtol(line, &line, 10);
    numPages = (int) strtol(line, &line, 10);







|
>
>
>
>
>

>
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>


<
<







1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355


1356
1357
1358
1359
1360
1361
1362
    char *line;
    int i, hi, lo, numPages, symbol, fallback;
    unsigned char used[256];
    unsigned int size;
    TableEncodingData *dataPtr;
    unsigned short *pageMemPtr;
    Tcl_EncodingType encType;

    /*
     * Speed over memory. Use a full 256 character table to decode hex
     * sequences in the encoding files.
     */

    static char staticHex[] = {
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*   0 ...  15 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  16 ...  31 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  32 ...  47 */
      0,  1,  2,  3,  4,  5,  6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /*  48 ...  63 */
      0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  64 ...  79 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  80 ...  95 */
      0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  96 ... 111 */
      0,  1,  2,  3,  4,  5,  6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 112 ... 127 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128 ... 143 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144 ... 159 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160 ... 175 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 176 ... 191 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 192 ... 207 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 208 ... 223 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 224 ... 239 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 ... 255 */
    };



    Tcl_DStringInit(&lineString);
    Tcl_Gets(chan, &lineString);
    line = Tcl_DStringValue(&lineString);

    fallback = (int) strtol(line, &line, 16);
    symbol = (int) strtol(line, &line, 10);
    numPages = (int) strtol(line, &line, 10);
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
    }
    for (i = 0; i < numPages; i++) {
	int ch;
	char *p;

	Tcl_ReadChars(chan, objPtr, 3 + 16 * (16 * 4 + 1), 0);
	p = Tcl_GetString(objPtr);
	hi = (hex[(int)p[0]] << 4) + hex[(int)p[1]];
	dataPtr->toUnicode[hi] = pageMemPtr;
	p += 2;
	for (lo = 0; lo < 256; lo++) {
	    if ((lo & 0x0f) == 0) {
		p++;
	    }
	    ch = (hex[(int)p[0]] << 12) + (hex[(int)p[1]] << 8)
		+ (hex[(int)p[2]] << 4) + hex[(int)p[3]];
	    if (ch != 0) {
		used[ch >> 8] = 1;
	    }
	    *pageMemPtr = (unsigned short) ch;
	    pageMemPtr++;
	    p += 4;
	}







|






|
|







1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
    }
    for (i = 0; i < numPages; i++) {
	int ch;
	char *p;

	Tcl_ReadChars(chan, objPtr, 3 + 16 * (16 * 4 + 1), 0);
	p = Tcl_GetString(objPtr);
	hi = (staticHex[(unsigned int)p[0]] << 4) + staticHex[(unsigned int)p[1]];
	dataPtr->toUnicode[hi] = pageMemPtr;
	p += 2;
	for (lo = 0; lo < 256; lo++) {
	    if ((lo & 0x0f) == 0) {
		p++;
	    }
	    ch = (staticHex[(unsigned int)p[0]] << 12) + (staticHex[(unsigned int)p[1]] << 8)
		+ (staticHex[(unsigned int)p[2]] << 4) + staticHex[(unsigned int)p[3]];
	    if (ch != 0) {
		used[ch >> 8] = 1;
	    }
	    *pageMemPtr = (unsigned short) ch;
	    pageMemPtr++;
	    p += 4;
	}
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
    encType.encodingName    = name;
    encType.toUtfProc	    = TableToUtfProc;
    encType.fromUtfProc	    = TableFromUtfProc;
    encType.freeProc	    = TableFreeProc;
    encType.nullSize	    = (type == ENCODING_DOUBLEBYTE) ? 2 : 1;
    encType.clientData	    = (ClientData) dataPtr;
    return Tcl_CreateEncoding(&encType);

}

/*
 *-------------------------------------------------------------------------
 *
 * LoadEscapeEncoding --
 *







<







1523
1524
1525
1526
1527
1528
1529

1530
1531
1532
1533
1534
1535
1536
    encType.encodingName    = name;
    encType.toUtfProc	    = TableToUtfProc;
    encType.fromUtfProc	    = TableFromUtfProc;
    encType.freeProc	    = TableFreeProc;
    encType.nullSize	    = (type == ENCODING_DOUBLEBYTE) ? 2 : 1;
    encType.clientData	    = (ClientData) dataPtr;
    return Tcl_CreateEncoding(&encType);

}

/*
 *-------------------------------------------------------------------------
 *
 * LoadEscapeEncoding --
 *
Changes to generic/tclEnv.c.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEnv.c,v 1.7 2000/04/19 08:32:44 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

TCL_DECLARE_MUTEX(envMutex)	/* To serialize access to environ */








|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEnv.c,v 1.7.2.2 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

TCL_DECLARE_MUTEX(envMutex)	/* To serialize access to environ */

352
353
354
355
356
357
358
359

360
361
362
363
364
365
366
 */

void
TclUnsetEnv(name)
    CONST char *name;		/* Name of variable to remove (UTF-8). */
{
    char *oldValue;
    int length, index;

#ifdef USE_PUTENV
    Tcl_DString envString;
    char *string;
#else
    char **envPtr;
#endif








|
>







352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
 */

void
TclUnsetEnv(name)
    CONST char *name;		/* Name of variable to remove (UTF-8). */
{
    char *oldValue;
    int length;
    int index;
#ifdef USE_PUTENV
    Tcl_DString envString;
    char *string;
#else
    char **envPtr;
#endif

Changes to generic/tclEvent.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclEvent.c --
 *
 *	This file implements some general event related interfaces including
 *	background errors, exit handlers, and the "vwait" and "update"
 *	command procedures. 
 *
 * Copyright (c) 1990-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEvent.c,v 1.8 2000/04/18 23:10:04 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The data structure below is used to report background errors.  One













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclEvent.c --
 *
 *	This file implements some general event related interfaces including
 *	background errors, exit handlers, and the "vwait" and "update"
 *	command procedures. 
 *
 * Copyright (c) 1990-1994 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclEvent.c,v 1.8.2.1 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The data structure below is used to report background errors.  One
94
95
96
97
98
99
100





101
102
103
104
105
106
107
    int inExit;			/* True when this thread is exiting. This
				 * is used as a hack to decide to close
				 * the standard channels. */
    Tcl_Obj *tclLibraryPath;	/* Path(s) to the Tcl library */
} ThreadSpecificData;
static Tcl_ThreadDataKey dataKey;






/*
 * Prototypes for procedures referenced only in this file:
 */

static void		BgErrorDeleteProc _ANSI_ARGS_((ClientData clientData,
			    Tcl_Interp *interp));
static void		HandleBgErrors _ANSI_ARGS_((ClientData clientData));







>
>
>
>
>







94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    int inExit;			/* True when this thread is exiting. This
				 * is used as a hack to decide to close
				 * the standard channels. */
    Tcl_Obj *tclLibraryPath;	/* Path(s) to the Tcl library */
} ThreadSpecificData;
static Tcl_ThreadDataKey dataKey;

/*
 * Common string for the library path for sharing across threads.
 */
char *tclLibraryPathStr;

/*
 * Prototypes for procedures referenced only in this file:
 */

static void		BgErrorDeleteProc _ANSI_ARGS_((ClientData clientData,
			    Tcl_Interp *interp));
static void		HandleBgErrors _ANSI_ARGS_((ClientData clientData));
592
593
594
595
596
597
598






599
600
601
602
603
604
605
    if (pathPtr != NULL) {
	Tcl_IncrRefCount(pathPtr);
    }
    if (tsdPtr->tclLibraryPath != NULL) {
	Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
    }
    tsdPtr->tclLibraryPath = pathPtr;






}

/*
 *-------------------------------------------------------------------------
 *
 * TclGetLibraryPath --
 *







>
>
>
>
>
>







597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
    if (pathPtr != NULL) {
	Tcl_IncrRefCount(pathPtr);
    }
    if (tsdPtr->tclLibraryPath != NULL) {
	Tcl_DecrRefCount(tsdPtr->tclLibraryPath);
    }
    tsdPtr->tclLibraryPath = pathPtr;

    /*
     *  No mutex locking is needed here as up the stack we're within
     *  TclpInitLock().
     */
    tclLibraryPathStr = Tcl_GetStringFromObj(pathPtr, NULL);
}

/*
 *-------------------------------------------------------------------------
 *
 * TclGetLibraryPath --
 *
615
616
617
618
619
620
621











622
623
624
625
626
627
628
 *-------------------------------------------------------------------------
 */

Tcl_Obj *
TclGetLibraryPath()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);











    return tsdPtr->tclLibraryPath;
}

/*
 *-------------------------------------------------------------------------
 *
 * TclInitSubsystems --







>
>
>
>
>
>
>
>
>
>
>







626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
 *-------------------------------------------------------------------------
 */

Tcl_Obj *
TclGetLibraryPath()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (tsdPtr->tclLibraryPath == NULL) {
	/*
	 * Grab the shared string and place it into a new thread specific
	 * Tcl_Obj.
	 */
	tsdPtr->tclLibraryPath = Tcl_NewStringObj(tclLibraryPathStr, -1);

	/* take ownership */
	Tcl_IncrRefCount(tsdPtr->tclLibraryPath);
    }
    return tsdPtr->tclLibraryPath;
}

/*
 *-------------------------------------------------------------------------
 *
 * TclInitSubsystems --
740
741
742
743
744
745
746
747
748
749


750
751
752
753
754
755
756
void
Tcl_Finalize()
{
    ExitHandler *exitPtr;
    ThreadSpecificData *tsdPtr;

    TclpInitLock();
    tsdPtr = TCL_TSD_INIT(&dataKey);
    if (subsystemsInitialized != 0) {
	subsystemsInitialized = 0;



	/*
	 * Invoke exit handlers first.
	 */

	Tcl_MutexLock(&exitMutex);
	inFinalize = 1;







<


>
>







762
763
764
765
766
767
768

769
770
771
772
773
774
775
776
777
778
779
void
Tcl_Finalize()
{
    ExitHandler *exitPtr;
    ThreadSpecificData *tsdPtr;

    TclpInitLock();

    if (subsystemsInitialized != 0) {
	subsystemsInitialized = 0;

	tsdPtr = TCL_TSD_INIT(&dataKey);

	/*
	 * Invoke exit handlers first.
	 */

	Tcl_MutexLock(&exitMutex);
	inFinalize = 1;
Changes to generic/tclExecute.c.
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclExecute.c --
 *
 *	This file contains procedures that execute byte-compiled Tcl
 *	commands.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.

 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclExecute.c,v 1.10 2000/03/27 22:18:55 hobbs Exp $
 */

#include "tclInt.h"
#include "tclCompile.h"

#ifdef NO_FLOAT_H
#   include "../compat/float.h"







>




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclExecute.c --
 *
 *	This file contains procedures that execute byte-compiled Tcl
 *	commands.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclExecute.c,v 1.10.2.2 2001/08/07 15:41:20 msofer Exp $
 */

#include "tclInt.h"
#include "tclCompile.h"

#ifdef NO_FLOAT_H
#   include "../compat/float.h"
108
109
110
111
112
113
114











115
116
117
118
119
120
121

#ifdef TCL_COMPILE_DEBUG
static char *resultStrings[] = {
    "TCL_OK", "TCL_ERROR", "TCL_RETURN", "TCL_BREAK", "TCL_CONTINUE"
};
#endif












/*
 * Macros for testing floating-point values for certain special cases. Test
 * for not-a-number by comparing a value against itself; test for infinity
 * by comparing against the largest floating-point value.
 */

#define IS_NAN(v) ((v) != (v))







>
>
>
>
>
>
>
>
>
>
>







109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133

#ifdef TCL_COMPILE_DEBUG
static char *resultStrings[] = {
    "TCL_OK", "TCL_ERROR", "TCL_RETURN", "TCL_BREAK", "TCL_CONTINUE"
};
#endif

/*
 * These are used by evalstats to monitor object usage in Tcl.
 */

#ifdef TCL_COMPILE_STATS
long		tclObjsAlloced = 0;
long		tclObjsFreed   = 0;
#define TCL_MAX_SHARED_OBJ_STATS 5
long		tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 };
#endif /* TCL_COMPILE_STATS */

/*
 * Macros for testing floating-point values for certain special cases. Test
 * for not-a-number by comparing a value against itself; test for infinity
 * by comparing against the largest floating-point value.
 */

#define IS_NAN(v) ((v) != (v))
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
 *----------------------------------------------------------------------
 */

void
TclDeleteExecEnv(eePtr)
    ExecEnv *eePtr;		/* Execution environment to free. */
{
    ckfree((char *) eePtr->stackPtr);
    ckfree((char *) eePtr);
}

/*
 *----------------------------------------------------------------------
 *
 * TclFinalizeExecution --







|







433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
 *----------------------------------------------------------------------
 */

void
TclDeleteExecEnv(eePtr)
    ExecEnv *eePtr;		/* Execution environment to free. */
{
    Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
    ckfree((char *) eePtr);
}

/*
 *----------------------------------------------------------------------
 *
 * TclFinalizeExecution --
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
    /*
     * Copy the existing stack items to the new stack space, free the old
     * storage if appropriate, and mark new space as malloc'ed.
     */
 
    memcpy((VOID *) newStackPtr, (VOID *) eePtr->stackPtr,
	   (size_t) currBytes);
    ckfree((char *) eePtr->stackPtr);
    eePtr->stackPtr = newStackPtr;
    eePtr->stackEnd = (newElems - 1); /* i.e. index of last usable item */
}

/*
 *----------------------------------------------------------------------
 *







|







503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
    /*
     * Copy the existing stack items to the new stack space, free the old
     * storage if appropriate, and mark new space as malloc'ed.
     */
 
    memcpy((VOID *) newStackPtr, (VOID *) eePtr->stackPtr,
	   (size_t) currBytes);
    Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
    eePtr->stackPtr = newStackPtr;
    eePtr->stackEnd = (newElems - 1); /* i.e. index of last usable item */
}

/*
 *----------------------------------------------------------------------
 *
618
619
620
621
622
623
624




625
626
627
628
629
630
631
632
633
634
635
636
	     * Pop the topmost object from the stack, set the interpreter's
	     * object result to point to it, and return.
	     */
	    valuePtr = POP_OBJECT();
	    Tcl_SetObjResult(interp, valuePtr);
	    TclDecrRefCount(valuePtr);
	    if (stackTop != initStackTop) {




		fprintf(stderr, "\nTclExecuteByteCode: done instruction at pc %u: stack top %d != entry stack top %d\n",
			(unsigned int)(pc - codePtr->codeStart),
			(unsigned int) stackTop,
			(unsigned int) initStackTop);
		panic("TclExecuteByteCode execution failure: end stack top != start stack top");
	    }
	    TRACE_WITH_OBJ(("=> return code=%d, result=", result),
		    iPtr->objResultPtr);
#ifdef TCL_COMPILE_DEBUG	    
	    if (traceInstructions) {
		fprintf(stdout, "\n");
	    }







>
>
>
>
|



|







630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
	     * Pop the topmost object from the stack, set the interpreter's
	     * object result to point to it, and return.
	     */
	    valuePtr = POP_OBJECT();
	    Tcl_SetObjResult(interp, valuePtr);
	    TclDecrRefCount(valuePtr);
	    if (stackTop != initStackTop) {
		/*
		 * if extra items in the stack, clean up the stack before return
		 */
		if (stackTop > initStackTop) goto abnormalReturn;
		fprintf(stderr, "\nTclExecuteByteCode: done instruction at pc %u: stack top %d < entry stack top %d\n",
			(unsigned int)(pc - codePtr->codeStart),
			(unsigned int) stackTop,
			(unsigned int) initStackTop);
		panic("TclExecuteByteCode execution failure: end stack top < start stack top");
	    }
	    TRACE_WITH_OBJ(("=> return code=%d, result=", result),
		    iPtr->objResultPtr);
#ifdef TCL_COMPILE_DEBUG	    
	    if (traceInstructions) {
		fprintf(stdout, "\n");
	    }
728
729
730
731
732
733
734




735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
	    
	    doInvocation:
	    {
		int objc = opnd; /* The number of arguments. */
		Tcl_Obj **objv;	 /* The array of argument objects. */
		Command *cmdPtr; /* Points to command's Command struct. */
		int newPcOffset; /* New inst offset for break, continue. */




#ifdef TCL_COMPILE_DEBUG
		int isUnknownCmd = 0;
		char cmdNameBuf[21];
#endif /* TCL_COMPILE_DEBUG */
		
		/*
		 * If the interpreter was deleted, return an error.
		 */
		
		if (iPtr->flags & DELETED) {
		    Tcl_ResetResult(interp);
		    Tcl_AppendToObj(Tcl_GetObjResult(interp),
		            "attempt to call eval in deleted interpreter", -1);
		    Tcl_SetErrorCode(interp, "CORE", "IDELETE",
			    "attempt to call eval in deleted interpreter",
			    (char *) NULL);
		    result = TCL_ERROR;
		    goto checkForCatch;
		}
    
		/*
		 * Find the procedure to execute this command. If the
		 * command is not found, handle it with the "unknown" proc.
		 */

		objv = &(stackPtr[stackTop - (objc-1)]);
		cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);







>
>
>
>




|



|










|







744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
	    
	    doInvocation:
	    {
		int objc = opnd; /* The number of arguments. */
		Tcl_Obj **objv;	 /* The array of argument objects. */
		Command *cmdPtr; /* Points to command's Command struct. */
		int newPcOffset; /* New inst offset for break, continue. */
		Tcl_Obj **preservedStack;
				 /* Reference to memory block containing
				  * objv array (must be kept live throughout
				  * trace and command invokations.) */
#ifdef TCL_COMPILE_DEBUG
		int isUnknownCmd = 0;
		char cmdNameBuf[21];
#endif /* TCL_COMPILE_DEBUG */

		/*
		 * If the interpreter was deleted, return an error.
		 */

		if (iPtr->flags & DELETED) {
		    Tcl_ResetResult(interp);
		    Tcl_AppendToObj(Tcl_GetObjResult(interp),
		            "attempt to call eval in deleted interpreter", -1);
		    Tcl_SetErrorCode(interp, "CORE", "IDELETE",
			    "attempt to call eval in deleted interpreter",
			    (char *) NULL);
		    result = TCL_ERROR;
		    goto checkForCatch;
		}

		/*
		 * Find the procedure to execute this command. If the
		 * command is not found, handle it with the "unknown" proc.
		 */

		objv = &(stackPtr[stackTop - (objc-1)]);
		cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);
779
780
781
782
783
784
785
786












787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
		    for (i = objc-1;  i >= 0;  i--) {
			objv[i+1] = objv[i];
		    }
		    objc++;
		    objv[0] = Tcl_NewStringObj("unknown", -1);
		    Tcl_IncrRefCount(objv[0]);
		}
		












		/*
		 * Call any trace procedures.
		 */

		if (iPtr->tracePtr != NULL) {
		    Trace *tracePtr, *nextTracePtr;

		    for (tracePtr = iPtr->tracePtr;  tracePtr != NULL;
		            tracePtr = nextTracePtr) {
			nextTracePtr = tracePtr->nextPtr;
			if (iPtr->numLevels <= tracePtr->level) {
			    int numChars;
			    char *cmd = GetSrcInfoForPc(pc, codePtr,
				    &numChars);
			    if (cmd != NULL) {
				DECACHE_STACK_INFO();
				CallTraceProcedure(interp, tracePtr, cmdPtr,
				        cmd, numChars, objc, objv);
				CACHE_STACK_INFO();
			    }
			}
		    }
		}
		
		/*
		 * Finally, invoke the command's Tcl_ObjCmdProc. First reset
		 * the interpreter's string and object results to their
		 * default empty values since they could have gotten changed
		 * by earlier invocations.
		 */
		
		Tcl_ResetResult(interp);
		if (tclTraceExec >= 2) {
#ifdef TCL_COMPILE_DEBUG
		    if (traceInstructions) {
			strncpy(cmdNameBuf, Tcl_GetString(objv[0]), 20);
			TRACE(("%u => call ", (isUnknownCmd? objc-1:objc)));
		    } else {







|
>
>
>
>
>
>
>
>
>
>
>
>






|
















|






|







799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
		    for (i = objc-1;  i >= 0;  i--) {
			objv[i+1] = objv[i];
		    }
		    objc++;
		    objv[0] = Tcl_NewStringObj("unknown", -1);
		    Tcl_IncrRefCount(objv[0]);
		}

		/*
		 * A reference to part of the stack vector itself
		 * escapes our control, so must use preserve/release
		 * to stop it from being deallocated by a recursive
		 * call to ourselves.  The extra variable is needed
		 * because all others are liable to change due to the
		 * trace procedures.
		 */

		Tcl_Preserve((ClientData)stackPtr);
		preservedStack = stackPtr;

		/*
		 * Call any trace procedures.
		 */

		if (iPtr->tracePtr != NULL) {
		    Trace *tracePtr, *nextTracePtr;
		    
		    for (tracePtr = iPtr->tracePtr;  tracePtr != NULL;
		            tracePtr = nextTracePtr) {
			nextTracePtr = tracePtr->nextPtr;
			if (iPtr->numLevels <= tracePtr->level) {
			    int numChars;
			    char *cmd = GetSrcInfoForPc(pc, codePtr,
				    &numChars);
			    if (cmd != NULL) {
				DECACHE_STACK_INFO();
				CallTraceProcedure(interp, tracePtr, cmdPtr,
				        cmd, numChars, objc, objv);
				CACHE_STACK_INFO();
			    }
			}
		    }
		}

		/*
		 * Finally, invoke the command's Tcl_ObjCmdProc. First reset
		 * the interpreter's string and object results to their
		 * default empty values since they could have gotten changed
		 * by earlier invocations.
		 */

		Tcl_ResetResult(interp);
		if (tclTraceExec >= 2) {
#ifdef TCL_COMPILE_DEBUG
		    if (traceInstructions) {
			strncpy(cmdNameBuf, Tcl_GetString(objv[0]), 20);
			TRACE(("%u => call ", (isUnknownCmd? objc-1:objc)));
		    } else {
845
846
847
848
849
850
851








852
853
854
855
856
857
858
		result = (*cmdPtr->objProc)(cmdPtr->objClientData, interp,
					    objc, objv);
		if (Tcl_AsyncReady()) {
		    result = Tcl_AsyncInvoke(interp, result);
		}
		CACHE_STACK_INFO();









		/*
		 * If the interpreter has a non-empty string result, the
		 * result object is either empty or stale because some
		 * procedure set interp->result directly. If so, move the
		 * string result to the result object, then reset the
		 * string result.
		 */







>
>
>
>
>
>
>
>







877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
		result = (*cmdPtr->objProc)(cmdPtr->objClientData, interp,
					    objc, objv);
		if (Tcl_AsyncReady()) {
		    result = Tcl_AsyncInvoke(interp, result);
		}
		CACHE_STACK_INFO();

		/*
		 * If the old stack is going to be released, it is
		 * safe to do so now, since no references to objv are
		 * going to be used from now on.
		 */

		Tcl_Release((ClientData)preservedStack);

		/*
		 * If the interpreter has a non-empty string result, the
		 * result object is either empty or stale because some
		 * procedure set interp->result directly. If so, move the
		 * string result to the result object, then reset the
		 * string result.
		 */
2303
2304
2305
2306
2307
2308
2309
2310

2311
2312
2313

2314
2315
2316

2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334





2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
	    }
	    ADJUST_PC(1);
	    
	case INST_UMINUS:
	case INST_LNOT:
	    {
		/*
		 * The operand must be numeric. If the operand object is

		 * unshared modify it directly, otherwise create a copy to
		 * modify: this is "copy on write". free any old string
		 * representation since it is now invalid.

		 */
		
		double d;

		Tcl_ObjType *tPtr;
		
		valuePtr = POP_OBJECT();
		tPtr = valuePtr->typePtr;
		if ((tPtr != &tclIntType) && ((tPtr != &tclDoubleType)
			|| (valuePtr->bytes != NULL))) {
		    if ((tPtr == &tclBooleanType) 
			    && (valuePtr->bytes == NULL)) {
			valuePtr->typePtr = &tclIntType;
		    } else {
			char *s = Tcl_GetStringFromObj(valuePtr, &length);
			if (TclLooksLikeInt(s, length)) {
			    result = Tcl_GetLongFromObj((Tcl_Interp *) NULL,
				    valuePtr, &i);
			} else {
			    result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL,
				    valuePtr, &d);
			}





			if (result != TCL_OK) {
			    TRACE(("\"%.20s\" => ILLEGAL TYPE %s\n",
				    s, (tPtr? tPtr->name : "null")));
			    IllegalExprOperandType(interp, pc, valuePtr);
			    Tcl_DecrRefCount(valuePtr);
			    goto checkForCatch;
			}
		    }
		    tPtr = valuePtr->typePtr;
		}
		
		if (Tcl_IsShared(valuePtr)) {
		    /*
		     * Create a new object.
		     */
		    if (tPtr == &tclIntType) {
			i = valuePtr->internalRep.longValue;
			objPtr = Tcl_NewLongObj(
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), objPtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {







|
>
|
|
|
>

|

>

|
















>
>
>
>
>










|




|







2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
	    }
	    ADJUST_PC(1);
	    
	case INST_UMINUS:
	case INST_LNOT:
	    {
		/*
		 * The operand must be numeric or a boolean string as
		 * accepted by Tcl_GetBooleanFromObj(). If the operand
		 * object is unshared modify it directly, otherwise
		 * create a copy to modify: this is "copy on write".
		 * Free any old string representation since it is now
		 * invalid.
		 */

		double d;
		int boolvar;
		Tcl_ObjType *tPtr;

		valuePtr = POP_OBJECT();
		tPtr = valuePtr->typePtr;
		if ((tPtr != &tclIntType) && ((tPtr != &tclDoubleType)
			|| (valuePtr->bytes != NULL))) {
		    if ((tPtr == &tclBooleanType) 
			    && (valuePtr->bytes == NULL)) {
			valuePtr->typePtr = &tclIntType;
		    } else {
			char *s = Tcl_GetStringFromObj(valuePtr, &length);
			if (TclLooksLikeInt(s, length)) {
			    result = Tcl_GetLongFromObj((Tcl_Interp *) NULL,
				    valuePtr, &i);
			} else {
			    result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL,
				    valuePtr, &d);
			}
			if (result == TCL_ERROR && *pc == INST_LNOT) {
			    result = Tcl_GetBooleanFromObj((Tcl_Interp *)NULL,
				    valuePtr, &boolvar);
			    i = (long)boolvar; /* i is long, not int! */
			}
			if (result != TCL_OK) {
			    TRACE(("\"%.20s\" => ILLEGAL TYPE %s\n",
				    s, (tPtr? tPtr->name : "null")));
			    IllegalExprOperandType(interp, pc, valuePtr);
			    Tcl_DecrRefCount(valuePtr);
			    goto checkForCatch;
			}
		    }
		    tPtr = valuePtr->typePtr;
		}

		if (Tcl_IsShared(valuePtr)) {
		    /*
		     * Create a new object.
		     */
		    if ((tPtr == &tclIntType) || (tPtr == &tclBooleanType)) {
			i = valuePtr->internalRep.longValue;
			objPtr = Tcl_NewLongObj(
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), objPtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
		    }
		    PUSH_OBJECT(objPtr);
		    TclDecrRefCount(valuePtr);
		} else {
		    /*
		     * valuePtr is unshared. Modify it directly.
		     */
		    if (tPtr == &tclIntType) {
			i = valuePtr->internalRep.longValue;
			Tcl_SetLongObj(valuePtr,
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), valuePtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {







|







2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
		    }
		    PUSH_OBJECT(objPtr);
		    TclDecrRefCount(valuePtr);
		} else {
		    /*
		     * valuePtr is unshared. Modify it directly.
		     */
		    if ((tPtr == &tclIntType) || (tPtr == &tclBooleanType)) {
			i = valuePtr->internalRep.longValue;
			Tcl_SetLongObj(valuePtr,
			        (*pc == INST_UMINUS)? -i : !i);
			TRACE_WITH_OBJ(("%ld => ", i), valuePtr);
		    } else {
			d = valuePtr->internalRep.doubleValue;
			if (*pc == INST_UMINUS) {
3840
3841
3842
3843
3844
3845
3846
3847

3848
3849
3850
3851









3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864




3865

3866
3867




3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
				 * the function. */
    ClientData clientData;	/* Ignored. */
{
    Tcl_Obj **stackPtr;        /* Cached evaluation stack base pointer. */
    register int stackTop;	/* Cached top index of evaluation stack. */
    Interp *iPtr = (Interp *) interp;
    double dResult;
    int tmp;


    if (!(iPtr->flags & RAND_SEED_INITIALIZED)) {
	iPtr->flags |= RAND_SEED_INITIALIZED;
	iPtr->randSeed = TclpGetClicks();









    }
    
    /*
     * Set stackPtr and stackTop from eePtr.
     */
    
    CACHE_STACK_INFO();

    /*
     * Generate the random number using the linear congruential
     * generator defined by the following recurrence:
     *		seed = ( IA * seed ) mod IM
     * where IA is 16807 and IM is (2^31) - 1.  In order to avoid




     * potential problems with integer overflow, the  code uses

     * additional constants IQ and IR such that
     *		IM = IA*IQ + IR




     * For details on how this algorithm works, refer to the following
     * papers: 
     *
     *	S.K. Park & K.W. Miller, "Random number generators: good ones
     *	are hard to find," Comm ACM 31(10):1192-1201, Oct 1988
     *
     *	W.H. Press & S.A. Teukolsky, "Portable random number
     *	generators," Computers in Physics 6(5):522-524, Sep/Oct 1992.
     */

#define RAND_IA		16807
#define RAND_IM		2147483647
#define RAND_IQ		127773
#define RAND_IR		2836
#define RAND_MASK	123459876

    if (iPtr->randSeed == 0) {
	/*
	 * Don't allow a 0 seed, since it breaks the generator.  Shift
	 * it to some other value.
	 */

	iPtr->randSeed = 123459876;
    }
    tmp = iPtr->randSeed/RAND_IQ;
    iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp;
    if (iPtr->randSeed < 0) {
	iPtr->randSeed += RAND_IM;
    }

    /*
     * On 64-bit architectures we need to mask off the upper bits to
     * ensure we only have a 32-bit range.  The constant has the
     * bizarre form below in order to make sure that it doesn't
     * get sign-extended (the rules for sign extension are very
     * concat, particularly on 64-bit machines).
     */

    iPtr->randSeed &= ((((unsigned long) 0xfffffff) << 4) | 0xf);
    dResult = iPtr->randSeed * (1.0/RAND_IM);

    /*
     * Push a Tcl object with the result.
     */

    PUSH_OBJECT(Tcl_NewDoubleObj(dResult));







|
>




>
>
>
>
>
>
>
>
>












|
>
>
>
>
|
>
|

>
>
>
>
|















<
<
<
<
<
<
<
<







|
|
<
<
<


<







3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950








3951
3952
3953
3954
3955
3956
3957
3958
3959



3960
3961

3962
3963
3964
3965
3966
3967
3968
				 * the function. */
    ClientData clientData;	/* Ignored. */
{
    Tcl_Obj **stackPtr;        /* Cached evaluation stack base pointer. */
    register int stackTop;	/* Cached top index of evaluation stack. */
    Interp *iPtr = (Interp *) interp;
    double dResult;
    long tmp;			/* Algorithm assumes at least 32 bits.
				 * Only long guarantees that.  See below. */

    if (!(iPtr->flags & RAND_SEED_INITIALIZED)) {
	iPtr->flags |= RAND_SEED_INITIALIZED;
	iPtr->randSeed = TclpGetClicks();

	/*
	 * Make sure 1 <= randSeed <= (2^31) - 2.  See below.
	 */

        iPtr->randSeed &= (unsigned long) 0x7fffffff;
	if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) {
	    iPtr->randSeed ^= 123459876;
	}
    }
    
    /*
     * Set stackPtr and stackTop from eePtr.
     */
    
    CACHE_STACK_INFO();

    /*
     * Generate the random number using the linear congruential
     * generator defined by the following recurrence:
     *		seed = ( IA * seed ) mod IM
     * where IA is 16807 and IM is (2^31) - 1.  The recurrence maps
     * a seed in the range [1, IM - 1] to a new seed in that same range.
     * The recurrence maps IM to 0, and maps 0 back to 0, so those two
     * values must not be allowed as initial values of seed.
     *
     * In order to avoid potential problems with integer overflow, the
     * recurrence is implemented in terms of additional constants
     * IQ and IR such that
     *		IM = IA*IQ + IR
     * None of the operations in the implementation overflows a 32-bit
     * signed integer, and the C type long is guaranteed to be at least
     * 32 bits wide.
     *
     * For more details on how this algorithm works, refer to the following
     * papers: 
     *
     *	S.K. Park & K.W. Miller, "Random number generators: good ones
     *	are hard to find," Comm ACM 31(10):1192-1201, Oct 1988
     *
     *	W.H. Press & S.A. Teukolsky, "Portable random number
     *	generators," Computers in Physics 6(5):522-524, Sep/Oct 1992.
     */

#define RAND_IA		16807
#define RAND_IM		2147483647
#define RAND_IQ		127773
#define RAND_IR		2836
#define RAND_MASK	123459876









    tmp = iPtr->randSeed/RAND_IQ;
    iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp;
    if (iPtr->randSeed < 0) {
	iPtr->randSeed += RAND_IM;
    }

    /*
     * Since the recurrence keeps seed values in the range [1, RAND_IM - 1],
     * dividing by RAND_IM yields a double in the range (0, 1).



     */


    dResult = iPtr->randSeed * (1.0/RAND_IM);

    /*
     * Push a Tcl object with the result.
     */

    PUSH_OBJECT(Tcl_NewDoubleObj(dResult));
4046
4047
4048
4049
4050
4051
4052
4053

4054
4055
4056
4057




4058
4059
4060
4061
4062
4063
4064
	badValue:
	Tcl_DecrRefCount(valuePtr);
	DECACHE_STACK_INFO();
	return TCL_ERROR;
    }
    
    /*
     * Reset the seed.

     */

    iPtr->flags |= RAND_SEED_INITIALIZED;
    iPtr->randSeed = i;





    /*
     * To avoid duplicating the random number generation code we simply
     * clean up our state and call the real random number function. That
     * function will always succeed.
     */
    







|
>




>
>
>
>







4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
	badValue:
	Tcl_DecrRefCount(valuePtr);
	DECACHE_STACK_INFO();
	return TCL_ERROR;
    }
    
    /*
     * Reset the seed.  Make sure 1 <= randSeed <= 2^31 - 2.
     * See comments in ExprRandFunc() for more details.
     */

    iPtr->flags |= RAND_SEED_INITIALIZED;
    iPtr->randSeed = i;
    iPtr->randSeed &= (unsigned long) 0x7fffffff;
    if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) {
	iPtr->randSeed ^= 123459876;
    }

    /*
     * To avoid duplicating the random number generation code we simply
     * clean up our state and call the real random number function. That
     * function will always succeed.
     */
    
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
	    statsPtr->numLiteralsCreated * sizeof(Tcl_Obj),
	    statsPtr->totalLitStringBytes);
    fprintf(stdout, "  Mean code/compile		%.1f\n",
	    totalCodeBytes / statsPtr->numCompilations);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    totalCodeBytes / statsPtr->totalSrcBytes);

    fprintf(stdout, "\nCurrent ByteCodes		%ld\n",
	    numCurrentByteCodes);
    fprintf(stdout, "  Source bytes			%.6g\n",
	    statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code bytes			%.6g\n",
	    currentCodeBytes);
    fprintf(stdout, "    ByteCode bytes		%.6g\n",
	    statsPtr->currentByteCodeBytes);







|







4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
	    statsPtr->numLiteralsCreated * sizeof(Tcl_Obj),
	    statsPtr->totalLitStringBytes);
    fprintf(stdout, "  Mean code/compile		%.1f\n",
	    totalCodeBytes / statsPtr->numCompilations);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    totalCodeBytes / statsPtr->totalSrcBytes);

    fprintf(stdout, "\nCurrent (active) ByteCodes	%ld\n",
	    numCurrentByteCodes);
    fprintf(stdout, "  Source bytes			%.6g\n",
	    statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code bytes			%.6g\n",
	    currentCodeBytes);
    fprintf(stdout, "    ByteCode bytes		%.6g\n",
	    statsPtr->currentByteCodeBytes);
4467
4468
4469
4470
4471
4472
4473























4474
4475
4476
4477
4478
4479
4480
	    statsPtr->currentLitStringBytes);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    currentCodeBytes / statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code + source bytes		%.6g (%0.1f mean code/src)\n",
	    (currentCodeBytes + statsPtr->currentSrcBytes),
	    (currentCodeBytes / statsPtr->currentSrcBytes) + 1.0);
























    /*
     * Literal table statistics.
     */

    numByteCodeLits = 0;
    refCountSum = 0;
    numSharedMultX = 0;







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
	    statsPtr->currentLitStringBytes);
    fprintf(stdout, "  Mean code/source		%.1f\n",
	    currentCodeBytes / statsPtr->currentSrcBytes);
    fprintf(stdout, "  Code + source bytes		%.6g (%0.1f mean code/src)\n",
	    (currentCodeBytes + statsPtr->currentSrcBytes),
	    (currentCodeBytes / statsPtr->currentSrcBytes) + 1.0);

    /*
     * Tcl_IsShared statistics check
     *
     * This gives the refcount of each obj as Tcl_IsShared was called
     * for it.  Shared objects must be duplicated before they can be
     * modified.
     */

    numSharedMultX = 0;
    fprintf(stdout, "\nTcl_IsShared object check (all objects):\n");
    fprintf(stdout, "  Object had refcount <=1 (not shared)	%ld\n",
	    tclObjsShared[1]);
    for (i = 2;  i < TCL_MAX_SHARED_OBJ_STATS;  i++) {
	fprintf(stdout, "  refcount ==%d		%ld\n",
		i, tclObjsShared[i]);
	numSharedMultX += tclObjsShared[i];
    }
    fprintf(stdout, "  refcount >=%d		%ld\n",
	    i, tclObjsShared[0]);
    numSharedMultX += tclObjsShared[0];
    fprintf(stdout, "  Total shared objects			%d\n",
	    numSharedMultX);

    /*
     * Literal table statistics.
     */

    numByteCodeLits = 0;
    refCountSum = 0;
    numSharedMultX = 0;
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521

    fprintf(stdout, "\nTotal objects (all interps)	%ld\n",
	    tclObjsAlloced);
    fprintf(stdout, "Current objects			%ld\n",
	    (tclObjsAlloced - tclObjsFreed));
    fprintf(stdout, "Total literal objects		%ld\n",
	    statsPtr->numLiteralsCreated);
    
    fprintf(stdout, "\nCurrent literal objects		%d (%0.1f%% of current objects)\n",
	    globalTablePtr->numEntries,
	    (globalTablePtr->numEntries * 100.0) / (tclObjsAlloced-tclObjsFreed));
    fprintf(stdout, "  ByteCode literals	 	%ld (%0.1f%% of current literals)\n",
	    numByteCodeLits,
	    (numByteCodeLits * 100.0) / globalTablePtr->numEntries);
    fprintf(stdout, "  Literals reused > 1x	 	%d\n",







|







4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604

    fprintf(stdout, "\nTotal objects (all interps)	%ld\n",
	    tclObjsAlloced);
    fprintf(stdout, "Current objects			%ld\n",
	    (tclObjsAlloced - tclObjsFreed));
    fprintf(stdout, "Total literal objects		%ld\n",
	    statsPtr->numLiteralsCreated);

    fprintf(stdout, "\nCurrent literal objects		%d (%0.1f%% of current objects)\n",
	    globalTablePtr->numEntries,
	    (globalTablePtr->numEntries * 100.0) / (tclObjsAlloced-tclObjsFreed));
    fprintf(stdout, "  ByteCode literals	 	%ld (%0.1f%% of current literals)\n",
	    numByteCodeLits,
	    (numByteCodeLits * 100.0) / globalTablePtr->numEntries);
    fprintf(stdout, "  Literals reused > 1x	 	%d\n",
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
    for (i = minSizeDecade;  i <= maxSizeDecade;  i++) {
	decadeHigh = (1 << (i+1)) - 1;
	sum += statsPtr->byteCodeCount[i];
        fprintf(stdout,	"	%10d		%8.0f%%\n",
		decadeHigh, (sum * 100.0) / statsPtr->numCompilations);
    }

    fprintf(stdout, "\nByteCode longevity (excludes current ByteCodes):\n");
    fprintf(stdout, "	       Up to ms		Percentage\n");
    minSizeDecade = maxSizeDecade = 0;
    for (i = 0;  i < 31;  i++) {
        if (statsPtr->lifetimeCount[i] > 0) {
	    minSizeDecade = i;
	    break;
        }







|







4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
    for (i = minSizeDecade;  i <= maxSizeDecade;  i++) {
	decadeHigh = (1 << (i+1)) - 1;
	sum += statsPtr->byteCodeCount[i];
        fprintf(stdout,	"	%10d		%8.0f%%\n",
		decadeHigh, (sum * 100.0) / statsPtr->numCompilations);
    }

    fprintf(stdout, "\nByteCode longevity (excludes Current ByteCodes):\n");
    fprintf(stdout, "	       Up to ms		Percentage\n");
    minSizeDecade = maxSizeDecade = 0;
    for (i = 0;  i < 31;  i++) {
        if (statsPtr->lifetimeCount[i] > 0) {
	    minSizeDecade = i;
	    break;
        }
Changes to generic/tclGetDate.y.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclGetDate.y --
 *
 *	Contains yacc grammar for parsing date and time strings.
 *	The output of this file should be the file tclDate.c which
 *	is used directly in the Tcl sources.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclGetDate.y,v 1.15 2000/02/28 18:49:42 ericm Exp $
 */

%{
/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclGetDate.y --
 *
 *	Contains yacc grammar for parsing date and time strings.
 *	The output of this file should be the file tclDate.c which
 *	is used directly in the Tcl sources.
 *
 * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclGetDate.y,v 1.15.2.1 2000/08/07 21:30:36 hobbs Exp $
 */

%{
/* 
 * tclDate.c --
 *
 *	This file is generated from a yacc grammar defined in
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

%token  tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
%token  tSTARDATE tSEC_UNIT tSNUMBER tUNUMBER tZONE tEPOCH tDST tISOBASE
%token  tDAY_UNIT tNEXT

%type   <Number>        tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT tDST
%type   <Number>        tSEC_UNIT tSNUMBER tUNUMBER tZONE tISOBASE tDAY_UNIT
%type   <Number>        unit ago sign tNEXT tSTARDATE
%type   <Meridian>      tMERIDIAN o_merid

%%

spec    : /* NULL */
        | spec item
        ;







|







143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

%token  tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
%token  tSTARDATE tSEC_UNIT tSNUMBER tUNUMBER tZONE tEPOCH tDST tISOBASE
%token  tDAY_UNIT tNEXT

%type   <Number>        tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT tDST
%type   <Number>        tSEC_UNIT tSNUMBER tUNUMBER tZONE tISOBASE tDAY_UNIT
%type   <Number>        unit sign tNEXT tSTARDATE
%type   <Meridian>      tMERIDIAN o_merid

%%

spec    : /* NULL */
        | spec item
        ;
353
354
355
356
357
358
359







360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
            yyDay  = 1;
	    yyMonth = 1;
	    yyRelDay += (($2%1000)*(365 + IsLeapYear(yyYear)))/1000;
	    yyRelSeconds += $4 * 144 * 60;
        }
        ;








relspec : sign tUNUMBER unit ago { *yyRelPointer += $1 * $2 * $3 * $4; }
        | tUNUMBER unit ago      { *yyRelPointer += $1 * $2 * $3; }
        | tNEXT unit             { *yyRelPointer += $2; }
        | tNEXT tUNUMBER unit    { *yyRelPointer += $2 * $3; }
        | unit ago               { *yyRelPointer += $1 * $2; }
        ;
sign    : '-'            { $$ = -1; }
        | '+'            { $$ =  1; }
        ;
unit    : tSEC_UNIT      { $$ = $1; yyRelPointer = &yyRelSeconds; }
        | tDAY_UNIT      { $$ = $1; yyRelPointer = &yyRelDay; }
        | tMONTH_UNIT    { $$ = $1; yyRelPointer = &yyRelMonth; }
        ;
ago     : tAGO           { $$ = -1; }
        |                { $$ = 1; }
        ;

number  : tUNUMBER
    {
	if (yyHaveTime && yyHaveDate && !yyHaveRel) {
	    yyYear = $1;
	} else {
	    yyHaveTime++;







>
>
>
>
>
>
>
|
|
|
|
|








<
<
<







353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379



380
381
382
383
384
385
386
            yyDay  = 1;
	    yyMonth = 1;
	    yyRelDay += (($2%1000)*(365 + IsLeapYear(yyYear)))/1000;
	    yyRelSeconds += $4 * 144 * 60;
        }
        ;

relspec : relunits tAGO {
	    yyRelSeconds *= -1;
	    yyRelMonth *= -1;
	    yyRelDay *= -1;
	}
	| relunits
	;
relunits : sign tUNUMBER unit  { *yyRelPointer += $1 * $2 * $3; }
        | tUNUMBER unit        { *yyRelPointer += $1 * $2; }
        | tNEXT unit           { *yyRelPointer += $2; }
        | tNEXT tUNUMBER unit  { *yyRelPointer += $2 * $3; }
        | unit                 { *yyRelPointer += $1; }
        ;
sign    : '-'            { $$ = -1; }
        | '+'            { $$ =  1; }
        ;
unit    : tSEC_UNIT      { $$ = $1; yyRelPointer = &yyRelSeconds; }
        | tDAY_UNIT      { $$ = $1; yyRelPointer = &yyRelDay; }
        | tMONTH_UNIT    { $$ = $1; yyRelPointer = &yyRelMonth; }
        ;




number  : tUNUMBER
    {
	if (yyHaveTime && yyHaveDate && !yyHaveRel) {
	    yyYear = $1;
	} else {
	    yyHaveTime++;
Changes to generic/tclIO.c.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423



424

425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452

453
454
455
456
457


458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
/* 
 * tclIO.c --
 *
 *	This file provides the generic portions (those that are the same on
 *	all platforms and for all channel types) of Tcl's IO facilities.
 *
 * Copyright (c) 1998 Scriptics Corporation
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIO.c,v 1.20 2000/04/05 19:00:41 kupries Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Make sure that both EAGAIN and EWOULDBLOCK are defined. This does not
 * compile on systems where neither is defined. We want both defined so
 * that we can test safely for both. In the code we still have to test for
 * both because there may be systems on which both are defined and have
 * different values.
 */

#if ((!defined(EWOULDBLOCK)) && (defined(EAGAIN)))
#   define EWOULDBLOCK EAGAIN
#endif
#if ((!defined(EAGAIN)) && (defined(EWOULDBLOCK)))
#   define EAGAIN EWOULDBLOCK
#endif
#if ((!defined(EAGAIN)) && (!defined(EWOULDBLOCK)))
    error one of EWOULDBLOCK or EAGAIN must be defined
#endif

/*
 * The following structure encapsulates the state for a background channel
 * copy.  Note that the data buffer for the copy will be appended to this
 * structure.
 */

typedef struct CopyState {
    struct Channel *readPtr;	/* Pointer to input channel. */
    struct Channel *writePtr;	/* Pointer to output channel. */
    int readFlags;		/* Original read channel flags. */
    int writeFlags;		/* Original write channel flags. */
    int toRead;			/* Number of bytes to copy, or -1. */
    int total;			/* Total bytes transferred (written). */
    Tcl_Interp *interp;		/* Interp that started the copy. */
    Tcl_Obj *cmdPtr;		/* Command to be invoked at completion. */
    int bufSize;		/* Size of appended buffer. */
    char buffer[1];		/* Copy buffer, this must be the last
				 * field. */
} CopyState;

/*
 * struct ChannelBuffer:
 *
 * Buffers data being sent to or from a channel.
 */

typedef struct ChannelBuffer {
    int nextAdded;		/* The next position into which a character
                                 * will be put in the buffer. */
    int nextRemoved;		/* Position of next byte to be removed
                                 * from the buffer. */
    int bufLength;		/* How big is the buffer? */
    struct ChannelBuffer *nextPtr;
    				/* Next buffer in chain. */
    char buf[4];		/* Placeholder for real buffer. The real
                                 * buffer occuppies this space + bufSize-4
                                 * bytes. This must be the last field in
                                 * the structure. */
} ChannelBuffer;

#define CHANNELBUFFER_HEADER_SIZE	(sizeof(ChannelBuffer) - 4)

/*
 * How much extra space to allocate in buffer to hold bytes from previous
 * buffer (when converting to UTF-8) or to hold bytes that will go to
 * next buffer (when converting from UTF-8).
 */
 
#define BUFFER_PADDING	    16
 
/*
 * The following defines the *default* buffer size for channels.
 */

#define CHANNELBUFFER_DEFAULT_SIZE	(1024 * 4)

/*
 * Structure to record a close callback. One such record exists for
 * each close callback registered for a channel.
 */

typedef struct CloseCallback {
    Tcl_CloseProc *proc;		/* The procedure to call. */
    ClientData clientData;		/* Arbitrary one-word data to pass
                                         * to the callback. */
    struct CloseCallback *nextPtr;	/* For chaining close callbacks. */
} CloseCallback;

/*
 * The following structure describes the information saved from a call to
 * "fileevent". This is used later when the event being waited for to
 * invoke the saved script in the interpreter designed in this record.
 */

typedef struct EventScriptRecord {
    struct Channel *chanPtr;	/* The channel for which this script is
                                 * registered. This is used only when an
                                 * error occurs during evaluation of the
                                 * script, to delete the handler. */
    Tcl_Obj *scriptPtr;		/* Script to invoke. */
    Tcl_Interp *interp;		/* In what interpreter to invoke script? */
    int mask;			/* Events must overlap current mask for the
                                 * stored script to be invoked. */
    struct EventScriptRecord *nextPtr;
    				/* Next in chain of records. */
} EventScriptRecord;

/*
 * struct Channel:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct Channel {
    char *channelName;		/* The name of the channel instance in Tcl
                                 * commands. Storage is owned by the generic IO
                                 * code,  is dynamically allocated. */
    int	flags;			/* ORed combination of the flags defined
                                 * below. */
    Tcl_Encoding encoding;	/* Encoding to apply when reading or writing
				 * data on this channel.  NULL means no
				 * encoding is applied to data. */
    Tcl_EncodingState inputEncodingState;
				/* Current encoding state, used when converting
				 * input data bytes to UTF-8. */
    int inputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting input data bytes to
				 * UTF-8.  May be TCL_ENCODING_START before
				 * converting first byte and TCL_ENCODING_END
				 * when EOF is seen. */
    Tcl_EncodingState outputEncodingState;
				/* Current encoding state, used when converting
				 * UTF-8 to output data bytes. */
    int outputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting UTF-8 to output
				 * data bytes.  May be TCL_ENCODING_START
				 * before converting first byte and
				 * TCL_ENCODING_END when EOF is seen. */
    Tcl_EolTranslation inputTranslation;
				/* What translation to apply for end of line
                                 * sequences on input? */    
    Tcl_EolTranslation outputTranslation;
    				/* What translation to use for generating
                                 * end of line sequences in output? */
    int inEofChar;		/* If nonzero, use this as a signal of EOF
                                 * on input. */
    int outEofChar;             /* If nonzero, append this to the channel
                                 * when it is closed if it is open for
                                 * writing. */
    int unreportedError;	/* Non-zero if an error report was deferred
                                 * because it happened in the background. The
                                 * value is the POSIX error code. */
    ClientData instanceData;	/* Instance-specific data provided by
				 * creator of channel. */

    Tcl_ChannelType *typePtr;	/* Pointer to channel type structure. */
    int refCount;		/* How many interpreters hold references to
                                 * this IO channel? */
    CloseCallback *closeCbPtr;	/* Callbacks registered to be called when the
                                 * channel is closed. */
    char *outputStage;		/* Temporary staging buffer used when
				 * translating EOL before converting from
				 * UTF-8 to external form. */
    ChannelBuffer *curOutPtr;	/* Current output buffer being filled. */
    ChannelBuffer *outQueueHead;/* Points at first buffer in output queue. */
    ChannelBuffer *outQueueTail;/* Points at last buffer in output queue. */

    ChannelBuffer *saveInBufPtr;/* Buffer saved for input queue - eliminates
                                 * need to allocate a new buffer for "gets"
                                 * that crosses buffer boundaries. */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */

    struct ChannelHandler *chPtr;/* List of channel handlers registered
                                  * for this channel. */
    int interestMask;		/* Mask of all events this channel has
                                 * handlers for. */
    struct Channel *nextChanPtr;/* Next in list of channels currently open. */
    EventScriptRecord *scriptRecordPtr;
    				/* Chain of all scripts registered for
                                 * event handlers ("fileevent") on this
                                 * channel. */
    int bufSize;		/* What size buffers to allocate? */
    Tcl_TimerToken timer;	/* Handle to wakeup timer for this channel. */
    CopyState *csPtr;		/* State of background copy, or NULL. */
    struct Channel* supercedes; /* Refers to channel this one was stacked upon.
				   This reference is NULL for normal channels.
				   See Tcl_StackChannel. */

} Channel;
    
/*
 * Values for the flags field in Channel. Any ORed combination of the
 * following flags can be stored in the field. These flags record various
 * options and state bits about the channel. In addition to the flags below,
 * the channel can also have TCL_READABLE (1<<1) and TCL_WRITABLE (1<<2) set.
 */

#define CHANNEL_NONBLOCKING	(1<<3)	/* Channel is currently in
					 * nonblocking mode. */
#define CHANNEL_LINEBUFFERED	(1<<4)	/* Output to the channel must be
					 * flushed after every newline. */
#define CHANNEL_UNBUFFERED	(1<<5)	/* Output to the channel must always
					 * be flushed immediately. */
#define BUFFER_READY		(1<<6)	/* Current output buffer (the
					 * curOutPtr field in the
                                         * channel structure) should be
                                         * output as soon as possible even
                                         * though it may not be full. */
#define BG_FLUSH_SCHEDULED	(1<<7)	/* A background flush of the
					 * queued output buffers has been
                                         * scheduled. */
#define CHANNEL_CLOSED		(1<<8)	/* Channel has been closed. No
					 * further Tcl-level IO on the
                                         * channel is allowed. */
#define CHANNEL_EOF		(1<<9)	/* EOF occurred on this channel.
					 * This bit is cleared before every
                                         * input operation. */
#define CHANNEL_STICKY_EOF	(1<<10)	/* EOF occurred on this channel because
					 * we saw the input eofChar. This bit
                                         * prevents clearing of the EOF bit
                                         * before every input operation. */
#define CHANNEL_BLOCKED	(1<<11)	/* EWOULDBLOCK or EAGAIN occurred
					 * on this channel. This bit is
                                         * cleared before every input or
                                         * output operation. */
#define INPUT_SAW_CR		(1<<12)	/* Channel is in CRLF eol input
					 * translation mode and the last
                                         * byte seen was a "\r". */
#define INPUT_NEED_NL		(1<<15)	/* Saw a '\r' at end of last buffer,
					 * and there should be a '\n' at
					 * beginning of next buffer. */
#define CHANNEL_DEAD		(1<<13)	/* The channel has been closed by
					 * the exit handler (on exit) but
                                         * not deallocated. When any IO
                                         * operation sees this flag on a
                                         * channel, it does not call driver
                                         * level functions to avoid referring
                                         * to deallocated data. */
#define CHANNEL_NEED_MORE_DATA	(1<<14)	/* The last input operation failed
					 * because there was not enough data
					 * to complete the operation.  This
					 * flag is set when gets fails to
					 * get a complete line or when read
					 * fails to get a complete character.
					 * When set, file events will not be
					 * delivered for buffered data until
					 * the state of the channel changes. */

/*
 * For each channel handler registered in a call to Tcl_CreateChannelHandler,
 * there is one record of the following type. All of records for a specific
 * channel are chained together in a singly linked list which is stored in
 * the channel structure.
 */

typedef struct ChannelHandler {
    Channel *chanPtr;		/* The channel structure for this channel. */
    int mask;			/* Mask of desired events. */
    Tcl_ChannelProc *proc;	/* Procedure to call in the type of
                                 * Tcl_CreateChannelHandler. */
    ClientData clientData;	/* Argument to pass to procedure. */
    struct ChannelHandler *nextPtr;
    				/* Next one in list of registered handlers. */
} ChannelHandler;

/*
 * This structure keeps track of the current ChannelHandler being invoked in
 * the current invocation of ChannelHandlerEventProc. There is a potential
 * problem if a ChannelHandler is deleted while it is the current one, since
 * ChannelHandlerEventProc needs to look at the nextPtr field. To handle this
 * problem, structures of the type below indicate the next handler to be
 * processed for any (recursively nested) dispatches in progress. The
 * nextHandlerPtr field is updated if the handler being pointed to is deleted.
 * The nextPtr field is used to chain together all recursive invocations, so
 * that Tcl_DeleteChannelHandler can find all the recursively nested
 * invocations of ChannelHandlerEventProc and compare the handler being
 * deleted against the NEXT handler to be invoked in that invocation; when it
 * finds such a situation, Tcl_DeleteChannelHandler updates the nextHandlerPtr
 * field of the structure to the next handler.
 */

typedef struct NextChannelHandler {
    ChannelHandler *nextHandlerPtr;	/* The next handler to be invoked in
                                         * this invocation. */
    struct NextChannelHandler *nestedHandlerPtr;
					/* Next nested invocation of
                                         * ChannelHandlerEventProc. */
} NextChannelHandler;


/*
 * The following structure describes the event that is added to the Tcl
 * event queue by the channel handler check procedure.
 */

typedef struct ChannelHandlerEvent {
    Tcl_Event header;		/* Standard header for all events. */
    Channel *chanPtr;		/* The channel that is ready. */
    int readyMask;		/* Events that have occurred. */
} ChannelHandlerEvent;

/*
 * The following structure is used by Tcl_GetsObj() to encapsulates the
 * state for a "gets" operation.
 */
 
typedef struct GetsState {
    Tcl_Obj *objPtr;		/* The object to which UTF-8 characters
				 * will be appended. */
    char **dstPtr;		/* Pointer into objPtr's string rep where
				 * next character should be stored. */
    Tcl_Encoding encoding;	/* The encoding to use to convert raw bytes
				 * to UTF-8.  */
    ChannelBuffer *bufPtr;	/* The current buffer of raw bytes being
				 * emptied. */
    Tcl_EncodingState state;	/* The encoding state just before the last
				 * external to UTF-8 conversion in
				 * FilterInputBytes(). */
    int rawRead;		/* The number of bytes removed from bufPtr
				 * in the last call to FilterInputBytes(). */
    int bytesWrote;		/* The number of bytes of UTF-8 data
				 * appended to objPtr during the last call to
				 * FilterInputBytes(). */
    int charsWrote;		/* The corresponding number of UTF-8
				 * characters appended to objPtr during the
				 * last call to FilterInputBytes(). */
    int totalChars;		/* The total number of UTF-8 characters
				 * appended to objPtr so far, just before the
				 * last call to FilterInputBytes(). */
} GetsState;

/*
 * All static variables used in this file are collected into a single
 * instance of the following structure.  For multi-threaded implementations,
 * there is one instance of this structure for each thread.
 *
 * Notice that different structures with the same name appear in other
 * files.  The structure defined below is used in this file only.
 */

typedef struct ThreadSpecificData {

    /*
     * This variable holds the list of nested ChannelHandlerEventProc 
     * invocations.
     */
    NextChannelHandler *nestedHandlerPtr;

    /*
     * List of all channels currently open.
     */
    Channel *firstChanPtr;
#ifdef oldcode
    /*
     * Has a channel exit handler been created yet?
     */
    int channelExitHandlerCreated;

    /*
     * Has the channel event source been created and registered with the
     * notifier?
     */
    int channelEventSourceCreated;
#endif
    /*
     * Static variables to hold channels for stdin, stdout and stderr.
     */
    Tcl_Channel stdinChannel;
    int stdinInitialized;
    Tcl_Channel stdoutChannel;
    int stdoutInitialized;
    Tcl_Channel stderrChannel;
    int stderrInitialized;

} ThreadSpecificData;

static Tcl_ThreadDataKey dataKey;


/*
 * Static functions in this file:
 */

static ChannelBuffer *	AllocChannelBuffer _ANSI_ARGS_((int length));
static void		ChannelEventScriptInvoker _ANSI_ARGS_((
			    ClientData clientData, int flags));
static void		ChannelTimerProc _ANSI_ARGS_((
			    ClientData clientData));
static int		CheckChannelErrors _ANSI_ARGS_((Channel *chanPtr,
			    int direction));
static int		CheckFlush _ANSI_ARGS_((Channel *chanPtr,
			    ChannelBuffer *bufPtr, int newlineFlag));
static int		CheckForDeadChannel _ANSI_ARGS_((Tcl_Interp *interp,
			    Channel *chan));
static void		CheckForStdChannelsBeingClosed _ANSI_ARGS_((
			    Tcl_Channel chan));
static void		CleanupChannelHandlers _ANSI_ARGS_((
			    Tcl_Interp *interp, Channel *chanPtr));
static int		CloseChannel _ANSI_ARGS_((Tcl_Interp *interp,
                            Channel *chanPtr, int errorCode));
static void		CommonGetsCleanup _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Encoding encoding));
static int		CopyAndTranslateBuffer _ANSI_ARGS_((



			    Channel *chanPtr, char *result, int space));

static int		CopyData _ANSI_ARGS_((CopyState *csPtr, int mask));
static void		CopyEventProc _ANSI_ARGS_((ClientData clientData,
			    int mask));
static void		CreateScriptRecord _ANSI_ARGS_((
			    Tcl_Interp *interp, Channel *chanPtr,
                            int mask, Tcl_Obj *scriptPtr));
static void		DeleteChannelTable _ANSI_ARGS_((
			    ClientData clientData, Tcl_Interp *interp));
static void		DeleteScriptRecord _ANSI_ARGS_((Tcl_Interp *interp,
        		    Channel *chanPtr, int mask));
static void		DiscardInputQueued _ANSI_ARGS_((
			    Channel *chanPtr, int discardSavedBuffers));
static void		DiscardOutputQueued _ANSI_ARGS_((
    			    Channel *chanPtr));
static int		DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr,
			    int slen));
static int		DoWrite _ANSI_ARGS_((Channel *chanPtr, char *src,
			    int srcLen));
static int		FilterInputBytes _ANSI_ARGS_((Channel *chanPtr,
			    GetsState *statePtr));
static int		FlushChannel _ANSI_ARGS_((Tcl_Interp *interp,
                            Channel *chanPtr, int calledFromAsyncFlush));
static Tcl_HashTable *	GetChannelTable _ANSI_ARGS_((Tcl_Interp *interp));
static int		GetInput _ANSI_ARGS_((Channel *chanPtr));
static void		PeekAhead _ANSI_ARGS_((Channel *chanPtr,
			    char **dstEndPtr, GetsState *gsPtr));
static int		ReadBytes _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Obj *objPtr, int charsLeft, int *offsetPtr));

static int		ReadChars _ANSI_ARGS_((Channel *chanPtr,
			    Tcl_Obj *objPtr, int charsLeft, int *offsetPtr,
			    int *factorPtr));
static void		RecycleBuffer _ANSI_ARGS_((Channel *chanPtr,
		            ChannelBuffer *bufPtr, int mustDiscard));


static int		SetBlockMode _ANSI_ARGS_((Tcl_Interp *interp,
		            Channel *chanPtr, int mode));
static void		StopCopy _ANSI_ARGS_((CopyState *csPtr));
static int		TranslateInputEOL _ANSI_ARGS_((Channel *chanPtr,
			    char *dst, CONST char *src, int *dstLenPtr,
			    int *srcLenPtr));
static int		TranslateOutputEOL _ANSI_ARGS_((Channel *chanPtr,
			    char *dst, CONST char *src, int *dstLenPtr,
			    int *srcLenPtr));
static void		UpdateInterest _ANSI_ARGS_((Channel *chanPtr));
static int		WriteBytes _ANSI_ARGS_((Channel *chanPtr,
			    CONST char *src, int srcLen));
static int		WriteChars _ANSI_ARGS_((Channel *chanPtr,
			    CONST char *src, int srcLen));


/*
 *---------------------------------------------------------------------------
 *
 * TclInitIOSubsystem --
 *






|





|




|
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















|
<
<
<
<
<
<
<
|
<
<
<

|
<














<





<
<

|
|
|

|

|

|

|

|

|

>
>
>
|
>


|

|
|

|

|
|
|

|

|

|

|

|



|
|
|
>
|
|
|
|
|
>
>

|

|
|
|
|
|
|


|

|







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40







41



42
43

44
45
46
47
48
49
50
51
52
53
54
55
56
57

58
59
60
61
62


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* 
 * tclIO.c --
 *
 *	This file provides the generic portions (those that are the same on
 *	all platforms and for all channel types) of Tcl's IO facilities.
 *
 * Copyright (c) 1998-2000 Ajuba Solutions
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIO.c,v 1.20.2.8 2001/07/18 17:17:19 andreas_kupries Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclIO.h"







#include <assert.h>





































































































































































































































































































































/*
 * All static variables used in this file are collected into a single
 * instance of the following structure.  For multi-threaded implementations,
 * there is one instance of this structure for each thread.
 *
 * Notice that different structures with the same name appear in other
 * files.  The structure defined below is used in this file only.
 */

typedef struct ThreadSpecificData {

    /*
     * This variable holds the list of nested ChannelHandlerEventProc 
     * invocations.
     */
    NextChannelHandler *nestedHandlerPtr;

    /*
     * List of all channels currently open, indexed by ChannelState,







     * as only one ChannelState exists per set of stacked channels.



     */
    ChannelState *firstCSPtr;

    /*
     * Static variables to hold channels for stdin, stdout and stderr.
     */
    Tcl_Channel stdinChannel;
    int stdinInitialized;
    Tcl_Channel stdoutChannel;
    int stdoutInitialized;
    Tcl_Channel stderrChannel;
    int stderrInitialized;

} ThreadSpecificData;

static Tcl_ThreadDataKey dataKey;


/*
 * Static functions in this file:
 */

static ChannelBuffer *	AllocChannelBuffer _ANSI_ARGS_((int length));


static void		ChannelTimerProc _ANSI_ARGS_((
				ClientData clientData));
static int		CheckChannelErrors _ANSI_ARGS_((ChannelState *statePtr,
				int direction));
static int		CheckFlush _ANSI_ARGS_((Channel *chanPtr,
				ChannelBuffer *bufPtr, int newlineFlag));
static int		CheckForDeadChannel _ANSI_ARGS_((Tcl_Interp *interp,
				ChannelState *statePtr));
static void		CheckForStdChannelsBeingClosed _ANSI_ARGS_((
				Tcl_Channel chan));
static void		CleanupChannelHandlers _ANSI_ARGS_((
				Tcl_Interp *interp, Channel *chanPtr));
static int		CloseChannel _ANSI_ARGS_((Tcl_Interp *interp,
				Channel *chanPtr, int errorCode));
static void		CommonGetsCleanup _ANSI_ARGS_((Channel *chanPtr,
				Tcl_Encoding encoding));
static int		CopyAndTranslateBuffer _ANSI_ARGS_((
				ChannelState *statePtr, char *result,
				int space));
static int		CopyBuffer _ANSI_ARGS_((
				Channel *chanPtr, char *result,
				int space));
static int		CopyData _ANSI_ARGS_((CopyState *csPtr, int mask));
static void		CopyEventProc _ANSI_ARGS_((ClientData clientData,
				int mask));
static void		CreateScriptRecord _ANSI_ARGS_((
				Tcl_Interp *interp, Channel *chanPtr,
				int mask, Tcl_Obj *scriptPtr));
static void		DeleteChannelTable _ANSI_ARGS_((
				ClientData clientData, Tcl_Interp *interp));
static void		DeleteScriptRecord _ANSI_ARGS_((Tcl_Interp *interp,
				Channel *chanPtr, int mask));
static void		DiscardInputQueued _ANSI_ARGS_((ChannelState *statePtr,
				int discardSavedBuffers));
static void		DiscardOutputQueued _ANSI_ARGS_((
				ChannelState *chanPtr));
static int		DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr,
				int slen));
static int		DoWrite _ANSI_ARGS_((Channel *chanPtr, char *src,
				int srcLen));
static int		FilterInputBytes _ANSI_ARGS_((Channel *chanPtr,
				GetsState *statePtr));
static int		FlushChannel _ANSI_ARGS_((Tcl_Interp *interp,
				Channel *chanPtr, int calledFromAsyncFlush));
static Tcl_HashTable *	GetChannelTable _ANSI_ARGS_((Tcl_Interp *interp));
static int		GetInput _ANSI_ARGS_((Channel *chanPtr));
static void		PeekAhead _ANSI_ARGS_((Channel *chanPtr,
				char **dstEndPtr, GetsState *gsPtr));
static int		ReadBytes _ANSI_ARGS_((ChannelState *statePtr,
				Tcl_Obj *objPtr, int charsLeft,
				int *offsetPtr));
static int		ReadChars _ANSI_ARGS_((ChannelState *statePtr,
				Tcl_Obj *objPtr, int charsLeft, int *offsetPtr,
				int *factorPtr));
static void		RecycleBuffer _ANSI_ARGS_((ChannelState *statePtr,
				ChannelBuffer *bufPtr, int mustDiscard));
static int		StackSetBlockMode _ANSI_ARGS_((Channel *chanPtr,
				int mode));
static int		SetBlockMode _ANSI_ARGS_((Tcl_Interp *interp,
				Channel *chanPtr, int mode));
static void		StopCopy _ANSI_ARGS_((CopyState *csPtr));
static int		TranslateInputEOL _ANSI_ARGS_((ChannelState *statePtr,
				char *dst, CONST char *src, int *dstLenPtr,
				int *srcLenPtr));
static int		TranslateOutputEOL _ANSI_ARGS_((ChannelState *statePtr,
				char *dst, CONST char *src, int *dstLenPtr,
				int *srcLenPtr));
static void		UpdateInterest _ANSI_ARGS_((Channel *chanPtr));
static int		WriteBytes _ANSI_ARGS_((Channel *chanPtr,
				CONST char *src, int srcLen));
static int		WriteChars _ANSI_ARGS_((Channel *chanPtr,
				CONST char *src, int srcLen));


/*
 *---------------------------------------------------------------------------
 *
 * TclInitIOSubsystem --
 *
518
519
520
521
522
523
524
525
526
527
528
529
530

531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559

	/* ARGSUSED */
void
TclFinalizeIOSubsystem()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel *chanPtr;			/* Iterates over open channels. */
    Channel *nextChanPtr;		/* Iterates over open channels. */


    for (chanPtr = tsdPtr->firstChanPtr; chanPtr != (Channel *) NULL;
             chanPtr = nextChanPtr) {
        nextChanPtr = chanPtr->nextChanPtr;


        /*
         * Set the channel back into blocking mode to ensure that we wait
         * for all data to flush out.
         */
        
        (void) Tcl_SetChannelOption(NULL, (Tcl_Channel) chanPtr,
                "-blocking", "on");

        if ((chanPtr == (Channel *) tsdPtr->stdinChannel) ||
                (chanPtr == (Channel *) tsdPtr->stdoutChannel) ||
                (chanPtr == (Channel *) tsdPtr->stderrChannel)) {

            /*
             * Decrement the refcount which was earlier artificially bumped
             * up to keep the channel from being closed.
             */

            chanPtr->refCount--;
        }

        if (chanPtr->refCount <= 0) {

	    /*
             * Close it only if the refcount indicates that the channel is not
             * referenced from any interpreter. If it is, that interpreter will
             * close the channel when it gets destroyed.
             */








|
|

|
|
|
>


















|


|







181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223

	/* ARGSUSED */
void
TclFinalizeIOSubsystem()
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel *chanPtr;			/* Iterates over open channels. */
    ChannelState *nextCSPtr;		/* Iterates over open channels. */
    ChannelState *statePtr;		/* state of channel stack */

    for (statePtr = tsdPtr->firstCSPtr; statePtr != (ChannelState *) NULL;
	 statePtr = nextCSPtr) {
	chanPtr		= statePtr->topChanPtr;
        nextCSPtr	= statePtr->nextCSPtr;

        /*
         * Set the channel back into blocking mode to ensure that we wait
         * for all data to flush out.
         */
        
        (void) Tcl_SetChannelOption(NULL, (Tcl_Channel) chanPtr,
                "-blocking", "on");

        if ((chanPtr == (Channel *) tsdPtr->stdinChannel) ||
                (chanPtr == (Channel *) tsdPtr->stdoutChannel) ||
                (chanPtr == (Channel *) tsdPtr->stderrChannel)) {

            /*
             * Decrement the refcount which was earlier artificially bumped
             * up to keep the channel from being closed.
             */

            statePtr->refCount--;
        }

        if (statePtr->refCount <= 0) {

	    /*
             * Close it only if the refcount indicates that the channel is not
             * referenced from any interpreter. If it is, that interpreter will
             * close the channel when it gets destroyed.
             */

584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
             * Finally, we clean up the fields in the channel data structure
             * since all of them have been deleted already. We mark the
             * channel with CHANNEL_DEAD to prevent any further IO operations
             * on it.
             */

            chanPtr->instanceData = (ClientData) NULL;
            chanPtr->flags |= CHANNEL_DEAD;
        }
    }
}


/*
 *----------------------------------------------------------------------







|







248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
             * Finally, we clean up the fields in the channel data structure
             * since all of them have been deleted already. We mark the
             * channel with CHANNEL_DEAD to prevent any further IO operations
             * on it.
             */

            chanPtr->instanceData = (ClientData) NULL;
            statePtr->flags |= CHANNEL_DEAD;
        }
    }
}


/*
 *----------------------------------------------------------------------
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
    Tcl_Channel chan;		/* The channel for which to create the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The callback routine to call when the
                                 * channel will be closed. */
    ClientData clientData;	/* Arbitrary data to pass to the
                                 * close callback. */
{
    Channel *chanPtr;
    CloseCallback *cbPtr;

    chanPtr = (Channel *) chan;

    cbPtr = (CloseCallback *) ckalloc((unsigned) sizeof(CloseCallback));
    cbPtr->proc = proc;
    cbPtr->clientData = clientData;

    cbPtr->nextPtr = chanPtr->closeCbPtr;
    chanPtr->closeCbPtr = cbPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteCloseHandler --
 *







|


|





|
|







397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
    Tcl_Channel chan;		/* The channel for which to create the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The callback routine to call when the
                                 * channel will be closed. */
    ClientData clientData;	/* Arbitrary data to pass to the
                                 * close callback. */
{
    ChannelState *statePtr;
    CloseCallback *cbPtr;

    statePtr = ((Channel *) chan)->state;

    cbPtr = (CloseCallback *) ckalloc((unsigned) sizeof(CloseCallback));
    cbPtr->proc = proc;
    cbPtr->clientData = clientData;

    cbPtr->nextPtr = statePtr->closeCbPtr;
    statePtr->closeCbPtr = cbPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteCloseHandler --
 *
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
    Tcl_Channel chan;		/* The channel for which to cancel the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The procedure for the callback to
                                 * remove. */
    ClientData clientData;	/* The callback data for the callback
                                 * to remove. */
{
    Channel *chanPtr;
    CloseCallback *cbPtr, *cbPrevPtr;

    chanPtr = (Channel *) chan;
    for (cbPtr = chanPtr->closeCbPtr, cbPrevPtr = (CloseCallback *) NULL;
             cbPtr != (CloseCallback *) NULL;
             cbPtr = cbPtr->nextPtr) {
        if ((cbPtr->proc == proc) && (cbPtr->clientData == clientData)) {
            if (cbPrevPtr == (CloseCallback *) NULL) {
                chanPtr->closeCbPtr = cbPtr->nextPtr;
            }
            ckfree((char *) cbPtr);
            break;
        } else {
            cbPrevPtr = cbPtr;
        }
    }







|


|
|
|
|


|







438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
    Tcl_Channel chan;		/* The channel for which to cancel the
                                 * close callback. */
    Tcl_CloseProc *proc;	/* The procedure for the callback to
                                 * remove. */
    ClientData clientData;	/* The callback data for the callback
                                 * to remove. */
{
    ChannelState *statePtr;
    CloseCallback *cbPtr, *cbPrevPtr;

    statePtr = ((Channel *) chan)->state;
    for (cbPtr = statePtr->closeCbPtr, cbPrevPtr = (CloseCallback *) NULL;
	 cbPtr != (CloseCallback *) NULL;
	 cbPtr = cbPtr->nextPtr) {
        if ((cbPtr->proc == proc) && (cbPtr->clientData == clientData)) {
            if (cbPrevPtr == (CloseCallback *) NULL) {
                statePtr->closeCbPtr = cbPtr->nextPtr;
            }
            ckfree((char *) cbPtr);
            break;
        } else {
            cbPrevPtr = cbPtr;
        }
    }
883
884
885
886
887
888
889
890

891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906

907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
DeleteChannelTable(clientData, interp)
    ClientData clientData;	/* The per-interpreter data structure. */
    Tcl_Interp *interp;		/* The interpreter being deleted. */
{
    Tcl_HashTable *hTblPtr;	/* The hash table. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;	/* Channel being deleted. */

    EventScriptRecord *sPtr, *prevPtr, *nextPtr;
    				/* Variables to loop over all channel events
                                 * registered, to delete the ones that refer
                                 * to the interpreter being deleted. */
    
    /*
     * Delete all the registered channels - this will close channels whose
     * refcount reaches zero.
     */
    
    hTblPtr = (Tcl_HashTable *) clientData;
    for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
             hPtr != (Tcl_HashEntry *) NULL;
             hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch)) {

        chanPtr = (Channel *) Tcl_GetHashValue(hPtr);


        /*
         * Remove any fileevents registered in this interpreter.
         */
        
        for (sPtr = chanPtr->scriptRecordPtr,
                 prevPtr = (EventScriptRecord *) NULL;
                 sPtr != (EventScriptRecord *) NULL;
                 sPtr = nextPtr) {
            nextPtr = sPtr->nextPtr;
            if (sPtr->interp == interp) {
                if (prevPtr == (EventScriptRecord *) NULL) {
                    chanPtr->scriptRecordPtr = nextPtr;
                } else {
                    prevPtr->nextPtr = nextPtr;
                }

                Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                        ChannelEventScriptInvoker, (ClientData) sPtr);

		Tcl_DecrRefCount(sPtr->scriptPtr);
                ckfree((char *) sPtr);
            } else {
                prevPtr = sPtr;
            }
        }

        /*
         * Cannot call Tcl_UnregisterChannel because that procedure calls
         * Tcl_GetAssocData to get the channel table, which might already
         * be inaccessible from the interpreter structure. Instead, we
         * emulate the behavior of Tcl_UnregisterChannel directly here.
         */

        Tcl_DeleteHashEntry(hPtr);
        chanPtr->refCount--;
        if (chanPtr->refCount <= 0) {
            if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
                (void) Tcl_Close(interp, (Tcl_Channel) chanPtr);
            }
        }
    }
    Tcl_DeleteHashTable(hTblPtr);
    ckfree((char *) hTblPtr);
}







|
>




|







|
|


>





|

|
|



|





|
















|
|
|







547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
DeleteChannelTable(clientData, interp)
    ClientData clientData;	/* The per-interpreter data structure. */
    Tcl_Interp *interp;		/* The interpreter being deleted. */
{
    Tcl_HashTable *hTblPtr;	/* The hash table. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* Channel being deleted. */
    ChannelState *statePtr;	/* State of Channel being deleted. */
    EventScriptRecord *sPtr, *prevPtr, *nextPtr;
    				/* Variables to loop over all channel events
                                 * registered, to delete the ones that refer
                                 * to the interpreter being deleted. */

    /*
     * Delete all the registered channels - this will close channels whose
     * refcount reaches zero.
     */
    
    hTblPtr = (Tcl_HashTable *) clientData;
    for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	 hPtr != (Tcl_HashEntry *) NULL;
	 hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch)) {

        chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
	statePtr = chanPtr->state;

        /*
         * Remove any fileevents registered in this interpreter.
         */
        
        for (sPtr = statePtr->scriptRecordPtr,
                 prevPtr = (EventScriptRecord *) NULL;
	     sPtr != (EventScriptRecord *) NULL;
	     sPtr = nextPtr) {
            nextPtr = sPtr->nextPtr;
            if (sPtr->interp == interp) {
                if (prevPtr == (EventScriptRecord *) NULL) {
                    statePtr->scriptRecordPtr = nextPtr;
                } else {
                    prevPtr->nextPtr = nextPtr;
                }

                Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                        TclChannelEventScriptInvoker, (ClientData) sPtr);

		Tcl_DecrRefCount(sPtr->scriptPtr);
                ckfree((char *) sPtr);
            } else {
                prevPtr = sPtr;
            }
        }

        /*
         * Cannot call Tcl_UnregisterChannel because that procedure calls
         * Tcl_GetAssocData to get the channel table, which might already
         * be inaccessible from the interpreter structure. Instead, we
         * emulate the behavior of Tcl_UnregisterChannel directly here.
         */

        Tcl_DeleteHashEntry(hPtr);
        statePtr->refCount--;
        if (statePtr->refCount <= 0) {
            if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
                (void) Tcl_Close(interp, (Tcl_Channel) chanPtr);
            }
        }
    }
    Tcl_DeleteHashTable(hTblPtr);
    ckfree((char *) hTblPtr);
}
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988

989
990
991
992
993
994

995
996
997
998
999
1000
1001
1002
1003
 *----------------------------------------------------------------------
 */

static void
CheckForStdChannelsBeingClosed(chan)
    Tcl_Channel chan;
{
    Channel *chanPtr = (Channel *) chan;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if ((chan == tsdPtr->stdinChannel) && (tsdPtr->stdinInitialized)) {
        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
            tsdPtr->stdinChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stdoutChannel) && (tsdPtr->stdoutInitialized)) {

        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
            tsdPtr->stdoutChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stderrChannel) && (tsdPtr->stderrInitialized)) {

        if (chanPtr->refCount < 2) {
            chanPtr->refCount = 0;
            tsdPtr->stderrChannel = NULL;
            return;
        }
    }
}

/*







|



|
|



|
>
|
|



|
>
|
|







638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
 *----------------------------------------------------------------------
 */

static void
CheckForStdChannelsBeingClosed(chan)
    Tcl_Channel chan;
{
    ChannelState *statePtr = ((Channel *) chan)->state;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if ((chan == tsdPtr->stdinChannel) && (tsdPtr->stdinInitialized)) {
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stdinChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stdoutChannel)
	    && (tsdPtr->stdoutInitialized)) {
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stdoutChannel = NULL;
            return;
        }
    } else if ((chan == tsdPtr->stderrChannel)
	    && (tsdPtr->stderrInitialized)) {
        if (statePtr->refCount < 2) {
            statePtr->refCount = 0;
            tsdPtr->stderrChannel = NULL;
            return;
        }
    }
}

/*
1024
1025
1026
1027
1028
1029
1030

1031





1032

1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
    Tcl_Channel chan;		/* The channel to add to this interpreter
                                 * channel table. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    int new;			/* Is the hash entry new or does it exist? */
    Channel *chanPtr;		/* The actual channel. */







    chanPtr = (Channel *) chan;


    if (chanPtr->channelName == (char *) NULL) {
        panic("Tcl_RegisterChannel: channel without name");
    }
    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = GetChannelTable(interp);
        hPtr = Tcl_CreateHashEntry(hTblPtr, chanPtr->channelName, &new);
        if (new == 0) {
            if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) {
                return;
            }

	    /* Andreas Kupries <a.kupries@westend.com>, 12/13/1998
	     * "Trf-Patch for filtering channels"
	     *
	     * This is the change to 'Tcl_RegisterChannel'.
	     *
	     * Explanation:
	     *		The moment a channel is stacked upon another he
	     *		takes the identity of the channel he supercedes,
	     *		i.e. he gets the *same* name. Because of this we
	     *		cannot check for duplicate names anymore, they
	     *		have to be allowed now.
	     */

	    /* panic("Tcl_RegisterChannel: duplicate channel names"); */
        }
        Tcl_SetHashValue(hPtr, (ClientData) chanPtr);
    }
    chanPtr->refCount++;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnregisterChannel --
 *







>

>
>
>
>
>
|
>

|




|





<
<
<
<
<
<
<
<
<
<
<
<
<
|



|







692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719













720
721
722
723
724
725
726
727
728
729
730
731
    Tcl_Channel chan;		/* The channel to add to this interpreter
                                 * channel table. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    int new;			/* Is the hash entry new or does it exist? */
    Channel *chanPtr;		/* The actual channel. */
    ChannelState *statePtr;	/* State of the actual channel. */

    /*
     * Always (un)register bottom-most channel in the stack.  This makes
     * management of the channel list easier because no manipulation is
     * necessary during (un)stack operation.
     */
    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    statePtr = chanPtr->state;

    if (statePtr->channelName == (char *) NULL) {
        panic("Tcl_RegisterChannel: channel without name");
    }
    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = GetChannelTable(interp);
        hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &new);
        if (new == 0) {
            if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) {
                return;
            }














	    panic("Tcl_RegisterChannel: duplicate channel names");
        }
        Tcl_SetHashValue(hPtr, (ClientData) chanPtr);
    }
    statePtr->refCount++;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnregisterChannel --
 *
1084
1085
1086
1087
1088
1089
1090

1091





1092

1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
Tcl_UnregisterChannel(interp, chan)
    Tcl_Interp *interp;		/* Interpreter in which channel is defined. */
    Tcl_Channel chan;		/* Channel to delete. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The real IO channel. */







    chanPtr = (Channel *) chan;

    
    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        hPtr = Tcl_FindHashEntry(hTblPtr, chanPtr->channelName);
        if (hPtr == (Tcl_HashEntry *) NULL) {
            return TCL_OK;
        }
        if ((Channel *) Tcl_GetHashValue(hPtr) != chanPtr) {
            return TCL_OK;
        }
        Tcl_DeleteHashEntry(hPtr);

        /*
         * Remove channel handlers that refer to this interpreter, so that they
         * will not be present if the actual close is delayed and more events
         * happen on the channel. This may occur if the channel is shared
         * between several interpreters, or if the channel has async
         * flushing active.
         */
    
        CleanupChannelHandlers(interp, chanPtr);
    }

    chanPtr->refCount--;
    
    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);

    /*
     * If the refCount reached zero, close the actual channel.
     */

    if (chanPtr->refCount <= 0) {

        /*
         * Ensure that if there is another buffer, it gets flushed
         * whether or not we are doing a background flush.
         */

        if ((chanPtr->curOutPtr != NULL) &&
                (chanPtr->curOutPtr->nextAdded >
                        chanPtr->curOutPtr->nextRemoved)) {
            chanPtr->flags |= BUFFER_READY;
        }
        chanPtr->flags |= CHANNEL_CLOSED;
        if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
            if (Tcl_Close(interp, chan) != TCL_OK) {
                return TCL_ERROR;
            }
        }
    }
    return TCL_OK;
}







>

>
>
>
>
>
|
>
|





|



















|















|






|
|
|
|

|
|







746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
Tcl_UnregisterChannel(interp, chan)
    Tcl_Interp *interp;		/* Interpreter in which channel is defined. */
    Tcl_Channel chan;		/* Channel to delete. */
{
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The real IO channel. */
    ChannelState *statePtr;	/* State of the real channel. */

    /*
     * Always (un)register bottom-most channel in the stack.  This makes
     * management of the channel list easier because no manipulation is
     * necessary during (un)stack operation.
     */
    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    statePtr = chanPtr->state;

    if (interp != (Tcl_Interp *) NULL) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        hPtr = Tcl_FindHashEntry(hTblPtr, statePtr->channelName);
        if (hPtr == (Tcl_HashEntry *) NULL) {
            return TCL_OK;
        }
        if ((Channel *) Tcl_GetHashValue(hPtr) != chanPtr) {
            return TCL_OK;
        }
        Tcl_DeleteHashEntry(hPtr);

        /*
         * Remove channel handlers that refer to this interpreter, so that they
         * will not be present if the actual close is delayed and more events
         * happen on the channel. This may occur if the channel is shared
         * between several interpreters, or if the channel has async
         * flushing active.
         */
    
        CleanupChannelHandlers(interp, chanPtr);
    }

    statePtr->refCount--;
    
    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);

    /*
     * If the refCount reached zero, close the actual channel.
     */

    if (statePtr->refCount <= 0) {

        /*
         * Ensure that if there is another buffer, it gets flushed
         * whether or not we are doing a background flush.
         */

        if ((statePtr->curOutPtr != NULL) &&
                (statePtr->curOutPtr->nextAdded >
                        statePtr->curOutPtr->nextRemoved)) {
            statePtr->flags |= BUFFER_READY;
        }
        statePtr->flags |= CHANNEL_CLOSED;
        if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
            if (Tcl_Close(interp, chan) != TCL_OK) {
                return TCL_ERROR;
            }
        }
    }
    return TCL_OK;
}
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222






1223

1224
1225
1226
1227
1228
1229
1230
1231
1232
     * have access to the standard channels.
     */

    name = chanName;
    if ((chanName[0] == 's') && (chanName[1] == 't')) {
	chanPtr = NULL;
	if (strcmp(chanName, "stdin") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDIN);
	} else if (strcmp(chanName, "stdout") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDOUT);
	} else if (strcmp(chanName, "stderr") == 0) {
	    chanPtr = (Channel *)Tcl_GetStdChannel(TCL_STDERR);
	}
	if (chanPtr != NULL) {
	    name = chanPtr->channelName;
	}
    }
    
    hTblPtr = GetChannelTable(interp);
    hPtr = Tcl_FindHashEntry(hTblPtr, name);
    if (hPtr == (Tcl_HashEntry *) NULL) {
        Tcl_AppendResult(interp, "can not find channel named \"",
                chanName, "\"", (char *) NULL);
        return NULL;
    }







    chanPtr = (Channel *) Tcl_GetHashValue(hPtr);

    if (modePtr != NULL) {
        *modePtr = (chanPtr->flags & (TCL_READABLE|TCL_WRITABLE));
    }
    
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------







|

|

|


|


|








>
>
>
>
>
>

>

|







866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
     * have access to the standard channels.
     */

    name = chanName;
    if ((chanName[0] == 's') && (chanName[1] == 't')) {
	chanPtr = NULL;
	if (strcmp(chanName, "stdin") == 0) {
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDIN);
	} else if (strcmp(chanName, "stdout") == 0) {
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDOUT);
	} else if (strcmp(chanName, "stderr") == 0) {
	    chanPtr = (Channel *) Tcl_GetStdChannel(TCL_STDERR);
	}
	if (chanPtr != NULL) {
	    name = chanPtr->state->channelName;
	}
    }

    hTblPtr = GetChannelTable(interp);
    hPtr = Tcl_FindHashEntry(hTblPtr, name);
    if (hPtr == (Tcl_HashEntry *) NULL) {
        Tcl_AppendResult(interp, "can not find channel named \"",
                chanName, "\"", (char *) NULL);
        return NULL;
    }

    /*
     * Always return bottom-most channel in the stack.  This one lives
     * the longest - other channels may go away unnoticed.
     * The other APIs compensate where necessary to retrieve the
     * topmost channel again.
     */
    chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
    chanPtr = chanPtr->state->bottomChanPtr;
    if (modePtr != NULL) {
        *modePtr = (chanPtr->state->flags & (TCL_READABLE|TCL_WRITABLE));
    }
    
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
1251
1252
1253
1254
1255
1256
1257


1258
1259
1260












1261


1262








1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322










1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338

1339
1340
1341

1342
1343
1344

1345
1346
1347
1348
1349
1350
1351
1352
    Tcl_ChannelType *typePtr;	/* The channel type record. */
    char *chanName;		/* Name of channel to record. */
    ClientData instanceData;	/* Instance specific data. */
    int mask;			/* TCL_READABLE & TCL_WRITABLE to indicate
                                 * if the channel is readable, writable. */
{
    Channel *chanPtr;		/* The channel structure newly created. */


    CONST char *name;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);













    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));


    








    if (chanName != (char *) NULL) {
        chanPtr->channelName = ckalloc((unsigned) (strlen(chanName) + 1));
        strcpy(chanPtr->channelName, chanName);
    } else {
        panic("Tcl_CreateChannel: NULL channel name");
    }

    chanPtr->flags = mask;

    /*
     * Set the channel to system default encoding.
     */

    chanPtr->encoding = NULL;
    name = Tcl_GetEncodingName(NULL);
    if (strcmp(name, "binary") != 0) {
    	chanPtr->encoding = Tcl_GetEncoding(NULL, name);
    }
    chanPtr->inputEncodingState = NULL;
    chanPtr->inputEncodingFlags = TCL_ENCODING_START;
    chanPtr->outputEncodingState = NULL;
    chanPtr->outputEncodingFlags = TCL_ENCODING_START;

    /*
     * Set the channel up initially in AUTO input translation mode to
     * accept "\n", "\r" and "\r\n". Output translation mode is set to
     * a platform specific default value. The eofChar is set to 0 for both
     * input and output, so that Tcl does not look for an in-file EOF
     * indicator (e.g. ^Z) and does not append an EOF indicator to files.
     */

    chanPtr->inputTranslation = TCL_TRANSLATE_AUTO;
    chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
    chanPtr->inEofChar = 0;
    chanPtr->outEofChar = 0;

    chanPtr->unreportedError = 0;
    chanPtr->instanceData = instanceData;
    chanPtr->typePtr = typePtr;
    chanPtr->refCount = 0;
    chanPtr->closeCbPtr = (CloseCallback *) NULL;
    chanPtr->curOutPtr = (ChannelBuffer *) NULL;
    chanPtr->outQueueHead = (ChannelBuffer *) NULL;
    chanPtr->outQueueTail = (ChannelBuffer *) NULL;
    chanPtr->saveInBufPtr = (ChannelBuffer *) NULL;
    chanPtr->inQueueHead = (ChannelBuffer *) NULL;
    chanPtr->inQueueTail = (ChannelBuffer *) NULL;
    chanPtr->chPtr = (ChannelHandler *) NULL;
    chanPtr->interestMask = 0;
    chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
    chanPtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
    chanPtr->timer = NULL;
    chanPtr->csPtr = NULL;
    chanPtr->supercedes = (Channel*) NULL;

    chanPtr->outputStage = NULL;
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *)
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    }











    /*
     * Link the channel into the list of all channels; create an on-exit
     * handler if there is not one already, to close off all the channels
     * in the list on exit.
     */

    chanPtr->nextChanPtr = tsdPtr->firstChanPtr;
    tsdPtr->firstChanPtr = chanPtr;

    /*
     * Install this channel in the first empty standard channel slot, if
     * the channel was previously closed explicitly.
     */

    if ((tsdPtr->stdinChannel == NULL) && (tsdPtr->stdinInitialized == 1)) {

	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDIN);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stdoutChannel == NULL) && (tsdPtr->stdoutInitialized == 1)) {

	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDOUT);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stderrChannel == NULL) && (tsdPtr->stderrInitialized == 1)) {

	Tcl_SetStdChannel((Tcl_Channel)chanPtr, TCL_STDERR);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } 
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------







>
>



>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>

|
|




|





|


|

|
|
|
|









|
|
|
|

|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<

|
|
|
|

>
>
>
>
>
>
>
>
>
>







|
|






|
>
|

|
>
|

|
>
|







927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999


1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013

1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
    Tcl_ChannelType *typePtr;	/* The channel type record. */
    char *chanName;		/* Name of channel to record. */
    ClientData instanceData;	/* Instance specific data. */
    int mask;			/* TCL_READABLE & TCL_WRITABLE to indicate
                                 * if the channel is readable, writable. */
{
    Channel *chanPtr;		/* The channel structure newly created. */
    ChannelState *statePtr;	/* The stack-level independent state info
				 * for the channel. */
    CONST char *name;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    /*
     * With the change of the Tcl_ChannelType structure to use a version in
     * 8.3.2+, we have to make sure that our assumption that the structure
     * remains a binary compatible size is true.
     *
     * If this assertion fails on some system, then it can be removed
     * only if the user recompiles code with older channel drivers in
     * the new system as well.
     */

    assert(sizeof(Tcl_ChannelTypeVersion) == sizeof(Tcl_DriverBlockModeProc*));

    chanPtr  = (Channel *) ckalloc((unsigned) sizeof(Channel));
    statePtr = (ChannelState *) ckalloc((unsigned) sizeof(ChannelState));
    chanPtr->state = statePtr;

    chanPtr->instanceData	= instanceData;
    chanPtr->typePtr		= typePtr;

    /*
     * Set all the bits that are part of the stack-independent state
     * information for the channel.
     */

    if (chanName != (char *) NULL) {
        statePtr->channelName = ckalloc((unsigned) (strlen(chanName) + 1));
        strcpy(statePtr->channelName, chanName);
    } else {
        panic("Tcl_CreateChannel: NULL channel name");
    }

    statePtr->flags		= mask;

    /*
     * Set the channel to system default encoding.
     */

    statePtr->encoding = NULL;
    name = Tcl_GetEncodingName(NULL);
    if (strcmp(name, "binary") != 0) {
    	statePtr->encoding = Tcl_GetEncoding(NULL, name);
    }
    statePtr->inputEncodingState	= NULL;
    statePtr->inputEncodingFlags	= TCL_ENCODING_START;
    statePtr->outputEncodingState	= NULL;
    statePtr->outputEncodingFlags	= TCL_ENCODING_START;

    /*
     * Set the channel up initially in AUTO input translation mode to
     * accept "\n", "\r" and "\r\n". Output translation mode is set to
     * a platform specific default value. The eofChar is set to 0 for both
     * input and output, so that Tcl does not look for an in-file EOF
     * indicator (e.g. ^Z) and does not append an EOF indicator to files.
     */

    statePtr->inputTranslation	= TCL_TRANSLATE_AUTO;
    statePtr->outputTranslation	= TCL_PLATFORM_TRANSLATION;
    statePtr->inEofChar		= 0;
    statePtr->outEofChar	= 0;

    statePtr->unreportedError	= 0;


    statePtr->refCount		= 0;
    statePtr->closeCbPtr	= (CloseCallback *) NULL;
    statePtr->curOutPtr		= (ChannelBuffer *) NULL;
    statePtr->outQueueHead	= (ChannelBuffer *) NULL;
    statePtr->outQueueTail	= (ChannelBuffer *) NULL;
    statePtr->saveInBufPtr	= (ChannelBuffer *) NULL;
    statePtr->inQueueHead	= (ChannelBuffer *) NULL;
    statePtr->inQueueTail	= (ChannelBuffer *) NULL;
    statePtr->chPtr		= (ChannelHandler *) NULL;
    statePtr->interestMask	= 0;
    statePtr->scriptRecordPtr	= (EventScriptRecord *) NULL;
    statePtr->bufSize		= CHANNELBUFFER_DEFAULT_SIZE;
    statePtr->timer		= NULL;
    statePtr->csPtr		= NULL;


    statePtr->outputStage	= NULL;
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *)
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }

    /*
     * As we are creating the channel, it is obviously the top for now
     */
    statePtr->topChanPtr	= chanPtr;
    statePtr->bottomChanPtr	= chanPtr;
    chanPtr->downChanPtr	= (Channel *) NULL;
    chanPtr->upChanPtr		= (Channel *) NULL;
    chanPtr->inQueueHead        = (ChannelBuffer*) NULL;
    chanPtr->inQueueTail        = (ChannelBuffer*) NULL;

    /*
     * Link the channel into the list of all channels; create an on-exit
     * handler if there is not one already, to close off all the channels
     * in the list on exit.
     */

    statePtr->nextCSPtr  = tsdPtr->firstCSPtr;
    tsdPtr->firstCSPtr   = statePtr;

    /*
     * Install this channel in the first empty standard channel slot, if
     * the channel was previously closed explicitly.
     */

    if ((tsdPtr->stdinChannel == NULL) &&
	    (tsdPtr->stdinInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDIN);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stdoutChannel == NULL) &&
	    (tsdPtr->stdoutInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDOUT);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } else if ((tsdPtr->stderrChannel == NULL) &&
	    (tsdPtr->stderrInitialized == 1)) {
	Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDERR);
        Tcl_RegisterChannel((Tcl_Interp *) NULL, (Tcl_Channel) chanPtr);
    } 
    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402

1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418

1419
1420
1421
1422
1423
1424
1425
1426
1427
1428

1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444



1445
1446
1447
1448






1449


1450












1451

1452










1453
1454
1455






1456


1457

1458
1459
1460
1461

1462


1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643

1644
1645

1646
1647
1648
1649
1650
1651
1652
1653
1654
1655



1656



1657

1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684



1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698

1699
1700


1701
1702
1703

1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731

1732
1733
1734
1735
1736

1737
1738
1739

1740

1741
1742
1743
1744
1745
1746
1747
1748
1749
1750




1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776


1777
1778
1779

1780
1781
1782
1783

1784
1785
1786
1787
1788

1789
1790
1791
1792


1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813

1814
1815
1816
1817
1818
1819

1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832



1833
1834

1835
1836
1837
1838
1839
1840

1841
1842



1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867

1868













































































1869
1870
1871
1872
1873
1874
1875
 *    replaced by the new typePtr.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_StackChannel(interp, typePtr, instanceData, mask, prevChan)
    Tcl_Interp*      interp;       /* The interpreter we are working in */
    Tcl_ChannelType *typePtr;	   /* The channel type record for the new
				    * channel. */
    ClientData       instanceData; /* Instance specific data for the new
				    * channel. */
    int              mask;	   /* TCL_READABLE & TCL_WRITABLE to indicate
				    * if the channel is readable, writable. */
    Tcl_Channel      prevChan;	   /* The channel structure to replace */
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel            *chanPtr, *pt;
    int                 interest = 0;

    /*
     * AK, 06/30/1999
     *
     * Tcl_StackChannel differs from Tcl_ReplaceChannel of the
     * original "Trf" patch. Instead of seeing the
     * newly created structure as the *new* channel to cover the specified
     * one use it to *save* the current state of the specified channel and
     * then reinitialize the current structure for the given transformation.

     *
     * Advantages:
     * - No splicing into the (thread-)global list of channels (or the per-
     *   interp hash-tables).
     * - Users of the C-API still have valid channel references even after
     *   the call to this procedure.
     *
     * Disadvantages:
     * - Untested code.
     */

    /*
     * Find the given channel in the list of all channels.
     */

    pt     = (Channel*) tsdPtr->firstChanPtr;


    while (pt != (Channel *) prevChan) {
	pt = pt->nextChanPtr;
    }

    /*
     * 'pt == prevChan' now (or NULL, if not found).
     */

    if (!pt) {

        return (Tcl_Channel) NULL;
    }

    /*
     * Here we check if the given "mask" matches the "flags"
     * of the already existing channel.
     *
     *	  | - | R | W | RW |
     *	--+---+---+---+----+	<=>  0 != (chan->mask & prevChan->mask)
     *	- |   |   |   |    |
     *	R |   | + |   | +  |	The superceding channel is allowed to
     *	W |   |   | + | +  |	restrict the capabilities of the
     *	RW|   | + | + | +  |	superceded one !
     *	--+---+---+---+----+
     */




    if ((mask & Tcl_GetChannelMode (prevChan)) == 0) {
        return (Tcl_Channel) NULL;
    }







    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));















    /*

     * If there is some interest in the channel, remove it, break










     * down the whole chain. It will be reconstructed later.
     */







    interest = pt->interestMask;




    pt->interestMask = 0;

    if (interest) {
        (pt->typePtr->watchProc) (pt->instanceData, 0);

    }



    /*
     * Save some of the current state into the new structure,
     * reinitialize the parts which will stay with the transformation.
     *
     * Remarks:
     * - We cannot discard the buffers, and they cannot be used from the
     *   transformation placed later into the 'pt' structure. Save them,
     *   and believe that Tcl_SetChannelOption (buffering, none) will do
     *   the right thing.
     * - encoding and EOL-translation control information is initialized
     *   to values for 'binary'. This is later reinforced via
     *   Tcl_SetChanneloption to get the handling of flags and the event
     *   system right.
     * - The 'interestMask' of the saved channel is cleared, but the
     *   transformations WatchProc is used to establish the connection
     *   between transformation and underlying channel. This should
     *   reestablish the correct mask.
     * - TTO = Transform Takes Over.   The hidden channel no longer
     *         needs to perform this function.
     */

    chanPtr->channelName = (char *) ckalloc (strlen(pt->channelName)+1);
    strcpy (chanPtr->channelName, pt->channelName);

    chanPtr->flags               = pt->flags;           /* Save */

    chanPtr->encoding            = (Tcl_Encoding) NULL; /* == 'binary' */
    chanPtr->inputEncodingState  = (Tcl_EncodingState) NULL;
    chanPtr->inputEncodingFlags  = TCL_ENCODING_START;
    chanPtr->outputEncodingState = (Tcl_EncodingState) NULL;
    chanPtr->outputEncodingFlags = TCL_ENCODING_START;

    chanPtr->inputTranslation    = TCL_TRANSLATE_LF; /* == 'binary' */
    chanPtr->outputTranslation   = TCL_TRANSLATE_LF; /* == 'binary' */
    chanPtr->inEofChar           = pt->inEofChar;         /* Save */
    chanPtr->outEofChar          = pt->outEofChar;        /* Save */

    chanPtr->unreportedError     = pt->unreportedError;   /* Save */
    chanPtr->instanceData        = pt->instanceData;      /* Save */
    chanPtr->typePtr             = pt->typePtr;           /* Save */
    chanPtr->refCount            = 0;   /* None, as the structure is covered */
    chanPtr->closeCbPtr          = (CloseCallback*) NULL; /* TTO */

    chanPtr->outputStage         = (char*) NULL;
    chanPtr->curOutPtr           = pt->curOutPtr;    /* Save */
    chanPtr->outQueueHead        = pt->outQueueHead; /* Save */
    chanPtr->outQueueTail        = pt->outQueueTail; /* Save */
    chanPtr->saveInBufPtr        = pt->saveInBufPtr; /* Save */
    chanPtr->inQueueHead         = pt->inQueueHead;  /* Save */
    chanPtr->inQueueTail         = pt->inQueueTail;  /* Save */

    chanPtr->chPtr               = (ChannelHandler *) NULL;  /* TTO */
    chanPtr->interestMask        = 0;
    chanPtr->nextChanPtr         = (Channel*) NULL;     /* Is not in list! */
    chanPtr->scriptRecordPtr     = (EventScriptRecord *) NULL; /* TTO */
    chanPtr->bufSize             = CHANNELBUFFER_DEFAULT_SIZE;
    chanPtr->timer               = (Tcl_TimerToken) NULL;      /* TTO */
    chanPtr->csPtr               = (CopyState*) NULL;          /* TTO */

    /*
     * Place new block at the head of a possibly existing list of previously
     * stacked channels, then do the missing initializations of translation
     * and buffer system.
     */

    chanPtr->supercedes          = pt->supercedes;

    Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	"-translation", "binary");
    Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
	"-buffering",   "none");

    /*
     * Save accomplished, now reinitialize the (old) structure for the
     * transformation.
     *
     * - The information about encoding and eol-translation is taken
     *   without change.  There is no need to fiddle with
     *   refCount et. al.
     *
     * Don't forget to use the same blocking mode as the old channel.
     */

    pt->flags               = mask | (chanPtr->flags & CHANNEL_NONBLOCKING);

    /*
     * EDITORS NOTE:  all the lines with "take it as is" should get
     * deleted once this code has been debugged.
     */

    /* pt->encoding,            take it as is */
    /* pt->inputEncodingState,  take it as is */
    /* pt->inputEncodingFlags,  take it as is */
    /* pt->outputEncodingState, take it as is */
    /* pt->outputEncodingFlags, take it as is */

    /* pt->inputTranslation,    take it as is */
    /* pt->outputTranslation,   take it as is */

    /*
     * No special EOF character, that condition is determined by the
     * old channel
     */

    pt->inEofChar           = 0;
    pt->outEofChar          = 0;

    pt->unreportedError     = 0; /* No errors yet */
    pt->instanceData        = instanceData; /* Transformation state */
    pt->typePtr             = typePtr;      /* Transformation type */
    /* pt->refCount,            take it as it is */
    /* pt->closeCbPtr,          take it as it is */

    /* pt->outputStage,         take it as it is */
    pt->curOutPtr           = (ChannelBuffer *) NULL;
    pt->outQueueHead        = (ChannelBuffer *) NULL;
    pt->outQueueTail        = (ChannelBuffer *) NULL;
    pt->saveInBufPtr        = (ChannelBuffer *) NULL;
    pt->inQueueHead         = (ChannelBuffer *) NULL;
    pt->inQueueTail         = (ChannelBuffer *) NULL;

    /* pt->chPtr,               take it as it is */
    /* pt->interestMask,        take it as it is */
    /* pt->nextChanPtr,         take it as it is */
    /* pt->scriptRecordPtr,     take it as it is */
    pt->bufSize             = CHANNELBUFFER_DEFAULT_SIZE;
    /* pt->timer,               take it as it is */
    /* pt->csPtr,               take it as it is */

    /*
     * Have the transformation reference the new structure containing
     * the saved channel.
     */

    pt->supercedes          = chanPtr;

    /*
     * Don't forget to reinitialize the output buffer used for encodings.
     */

    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
        chanPtr->outputStage = (char *)
	    ckalloc((unsigned) (chanPtr->bufSize + 2));
    }

    /*
     * Event handling: If the information in the old channel shows
     * that there was interest in some events call the 'WatchProc'
     * of the transformation to establish the proper connection
     * between them.
     */

    if (interest) {
        (pt->typePtr->watchProc) (pt->instanceData, interest);
    }

    /*
     * The superceded channel is effectively unregistered
     * We cannot decrement its reference count because that
     * can cause it to get garbage collected out from under us.
     * Don't add the following code:
     *
     * chanPtr->supercedes->refCount --;
     */

    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnstackChannel --
 *
 *	Unstacks an entry in the hash table for a Tcl_Channel
 *	record. This is the reverse to 'Tcl_StackChannel'.
 *	The old, superceded channel is uncovered and re-registered
 *	in the appropriate data structures.
 *
 * Results:
 *	Returns the old Tcl_Channel, i.e. the one which was stacked over.

 *
 * Side effects:

 *	See above.
 *
 *----------------------------------------------------------------------
 */

void
Tcl_UnstackChannel (interp, chan)
    Tcl_Interp* interp; /* The interpreter we are working in */
    Tcl_Channel chan;   /* The channel to unstack */
{



    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);



    Channel* chanPtr = (Channel*) chan;


    if (chanPtr->supercedes != (Channel*) NULL) {
        /*
	 * Instead of manipulating the per-thread / per-interp list/hashtable
	 * of registered channels we wind down the state of the transformation,
	 * and then restore the state of underlying channel into the old
	 * structure.
	 */

	Tcl_DString       dsTrans; /* storage to save option information */
	Tcl_DString       dsBuf;   /* storage to save option information */
	Channel           top;     /* Save area for current transformation */
	Channel*          chanDownPtr = chanPtr->supercedes;
	int               interest;	/* interest mask of transformation
					 * before destruct. */
	int               saveInputEncodingFlags;  /* Save area for encoding */
 	int               saveOutputEncodingFlags; /* related information */
	Tcl_EncodingState saveInputEncodingState;
	Tcl_EncodingState saveOutputEncodingState;
	Tcl_Encoding      saveEncoding;

	/*
	 * Event handling: Disallow the delivery of events from the

	 * old, now uncovered channel to the transformation.
	 *
	 * This is done before everything else to avoid problems
	 * after our heavy-duty shuffling of pointers around.



	 */

	interest = chanPtr->interestMask;
        (chanPtr->typePtr->watchProc) (chanPtr->instanceData, 0);

	/* 1. Swap the information in the top channel (the transformation)
	 *    and the channel below, with some exceptions. This additionally
	 *    cuts the top channel out of the chain. Without the latter
	 *    a Tcl_Close on the transformation would be impossible, as that
	 *    procedure will free the structure, making 'top' unusable.
	 *
	 * chanPtr     -> top channel, transformation.
	 * chanDownPtr -> channel immediately below the transformation.
	 */


	memcpy ((void*) &top,        (void*) chanPtr,     sizeof (Channel));


	memcpy ((void*) chanPtr,     (void*) chanDownPtr, sizeof (Channel));
	top.supercedes = (Channel*) NULL;
	memcpy ((void*) chanDownPtr, (void*) &top,        sizeof (Channel));


	/* Now:
 	 * chanPtr     -> channel immediately below the transformation, now top
 	 * chanDownPtr -> transformation, cut loose.
 	 *
 	 * Handle the exceptions mentioned above, i.e. move the information
 	 * from the transformation into the new top, and reinitialize it to
 	 * safe values in the transformation.
 	 */

	chanPtr->refCount        = chanDownPtr->refCount;
	chanPtr->closeCbPtr      = chanDownPtr->closeCbPtr;
	chanPtr->chPtr           = chanDownPtr->chPtr;
	chanPtr->nextChanPtr     = chanDownPtr->nextChanPtr;
	chanPtr->scriptRecordPtr = chanDownPtr->scriptRecordPtr;
	chanPtr->timer           = chanDownPtr->timer;
	chanPtr->csPtr           = chanDownPtr->csPtr;

	chanDownPtr->refCount        = 0;
	chanDownPtr->closeCbPtr      = (CloseCallback*) NULL;
	chanDownPtr->chPtr           = (ChannelHandler*) NULL;
	chanDownPtr->nextChanPtr     = (Channel*) NULL;
	chanDownPtr->scriptRecordPtr = (EventScriptRecord*) NULL;
	chanDownPtr->timer           = (Tcl_TimerToken) NULL;
	chanDownPtr->csPtr           = (CopyState*) NULL;

	/* The now uncovered channel still has encoding and eol-translation
	 * deactivated, i.e. switched to 'binary'. *Don't* touch this until

	 * after the transformation is closed for good, as it may write
	 * information into it during that (-> flushing of data waiting in
	 * internal buffers!) and rely on these settings. Thanks to Matt
	 * Newman <matt@sensus.org> for finding this goof.
	 *

	 * But we also have to protect the state of the encoding from removal
	 * during the close. So we save it in some local variables.
	 * Additionally the current value of the options is lost after we

	 * close, we have to save them now.

	 */

 	saveEncoding            = chanDownPtr->encoding;
 	saveInputEncodingState  = chanDownPtr->inputEncodingState;
 	saveInputEncodingFlags  = chanDownPtr->inputEncodingFlags;
 	saveOutputEncodingState = chanDownPtr->outputEncodingState;
 	saveOutputEncodingFlags = chanDownPtr->outputEncodingFlags;

 	Tcl_DStringInit (&dsTrans);
 	Tcl_GetChannelOption (interp, (Tcl_Channel) chanDownPtr,




		"-translation", &dsTrans);

 	Tcl_DStringInit (&dsBuf);
 	Tcl_GetChannelOption (interp, (Tcl_Channel) chanDownPtr,
		"-buffering", &dsBuf);

	/*
	 * Prevent the accidential removal of the encoding during
	 * the destruction of the transformation channel.
	 */

	chanDownPtr->encoding            = (Tcl_Encoding) NULL;
	chanDownPtr->inputEncodingState  = (Tcl_EncodingState) NULL;
	chanDownPtr->inputEncodingFlags  = TCL_ENCODING_START;
	chanDownPtr->outputEncodingState = (Tcl_EncodingState) NULL;
	chanDownPtr->outputEncodingFlags = TCL_ENCODING_START;

	/*
	 * A little trick: Add the transformation structure to the
	 * per-thread list of existing channels (which it never were
	 * part of so far), or Tcl_Close/FlushChannel will panic
	 * ("damaged channel list").
	 *
	 * Afterward do a regular close upon the transformation.
	 * This may cause flushing of data into the old channel (if the
	 * transformation remembered its own channel in itself).


	 *
	 * We know that its refCount dropped to 0.
	 */


	chanDownPtr->nextChanPtr = tsdPtr->firstChanPtr;
	tsdPtr->firstChanPtr     = chanDownPtr;


	Tcl_Close (interp, (Tcl_Channel)chanDownPtr);

	/*
	 * Now it is possible to wind down the transformation (in 'top'),
	 * especially to copy the current encoding and translation control

	 * information down.
	 */
	
	/*


	 * Move the currently active encoding from the save area
	 * to the now uncovered channel. We assume here that this
	 * channel uses 'encoding binary' (==> encoding == NULL, etc.
	 * This allows us to simply copy the pointers without having to
	 * think about refcounts and deallocation of the old encoding.
	 *
	 * And don't forget to reenable the EOL-translation used by the
	 * transformation. Using a DString to do this *is* a bit awkward,
	 * but still the best way to handle the complexities here, like
	 * flag manipulation and event system.
	 */

	chanPtr->encoding            = saveEncoding;
	chanPtr->inputEncodingState  = saveInputEncodingState;
	chanPtr->inputEncodingFlags  = saveInputEncodingFlags;
	chanPtr->outputEncodingState = saveOutputEncodingState;
	chanPtr->outputEncodingFlags = saveOutputEncodingFlags;

	Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
		"-translation", dsTrans.string);


	Tcl_SetChannelOption (interp, (Tcl_Channel) chanPtr,
		"-buffering", dsBuf.string);

	Tcl_DStringFree (&dsTrans);
	Tcl_DStringFree (&dsBuf);


	/*
	 * Event handling: If the information from the now destroyed
	 * transformation shows that there was interest in some events
	 * call the 'WatchProc' of the now uncovered channel to renew
	 * that interest with underlying channels or the driver.
	 */

	if (interest) {
	    chanPtr->interestMask = 0;
	    (chanPtr->typePtr->watchProc) (chanPtr->instanceData,
		interest);
	    chanPtr->interestMask = interest;
	}




    } else {

        /* This channel does not cover another one.
	 * Simply do a close, if necessary.
	 */

        if (chanPtr->refCount == 0) {
	    Tcl_Close (interp, chan);

	}
    }



}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetStackedChannel --
 *
 *	Determines wether the specified channel is stacked upon another.
 *
 * Results:
 *	NULL if the channel is not stacked upon another one, or a reference
 *	to the channel it is stacked upon. This reference can be used in
 *	queries, but modification is not allowed.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_GetStackedChannel(chan)
    Tcl_Channel chan;
{
  Channel* chanPtr = (Channel*) chan;

  return (Tcl_Channel) chanPtr->supercedes;













































































}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelMode --
 *







|


|

|

|

|
|
|


<
<
<
<
<
<
|
>

<
<
<
<
<
<
<
<
<
|
<
<


|
>

|
|


<
|
<
|
<
>
















>
>
>
|



>
>
>
>
>
>
|
>
>

>
>
>
>
>
>
>
>
>
>
>
>

>
|
>
>
>
>
>
>
>
>
>
>
|


>
>
>
>
>
>
|
>
>

>
|
|
|
|
>

>
>






<
<
<
<
<
<
<
<
<
<
<
<
<
<


<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
|
|
<
<
<
<
|
|
<
<
<
<
<
<
<
<



|
<


<
|
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<











<
<


<
>


>
|




|

|


>
>
>
|
>
>
>
|
>

|






|
<
<
<
<
<
<
<
<
<
<
<


<
>
|
<
<
<
>
>
>


|
<
|
<
<
<
<
<
|
|
<
<
>

|
>
>
|
|
<
>
|
<
<
<
|
|
<
<
<
|
<
<
<
<
<
<
<

<
<
<
<
<
<
<
|
<
<
>
|
<
<
<
<
>
|
<
<
>
|
>


|
|
|
<
<

<
|
>
>
>
>
<

<
<
<
|
<
<
<
<
|
<
<
|
<
<
|
<
<
<
<
<
|
<
<
<
>
>
|
<
<
>
|
<
<

>
|


<
<
>
|

|

>
>
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
|
<
|
>
|
<
|
<
<

>

<
<
|
<

|
<
<
<
|
<
|
>
>
>
|

>
|



|
|
>
|
|
>
>
>







|
















|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105






1106
1107
1108









1109


1110
1111
1112
1113
1114
1115
1116
1117
1118

1119

1120

1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207














1208
1209


1210














1211
1212


1213
1214




1215
1216








1217
1218
1219
1220

1221
1222

1223




1224




























































































1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235


1236
1237

1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269











1270
1271

1272
1273



1274
1275
1276
1277
1278
1279

1280





1281
1282


1283
1284
1285
1286
1287
1288
1289

1290
1291



1292
1293



1294







1295







1296


1297
1298




1299
1300


1301
1302
1303
1304
1305
1306
1307
1308


1309

1310
1311
1312
1313
1314

1315



1316




1317


1318


1319





1320



1321
1322
1323


1324
1325


1326
1327
1328
1329
1330


1331
1332
1333
1334
1335
1336
1337





1338





1339





1340
1341

1342
1343
1344

1345


1346
1347
1348


1349

1350
1351



1352

1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
 *    replaced by the new typePtr.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_StackChannel(interp, typePtr, instanceData, mask, prevChan)
    Tcl_Interp	    *interp;	   /* The interpreter we are working in */
    Tcl_ChannelType *typePtr;	   /* The channel type record for the new
				    * channel. */
    ClientData	     instanceData; /* Instance specific data for the new
				    * channel. */
    int		     mask;	   /* TCL_READABLE & TCL_WRITABLE to indicate
				    * if the channel is readable, writable. */
    Tcl_Channel	     prevChan;	   /* The channel structure to replace */
{
    ThreadSpecificData	*tsdPtr = TCL_TSD_INIT(&dataKey);
    Channel		*chanPtr, *prevChanPtr;
    ChannelState	*statePtr;

    /*






     * Find the given channel in the list of all channels.
     * If we don't find it, then it was never registered correctly.
     *









     * This operation should occur at the top of a channel stack.


     */

    statePtr    = (ChannelState *) tsdPtr->firstCSPtr;
    prevChanPtr = ((Channel *) prevChan)->state->topChanPtr;

    while (statePtr->topChanPtr != prevChanPtr) {
	statePtr = statePtr->nextCSPtr;
    }


    if (statePtr == NULL) {

	Tcl_AppendResult(interp, "couldn't find state for channel \"",

		Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
        return (Tcl_Channel) NULL;
    }

    /*
     * Here we check if the given "mask" matches the "flags"
     * of the already existing channel.
     *
     *	  | - | R | W | RW |
     *	--+---+---+---+----+	<=>  0 != (chan->mask & prevChan->mask)
     *	- |   |   |   |    |
     *	R |   | + |   | +  |	The superceding channel is allowed to
     *	W |   |   | + | +  |	restrict the capabilities of the
     *	RW|   | + | + | +  |	superceded one !
     *	--+---+---+---+----+
     */

    if ((mask & (statePtr->flags & (TCL_READABLE | TCL_WRITABLE))) == 0) {
	Tcl_AppendResult(interp,
		"reading and writing both disallowed for channel \"",
		Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
        return (Tcl_Channel) NULL;
    }

    /*
     * Flush the buffers. This ensures that any data still in them
     * at this time is not handled by the new transformation. Restrict
     * this to writable channels. Take care to hide a possible bg-copy
     * in progress from Tcl_Flush and the CheckForChannelErrors inside.
     */

    if ((mask & TCL_WRITABLE) != 0) {
        CopyState *csPtr;

        csPtr           = statePtr->csPtr;
	statePtr->csPtr = (CopyState*) NULL;

	if (Tcl_Flush((Tcl_Channel) prevChanPtr) != TCL_OK) {
	    statePtr->csPtr = csPtr;
	    Tcl_AppendResult(interp, "could not flush channel \"",
		    Tcl_GetChannelName(prevChan), "\"", (char *) NULL);
	    return (Tcl_Channel) NULL;
	}

	statePtr->csPtr = csPtr;
    }
    /*
     * Discard any input in the buffers. They are not yet read by the
     * user of the channel, so they have to go through the new
     * transformation before reading. As the buffers contain the
     * untransformed form their contents are not only useless but actually
     * distorts our view of the system.
     *
     * To preserve the information without having to read them again and
     * to avoid problems with the location in the channel (seeking might
     * be impossible) we move the buffers from the common state structure
     * into the channel itself. We use the buffers in the channel below
     * the new transformation to hold the data. In the future this allows
     * us to write transformations which pre-read data and push the unused
     * part back when they are going away.
     */

    if (((mask & TCL_READABLE) != 0) &&
	(statePtr->inQueueHead != (ChannelBuffer*) NULL)) {
      /*
       * Remark: It is possible that the channel buffers contain data from
       * some earlier push-backs.
       */

      statePtr->inQueueTail->nextPtr = prevChanPtr->inQueueHead;
      prevChanPtr->inQueueHead       = statePtr->inQueueHead;

      if (prevChanPtr->inQueueTail == (ChannelBuffer*) NULL) {
	prevChanPtr->inQueueTail = statePtr->inQueueTail;
      }

      statePtr->inQueueHead          = (ChannelBuffer*) NULL;
      statePtr->inQueueTail          = (ChannelBuffer*) NULL;
    }

    chanPtr = (Channel *) ckalloc((unsigned) sizeof(Channel));

    /*
     * Save some of the current state into the new structure,
     * reinitialize the parts which will stay with the transformation.
     *
     * Remarks:














     */



    chanPtr->state		= statePtr;














    chanPtr->instanceData	= instanceData;
    chanPtr->typePtr		= typePtr;


    chanPtr->downChanPtr	= prevChanPtr;
    chanPtr->upChanPtr		= (Channel *) NULL;




    chanPtr->inQueueHead        = (ChannelBuffer*) NULL;
    chanPtr->inQueueTail        = (ChannelBuffer*) NULL;









    /*
     * Place new block at the head of a possibly existing list of previously
     * stacked channels.

     */


    prevChanPtr->upChanPtr	= chanPtr;




    statePtr->topChanPtr	= chanPtr;





























































































    return (Tcl_Channel) chanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UnstackChannel --
 *
 *	Unstacks an entry in the hash table for a Tcl_Channel
 *	record. This is the reverse to 'Tcl_StackChannel'.


 *
 * Results:

 *	A standard Tcl result.
 *
 * Side effects:
 *	If TCL_ERROR is returned, the posix error code will be set
 *	with Tcl_SetErrno.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_UnstackChannel (interp, chan)
    Tcl_Interp *interp; /* The interpreter we are working in */
    Tcl_Channel chan;   /* The channel to unstack */
{
    Channel      *chanPtr  = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;
    int result = 0;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (chanPtr->downChanPtr != (Channel *) NULL) {
        /*
	 * Instead of manipulating the per-thread / per-interp list/hashtable
	 * of registered channels we wind down the state of the transformation,
	 * and then restore the state of underlying channel into the old
	 * structure.
	 */
	Channel *downChanPtr = chanPtr->downChanPtr;












	/*

	 * Flush the buffers. This ensures that any data still in them
	 * at this time _is_ handled by the transformation we are unstacking



	 * right now. Restrict this to writable channels. Take care to hide
	 * a possible bg-copy in progress from Tcl_Flush and the
	 * CheckForChannelErrors inside.
	 */

	if (statePtr->flags & TCL_WRITABLE) {

	    CopyState*    csPtr;






	    csPtr           = statePtr->csPtr;


	    statePtr->csPtr = (CopyState*) NULL;

	    if (Tcl_Flush((Tcl_Channel) chanPtr) != TCL_OK) {
	        statePtr->csPtr = csPtr;
		Tcl_AppendResult(interp, "could not flush channel \"",
			Tcl_GetChannelName((Tcl_Channel) chanPtr), "\"",
			(char *) NULL);

		return TCL_ERROR;
	    }




	    statePtr->csPtr = csPtr;



	}















	/*


	 * Anything in the input queue and the push-back buffers of
	 * the transformation going away is transformed data, but not




	 * yet read. As unstacking means that the caller does not want
	 * to see transformed data any more we have to discard these


	 * bytes. To avoid writing an analogue to 'DiscardInputQueued'
	 * we move the information in the push back buffers to the
	 * input queue and then call 'DiscardInputQueued' on that.
	 */

	if (((statePtr->flags & TCL_READABLE)  != 0) &&
	    ((statePtr->inQueueHead != (ChannelBuffer*) NULL) ||
	     (chanPtr->inQueueHead  != (ChannelBuffer*) NULL))) {




	    if ((statePtr->inQueueHead != (ChannelBuffer*) NULL) &&
		(chanPtr->inQueueHead  != (ChannelBuffer*) NULL)) {
	        statePtr->inQueueTail->nextPtr = chanPtr->inQueueHead;
		statePtr->inQueueTail = chanPtr->inQueueTail;
	        statePtr->inQueueHead = statePtr->inQueueTail;





	    } else if (chanPtr->inQueueHead != (ChannelBuffer*) NULL) {




	        statePtr->inQueueHead = chanPtr->inQueueHead;


		statePtr->inQueueTail = chanPtr->inQueueTail;


	    }









	    chanPtr->inQueueHead          = (ChannelBuffer*) NULL;
	    chanPtr->inQueueTail          = (ChannelBuffer*) NULL;



	    DiscardInputQueued (statePtr, 0);
	}



	statePtr->topChanPtr	= downChanPtr;
	downChanPtr->upChanPtr	= (Channel *) NULL;

	/*


	 * Leave this link intact for closeproc
	 *  chanPtr->downChanPtr	= (Channel *) NULL;
	 */

	/*
	 * Close and free the channel driver state.
	 */











	if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) {





	    result = (chanPtr->typePtr->closeProc)(chanPtr->instanceData,
		    interp);

	} else {
	    result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData,
		    interp, 0);

	}



	chanPtr->typePtr	= NULL;
	/*


	 * AK: Tcl_NotifyChannel may hold a reference to this block of memory

	 */
	Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);



	UpdateInterest(downChanPtr);


	if (result != 0) {
	    Tcl_SetErrno(result);
	    return TCL_ERROR;
	}
    } else {
        /*
	 * This channel does not cover another one.
	 * Simply do a close, if necessary.
	 */

        if (statePtr->refCount <= 0) {
            if (Tcl_Close(interp, chan) != TCL_OK) {
                return TCL_ERROR;
            }
	}
    }

    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetStackedChannel --
 *
 *	Determines whether the specified channel is stacked upon another.
 *
 * Results:
 *	NULL if the channel is not stacked upon another one, or a reference
 *	to the channel it is stacked upon. This reference can be used in
 *	queries, but modification is not allowed.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_GetStackedChannel(chan)
    Tcl_Channel chan;
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return (Tcl_Channel) chanPtr->downChanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetTopChannel --
 *
 *	Returns the top channel of a channel stack.
 *
 * Results:
 *	NULL if the channel is not stacked upon another one, or a reference
 *	to the channel it is stacked upon. This reference can be used in
 *	queries, but modification is not allowed.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_Channel
Tcl_GetTopChannel(chan)
    Tcl_Channel chan;
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return (Tcl_Channel) chanPtr->state->topChanPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelInstanceData --
 *
 *	Returns the client data associated with a channel.
 *
 * Results:
 *	The client data.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

ClientData
Tcl_GetChannelInstanceData(chan)
    Tcl_Channel chan;		/* Channel for which to return client data. */
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return chanPtr->instanceData;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelType --
 *
 *	Given a channel structure, returns the channel type structure.
 *
 * Results:
 *	Returns a pointer to the channel type structure.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelType *
Tcl_GetChannelType(chan)
    Tcl_Channel chan;		/* The channel to return type for. */
{
    Channel *chanPtr = (Channel *) chan;	/* The actual channel. */

    return chanPtr->typePtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelMode --
 *
1886
1887
1888
1889
1890
1891
1892

1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
 */

int
Tcl_GetChannelMode(chan)
    Tcl_Channel chan;		/* The channel for which the mode is
                                 * being computed. */
{

    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return (chanPtr->flags & (TCL_READABLE | TCL_WRITABLE));
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelName --
 *







>
|

<
|







1493
1494
1495
1496
1497
1498
1499
1500
1501
1502

1503
1504
1505
1506
1507
1508
1509
1510
 */

int
Tcl_GetChannelMode(chan)
    Tcl_Channel chan;		/* The channel for which the mode is
                                 * being computed. */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of actual channel. */


    return (statePtr->flags & (TCL_READABLE | TCL_WRITABLE));
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelName --
 *
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
 *----------------------------------------------------------------------
 */

char *
Tcl_GetChannelName(chan)
    Tcl_Channel chan;		/* The channel for which to return the name. */
{
    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->channelName;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelType --
 *
 *	Given a channel structure, returns the channel type structure.
 *
 * Results:
 *	Returns a pointer to the channel type structure.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelType *
Tcl_GetChannelType(chan)
    Tcl_Channel chan;		/* The channel to return type for. */
{
    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->typePtr;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelHandle --
 *







|

|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531


























1532
1533
1534
1535
1536
1537
1538
 *----------------------------------------------------------------------
 */

char *
Tcl_GetChannelName(chan)
    Tcl_Channel chan;		/* The channel for which to return the name. */
{
    ChannelState *statePtr;	/* State of actual channel. */

    statePtr = ((Channel *) chan)->state;
    return statePtr->channelName;


























}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelHandle --
 *
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
    int direction;		/* TCL_WRITABLE or TCL_READABLE. */
    ClientData *handlePtr;	/* Where to store handle */
{
    Channel *chanPtr;		/* The actual channel. */
    ClientData handle;
    int result;

    chanPtr = (Channel *) chan;
    result = (chanPtr->typePtr->getHandleProc)(chanPtr->instanceData,
	    direction, &handle);
    if (handlePtr) {
	*handlePtr = handle;
    }
    return result;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelInstanceData --
 *
 *	Returns the client data associated with a channel.
 *
 * Results:
 *	The client data.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

ClientData
Tcl_GetChannelInstanceData(chan)
    Tcl_Channel chan;		/* Channel for which to return client data. */
{
    Channel *chanPtr;		/* The actual channel. */

    chanPtr = (Channel *) chan;
    return chanPtr->instanceData;
}

/*
 *---------------------------------------------------------------------------
 *
 * AllocChannelBuffer --
 *
 *	A channel buffer has BUFFER_PADDING bytes extra at beginning to







|







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568


























1569
1570
1571
1572
1573
1574
1575
    int direction;		/* TCL_WRITABLE or TCL_READABLE. */
    ClientData *handlePtr;	/* Where to store handle */
{
    Channel *chanPtr;		/* The actual channel. */
    ClientData handle;
    int result;

    chanPtr = ((Channel *) chan)->state->bottomChanPtr;
    result = (chanPtr->typePtr->getHandleProc)(chanPtr->instanceData,
	    direction, &handle);
    if (handlePtr) {
	*handlePtr = handle;
    }
    return result;
}



























/*
 *---------------------------------------------------------------------------
 *
 * AllocChannelBuffer --
 *
 *	A channel buffer has BUFFER_PADDING bytes extra at beginning to
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091











2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
 * Side effects:
 *	May free a buffer to the OS.
 *
 *----------------------------------------------------------------------
 */

static void
RecycleBuffer(chanPtr, bufPtr, mustDiscard)
    Channel *chanPtr;		/* Channel for which to recycle buffers. */
    ChannelBuffer *bufPtr;	/* The buffer to recycle. */
    int mustDiscard;		/* If nonzero, free the buffer to the
                                 * OS, always. */
{
    /*
     * Do we have to free the buffer to the OS?
     */

    if (mustDiscard) {
        ckfree((char *) bufPtr);
        return;
    }
    











    /*
     * Only save buffers for the input queue if the channel is readable.
     */
    
    if (chanPtr->flags & TCL_READABLE) {
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueHead = bufPtr;
            chanPtr->inQueueTail = bufPtr;
            goto keepit;
        }
        if (chanPtr->saveInBufPtr == (ChannelBuffer *) NULL) {
            chanPtr->saveInBufPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * Only save buffers for the output queue if the channel is writable.
     */

    if (chanPtr->flags & TCL_WRITABLE) {
        if (chanPtr->curOutPtr == (ChannelBuffer *) NULL) {
            chanPtr->curOutPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * If we reached this code we return the buffer to the OS.
     */

    ckfree((char *) bufPtr);
    return;

keepit:
    bufPtr->nextRemoved = BUFFER_PADDING;
    bufPtr->nextAdded = BUFFER_PADDING;
    bufPtr->nextPtr = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------







|
|












|
>
>
>
>
>
>
>
>
>
>
>




|
|
|
|


|
|








|
|
|











|







1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
 * Side effects:
 *	May free a buffer to the OS.
 *
 *----------------------------------------------------------------------
 */

static void
RecycleBuffer(statePtr, bufPtr, mustDiscard)
    ChannelState *statePtr;	/* ChannelState in which to recycle buffers. */
    ChannelBuffer *bufPtr;	/* The buffer to recycle. */
    int mustDiscard;		/* If nonzero, free the buffer to the
                                 * OS, always. */
{
    /*
     * Do we have to free the buffer to the OS?
     */

    if (mustDiscard) {
        ckfree((char *) bufPtr);
        return;
    }

    /*
     * Only save buffers which are at least as big as the requested
     * buffersize for the channel. This is to honor dynamic changes
     * of the buffersize made by the user.
     */

    if ((bufPtr->bufLength - BUFFER_PADDING) < statePtr->bufSize) {
        ckfree((char *) bufPtr);
        return;
    }

    /*
     * Only save buffers for the input queue if the channel is readable.
     */
    
    if (statePtr->flags & TCL_READABLE) {
        if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
            statePtr->inQueueHead = bufPtr;
            statePtr->inQueueTail = bufPtr;
            goto keepit;
        }
        if (statePtr->saveInBufPtr == (ChannelBuffer *) NULL) {
            statePtr->saveInBufPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * Only save buffers for the output queue if the channel is writable.
     */

    if (statePtr->flags & TCL_WRITABLE) {
        if (statePtr->curOutPtr == (ChannelBuffer *) NULL) {
            statePtr->curOutPtr = bufPtr;
            goto keepit;
        }
    }

    /*
     * If we reached this code we return the buffer to the OS.
     */

    ckfree((char *) bufPtr);
    return;

    keepit:
    bufPtr->nextRemoved = BUFFER_PADDING;
    bufPtr->nextAdded = BUFFER_PADDING;
    bufPtr->nextPtr = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
 * Side effects:
 *	Recycles buffers.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardOutputQueued(chanPtr)
    Channel *chanPtr;		/* The channel for which to discard output. */
{
    ChannelBuffer *bufPtr;
    
    while (chanPtr->outQueueHead != (ChannelBuffer *) NULL) {
        bufPtr = chanPtr->outQueueHead;
        chanPtr->outQueueHead = bufPtr->nextPtr;
        RecycleBuffer(chanPtr, bufPtr, 0);
    }
    chanPtr->outQueueHead = (ChannelBuffer *) NULL;
    chanPtr->outQueueTail = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------
 *
 * CheckForDeadChannel --
 *
 *	This function checks is a given channel is Dead.
 *      (A channel that has been closed but not yet deallocated.)
 *
 * Results:
 *	True (1) if channel is Dead, False (0) if channel is Ok
 *
 * Side effects:
 *      None
 *
 *----------------------------------------------------------------------
 */

static int
CheckForDeadChannel(interp, chanPtr)
    Tcl_Interp *interp;		/* For error reporting (can be NULL) */
    Channel    *chanPtr;	/* The channel to check. */
{
    if (chanPtr->flags & CHANNEL_DEAD) {
        Tcl_SetErrno(EINVAL);
	if (interp) {
	    Tcl_AppendResult(interp,
			     "unable to access channel: invalid channel",
			     (char *) NULL);   
	}
	return 1;
    }
    return 0;
}

/*







|
|



|
|
|
|

|
|




















|

|

|



|
|







1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
 * Side effects:
 *	Recycles buffers.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardOutputQueued(statePtr)
    ChannelState *statePtr;	/* ChannelState for which to discard output. */
{
    ChannelBuffer *bufPtr;
    
    while (statePtr->outQueueHead != (ChannelBuffer *) NULL) {
        bufPtr = statePtr->outQueueHead;
        statePtr->outQueueHead = bufPtr->nextPtr;
        RecycleBuffer(statePtr, bufPtr, 0);
    }
    statePtr->outQueueHead = (ChannelBuffer *) NULL;
    statePtr->outQueueTail = (ChannelBuffer *) NULL;
}

/*
 *----------------------------------------------------------------------
 *
 * CheckForDeadChannel --
 *
 *	This function checks is a given channel is Dead.
 *      (A channel that has been closed but not yet deallocated.)
 *
 * Results:
 *	True (1) if channel is Dead, False (0) if channel is Ok
 *
 * Side effects:
 *      None
 *
 *----------------------------------------------------------------------
 */

static int
CheckForDeadChannel(interp, statePtr)
    Tcl_Interp *interp;		/* For error reporting (can be NULL) */
    ChannelState *statePtr;	/* The channel state to check. */
{
    if (statePtr->flags & CHANNEL_DEAD) {
        Tcl_SetErrno(EINVAL);
	if (interp) {
	    Tcl_AppendResult(interp,
		    "unable to access channel: invalid channel",
		    (char *) NULL);   
	}
	return 1;
    }
    return 0;
}

/*
2219
2220
2221
2222
2223
2224
2225


2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
FlushChannel(interp, chanPtr, calledFromAsyncFlush)
    Tcl_Interp *interp;			/* For error reporting during close. */
    Channel *chanPtr;			/* The channel to flush on. */
    int calledFromAsyncFlush;		/* If nonzero then we are being
                                         * called from an asynchronous
                                         * flush callback. */
{


    ChannelBuffer *bufPtr;		/* Iterates over buffered output
                                         * queue. */
    int toWrite;			/* Amount of output data in current
                                         * buffer available to be written. */
    int written;			/* Amount of output data actually
                                         * written in current round. */
    int errorCode = 0;			/* Stores POSIX error codes from
                                         * channel driver operations. */
    int wroteSome = 0;			/* Set to one if any data was
					 * written to the driver. */

    /*
     * Prevent writing on a dead channel -- a channel that has been closed
     * but not yet deallocated. This can occur if the exit handler for the
     * channel deallocation runs before all channels are deregistered in
     * all interpreters.
     */
    
    if (CheckForDeadChannel(interp,chanPtr)) return -1;
    
    /*
     * Loop over the queued buffers and attempt to flush as
     * much as possible of the queued output to the channel.
     */

    while (1) {

        /*
         * If the queue is empty and there is a ready current buffer, OR if
         * the current buffer is full, then move the current buffer to the
         * queue.
         */
        
        if (((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
                (chanPtr->curOutPtr->nextAdded == chanPtr->curOutPtr->bufLength))
                || ((chanPtr->flags & BUFFER_READY) &&
                        (chanPtr->outQueueHead == (ChannelBuffer *) NULL))) {
            chanPtr->flags &= (~(BUFFER_READY));
            chanPtr->curOutPtr->nextPtr = (ChannelBuffer *) NULL;
            if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
                chanPtr->outQueueHead = chanPtr->curOutPtr;
            } else {
                chanPtr->outQueueTail->nextPtr = chanPtr->curOutPtr;
            }
            chanPtr->outQueueTail = chanPtr->curOutPtr;
            chanPtr->curOutPtr = (ChannelBuffer *) NULL;
        }
        bufPtr = chanPtr->outQueueHead;

        /*
         * If we are not being called from an async flush and an async
         * flush is active, we just return without producing any output.
         */

        if ((!calledFromAsyncFlush) &&
                (chanPtr->flags & BG_FLUSH_SCHEDULED)) {
            return 0;
        }

        /*
         * If the output queue is still empty, break out of the while loop.
         */

        if (bufPtr == (ChannelBuffer *) NULL) {
            break;	/* Out of the "while (1)". */
        }

        /*
         * Produce the output on the channel.
         */
        
        toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
        written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
                (char *) bufPtr->buf + bufPtr->nextRemoved, toWrite,
		&errorCode);
            
	/*
         * If the write failed completely attempt to start the asynchronous
         * flush mechanism and break out of this loop - do not attempt to
         * write any more output at this time.
         */

        if (written < 0) {







>
>


















|













|
|
|
|
|
|
|
|
|

|

|
|

|







|














|




|







1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
FlushChannel(interp, chanPtr, calledFromAsyncFlush)
    Tcl_Interp *interp;			/* For error reporting during close. */
    Channel *chanPtr;			/* The channel to flush on. */
    int calledFromAsyncFlush;		/* If nonzero then we are being
                                         * called from an asynchronous
                                         * flush callback. */
{
    ChannelState *statePtr = chanPtr->state;
					/* State of the channel stack. */
    ChannelBuffer *bufPtr;		/* Iterates over buffered output
                                         * queue. */
    int toWrite;			/* Amount of output data in current
                                         * buffer available to be written. */
    int written;			/* Amount of output data actually
                                         * written in current round. */
    int errorCode = 0;			/* Stores POSIX error codes from
                                         * channel driver operations. */
    int wroteSome = 0;			/* Set to one if any data was
					 * written to the driver. */

    /*
     * Prevent writing on a dead channel -- a channel that has been closed
     * but not yet deallocated. This can occur if the exit handler for the
     * channel deallocation runs before all channels are deregistered in
     * all interpreters.
     */
    
    if (CheckForDeadChannel(interp, statePtr)) return -1;
    
    /*
     * Loop over the queued buffers and attempt to flush as
     * much as possible of the queued output to the channel.
     */

    while (1) {

        /*
         * If the queue is empty and there is a ready current buffer, OR if
         * the current buffer is full, then move the current buffer to the
         * queue.
         */

        if (((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
                (statePtr->curOutPtr->nextAdded == statePtr->curOutPtr->bufLength))
                || ((statePtr->flags & BUFFER_READY) &&
                        (statePtr->outQueueHead == (ChannelBuffer *) NULL))) {
            statePtr->flags &= (~(BUFFER_READY));
            statePtr->curOutPtr->nextPtr = (ChannelBuffer *) NULL;
            if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
                statePtr->outQueueHead = statePtr->curOutPtr;
            } else {
                statePtr->outQueueTail->nextPtr = statePtr->curOutPtr;
            }
            statePtr->outQueueTail = statePtr->curOutPtr;
            statePtr->curOutPtr = (ChannelBuffer *) NULL;
        }
        bufPtr = statePtr->outQueueHead;

        /*
         * If we are not being called from an async flush and an async
         * flush is active, we just return without producing any output.
         */

        if ((!calledFromAsyncFlush) &&
                (statePtr->flags & BG_FLUSH_SCHEDULED)) {
            return 0;
        }

        /*
         * If the output queue is still empty, break out of the while loop.
         */

        if (bufPtr == (ChannelBuffer *) NULL) {
            break;	/* Out of the "while (1)". */
        }

        /*
         * Produce the output on the channel.
         */

        toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
        written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
                (char *) bufPtr->buf + bufPtr->nextRemoved, toWrite,
		&errorCode);

	/*
         * If the write failed completely attempt to start the asynchronous
         * flush mechanism and break out of this loop - do not attempt to
         * write any more output at this time.
         */

        if (written < 0) {
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421







2422
2423
2424
2425
2426

2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441

2442
2443
2444
2445
2446

2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524







2525
2526

2527

2528
2529
2530

2531
2532

2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593


















2594
2595

2596
2597
2598
2599
2600
2601
2602
            if ((errorCode == EWOULDBLOCK) || (errorCode == EAGAIN)) {
		/*
		 * This used to check for CHANNEL_NONBLOCKING, and panic
		 * if the channel was blocking.  However, it appears
		 * that setting stdin to -blocking 0 has some effect on
		 * the stdout when it's a tty channel (dup'ed underneath)
		 */
		if (!(chanPtr->flags & BG_FLUSH_SCHEDULED)) {
		    chanPtr->flags |= BG_FLUSH_SCHEDULED;
		    UpdateInterest(chanPtr);
		}
		errorCode = 0;
		break;
            }

            /*
             * Decide whether to report the error upwards or defer it.
             */

            if (calledFromAsyncFlush) {
                if (chanPtr->unreportedError == 0) {
                    chanPtr->unreportedError = errorCode;
                }
            } else {
                Tcl_SetErrno(errorCode);
		if (interp != NULL) {
		    Tcl_SetResult(interp,
			    Tcl_PosixError(interp), TCL_VOLATILE);
		}
            }

            /*
             * When we get an error we throw away all the output
             * currently queued.
             */

            DiscardOutputQueued(chanPtr);
            continue;
        } else {
	    wroteSome = 1;
	}

        bufPtr->nextRemoved += written;

        /*
         * If this buffer is now empty, recycle it.
         */

        if (bufPtr->nextRemoved == bufPtr->nextAdded) {
            chanPtr->outQueueHead = bufPtr->nextPtr;
            if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
                chanPtr->outQueueTail = (ChannelBuffer *) NULL;
            }
            RecycleBuffer(chanPtr, bufPtr, 0);
        }
    }	/* Closes "while (1)". */

    /*
     * If we wrote some data while flushing in the background, we are done.
     * We can't finish the background flush until we run out of data and
     * the channel becomes writable again.  This ensures that all of the
     * pending data has been flushed at the system level.
     */

    if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
	if (wroteSome) {
	    return errorCode;
	} else if (chanPtr->outQueueHead == (ChannelBuffer *) NULL) {
	    chanPtr->flags &= (~(BG_FLUSH_SCHEDULED));
	    (chanPtr->typePtr->watchProc)(chanPtr->instanceData,
		    chanPtr->interestMask);
	}
    }

    /*
     * If the channel is flagged as closed, delete it when the refCount
     * drops to zero, the output queue is empty and there is no output
     * in the current output buffer.
     */

    if ((chanPtr->flags & CHANNEL_CLOSED) && (chanPtr->refCount <= 0) &&
            (chanPtr->outQueueHead == (ChannelBuffer *) NULL) &&
            ((chanPtr->curOutPtr == (ChannelBuffer *) NULL) ||
                    (chanPtr->curOutPtr->nextAdded ==
                            chanPtr->curOutPtr->nextRemoved))) {
        return CloseChannel(interp, chanPtr, errorCode);
    }
    return errorCode;
}

/*
 *----------------------------------------------------------------------
 *
 * CloseChannel --
 *
 *	Utility procedure to close a channel and free its associated
 *	resources.
 *







 * Results:
 *	0 on success or a POSIX error code if the operation failed.
 *
 * Side effects:
 *	May close the actual channel; may free memory.

 *
 *----------------------------------------------------------------------
 */

static int
CloseChannel(interp, chanPtr, errorCode)
    Tcl_Interp *interp;			/* For error reporting. */
    Channel *chanPtr;			/* The channel to close. */
    int errorCode;			/* Status of operation so far. */
{
    int result = 0;			/* Of calling driver close
                                         * operation. */
    Channel *prevChanPtr;		/* Preceding channel in list of
                                         * all channels - used to splice a
                                         * channel out of the list on close. */

    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (chanPtr == NULL) {
        return result;
    }

    
    /*
     * No more input can be consumed so discard any leftover input.
     */

    DiscardInputQueued(chanPtr, 1);

    /*
     * Discard a leftover buffer in the current output buffer field.
     */

    if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
        ckfree((char *) chanPtr->curOutPtr);
        chanPtr->curOutPtr = (ChannelBuffer *) NULL;
    }
    
    /*
     * The caller guarantees that there are no more buffers
     * queued for output.
     */

    if (chanPtr->outQueueHead != (ChannelBuffer *) NULL) {
        panic("TclFlush, closed channel: queued output left");
    }

    /*
     * If the EOF character is set in the channel, append that to the
     * output device.
     */

    if ((chanPtr->outEofChar != 0) && (chanPtr->flags & TCL_WRITABLE)) {
        int dummy;
        char c;

        c = (char) chanPtr->outEofChar;
        (chanPtr->typePtr->outputProc) (chanPtr->instanceData, &c, 1, &dummy);
    }

    /*
     * Remove TCL_READABLE and TCL_WRITABLE from chanPtr->flags, so
     * that close callbacks can not do input or output (assuming they
     * squirreled the channel away in their clientData). This also
     * prevents infinite loops if the callback calls any C API that
     * could call FlushChannel.
     */

    chanPtr->flags &= (~(TCL_READABLE|TCL_WRITABLE));
        
    /*
     * Splice this channel out of the list of all channels.
     */

    if (chanPtr == tsdPtr->firstChanPtr) {
        tsdPtr->firstChanPtr = chanPtr->nextChanPtr;
    } else {
        for (prevChanPtr = tsdPtr->firstChanPtr;
                 (prevChanPtr != (Channel *) NULL) &&
                     (prevChanPtr->nextChanPtr != chanPtr);
                 prevChanPtr = prevChanPtr->nextChanPtr) {
            /* Empty loop body. */
        }
        if (prevChanPtr == (Channel *) NULL) {
            panic("FlushChannel: damaged channel list");
        }
        prevChanPtr->nextChanPtr = chanPtr->nextChanPtr;
    }

    /*
     * Close and free the channel driver state.
     */
            
    if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->closeProc)(chanPtr->instanceData, interp);
    } else {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		0);
    }
    







    if (chanPtr->channelName != (char *) NULL) {
        ckfree(chanPtr->channelName);

    }

    Tcl_FreeEncoding(chanPtr->encoding);
    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);

    }
    

    /*
     * If we are being called synchronously, report either
     * any latent error on the channel or the current error.
     */
        
    if (chanPtr->unreportedError != 0) {
        errorCode = chanPtr->unreportedError;
    }
    if (errorCode == 0) {
        errorCode = result;
        if (errorCode != 0) {
            Tcl_SetErrno(errorCode);
        }
    }

    /* Andreas Kupries <a.kupries@westend.com>, 12/13/1998
     * "Trf-Patch for filtering channels"
     *
     * This is the change to 'CloseChannel'.
     *
     * Explanation
     *		Closing a filtering channel closes the one it
     *		superceded too. This basically ripples through
     *		the whole chain of filters until it reaches
     *		the underlying normal channel.
     *
     *		This is done by reintegrating the superceded
     *		channel into the (thread) global list of open
     *		channels and then invoking a regular close.
     *		There is no need to handle the complexities of
     *		this process by ourselves.
     *
     *		*Note*
     *		This has to be done after the call to the
     *		'closeProc' of the filtering channel to allow
     *		that one to flush internal buffers into
     *		the underlying channel.
     */

    if (chanPtr->supercedes != (Channel*) NULL) {
	/*
	 * Insert the channel we were stacked upon back into
	 * the list of open channels, then do a regular close.
	 */

	chanPtr->supercedes->nextChanPtr = tsdPtr->firstChanPtr;
	tsdPtr->firstChanPtr             = chanPtr->supercedes;
	chanPtr->supercedes->refCount --; /* is deregistered */
	Tcl_Close (interp, (Tcl_Channel) chanPtr->supercedes);
    }

    /*
     * Cancel any outstanding timer.
     */

    Tcl_DeleteTimerHandler(chanPtr->timer);

    /*
     * Mark the channel as deleted by clearing the type structure.
     */



















    chanPtr->typePtr = NULL;


    Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);

    return errorCode;
}

/*
 *----------------------------------------------------------------------







|
|











|
|














|












|
|
|

|










|


|
|

|









|
|
|
|
|
|









|
<

>
>
>
>
>
>
>

|



>












|
|

>





>
|




|





|
|
|







|








|



|




<
<
<
<
<
<
<
<
<
<



|
|

|
<
|
|


|


|





|






|
>
>
>
>
>
>
>
|
|
>
|
>
|
|
|
>
|
|
>




|
|
|








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<



|





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>







1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987

1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062










2063
2064
2065
2066
2067
2068
2069

2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124

























2125











2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
            if ((errorCode == EWOULDBLOCK) || (errorCode == EAGAIN)) {
		/*
		 * This used to check for CHANNEL_NONBLOCKING, and panic
		 * if the channel was blocking.  However, it appears
		 * that setting stdin to -blocking 0 has some effect on
		 * the stdout when it's a tty channel (dup'ed underneath)
		 */
		if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) {
		    statePtr->flags |= BG_FLUSH_SCHEDULED;
		    UpdateInterest(chanPtr);
		}
		errorCode = 0;
		break;
            }

            /*
             * Decide whether to report the error upwards or defer it.
             */

            if (calledFromAsyncFlush) {
                if (statePtr->unreportedError == 0) {
                    statePtr->unreportedError = errorCode;
                }
            } else {
                Tcl_SetErrno(errorCode);
		if (interp != NULL) {
		    Tcl_SetResult(interp,
			    Tcl_PosixError(interp), TCL_VOLATILE);
		}
            }

            /*
             * When we get an error we throw away all the output
             * currently queued.
             */

            DiscardOutputQueued(statePtr);
            continue;
        } else {
	    wroteSome = 1;
	}

        bufPtr->nextRemoved += written;

        /*
         * If this buffer is now empty, recycle it.
         */

        if (bufPtr->nextRemoved == bufPtr->nextAdded) {
            statePtr->outQueueHead = bufPtr->nextPtr;
            if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
                statePtr->outQueueTail = (ChannelBuffer *) NULL;
            }
            RecycleBuffer(statePtr, bufPtr, 0);
        }
    }	/* Closes "while (1)". */

    /*
     * If we wrote some data while flushing in the background, we are done.
     * We can't finish the background flush until we run out of data and
     * the channel becomes writable again.  This ensures that all of the
     * pending data has been flushed at the system level.
     */

    if (statePtr->flags & BG_FLUSH_SCHEDULED) {
	if (wroteSome) {
	    return errorCode;
	} else if (statePtr->outQueueHead == (ChannelBuffer *) NULL) {
	    statePtr->flags &= (~(BG_FLUSH_SCHEDULED));
	    (chanPtr->typePtr->watchProc)(chanPtr->instanceData,
		    statePtr->interestMask);
	}
    }

    /*
     * If the channel is flagged as closed, delete it when the refCount
     * drops to zero, the output queue is empty and there is no output
     * in the current output buffer.
     */

    if ((statePtr->flags & CHANNEL_CLOSED) && (statePtr->refCount <= 0) &&
            (statePtr->outQueueHead == (ChannelBuffer *) NULL) &&
            ((statePtr->curOutPtr == (ChannelBuffer *) NULL) ||
                    (statePtr->curOutPtr->nextAdded ==
                            statePtr->curOutPtr->nextRemoved))) {
	return CloseChannel(interp, chanPtr, errorCode);
    }
    return errorCode;
}

/*
 *----------------------------------------------------------------------
 *
 * CloseChannel --
 *
 *	Utility procedure to close a channel and free associated resources.

 *
 *	If the channel was stacked, then the it will copy the necessary
 *	elements of the NEXT channel into the TOP channel, in essence
 *	unstacking the channel.  The NEXT channel will then be freed.
 *
 *	If the channel was not stacked, then we will free all the bits
 *	for the TOP channel, including the data structure itself.
 *
 * Results:
 *	1 if the channel was stacked, 0 otherwise.
 *
 * Side effects:
 *	May close the actual channel; may free memory.
 *	May change the value of errno.
 *
 *----------------------------------------------------------------------
 */

static int
CloseChannel(interp, chanPtr, errorCode)
    Tcl_Interp *interp;			/* For error reporting. */
    Channel *chanPtr;			/* The channel to close. */
    int errorCode;			/* Status of operation so far. */
{
    int result = 0;			/* Of calling driver close
                                         * operation. */
    ChannelState *prevCSPtr;		/* Preceding channel state in list of
                                         * all states - used to splice a
                                         * channel out of the list on close. */
    ChannelState *statePtr;		/* state of the channel stack. */
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    if (chanPtr == NULL) {
        return result;
    }
    statePtr = chanPtr->state;

    /*
     * No more input can be consumed so discard any leftover input.
     */

    DiscardInputQueued(statePtr, 1);

    /*
     * Discard a leftover buffer in the current output buffer field.
     */

    if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
        ckfree((char *) statePtr->curOutPtr);
        statePtr->curOutPtr = (ChannelBuffer *) NULL;
    }
    
    /*
     * The caller guarantees that there are no more buffers
     * queued for output.
     */

    if (statePtr->outQueueHead != (ChannelBuffer *) NULL) {
        panic("TclFlush, closed channel: queued output left");
    }

    /*
     * If the EOF character is set in the channel, append that to the
     * output device.
     */

    if ((statePtr->outEofChar != 0) && (statePtr->flags & TCL_WRITABLE)) {
        int dummy;
        char c;

        c = (char) statePtr->outEofChar;
        (chanPtr->typePtr->outputProc) (chanPtr->instanceData, &c, 1, &dummy);
    }

    /*










     * Splice this channel out of the list of all channels.
     */

    if (tsdPtr->firstCSPtr && (statePtr == tsdPtr->firstCSPtr)) {
        tsdPtr->firstCSPtr = statePtr->nextCSPtr;
    } else {
        for (prevCSPtr = tsdPtr->firstCSPtr;

	     prevCSPtr && (prevCSPtr->nextCSPtr != statePtr);
	     prevCSPtr = prevCSPtr->nextCSPtr) {
            /* Empty loop body. */
        }
        if (prevCSPtr == (ChannelState *) NULL) {
            panic("FlushChannel: damaged channel list");
        }
        prevCSPtr->nextCSPtr = statePtr->nextCSPtr;
    }

    /*
     * Close and free the channel driver state.
     */

    if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->closeProc)(chanPtr->instanceData, interp);
    } else {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		0);
    }

    /*
     * Some resources can be cleared only if the bottom channel
     * in a stack is closed. All the other channels in the stack
     * are not allowed to remove.
     */

    if (chanPtr == statePtr->bottomChanPtr) {
	if (statePtr->channelName != (char *) NULL) {
	    ckfree(statePtr->channelName);
	    statePtr->channelName = NULL;
	}

	Tcl_FreeEncoding(statePtr->encoding);
	if (statePtr->outputStage != NULL) {
	    ckfree((char *) statePtr->outputStage);
	    statePtr->outputStage = (char *) NULL;
	}
    }

    /*
     * If we are being called synchronously, report either
     * any latent error on the channel or the current error.
     */

    if (statePtr->unreportedError != 0) {
        errorCode = statePtr->unreportedError;
    }
    if (errorCode == 0) {
        errorCode = result;
        if (errorCode != 0) {
            Tcl_SetErrno(errorCode);
        }
    }


























    /*











     * Cancel any outstanding timer.
     */

    Tcl_DeleteTimerHandler(statePtr->timer);

    /*
     * Mark the channel as deleted by clearing the type structure.
     */

    if (chanPtr->downChanPtr != (Channel *) NULL) {
	Channel *downChanPtr = chanPtr->downChanPtr;

	statePtr->nextCSPtr	= tsdPtr->firstCSPtr;
	tsdPtr->firstCSPtr	= statePtr;

	statePtr->topChanPtr	= downChanPtr;
	downChanPtr->upChanPtr	= (Channel *) NULL;
	chanPtr->typePtr	= NULL;

	Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);
	return Tcl_Close(interp, (Tcl_Channel) downChanPtr);
    }

    /*
     * There is only the TOP Channel, so we free the remaining
     * pointers we have and then ourselves.
     */
    chanPtr->typePtr = NULL;

    Tcl_EventuallyFree((ClientData) statePtr, TCL_DYNAMIC);
    Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC);

    return errorCode;
}

/*
 *----------------------------------------------------------------------
2629
2630
2631
2632
2633
2634
2635

2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653




2654



2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
                                         * interpreter. */
{
    ChannelHandler *chPtr, *chNext;	/* Iterate over channel handlers. */
    CloseCallback *cbPtr;		/* Iterate over close callbacks
                                         * for this channel. */
    EventScriptRecord *ePtr, *eNextPtr;	/* Iterate over eventscript records. */
    Channel *chanPtr;			/* The real IO channel. */

    int result;				/* Of calling FlushChannel. */
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler *nhPtr;

    if (chan == (Tcl_Channel) NULL) {
        return TCL_OK;
    }
    
    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);





    chanPtr = (Channel *) chan;



    if (chanPtr->refCount > 0) {
        panic("called Tcl_Close on channel with refCount > 0");
    }

    /*
     * Remove any references to channel handlers for this channel that
     * may be about to be invoked.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
             nhPtr != (NextChannelHandler *) NULL;
             nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr &&
		(nhPtr->nextHandlerPtr->chanPtr == chanPtr)) {
	    nhPtr->nextHandlerPtr = NULL;
        }
    }

    /*
     * Remove all the channel handler records attached to the channel
     * itself.
     */
        
    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chNext) {
        chNext = chPtr->nextPtr;
        ckfree((char *) chPtr);
    }
    chanPtr->chPtr = (ChannelHandler *) NULL;
    
    
    /*
     * Cancel any pending copy operation.
     */

    StopCopy(chanPtr->csPtr);

    /*
     * Must set the interest mask now to 0, otherwise infinite loops
     * will occur if Tcl_DoOneEvent is called before the channel is
     * finally deleted in FlushChannel. This can happen if the channel
     * has a background flush active.
     */
        
    chanPtr->interestMask = 0;
    
    /*
     * Remove any EventScript records for this channel.
     */

    for (ePtr = chanPtr->scriptRecordPtr;
             ePtr != (EventScriptRecord *) NULL;
             ePtr = eNextPtr) {
        eNextPtr = ePtr->nextPtr;
	Tcl_DecrRefCount(ePtr->scriptPtr);
        ckfree((char *) ePtr);
    }
    chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        
    /*
     * Invoke the registered close callbacks and delete their records.
     */

    while (chanPtr->closeCbPtr != (CloseCallback *) NULL) {
        cbPtr = chanPtr->closeCbPtr;
        chanPtr->closeCbPtr = cbPtr->nextPtr;
        (cbPtr->proc) (cbPtr->clientData);
        ckfree((char *) cbPtr);
    }

    /*
     * Ensure that the last output buffer will be flushed.
     */
    
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
    }

    /*
     * If this channel supports it, close the read side, since we don't need it
     * anymore and this will help avoid deadlocks on some channel types.
     */

    if (chanPtr->typePtr->closeProc == TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		TCL_CLOSE_READ);
    } else {
	result = 0;
    }

    /*
     * The call to FlushChannel will flush any queued output and invoke
     * the close function of the channel driver, or it will set up the
     * channel to be flushed and closed asynchronously.
     */

    chanPtr->flags |= CHANNEL_CLOSED;
    if ((FlushChannel(interp, chanPtr, 0) != 0) || (result != 0)) {
        return TCL_ERROR;
    }
    return TCL_OK;
}

/*







>







|










>
>
>
>
|
>
>
>
|









|
|










|
|
|
|



|
|
<




|








|





|
|
|




|





|
|
|








|
|
|




















|







2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253

2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
                                         * interpreter. */
{
    ChannelHandler *chPtr, *chNext;	/* Iterate over channel handlers. */
    CloseCallback *cbPtr;		/* Iterate over close callbacks
                                         * for this channel. */
    EventScriptRecord *ePtr, *eNextPtr;	/* Iterate over eventscript records. */
    Channel *chanPtr;			/* The real IO channel. */
    ChannelState *statePtr;		/* State of real IO channel. */
    int result;				/* Of calling FlushChannel. */
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler *nhPtr;

    if (chan == (Tcl_Channel) NULL) {
        return TCL_OK;
    }

    /*
     * Perform special handling for standard channels being closed. If the
     * refCount is now 1 it means that the last reference to the standard
     * channel is being explicitly closed, so bump the refCount down
     * artificially to 0. This will ensure that the channel is actually
     * closed, below. Also set the static pointer to NULL for the channel.
     */

    CheckForStdChannelsBeingClosed(chan);

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr	= (Channel *) chan;
    statePtr	= chanPtr->state;
    chanPtr	= statePtr->topChanPtr;

    if (statePtr->refCount > 0) {
        panic("called Tcl_Close on channel with refCount > 0");
    }

    /*
     * Remove any references to channel handlers for this channel that
     * may be about to be invoked.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
	 nhPtr != (NextChannelHandler *) NULL;
	 nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr &&
		(nhPtr->nextHandlerPtr->chanPtr == chanPtr)) {
	    nhPtr->nextHandlerPtr = NULL;
        }
    }

    /*
     * Remove all the channel handler records attached to the channel
     * itself.
     */

    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chNext) {
        chNext = chPtr->nextPtr;
        ckfree((char *) chPtr);
    }
    statePtr->chPtr = (ChannelHandler *) NULL;


    /*
     * Cancel any pending copy operation.
     */

    StopCopy(statePtr->csPtr);

    /*
     * Must set the interest mask now to 0, otherwise infinite loops
     * will occur if Tcl_DoOneEvent is called before the channel is
     * finally deleted in FlushChannel. This can happen if the channel
     * has a background flush active.
     */
        
    statePtr->interestMask = 0;
    
    /*
     * Remove any EventScript records for this channel.
     */

    for (ePtr = statePtr->scriptRecordPtr;
	 ePtr != (EventScriptRecord *) NULL;
	 ePtr = eNextPtr) {
        eNextPtr = ePtr->nextPtr;
	Tcl_DecrRefCount(ePtr->scriptPtr);
        ckfree((char *) ePtr);
    }
    statePtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        
    /*
     * Invoke the registered close callbacks and delete their records.
     */

    while (statePtr->closeCbPtr != (CloseCallback *) NULL) {
        cbPtr = statePtr->closeCbPtr;
        statePtr->closeCbPtr = cbPtr->nextPtr;
        (cbPtr->proc) (cbPtr->clientData);
        ckfree((char *) cbPtr);
    }

    /*
     * Ensure that the last output buffer will be flushed.
     */
    
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
    }

    /*
     * If this channel supports it, close the read side, since we don't need it
     * anymore and this will help avoid deadlocks on some channel types.
     */

    if (chanPtr->typePtr->closeProc == TCL_CLOSE2PROC) {
	result = (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, interp,
		TCL_CLOSE_READ);
    } else {
	result = 0;
    }

    /*
     * The call to FlushChannel will flush any queued output and invoke
     * the close function of the channel driver, or it will set up the
     * channel to be flushed and closed asynchronously.
     */

    statePtr->flags |= CHANNEL_CLOSED;
    if ((FlushChannel(interp, chanPtr, 0) != 0) || (result != 0)) {
        return TCL_ERROR;
    }
    return TCL_OK;
}

/*
2781
2782
2783
2784
2785
2786
2787



2788

2789
2790


2791
2792
2793

2794
2795
2796
2797
2798























































2799
2800
2801
2802
2803
2804
2805
int
Tcl_Write(chan, src, srcLen)
    Tcl_Channel chan;			/* The channel to buffer output for. */
    char *src;				/* Data to queue in output buffer. */
    int srcLen;				/* Length of data in bytes, or < 0 for
					 * strlen(). */
{



    Channel *chanPtr;


    chanPtr = (Channel *) chan;


    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    if (srcLen < 0) {
        srcLen = strlen(src);
    }
    return DoWrite(chanPtr, src, srcLen);
}
























































/*
 *---------------------------------------------------------------------------
 *
 * Tcl_WriteChars --
 *
 *	Takes a sequence of UTF-8 characters and converts them for output







>
>
>

>

|
>
>
|


>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
int
Tcl_Write(chan, src, srcLen)
    Tcl_Channel chan;			/* The channel to buffer output for. */
    char *src;				/* Data to queue in output buffer. */
    int srcLen;				/* Length of data in bytes, or < 0 for
					 * strlen(). */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */

    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    if (srcLen < 0) {
        srcLen = strlen(src);
    }
    return DoWrite(chanPtr, src, srcLen);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_WriteRaw --
 *
 *	Puts a sequence of bytes into an output buffer, may queue the
 *	buffer for output if it gets full, and also remembers whether the
 *	current buffer is ready e.g. if it contains a newline and we are in
 *	line buffering mode.
 *
 * Results:
 *	The number of bytes written or -1 in case of error. If -1,
 *	Tcl_GetErrno will return the error code.
 *
 * Side effects:
 *	May buffer up output and may cause output to be produced on the
 *	channel.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_WriteRaw(chan, src, srcLen)
    Tcl_Channel chan;			/* The channel to buffer output for. */
    char *src;				/* Data to queue in output buffer. */
    int srcLen;				/* Length of data in bytes, or < 0 for
					 * strlen(). */
{
    Channel *chanPtr = ((Channel *) chan);
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int errorCode, written;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE | CHANNEL_RAW_MODE) != 0) {
	return -1;
    }

    if (srcLen < 0) {
        srcLen = strlen(src);
    }

    /*
     * Go immediately to the driver, do all the error handling by ourselves.
     * The code was stolen from 'FlushChannel'.
     */

    written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
	    src, srcLen, &errorCode);

    if (written < 0) {
	Tcl_SetErrno(errorCode);
    }

    return written;
}

/*
 *---------------------------------------------------------------------------
 *
 * Tcl_WriteChars --
 *
 *	Takes a sequence of UTF-8 characters and converts them for output
2822
2823
2824
2825
2826
2827
2828



2829

2830
2831


2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
int
Tcl_WriteChars(chan, src, len)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 characters to queue in output buffer. */
    int len;			/* Length of string in bytes, or < 0 for 
				 * strlen(). */
{



    Channel *chanPtr;


    chanPtr = (Channel *) chan;


    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (len < 0) {
        len = strlen(src);
    }
    if (chanPtr->encoding == NULL) {
	/*
	 * Inefficient way to convert UTF-8 to byte-array, but the  
	 * code parallels the way it is done for objects.
	 */

	Tcl_Obj *objPtr;
	int result;







>
>
>

>

|
>
>
|





|







2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
int
Tcl_WriteChars(chan, src, len)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 characters to queue in output buffer. */
    int len;			/* Length of string in bytes, or < 0 for 
				 * strlen(). */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */

    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (len < 0) {
        len = strlen(src);
    }
    if (statePtr->encoding == NULL) {
	/*
	 * Inefficient way to convert UTF-8 to byte-array, but the  
	 * code parallels the way it is done for objects.
	 */

	Tcl_Obj *objPtr;
	int result;
2879
2880
2881
2882
2883
2884
2885



2886

2887
2888
2889
2890


2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
 */

int
Tcl_WriteObj(chan, objPtr)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    Tcl_Obj *objPtr;		/* The object to write. */
{



    Channel *chanPtr;

    char *src;
    int srcLen;

    chanPtr = (Channel *) chan;


    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (chanPtr->encoding == NULL) {
	src = (char *) Tcl_GetByteArrayFromObj(objPtr, &srcLen);
	return WriteBytes(chanPtr, src, srcLen);
    } else {
	src = Tcl_GetStringFromObj(objPtr, &srcLen);
	return WriteChars(chanPtr, src, srcLen);
    }
}







>
>
>

>



|
>
>
|


|







2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
 */

int
Tcl_WriteObj(chan, objPtr)
    Tcl_Channel chan;		/* The channel to buffer output for. */
    Tcl_Obj *objPtr;		/* The object to write. */
{
    /*
     * Always use the topmost channel of the stack
     */
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */
    char *src;
    int srcLen;

    statePtr = ((Channel *) chan)->state;
    chanPtr  = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }
    if (statePtr->encoding == NULL) {
	src = (char *) Tcl_GetByteArrayFromObj(objPtr, &srcLen);
	return WriteBytes(chanPtr, src, srcLen);
    } else {
	src = Tcl_GetStringFromObj(objPtr, &srcLen);
	return WriteChars(chanPtr, src, srcLen);
    }
}
2923
2924
2925
2926
2927
2928
2929

2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954

static int
WriteBytes(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* Bytes to write. */
    int srcLen;			/* Number of bytes to write. */
{

    ChannelBuffer *bufPtr;
    char *dst;
    int dstLen, dstMax, sawLF, savedLF, total, toWrite;
    
    total = 0;
    sawLF = 0;
    savedLF = 0;

    /*
     * Loop over all bytes in src, storing them in output buffer with
     * proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	bufPtr = chanPtr->curOutPtr;
	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(chanPtr->bufSize);
	    chanPtr->curOutPtr	= bufPtr;
	}
	dst = bufPtr->buf + bufPtr->nextAdded;
	dstMax = bufPtr->bufLength - bufPtr->nextAdded;
	dstLen = dstMax;

	toWrite = dstLen;
	if (toWrite > srcLen) {







>














|

|
|







2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596

static int
WriteBytes(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* Bytes to write. */
    int srcLen;			/* Number of bytes to write. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *dst;
    int dstLen, dstMax, sawLF, savedLF, total, toWrite;
    
    total = 0;
    sawLF = 0;
    savedLF = 0;

    /*
     * Loop over all bytes in src, storing them in output buffer with
     * proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	bufPtr = statePtr->curOutPtr;
	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(statePtr->bufSize);
	    statePtr->curOutPtr	= bufPtr;
	}
	dst = bufPtr->buf + bufPtr->nextAdded;
	dstMax = bufPtr->bufLength - bufPtr->nextAdded;
	dstLen = dstMax;

	toWrite = dstLen;
	if (toWrite > srcLen) {
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
	     * line-based, we will need to flush it.
	     */

	    *dst++ = '\n';
	    dstLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(chanPtr, dst, src, &dstLen, &toWrite);
	dstLen += savedLF;
	savedLF = 0;

	if (dstLen > dstMax) {
	    savedLF = 1;
	    dstLen = dstMax;
	}







|







2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
	     * line-based, we will need to flush it.
	     */

	    *dst++ = '\n';
	    dstLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(statePtr, dst, src, &dstLen, &toWrite);
	dstLen += savedLF;
	savedLF = 0;

	if (dstLen > dstMax) {
	    savedLF = 1;
	    dstLen = dstMax;
	}
3010
3011
3012
3013
3014
3015
3016

3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111

static int
WriteChars(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 string to write. */
    int srcLen;			/* Length of UTF-8 string in bytes. */
{

    ChannelBuffer *bufPtr;
    char *dst, *stage;
    int saved, savedLF, sawLF, total, toWrite, flags;
    int dstWrote, dstLen, stageLen, stageMax, stageRead;
    Tcl_Encoding encoding;
    char safe[BUFFER_PADDING];
    
    total = 0;
    sawLF = 0;
    savedLF = 0;
    saved = 0;
    encoding = chanPtr->encoding;

    /*
     * Loop over all UTF-8 characters in src, storing them in staging buffer
     * with proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	stage = chanPtr->outputStage;
	stageMax = chanPtr->bufSize;
	stageLen = stageMax;

	toWrite = stageLen;
	if (toWrite > srcLen) {
	    toWrite = srcLen;
	}

	if (savedLF) {
	    /*
	     * A '\n' was left over from last call to TranslateOutputEOL()
	     * and we need to store it in the staging buffer.  If the
	     * channel is line-based, we will need to flush the output
	     * buffer (after translating the staging buffer).
	     */
	    
	    *stage++ = '\n';
	    stageLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(chanPtr, stage, src, &stageLen, &toWrite);

	stage -= savedLF;
	stageLen += savedLF;
	savedLF = 0;

	if (stageLen > stageMax) {
	    savedLF = 1;
	    stageLen = stageMax;
	}
	src += toWrite;
	srcLen -= toWrite;

	flags = chanPtr->outputEncodingFlags;
	if (srcLen == 0) {
	    flags |= TCL_ENCODING_END;
	}

	/*
	 * Loop over all UTF-8 characters in staging buffer, converting them
	 * to external encoding, storing them in output buffer.
	 */

	while (stageLen + saved > 0) {
	    bufPtr = chanPtr->curOutPtr;
	    if (bufPtr == NULL) {
		bufPtr = AllocChannelBuffer(chanPtr->bufSize);
		chanPtr->curOutPtr = bufPtr;
	    }
	    dst = bufPtr->buf + bufPtr->nextAdded;
	    dstLen = bufPtr->bufLength - bufPtr->nextAdded;

	    if (saved != 0) {
		/*
		 * Here's some translated bytes left over from the last
		 * buffer that we need to stick at the beginning of this
		 * buffer.
		 */
		 
		memcpy((VOID *) dst, (VOID *) safe, (size_t) saved);
		bufPtr->nextAdded += saved;
		dst += saved;
		dstLen -= saved;
		saved = 0;
	    }

	    Tcl_UtfToExternal(NULL, encoding, stage, stageLen, flags,
		    &chanPtr->outputEncodingState, dst,
		    dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);
	    if (stageRead + dstWrote == 0) {
		/*
		 * We have an incomplete UTF-8 character at the end of the
		 * staging buffer.  It will get moved to the beginning of the
		 * staging buffer followed by more bytes from src.
		 */







>











|







|
|



















|












|










|

|
|



















|







2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754

static int
WriteChars(chanPtr, src, srcLen)
    Channel *chanPtr;		/* The channel to buffer output for. */
    CONST char *src;		/* UTF-8 string to write. */
    int srcLen;			/* Length of UTF-8 string in bytes. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *dst, *stage;
    int saved, savedLF, sawLF, total, toWrite, flags;
    int dstWrote, dstLen, stageLen, stageMax, stageRead;
    Tcl_Encoding encoding;
    char safe[BUFFER_PADDING];
    
    total = 0;
    sawLF = 0;
    savedLF = 0;
    saved = 0;
    encoding = statePtr->encoding;

    /*
     * Loop over all UTF-8 characters in src, storing them in staging buffer
     * with proper EOL translation.
     */

    while (srcLen + savedLF > 0) {
	stage = statePtr->outputStage;
	stageMax = statePtr->bufSize;
	stageLen = stageMax;

	toWrite = stageLen;
	if (toWrite > srcLen) {
	    toWrite = srcLen;
	}

	if (savedLF) {
	    /*
	     * A '\n' was left over from last call to TranslateOutputEOL()
	     * and we need to store it in the staging buffer.  If the
	     * channel is line-based, we will need to flush the output
	     * buffer (after translating the staging buffer).
	     */
	    
	    *stage++ = '\n';
	    stageLen--;
	    sawLF++;
	}
	sawLF += TranslateOutputEOL(statePtr, stage, src, &stageLen, &toWrite);

	stage -= savedLF;
	stageLen += savedLF;
	savedLF = 0;

	if (stageLen > stageMax) {
	    savedLF = 1;
	    stageLen = stageMax;
	}
	src += toWrite;
	srcLen -= toWrite;

	flags = statePtr->outputEncodingFlags;
	if (srcLen == 0) {
	    flags |= TCL_ENCODING_END;
	}

	/*
	 * Loop over all UTF-8 characters in staging buffer, converting them
	 * to external encoding, storing them in output buffer.
	 */

	while (stageLen + saved > 0) {
	    bufPtr = statePtr->curOutPtr;
	    if (bufPtr == NULL) {
		bufPtr = AllocChannelBuffer(statePtr->bufSize);
		statePtr->curOutPtr = bufPtr;
	    }
	    dst = bufPtr->buf + bufPtr->nextAdded;
	    dstLen = bufPtr->bufLength - bufPtr->nextAdded;

	    if (saved != 0) {
		/*
		 * Here's some translated bytes left over from the last
		 * buffer that we need to stick at the beginning of this
		 * buffer.
		 */
		 
		memcpy((VOID *) dst, (VOID *) safe, (size_t) saved);
		bufPtr->nextAdded += saved;
		dst += saved;
		dstLen -= saved;
		saved = 0;
	    }

	    Tcl_UtfToExternal(NULL, encoding, stage, stageLen, flags,
		    &statePtr->outputEncodingState, dst,
		    dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);
	    if (stageRead + dstWrote == 0) {
		/*
		 * We have an incomplete UTF-8 character at the end of the
		 * staging buffer.  It will get moved to the beginning of the
		 * staging buffer followed by more bytes from src.
		 */
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
 *	buffer), the number of bytes consumed from the source buffer
 *	will be less than the number of bytes stored in the output buffer.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateOutputEOL(chanPtr, dst, src, dstLenPtr, srcLenPtr)
    Channel *chanPtr;		/* Channel being read, for translation and
				 * buffering modes. */
    char *dst;			/* Output buffer filled with UTF-8 chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *src;		/* Source UTF-8 characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes.  On exit, the number of
				 * bytes actually used in output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    char *dstEnd;
    int srcLen, newlineFound;
    
    newlineFound = 0;
    srcLen = *srcLenPtr;

    switch (chanPtr->outputTranslation) {
	case TCL_TRANSLATE_LF: {
	    for (dstEnd = dst + srcLen; dst < dstEnd; ) {
		if (*src == '\n') {
		    newlineFound = 1;
		}
		*dst++ = *src++;
	    }







|
|


















|







2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
 *	buffer), the number of bytes consumed from the source buffer
 *	will be less than the number of bytes stored in the output buffer.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateOutputEOL(statePtr, dst, src, dstLenPtr, srcLenPtr)
    ChannelState *statePtr;	/* Channel being read, for translation and
				 * buffering modes. */
    char *dst;			/* Output buffer filled with UTF-8 chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *src;		/* Source UTF-8 characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes.  On exit, the number of
				 * bytes actually used in output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    char *dstEnd;
    int srcLen, newlineFound;
    
    newlineFound = 0;
    srcLen = *srcLenPtr;

    switch (statePtr->outputTranslation) {
	case TCL_TRANSLATE_LF: {
	    for (dstEnd = dst + srcLen; dst < dstEnd; ) {
		if (*src == '\n') {
		    newlineFound = 1;
		}
		*dst++ = *src++;
	    }
3293
3294
3295
3296
3297
3298
3299

3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
static int
CheckFlush(chanPtr, bufPtr, newlineFlag)
    Channel *chanPtr;		/* Channel being read, for buffering mode. */
    ChannelBuffer *bufPtr;	/* Channel buffer to possibly flush. */
    int newlineFlag;		/* Non-zero if a the channel buffer
				 * contains a newline. */
{

    /*
     * The current buffer is ready for output:
     * 1. if it is full.
     * 2. if it contains a newline and this channel is line-buffered.
     * 3. if it contains any output and this channel is unbuffered.
     */

    if ((chanPtr->flags & BUFFER_READY) == 0) {
	if (bufPtr->nextAdded == bufPtr->bufLength) {
	    chanPtr->flags |= BUFFER_READY;
	} else if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
	    if (newlineFlag != 0) {
		chanPtr->flags |= BUFFER_READY;
	    }
	} else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
	    chanPtr->flags |= BUFFER_READY;
	}
    }
    if (chanPtr->flags & BUFFER_READY) {
	if (FlushChannel(NULL, chanPtr, 0) != 0) {
	    return -1;
	}
    }
    return 0;
}








>







|

|
|

|

|
|


|







2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
static int
CheckFlush(chanPtr, bufPtr, newlineFlag)
    Channel *chanPtr;		/* Channel being read, for buffering mode. */
    ChannelBuffer *bufPtr;	/* Channel buffer to possibly flush. */
    int newlineFlag;		/* Non-zero if a the channel buffer
				 * contains a newline. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    /*
     * The current buffer is ready for output:
     * 1. if it is full.
     * 2. if it contains a newline and this channel is line-buffered.
     * 3. if it contains any output and this channel is unbuffered.
     */

    if ((statePtr->flags & BUFFER_READY) == 0) {
	if (bufPtr->nextAdded == bufPtr->bufLength) {
	    statePtr->flags |= BUFFER_READY;
	} else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
	    if (newlineFlag != 0) {
		statePtr->flags |= BUFFER_READY;
	    }
	} else if (statePtr->flags & CHANNEL_UNBUFFERED) {
	    statePtr->flags |= BUFFER_READY;
	}
    }
    if (statePtr->flags & BUFFER_READY) {
	if (FlushChannel(NULL, chanPtr, 0) != 0) {
	    return -1;
	}
    }
    return 0;
}

3392
3393
3394
3395
3396
3397
3398
3399
3400
3401

3402
3403
3404
3405
3406




3407

3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
int
Tcl_GetsObj(chan, objPtr)
    Tcl_Channel chan;		/* Channel from which to read. */
    Tcl_Obj *objPtr;		/* The line read will be appended to this
				 * object as UTF-8 characters. */
{
    GetsState gs;
    Channel *chanPtr;
    int inEofChar, skip, copiedTotal;
    ChannelBuffer *bufPtr;

    Tcl_Encoding encoding;
    char *dst, *dstEnd, *eol, *eof;
    Tcl_EncodingState oldState;
    int oldLength, oldFlags, oldRemoved;





    chanPtr = (Channel *) chan;

    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
	copiedTotal = -1;
	goto done;
    }

    bufPtr = chanPtr->inQueueHead;
    encoding = chanPtr->encoding;

    /*
     * Preserved so we can restore the channel's state in case we don't
     * find a newline in the available input.
     */

    Tcl_GetStringFromObj(objPtr, &oldLength);
    oldFlags = chanPtr->inputEncodingFlags;
    oldState = chanPtr->inputEncodingState;
    oldRemoved = BUFFER_PADDING;
    if (bufPtr != NULL) {
	oldRemoved = bufPtr->nextRemoved;
    }

    /*
     * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't







|
|

>





>
>
>
>
|
>
|




|
|







|
|







3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
int
Tcl_GetsObj(chan, objPtr)
    Tcl_Channel chan;		/* Channel from which to read. */
    Tcl_Obj *objPtr;		/* The line read will be appended to this
				 * object as UTF-8 characters. */
{
    GetsState gs;
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inEofChar, skip, copiedTotal;
    Tcl_Encoding encoding;
    char *dst, *dstEnd, *eol, *eof;
    Tcl_EncodingState oldState;
    int oldLength, oldFlags, oldRemoved;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	copiedTotal = -1;
	goto done;
    }

    bufPtr = statePtr->inQueueHead;
    encoding = statePtr->encoding;

    /*
     * Preserved so we can restore the channel's state in case we don't
     * find a newline in the available input.
     */

    Tcl_GetStringFromObj(objPtr, &oldLength);
    oldFlags = statePtr->inputEncodingFlags;
    oldState = statePtr->inputEncodingState;
    oldRemoved = BUFFER_PADDING;
    if (bufPtr != NULL) {
	oldRemoved = bufPtr->nextRemoved;
    }

    /*
     * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
    gs.totalChars	= 0;

    dst = objPtr->bytes + oldLength;
    dstEnd = dst;

    skip = 0;
    eof = NULL;
    inEofChar = chanPtr->inEofChar;

    while (1) {
	if (dst >= dstEnd) {
	    if (FilterInputBytes(chanPtr, &gs) != 0) {
		goto restore;
	    }
	    dstEnd = dst + gs.bytesWrote;







|







3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
    gs.totalChars	= 0;

    dst = objPtr->bytes + oldLength;
    dstEnd = dst;

    skip = 0;
    eof = NULL;
    inEofChar = statePtr->inEofChar;

    while (1) {
	if (dst >= dstEnd) {
	    if (FilterInputBytes(chanPtr, &gs) != 0) {
		goto restore;
	    }
	    dstEnd = dst + gs.bytesWrote;
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497

	/*
	 * On EOL, leave current file position pointing after the EOL, but
	 * don't store the EOL in the output string.
	 */

	eol = dst;
	switch (chanPtr->inputTranslation) {
	    case TCL_TRANSLATE_LF: {
		for (eol = dst; eol < dstEnd; eol++) {
		    if (*eol == '\n') {
			skip = 1;
			goto goteol;
		    }
		}







|







3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147

	/*
	 * On EOL, leave current file position pointing after the EOL, but
	 * don't store the EOL in the output string.
	 */

	eol = dst;
	switch (statePtr->inputTranslation) {
	    case TCL_TRANSLATE_LF: {
		for (eol = dst; eol < dstEnd; eol++) {
		    if (*eol == '\n') {
			skip = 1;
			goto goteol;
		    }
		}
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
			}
		    }
		}
		break;
	    }
	    case TCL_TRANSLATE_AUTO: {
		skip = 1;
		if (chanPtr->flags & INPUT_SAW_CR) {
		    chanPtr->flags &= ~INPUT_SAW_CR;
		    if (*eol == '\n') {
			/*
			 * Skip the raw bytes that make up the '\n'.
			 */

			char tmp[1 + TCL_UTF_MAX];
			int rawRead;

			bufPtr = gs.bufPtr;
			Tcl_ExternalToUtf(NULL, gs.encoding,
				bufPtr->buf + bufPtr->nextRemoved,
				gs.rawRead, chanPtr->inputEncodingFlags,
				&gs.state, tmp, 1 + TCL_UTF_MAX, &rawRead,
				NULL, NULL);
			bufPtr->nextRemoved += rawRead;
			gs.rawRead -= rawRead;
			gs.bytesWrote--;
			gs.charsWrote--;
			memmove(dst, dst + 1, (size_t) (dstEnd - dst));







|
|











|







3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
			}
		    }
		}
		break;
	    }
	    case TCL_TRANSLATE_AUTO: {
		skip = 1;
		if (statePtr->flags & INPUT_SAW_CR) {
		    statePtr->flags &= ~INPUT_SAW_CR;
		    if (*eol == '\n') {
			/*
			 * Skip the raw bytes that make up the '\n'.
			 */

			char tmp[1 + TCL_UTF_MAX];
			int rawRead;

			bufPtr = gs.bufPtr;
			Tcl_ExternalToUtf(NULL, gs.encoding,
				bufPtr->buf + bufPtr->nextRemoved,
				gs.rawRead, statePtr->inputEncodingFlags,
				&gs.state, tmp, 1 + TCL_UTF_MAX, &rawRead,
				NULL, NULL);
			bufPtr->nextRemoved += rawRead;
			gs.rawRead -= rawRead;
			gs.bytesWrote--;
			gs.charsWrote--;
			memmove(dst, dst + 1, (size_t) (dstEnd - dst));
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
			    
			    offset = eol - objPtr->bytes;
			    dst = dstEnd;
			    PeekAhead(chanPtr, &dstEnd, &gs);
			    eol = objPtr->bytes + offset;
			    if (eol >= dstEnd) {
				eol--;
				chanPtr->flags |= INPUT_SAW_CR;
				goto goteol;
			    }
			}
			if (*eol == '\n') {
			    skip++;
			}
			eol--;







|







3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
			    
			    offset = eol - objPtr->bytes;
			    dst = dstEnd;
			    PeekAhead(chanPtr, &dstEnd, &gs);
			    eol = objPtr->bytes + offset;
			    if (eol >= dstEnd) {
				eol--;
				statePtr->flags |= INPUT_SAW_CR;
				goto goteol;
			    }
			}
			if (*eol == '\n') {
			    skip++;
			}
			eol--;
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
	    /*
	     * EOF character was seen.  On EOF, leave current file position
	     * pointing at the EOF character, but don't store the EOF
	     * character in the output string.
	     */

	    dstEnd = eof;
	    chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	    chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
	}
	if (chanPtr->flags & CHANNEL_EOF) {
	    skip = 0;
	    eol = dstEnd;
	    if (eol == objPtr->bytes) {
		/*
		 * If we didn't produce any bytes before encountering EOF,
		 * caller needs to see -1.
		 */







|
|

|







3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
	    /*
	     * EOF character was seen.  On EOF, leave current file position
	     * pointing at the EOF character, but don't store the EOF
	     * character in the output string.
	     */

	    dstEnd = eof;
	    statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	    statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	}
	if (statePtr->flags & CHANNEL_EOF) {
	    skip = 0;
	    eol = dstEnd;
	    if (eol == objPtr->bytes) {
		/*
		 * If we didn't produce any bytes before encountering EOF,
		 * caller needs to see -1.
		 */
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
     * the number of UTF-8 characters we want, plus how many raw bytes
     * correspond to the character(s) making up EOL (if any), so we can
     * remove the correct number of bytes from the channel buffer.
     */
     
    goteol:
    bufPtr = gs.bufPtr;
    chanPtr->inputEncodingState = gs.state;
    Tcl_ExternalToUtf(NULL, gs.encoding, bufPtr->buf + bufPtr->nextRemoved,
	    gs.rawRead, chanPtr->inputEncodingFlags,
	    &chanPtr->inputEncodingState, dst, eol - dst + skip + TCL_UTF_MAX,
	    &gs.rawRead, NULL, &gs.charsWrote);
    bufPtr->nextRemoved += gs.rawRead;

    /*
     * Recycle all the emptied buffers.
     */

    Tcl_SetObjLength(objPtr, eol - objPtr->bytes);
    CommonGetsCleanup(chanPtr, encoding);
    chanPtr->flags &= ~CHANNEL_BLOCKED;
    copiedTotal = gs.totalChars + gs.charsWrote - skip;
    goto done;

    /*
     * Couldn't get a complete line.  This only happens if we get a error
     * reading from the channel or we are non-blocking and there wasn't
     * an EOL or EOF in the data available.
     */

    restore:
    bufPtr = chanPtr->inQueueHead;
    bufPtr->nextRemoved = oldRemoved;

    for (bufPtr = bufPtr->nextPtr; bufPtr != NULL; bufPtr = bufPtr->nextPtr) {
	bufPtr->nextRemoved = BUFFER_PADDING;
    }
    CommonGetsCleanup(chanPtr, encoding);

    chanPtr->inputEncodingState = oldState;
    chanPtr->inputEncodingFlags = oldFlags;
    Tcl_SetObjLength(objPtr, oldLength);

    /*
     * We didn't get a complete line so we need to indicate to UpdateInterest
     * that the gets blocked.  It will wait for more data instead of firing
     * a timer, avoiding a busy wait.  This is where we are assuming that the
     * next operation is a gets.  No more file events will be delivered on 
     * this channel until new data arrives or some operation is performed
     * on the channel (e.g. gets, read, fconfigure) that changes the blocking
     * state.  Note that this means a file event will not be delivered even
     * though a read would be able to consume the buffered data.
     */

    chanPtr->flags |= CHANNEL_NEED_MORE_DATA;
    copiedTotal = -1;

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */







|

|
|









|










|







|
|













|







3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
     * the number of UTF-8 characters we want, plus how many raw bytes
     * correspond to the character(s) making up EOL (if any), so we can
     * remove the correct number of bytes from the channel buffer.
     */
     
    goteol:
    bufPtr = gs.bufPtr;
    statePtr->inputEncodingState = gs.state;
    Tcl_ExternalToUtf(NULL, gs.encoding, bufPtr->buf + bufPtr->nextRemoved,
	    gs.rawRead, statePtr->inputEncodingFlags,
	    &statePtr->inputEncodingState, dst, eol - dst + skip + TCL_UTF_MAX,
	    &gs.rawRead, NULL, &gs.charsWrote);
    bufPtr->nextRemoved += gs.rawRead;

    /*
     * Recycle all the emptied buffers.
     */

    Tcl_SetObjLength(objPtr, eol - objPtr->bytes);
    CommonGetsCleanup(chanPtr, encoding);
    statePtr->flags &= ~CHANNEL_BLOCKED;
    copiedTotal = gs.totalChars + gs.charsWrote - skip;
    goto done;

    /*
     * Couldn't get a complete line.  This only happens if we get a error
     * reading from the channel or we are non-blocking and there wasn't
     * an EOL or EOF in the data available.
     */

    restore:
    bufPtr = statePtr->inQueueHead;
    bufPtr->nextRemoved = oldRemoved;

    for (bufPtr = bufPtr->nextPtr; bufPtr != NULL; bufPtr = bufPtr->nextPtr) {
	bufPtr->nextRemoved = BUFFER_PADDING;
    }
    CommonGetsCleanup(chanPtr, encoding);

    statePtr->inputEncodingState = oldState;
    statePtr->inputEncodingFlags = oldFlags;
    Tcl_SetObjLength(objPtr, oldLength);

    /*
     * We didn't get a complete line so we need to indicate to UpdateInterest
     * that the gets blocked.  It will wait for more data instead of firing
     * a timer, avoiding a busy wait.  This is where we are assuming that the
     * next operation is a gets.  No more file events will be delivered on 
     * this channel until new data arrives or some operation is performed
     * on the channel (e.g. gets, read, fconfigure) that changes the blocking
     * state.  Note that this means a file event will not be delivered even
     * though a read would be able to consume the buffered data.
     */

    statePtr->flags |= CHANNEL_NEED_MORE_DATA;
    copiedTotal = -1;

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */
3717
3718
3719
3720
3721
3722
3723

3724
3725
3726
3727
3728
3729
3730
 */
 
static int
FilterInputBytes(chanPtr, gsPtr)
    Channel *chanPtr;		/* Channel to read. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{

    ChannelBuffer *bufPtr;
    char *raw, *rawStart, *rawEnd;
    char *dst;
    int offset, toRead, dstNeeded, spaceLeft, result, rawLen, length;
    Tcl_Obj *objPtr;
#define ENCODING_LINESIZE   30	/* Lower bound on how many bytes to convert
				 * at a time.  Since we don't know a priori







>







3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
 */
 
static int
FilterInputBytes(chanPtr, gsPtr)
    Channel *chanPtr;		/* Channel to read. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    char *raw, *rawStart, *rawEnd;
    char *dst;
    int offset, toRead, dstNeeded, spaceLeft, result, rawLen, length;
    Tcl_Obj *objPtr;
#define ENCODING_LINESIZE   30	/* Lower bound on how many bytes to convert
				 * at a time.  Since we don't know a priori
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
	/*
	 * All channel buffers were exhausted and the caller still hasn't
	 * seen EOL.  Need to read more bytes from the channel device.
	 * Side effect is to allocate another channel buffer.
	 */
	 
	read:
        if (chanPtr->flags & CHANNEL_BLOCKED) {
            if (chanPtr->flags & CHANNEL_NONBLOCKING) {
		gsPtr->charsWrote = 0;
		gsPtr->rawRead = 0;
		return -1;
	    }
            chanPtr->flags &= ~CHANNEL_BLOCKED;
        }
	if (GetInput(chanPtr) != 0) {
	    gsPtr->charsWrote = 0;
	    gsPtr->rawRead = 0;
	    return -1;
	}
	bufPtr = chanPtr->inQueueTail;
	gsPtr->bufPtr = bufPtr;
    }

    /*
     * Convert some of the bytes from the channel buffer to UTF-8.  Space in
     * objPtr's string rep is used to hold the UTF-8 characters.  Grow the
     * string rep if we need more space.







|
|




|






|







3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
	/*
	 * All channel buffers were exhausted and the caller still hasn't
	 * seen EOL.  Need to read more bytes from the channel device.
	 * Side effect is to allocate another channel buffer.
	 */
	 
	read:
        if (statePtr->flags & CHANNEL_BLOCKED) {
            if (statePtr->flags & CHANNEL_NONBLOCKING) {
		gsPtr->charsWrote = 0;
		gsPtr->rawRead = 0;
		return -1;
	    }
            statePtr->flags &= ~CHANNEL_BLOCKED;
        }
	if (GetInput(chanPtr) != 0) {
	    gsPtr->charsWrote = 0;
	    gsPtr->rawRead = 0;
	    return -1;
	}
	bufPtr = statePtr->inQueueTail;
	gsPtr->bufPtr = bufPtr;
    }

    /*
     * Convert some of the bytes from the channel buffer to UTF-8.  Space in
     * objPtr's string rep is used to hold the UTF-8 characters.  Grow the
     * string rep if we need more space.
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
	}
	length += TCL_UTF_MAX + 1;
	Tcl_SetObjLength(objPtr, length);
	spaceLeft = length - offset;
	dst = objPtr->bytes + offset;
	*gsPtr->dstPtr = dst;
    }
    gsPtr->state = chanPtr->inputEncodingState;
    result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen,
	    chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
	    dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote,
	    &gsPtr->charsWrote); 
    if (result == TCL_CONVERT_MULTIBYTE) {
	/*
	 * The last few bytes in this channel buffer were the start of a
	 * multibyte sequence.  If this buffer was full, then move them to
	 * the next buffer so the bytes will be contiguous.  
	 */

	ChannelBuffer *nextPtr;
	int extra;
	
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextAdded < bufPtr->bufLength) {
	    if (gsPtr->rawRead > 0) {
		/*
		 * Some raw bytes were converted to UTF-8.  Fall through,
		 * returning those UTF-8 characters because a EOL might be
		 * present in them.
		 */
	    } else if (chanPtr->flags & CHANNEL_EOF) {
		/*
		 * There was a partial character followed by EOF on the
		 * device.  Fall through, returning that nothing was found.
		 */

		 bufPtr->nextRemoved = bufPtr->nextAdded;
	    } else {
		/*
		 * There are no more cached raw bytes left.  See if we can
		 * get some more.
		 */

		goto read;
	    }
	} else {
	    if (nextPtr == NULL) {
		nextPtr = AllocChannelBuffer(chanPtr->bufSize);
		bufPtr->nextPtr = nextPtr;
		chanPtr->inQueueTail = nextPtr;
	    }
	    extra = rawLen - gsPtr->rawRead;
	    memcpy((VOID *) (nextPtr->buf + BUFFER_PADDING - extra),
		    (VOID *) (raw + gsPtr->rawRead), (size_t) extra);
	    nextPtr->nextRemoved -= extra;
	    bufPtr->nextAdded -= extra;
	}







|

|




















|





|










|

|







3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
	}
	length += TCL_UTF_MAX + 1;
	Tcl_SetObjLength(objPtr, length);
	spaceLeft = length - offset;
	dst = objPtr->bytes + offset;
	*gsPtr->dstPtr = dst;
    }
    gsPtr->state = statePtr->inputEncodingState;
    result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen,
	    statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
	    dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote,
	    &gsPtr->charsWrote); 
    if (result == TCL_CONVERT_MULTIBYTE) {
	/*
	 * The last few bytes in this channel buffer were the start of a
	 * multibyte sequence.  If this buffer was full, then move them to
	 * the next buffer so the bytes will be contiguous.  
	 */

	ChannelBuffer *nextPtr;
	int extra;
	
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextAdded < bufPtr->bufLength) {
	    if (gsPtr->rawRead > 0) {
		/*
		 * Some raw bytes were converted to UTF-8.  Fall through,
		 * returning those UTF-8 characters because a EOL might be
		 * present in them.
		 */
	    } else if (statePtr->flags & CHANNEL_EOF) {
		/*
		 * There was a partial character followed by EOF on the
		 * device.  Fall through, returning that nothing was found.
		 */

		bufPtr->nextRemoved = bufPtr->nextAdded;
	    } else {
		/*
		 * There are no more cached raw bytes left.  See if we can
		 * get some more.
		 */

		goto read;
	    }
	} else {
	    if (nextPtr == NULL) {
		nextPtr = AllocChannelBuffer(statePtr->bufSize);
		bufPtr->nextPtr = nextPtr;
		statePtr->inQueueTail = nextPtr;
	    }
	    extra = rawLen - gsPtr->rawRead;
	    memcpy((VOID *) (nextPtr->buf + BUFFER_PADDING - extra),
		    (VOID *) (raw + gsPtr->rawRead), (size_t) extra);
	    nextPtr->nextRemoved -= extra;
	    bufPtr->nextAdded -= extra;
	}
3885
3886
3887
3888
3889
3890
3891

3892
3893
3894
3895
3896
3897
3898
static void
PeekAhead(chanPtr, dstEndPtr, gsPtr)
    Channel *chanPtr;		/* The channel to read. */
    char **dstEndPtr;		/* Filled with pointer to end of new range
				 * of UTF-8 characters. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{

    ChannelBuffer *bufPtr;
    Tcl_DriverBlockModeProc *blockModeProc;
    int bytesLeft;

    bufPtr = gsPtr->bufPtr;

    /*







>







3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
static void
PeekAhead(chanPtr, dstEndPtr, gsPtr)
    Channel *chanPtr;		/* The channel to read. */
    char **dstEndPtr;		/* Filled with pointer to end of new range
				 * of UTF-8 characters. */
    GetsState *gsPtr;		/* Current state of gets operation. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    Tcl_DriverBlockModeProc *blockModeProc;
    int bytesLeft;

    bufPtr = gsPtr->bufPtr;

    /*
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
	    if (bufPtr->nextAdded < bufPtr->bufLength) {
		/*
		 * Don't peek ahead if last read was short read.
		 */
		 
		goto cleanup;
	    }
	    if ((chanPtr->flags & CHANNEL_NONBLOCKING) == 0) {
		blockModeProc = chanPtr->typePtr->blockModeProc;
		if (blockModeProc == NULL) {
		    /*
		     * Don't peek ahead if cannot set non-blocking mode.
		     */

		    goto cleanup;
		}
		(*blockModeProc)(chanPtr->instanceData, TCL_MODE_NONBLOCKING);
	    }
	}
    }
    if (FilterInputBytes(chanPtr, gsPtr) == 0) {
	*dstEndPtr = *gsPtr->dstPtr + gsPtr->bytesWrote;
    }
    if (blockModeProc != NULL) {
	(*blockModeProc)(chanPtr->instanceData, TCL_MODE_BLOCKING);
    }
    return;

    cleanup:
    bufPtr->nextRemoved += gsPtr->rawRead;
    gsPtr->rawRead = 0;
    gsPtr->totalChars += gsPtr->charsWrote;







|
|







|







|







3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
	    if (bufPtr->nextAdded < bufPtr->bufLength) {
		/*
		 * Don't peek ahead if last read was short read.
		 */
		 
		goto cleanup;
	    }
	    if ((statePtr->flags & CHANNEL_NONBLOCKING) == 0) {
		blockModeProc = Tcl_ChannelBlockModeProc(chanPtr->typePtr);
		if (blockModeProc == NULL) {
		    /*
		     * Don't peek ahead if cannot set non-blocking mode.
		     */

		    goto cleanup;
		}
		StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);
	    }
	}
    }
    if (FilterInputBytes(chanPtr, gsPtr) == 0) {
	*dstEndPtr = *gsPtr->dstPtr + gsPtr->bytesWrote;
    }
    if (blockModeProc != NULL) {
	StackSetBlockMode(chanPtr, TCL_MODE_BLOCKING);
    }
    return;

    cleanup:
    bufPtr->nextRemoved += gsPtr->rawRead;
    gsPtr->rawRead = 0;
    gsPtr->totalChars += gsPtr->charsWrote;
3961
3962
3963
3964
3965
3966
3967

3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
 */
 
static void
CommonGetsCleanup(chanPtr, encoding)
    Channel *chanPtr;
    Tcl_Encoding encoding;
{

    ChannelBuffer *bufPtr, *nextPtr;
    
    bufPtr = chanPtr->inQueueHead;
    for ( ; bufPtr != NULL; bufPtr = nextPtr) {
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextRemoved < bufPtr->nextAdded) {
	    break;
	}
	RecycleBuffer(chanPtr, bufPtr, 0);
    }
    chanPtr->inQueueHead = bufPtr;
    if (bufPtr == NULL) {
	chanPtr->inQueueTail = NULL;
    } else {
	/*
	 * If any multi-byte characters were split across channel buffer
	 * boundaries, the split-up bytes were moved to the next channel
	 * buffer by FilterInputBytes().  Move the bytes back to their
	 * original buffer because the caller could change the channel's
	 * encoding which could change the interpretation of whether those







>


|





|

|

|







3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
 */
 
static void
CommonGetsCleanup(chanPtr, encoding)
    Channel *chanPtr;
    Tcl_Encoding encoding;
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr, *nextPtr;
    
    bufPtr = statePtr->inQueueHead;
    for ( ; bufPtr != NULL; bufPtr = nextPtr) {
	nextPtr = bufPtr->nextPtr;
	if (bufPtr->nextRemoved < bufPtr->nextAdded) {
	    break;
	}
	RecycleBuffer(statePtr, bufPtr, 0);
    }
    statePtr->inQueueHead = bufPtr;
    if (bufPtr == NULL) {
	statePtr->inQueueTail = NULL;
    } else {
	/*
	 * If any multi-byte characters were split across channel buffer
	 * boundaries, the split-up bytes were moved to the next channel
	 * buffer by FilterInputBytes().  Move the bytes back to their
	 * original buffer because the caller could change the channel's
	 * encoding which could change the interpretation of whether those
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
			(size_t) extra);
		bufPtr->nextAdded += extra;
		nextPtr->nextRemoved = BUFFER_PADDING;
	    }
	    bufPtr = nextPtr;
	}
    }
    if (chanPtr->encoding == NULL) {
	Tcl_FreeEncoding(encoding);
    }
}

/*
 *----------------------------------------------------------------------
 *







|







3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
			(size_t) extra);
		bufPtr->nextAdded += extra;
		nextPtr->nextRemoved = BUFFER_PADDING;
	    }
	    bufPtr = nextPtr;
	}
    }
    if (statePtr->encoding == NULL) {
	Tcl_FreeEncoding(encoding);
    }
}

/*
 *----------------------------------------------------------------------
 *
4032
4033
4034
4035
4036
4037
4038
4039

4040




4041

4042
4043
4044
4045
4046
4047

























































































































4048
4049
4050
4051
4052
4053
4054

int
Tcl_Read(chan, dst, bytesToRead)
    Tcl_Channel chan;		/* The channel from which to read. */
    char *dst;			/* Where to store input read. */
    int bytesToRead;		/* Maximum number of bytes to read. */
{
    Channel *chanPtr;		

    




    chanPtr = (Channel *) chan;

    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
	return -1;
    }

    return DoRead(chanPtr, dst, bytesToRead);
}


























































































































/*
 *---------------------------------------------------------------------------
 *
 * Tcl_ReadChars --
 *
 *	Reads from the channel until the requested number of characters







|
>
|
>
>
>
>
|
>
|





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834

int
Tcl_Read(chan, dst, bytesToRead)
    Tcl_Channel chan;		/* The channel from which to read. */
    char *dst;			/* Where to store input read. */
    int bytesToRead;		/* Maximum number of bytes to read. */
{
    Channel *chanPtr = (Channel *) chan;		
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	return -1;
    }

    return DoRead(chanPtr, dst, bytesToRead);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ReadRaw --
 *
 *	Reads a given number of bytes from a channel.  EOL and EOF
 *	translation is done on the bytes being read, so the the number
 *	of bytes consumed from the channel may not be equal to the
 *	number of bytes stored in the destination buffer.
 *
 *	No encoding conversions are applied to the bytes being read.
 *
 * Results:
 *	The number of bytes read, or -1 on error. Use Tcl_GetErrno()
 *	to retrieve the error code for the error that occurred.
 *
 * Side effects:
 *	May cause input to be buffered.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ReadRaw(chan, bufPtr, bytesToRead)
    Tcl_Channel chan;		/* The channel from which to read. */
    char *bufPtr;			/* Where to store input read. */
    int bytesToRead;		/* Maximum number of bytes to read. */
{
    Channel *chanPtr = (Channel *) chan;		
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int nread, result;
    int copied, copiedNow;

    /*
     * The check below does too much because it will reject a call to this
     * function with a channel which is part of an 'fcopy'. But we have to
     * allow this here or else the chaining in the transformation drivers
     * will fail with 'file busy' error instead of retrieving and
     * transforming the data to copy.
     *
     * We let the check procedure now believe that there is no fcopy in
     * progress. A better solution than this might be an additional flag
     * argument to switch off specific checks.
     */

    if (CheckChannelErrors(statePtr, TCL_READABLE | CHANNEL_RAW_MODE) != 0) {
	return -1;
    }

    /*
     * Check for information in the push-back buffers. If there is
     * some, use it. Go to the driver only if there is none (anymore)
     * and the caller requests more bytes.
     */

    for (copied = 0; copied < bytesToRead; copied += copiedNow) {
        copiedNow = CopyBuffer(chanPtr, bufPtr + copied,
                bytesToRead - copied);
        if (copiedNow == 0) {
            if (statePtr->flags & CHANNEL_EOF) {
		goto done;
            }
            if (statePtr->flags & CHANNEL_BLOCKED) {
                if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    goto done;
                }
                statePtr->flags &= (~(CHANNEL_BLOCKED));
            }

	    /*
	     * Now go to the driver to get as much as is possible to
	     * fill the remaining request. Do all the error handling
	     * by ourselves.  The code was stolen from 'GetInput' and
	     * slightly adapted (different return value here).
	     *
	     * The case of 'bytesToRead == 0' at this point cannot happen.
	     */

	    nread = (chanPtr->typePtr->inputProc)(chanPtr->instanceData,
			  bufPtr + copied, bytesToRead - copied, &result);
	    if (nread > 0) {
	        /*
		 * If we get a short read, signal up that we may be
		 * BLOCKED. We should avoid calling the driver because
		 * on some platforms we will block in the low level
		 * reading code even though the channel is set into
		 * nonblocking mode.
		 */
            
	        if (nread < (bytesToRead - copied)) {
		    statePtr->flags |= CHANNEL_BLOCKED;
		}
	    } else if (nread == 0) {
	        statePtr->flags |= CHANNEL_EOF;
		statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	    } else if (nread < 0) {
	        if ((result == EWOULDBLOCK) || (result == EAGAIN)) {
		    if (copied > 0) {
		      /*
		       * Information that was copied earlier has precedence
		       * over EAGAIN/WOULDBLOCK handling.
		       */
		      return copied;
		    }

		    statePtr->flags |= CHANNEL_BLOCKED;
		    result = EAGAIN;
		}

		Tcl_SetErrno(result);
		return -1;
	    } 

	    return copied + nread;
        }
    }

done:
    return copied;
}

/*
 *---------------------------------------------------------------------------
 *
 * Tcl_ReadChars --
 *
 *	Reads from the channel until the requested number of characters
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086

4087
4088
4089




4090

4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
				 * or when channel blocks). */
    int appendFlag;		/* If non-zero, data read from the channel
				 * will be appended to the object.  Otherwise,
				 * the data will replace the existing contents
				 * of the object. */

{
    Channel *chanPtr;
    int offset, factor, copied, copiedNow, result;
    ChannelBuffer *bufPtr;

    Tcl_Encoding encoding;
#define UTF_EXPANSION_FACTOR	1024
    




    chanPtr = (Channel *) chan;

    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
	copied = -1;
	goto done;
    }

    encoding = chanPtr->encoding;
    factor = UTF_EXPANSION_FACTOR;

    if (appendFlag == 0) {
	if (encoding == NULL) {
	    Tcl_SetByteArrayLength(objPtr, 0);
	} else {
	    Tcl_SetObjLength(objPtr, 0);
	}
	offset = 0;
    } else {
	if (encoding == NULL) {
	    Tcl_GetByteArrayFromObj(objPtr, &offset);
	} else {
	    Tcl_GetStringFromObj(objPtr, &offset);
	}
    }

    for (copied = 0; (unsigned) toRead > 0; ) {
	copiedNow = -1;
	if (chanPtr->inQueueHead != NULL) {
	    if (encoding == NULL) {
		copiedNow = ReadBytes(chanPtr, objPtr, toRead, &offset);
	    } else {
		copiedNow = ReadChars(chanPtr, objPtr, toRead, &offset,
			&factor);
	    }

	    /*
	     * If the current buffer is empty recycle it.
	     */

	    bufPtr = chanPtr->inQueueHead;
	    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
		ChannelBuffer *nextPtr;

		nextPtr = bufPtr->nextPtr;
		RecycleBuffer(chanPtr, bufPtr, 0);
		chanPtr->inQueueHead = nextPtr;
		if (nextPtr == NULL) {
		    chanPtr->inQueueTail = nextPtr;
		}
	    }
	}
	if (copiedNow < 0) {
	    if (chanPtr->flags & CHANNEL_EOF) {
		break;
	    }
	    if (chanPtr->flags & CHANNEL_BLOCKED) {
		if (chanPtr->flags & CHANNEL_NONBLOCKING) {
		    break;
		}
		chanPtr->flags &= ~CHANNEL_BLOCKED;
	    }
	    result = GetInput(chanPtr);
	    if (result != 0) {
		if (result == EAGAIN) {
		    break;
		}
		copied = -1;
		goto done;
	    }
	} else {
	    copied += copiedNow;
	    toRead -= copiedNow;
	}
    }
    chanPtr->flags &= ~CHANNEL_BLOCKED;
    if (encoding == NULL) {
	Tcl_SetByteArrayLength(objPtr, offset);
    } else {
	Tcl_SetObjLength(objPtr, offset);
    }

    done:







|
|

>



>
>
>
>
|
>
|




|



















|

|

|







|




|
|

|




|


|
|


|














|







3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
				 * or when channel blocks). */
    int appendFlag;		/* If non-zero, data read from the channel
				 * will be appended to the object.  Otherwise,
				 * the data will replace the existing contents
				 * of the object. */

{
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int offset, factor, copied, copiedNow, result;
    Tcl_Encoding encoding;
#define UTF_EXPANSION_FACTOR	1024
    
    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	copied = -1;
	goto done;
    }

    encoding = statePtr->encoding;
    factor = UTF_EXPANSION_FACTOR;

    if (appendFlag == 0) {
	if (encoding == NULL) {
	    Tcl_SetByteArrayLength(objPtr, 0);
	} else {
	    Tcl_SetObjLength(objPtr, 0);
	}
	offset = 0;
    } else {
	if (encoding == NULL) {
	    Tcl_GetByteArrayFromObj(objPtr, &offset);
	} else {
	    Tcl_GetStringFromObj(objPtr, &offset);
	}
    }

    for (copied = 0; (unsigned) toRead > 0; ) {
	copiedNow = -1;
	if (statePtr->inQueueHead != NULL) {
	    if (encoding == NULL) {
		copiedNow = ReadBytes(statePtr, objPtr, toRead, &offset);
	    } else {
		copiedNow = ReadChars(statePtr, objPtr, toRead, &offset,
			&factor);
	    }

	    /*
	     * If the current buffer is empty recycle it.
	     */

	    bufPtr = statePtr->inQueueHead;
	    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
		ChannelBuffer *nextPtr;

		nextPtr = bufPtr->nextPtr;
		RecycleBuffer(statePtr, bufPtr, 0);
		statePtr->inQueueHead = nextPtr;
		if (nextPtr == NULL) {
		    statePtr->inQueueTail = nextPtr;
		}
	    }
	}
	if (copiedNow < 0) {
	    if (statePtr->flags & CHANNEL_EOF) {
		break;
	    }
	    if (statePtr->flags & CHANNEL_BLOCKED) {
		if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    break;
		}
		statePtr->flags &= ~CHANNEL_BLOCKED;
	    }
	    result = GetInput(chanPtr);
	    if (result != 0) {
		if (result == EAGAIN) {
		    break;
		}
		copied = -1;
		goto done;
	    }
	} else {
	    copied += copiedNow;
	    toRead -= copiedNow;
	}
    }
    statePtr->flags &= ~CHANNEL_BLOCKED;
    if (encoding == NULL) {
	Tcl_SetByteArrayLength(objPtr, offset);
    } else {
	Tcl_SetObjLength(objPtr, offset);
    }

    done:
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadBytes(chanPtr, objPtr, bytesToRead, offsetPtr)
    Channel *chanPtr;		/* The channel to read. */
    int bytesToRead;		/* Maximum number of characters to store,
				 * or < 0 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are







|
|







3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadBytes(statePtr, objPtr, bytesToRead, offsetPtr)
    ChannelState *statePtr;	/* State of the channel to read. */
    int bytesToRead;		/* Maximum number of characters to store,
				 * or < 0 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
{
    int toRead, srcLen, srcRead, dstWrote, offset, length;
    ChannelBuffer *bufPtr;
    char *src, *dst;

    offset = *offsetPtr;

    bufPtr = chanPtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = bytesToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }







|







4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
{
    int toRead, srcLen, srcRead, dstWrote, offset, length;
    ChannelBuffer *bufPtr;
    char *src, *dst;

    offset = *offsetPtr;

    bufPtr = statePtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = bytesToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
	if (offset < toRead) {
	    length = offset + toRead + 1;
	}
	dst = (char *) Tcl_SetByteArrayLength(objPtr, length);
    }
    dst += offset;

    if (chanPtr->flags & INPUT_NEED_NL) {
	chanPtr->flags &= ~INPUT_NEED_NL;
	if ((srcLen == 0) || (*src != '\n')) {
	    *dst = '\r';
	    *offsetPtr += 1;
	    return 1;
	}
	*dst++ = '\n';
	src++;
	srcLen--;
	toRead--;
    }

    srcRead = srcLen;
    dstWrote = toRead;
    if (TranslateInputEOL(chanPtr, dst, src, &dstWrote, &srcRead) != 0) {
	if (dstWrote == 0) {
	    return -1;
	}
    }
    bufPtr->nextRemoved += srcRead;
    *offsetPtr += dstWrote;
    return dstWrote;







|
|













|







4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
	if (offset < toRead) {
	    length = offset + toRead + 1;
	}
	dst = (char *) Tcl_SetByteArrayLength(objPtr, length);
    }
    dst += offset;

    if (statePtr->flags & INPUT_NEED_NL) {
	statePtr->flags &= ~INPUT_NEED_NL;
	if ((srcLen == 0) || (*src != '\n')) {
	    *dst = '\r';
	    *offsetPtr += 1;
	    return 1;
	}
	*dst++ = '\n';
	src++;
	srcLen--;
	toRead--;
    }

    srcRead = srcLen;
    dstWrote = toRead;
    if (TranslateInputEOL(statePtr, dst, src, &dstWrote, &srcRead) != 0) {
	if (dstWrote == 0) {
	    return -1;
	}
    }
    bufPtr->nextRemoved += srcRead;
    *offsetPtr += dstWrote;
    return dstWrote;
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadChars(chanPtr, objPtr, charsToRead, offsetPtr, factorPtr)
    Channel *chanPtr;		/* The channel to read. */
    int charsToRead;		/* Maximum number of characters to store,
				 * or -1 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are







|
|







4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr)
    ChannelState *statePtr;	/* State of channel to read. */
    int charsToRead;		/* Maximum number of characters to store,
				 * or -1 to get all available characters.
				 * Characters are obtained from the first
				 * buffer in the queue -- even if this number
				 * is larger than the number of characters
				 * available in the first buffer, only the
				 * characters from the first buffer are
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
    ChannelBuffer *bufPtr;
    char *src, *dst;
    Tcl_EncodingState oldState;

    factor = *factorPtr;
    offset = *offsetPtr;

    bufPtr = chanPtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = charsToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }







|







4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
    ChannelBuffer *bufPtr;
    char *src, *dst;
    Tcl_EncodingState oldState;

    factor = *factorPtr;
    offset = *offsetPtr;

    bufPtr = statePtr->inQueueHead; 
    src = bufPtr->buf + bufPtr->nextRemoved;
    srcLen = bufPtr->nextAdded - bufPtr->nextRemoved;

    toRead = charsToRead;
    if ((unsigned) toRead > (unsigned) srcLen) {
	toRead = srcLen;
    }
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
	 * rather than using the factor.
	 */

	dstNeeded = spaceLeft;
    }
    dst = objPtr->bytes + offset;

    oldState = chanPtr->inputEncodingState;
    if (chanPtr->flags & INPUT_NEED_NL) {
	/*
	 * We want a '\n' because the last character we saw was '\r'.
	 */
	 
	chanPtr->flags &= ~INPUT_NEED_NL;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
		dst, TCL_UTF_MAX + 1, &srcRead, &dstWrote, &numChars);
	if ((dstWrote > 0) && (*dst == '\n')) {
	    /*
	     * The next char was a '\n'.  Consume it and produce a '\n'.
	     */
	     
	    bufPtr->nextRemoved += srcRead;
	} else {
	    /*
	     * The next char was not a '\n'.  Produce a '\r'.
	     */

	    *dst = '\r';
	}
	chanPtr->inputEncodingFlags &= ~TCL_ENCODING_START;
	*offsetPtr += 1;
        return 1;
    }

    Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
	    chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState, dst,
	    dstNeeded + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
    if (srcRead == 0) {
	/*
	 * Not enough bytes in src buffer to make a complete char.  Copy
	 * the bytes to the next buffer to make a new contiguous string,
	 * then tell the caller to fill the buffer with more bytes.
	 */

	ChannelBuffer *nextPtr;
	
	nextPtr = bufPtr->nextPtr;
	if (nextPtr == NULL) {
	    /*
	     * There isn't enough data in the buffers to complete the next
	     * character, so we need to wait for more data before the next
	     * file event can be delivered.
	     */

	    chanPtr->flags |= CHANNEL_NEED_MORE_DATA;
	    return -1;
	}
	nextPtr->nextRemoved -= srcLen;
	memcpy((VOID *) (nextPtr->buf + nextPtr->nextRemoved), (VOID *) src,
		(size_t) srcLen);
	RecycleBuffer(chanPtr, bufPtr, 0);
	chanPtr->inQueueHead = nextPtr;
	return ReadChars(chanPtr, objPtr, charsToRead, offsetPtr, factorPtr);
    }

    dstRead = dstWrote;
    if (TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead) != 0) {
	/*
	 * Hit EOF char.  How many bytes of src correspond to where the
	 * EOF was located in dst?
	 */
	 
	if (dstWrote == 0) {
	    return -1;
	}
	chanPtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
		dst, dstRead + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead);
    } 

    /*
     * The number of characters that we got may be less than the number
     * that we started with because "\r\n" sequences may have been
     * turned into just '\n' in dst.
     */

    numChars -= (dstRead - dstWrote);

    if ((unsigned) numChars > (unsigned) toRead) {
	/*
	 * Got too many chars.
	 */

	char *eof;

	eof = Tcl_UtfAtIndex(dst, toRead);
	chanPtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, chanPtr->encoding, src, srcLen,
		chanPtr->inputEncodingFlags, &chanPtr->inputEncodingState,
		dst, eof - dst + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	dstRead = dstWrote;
	TranslateInputEOL(chanPtr, dst, dst, &dstWrote, &dstRead);
	numChars -= (dstRead - dstWrote);
    }
    chanPtr->inputEncodingFlags &= ~TCL_ENCODING_START;

    bufPtr->nextRemoved += srcRead;
    if (dstWrote > srcRead + 1) {
	*factorPtr = dstWrote * UTF_EXPANSION_FACTOR / srcRead;
    }
    *offsetPtr += dstWrote;
    return numChars;







|
|



|
|
|
|





|








|




|
|


















|





|
|
|



|








|
|
|

|


















|
|
|


|


|







4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
	 * rather than using the factor.
	 */

	dstNeeded = spaceLeft;
    }
    dst = objPtr->bytes + offset;

    oldState = statePtr->inputEncodingState;
    if (statePtr->flags & INPUT_NEED_NL) {
	/*
	 * We want a '\n' because the last character we saw was '\r'.
	 */

	statePtr->flags &= ~INPUT_NEED_NL;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, TCL_UTF_MAX + 1, &srcRead, &dstWrote, &numChars);
	if ((dstWrote > 0) && (*dst == '\n')) {
	    /*
	     * The next char was a '\n'.  Consume it and produce a '\n'.
	     */

	    bufPtr->nextRemoved += srcRead;
	} else {
	    /*
	     * The next char was not a '\n'.  Produce a '\r'.
	     */

	    *dst = '\r';
	}
	statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;
	*offsetPtr += 1;
        return 1;
    }

    Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
	    statePtr->inputEncodingFlags, &statePtr->inputEncodingState, dst,
	    dstNeeded + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
    if (srcRead == 0) {
	/*
	 * Not enough bytes in src buffer to make a complete char.  Copy
	 * the bytes to the next buffer to make a new contiguous string,
	 * then tell the caller to fill the buffer with more bytes.
	 */

	ChannelBuffer *nextPtr;
	
	nextPtr = bufPtr->nextPtr;
	if (nextPtr == NULL) {
	    /*
	     * There isn't enough data in the buffers to complete the next
	     * character, so we need to wait for more data before the next
	     * file event can be delivered.
	     */

	    statePtr->flags |= CHANNEL_NEED_MORE_DATA;
	    return -1;
	}
	nextPtr->nextRemoved -= srcLen;
	memcpy((VOID *) (nextPtr->buf + nextPtr->nextRemoved), (VOID *) src,
		(size_t) srcLen);
	RecycleBuffer(statePtr, bufPtr, 0);
	statePtr->inQueueHead = nextPtr;
	return ReadChars(statePtr, objPtr, charsToRead, offsetPtr, factorPtr);
    }

    dstRead = dstWrote;
    if (TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead) != 0) {
	/*
	 * Hit EOF char.  How many bytes of src correspond to where the
	 * EOF was located in dst?
	 */
	 
	if (dstWrote == 0) {
	    return -1;
	}
	statePtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, dstRead + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead);
    } 

    /*
     * The number of characters that we got may be less than the number
     * that we started with because "\r\n" sequences may have been
     * turned into just '\n' in dst.
     */

    numChars -= (dstRead - dstWrote);

    if ((unsigned) numChars > (unsigned) toRead) {
	/*
	 * Got too many chars.
	 */

	char *eof;

	eof = Tcl_UtfAtIndex(dst, toRead);
	statePtr->inputEncodingState = oldState;
	Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
		statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
		dst, eof - dst + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
	dstRead = dstWrote;
	TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead);
	numChars -= (dstRead - dstWrote);
    }
    statePtr->inputEncodingFlags &= ~TCL_ENCODING_START;

    bufPtr->nextRemoved += srcRead;
    if (dstWrote > srcRead + 1) {
	*factorPtr = dstWrote * UTF_EXPANSION_FACTOR / srcRead;
    }
    *offsetPtr += dstWrote;
    return numChars;
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateInputEOL(chanPtr, dstStart, srcStart, dstLenPtr, srcLenPtr)
    Channel *chanPtr;		/* Channel being read, for EOL translation
				 * and EOF character. */
    char *dstStart;		/* Output buffer filled with chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *srcStart;	/* Source characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes; must be <= *srcLenPtr.  On
				 * exit, the number of bytes actually used in
				 * output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    int dstLen, srcLen, inEofChar;
    CONST char *eof;

    dstLen = *dstLenPtr;

    eof = NULL;
    inEofChar = chanPtr->inEofChar;
    if (inEofChar != '\0') {
	/*
	 * Find EOF in translated buffer then compress out the EOL.  The
	 * source buffer may be much longer than the destination buffer --
	 * we only want to return EOF if the EOF has been copied to the
	 * destination buffer.
	 */







|
|



















|







4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

static int
TranslateInputEOL(statePtr, dstStart, srcStart, dstLenPtr, srcLenPtr)
    ChannelState *statePtr;	/* Channel being read, for EOL translation
				 * and EOF character. */
    char *dstStart;		/* Output buffer filled with chars by
				 * applying appropriate EOL translation to
				 * source characters. */
    CONST char *srcStart;	/* Source characters. */
    int *dstLenPtr;		/* On entry, the maximum length of output
				 * buffer in bytes; must be <= *srcLenPtr.  On
				 * exit, the number of bytes actually used in
				 * output buffer. */
    int *srcLenPtr;		/* On entry, the length of source buffer.
				 * On exit, the number of bytes read from
				 * the source buffer. */
{
    int dstLen, srcLen, inEofChar;
    CONST char *eof;

    dstLen = *dstLenPtr;

    eof = NULL;
    inEofChar = statePtr->inEofChar;
    if (inEofChar != '\0') {
	/*
	 * Find EOF in translated buffer then compress out the EOL.  The
	 * source buffer may be much longer than the destination buffer --
	 * we only want to return EOF if the EOF has been copied to the
	 * destination buffer.
	 */
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
		    dstLen = srcLen;
		}
		*srcLenPtr = srcLen;
		break;
	    }
	}
    }
    switch (chanPtr->inputTranslation) {
	case TCL_TRANSLATE_LF: {
	    if (dstStart != srcStart) {
		memcpy((VOID *) dstStart, (VOID *) srcStart, (size_t) dstLen);
	    }
	    srcLen = dstLen;
	    break;
	}







|







4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
		    dstLen = srcLen;
		}
		*srcLenPtr = srcLen;
		break;
	    }
	}
    }
    switch (statePtr->inputTranslation) {
	case TCL_TRANSLATE_LF: {
	    if (dstStart != srcStart) {
		memcpy((VOID *) dstStart, (VOID *) srcStart, (size_t) dstLen);
	    }
	    srcLen = dstLen;
	    break;
	}
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			chanPtr->flags |= INPUT_NEED_NL;
		    } else if (*src == '\n') {
			*dst++ = *src++;
		    } else {
			*dst++ = '\r';
		    }
		} else {
		    *dst++ = *src++;







|







4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			statePtr->flags |= INPUT_NEED_NL;
		    } else if (*src == '\n') {
			*dst++ = *src++;
		    } else {
			*dst++ = '\r';
		    }
		} else {
		    *dst++ = *src++;
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
	    CONST char *src, *srcEnd, *srcMax;

	    dst = dstStart;
	    src = srcStart;
	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    if ((chanPtr->flags & INPUT_SAW_CR) && (src < srcMax)) {
		if (*src == '\n') {
		    src++;
		}
		chanPtr->flags &= ~INPUT_SAW_CR;
	    }
	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			chanPtr->flags |= INPUT_SAW_CR;
		    } else if (*src == '\n') {
			if (srcEnd < srcMax) {
			    srcEnd++;
			}
			src++;
		    }
		    *dst++ = '\n';







|



|





|







4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
	    CONST char *src, *srcEnd, *srcMax;

	    dst = dstStart;
	    src = srcStart;
	    srcEnd = srcStart + dstLen;
	    srcMax = srcStart + *srcLenPtr;

	    if ((statePtr->flags & INPUT_SAW_CR) && (src < srcMax)) {
		if (*src == '\n') {
		    src++;
		}
		statePtr->flags &= ~INPUT_SAW_CR;
	    }
	    for ( ; src < srcEnd; ) {
		if (*src == '\r') {
		    src++;
		    if (src >= srcMax) {
			statePtr->flags |= INPUT_SAW_CR;
		    } else if (*src == '\n') {
			if (srcEnd < srcMax) {
			    srcEnd++;
			}
			src++;
		    }
		    *dst++ = '\n';
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
    if ((eof != NULL) && (srcStart + srcLen >= eof)) {
	/*
	 * EOF character was seen in EOL translated range.  Leave current
	 * file position pointing at the EOF character, but don't store the
	 * EOF character in the output string.
	 */

	chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
	chanPtr->flags &= ~(INPUT_SAW_CR | INPUT_NEED_NL);
	return 1;
    }

    *srcLenPtr = srcLen;
    return 0;
}








|
|
|







4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
    if ((eof != NULL) && (srcStart + srcLen >= eof)) {
	/*
	 * EOF character was seen in EOL translated range.  Leave current
	 * file position pointing at the EOF character, but don't store the
	 * EOF character in the output string.
	 */

	statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
	statePtr->inputEncodingFlags |= TCL_ENCODING_END;
	statePtr->flags &= ~(INPUT_SAW_CR | INPUT_NEED_NL);
	return 1;
    }

    *srcLenPtr = srcLen;
    return 0;
}

4689
4690
4691
4692
4693
4694
4695

4696
4697
4698
4699

4700






4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
    Tcl_Channel chan;		/* The channel for which to add the input. */
    char *str;			/* The input itself. */
    int len;			/* The length of the input. */
    int atEnd;			/* If non-zero, add at end of queue; otherwise
                                 * add at head of queue. */    
{
    Channel *chanPtr;		/* The real IO channel. */

    ChannelBuffer *bufPtr;	/* Buffer to contain the data. */
    int i, flags;

    chanPtr = (Channel *) chan;

    






    /*
     * CheckChannelErrors clears too many flag bits in this one case.
     */
     
    flags = chanPtr->flags;
    if (CheckChannelErrors(chanPtr, TCL_READABLE) != 0) {
	len = -1;
	goto done;
    }
    chanPtr->flags = flags;

    /*
     * If we have encountered a sticky EOF, just punt without storing.
     * (sticky EOF is set if we have seen the input eofChar, to prevent
     * reading beyond the eofChar). Otherwise, clear the EOF flags, and
     * clear the BLOCKED bit. We want to discover these conditions anew
     * in each operation.
     */

    if (chanPtr->flags & CHANNEL_STICKY_EOF) {
	goto done;
    }
    chanPtr->flags &= (~(CHANNEL_BLOCKED | CHANNEL_EOF));

    bufPtr = AllocChannelBuffer(len);
    for (i = 0; i < len; i++) {
        bufPtr->buf[i] = str[i];
    }
    bufPtr->nextAdded += len;

    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        chanPtr->inQueueHead = bufPtr;
        chanPtr->inQueueTail = bufPtr;
    } else if (atEnd) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        chanPtr->inQueueTail->nextPtr = bufPtr;
        chanPtr->inQueueTail = bufPtr;
    } else {
        bufPtr->nextPtr = chanPtr->inQueueHead;
        chanPtr->inQueueHead = bufPtr;
    }

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */







>




>
|
>
>
>
>
>
>




|
|



|









|


|







|

|
|


|
|

|
|







4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
    Tcl_Channel chan;		/* The channel for which to add the input. */
    char *str;			/* The input itself. */
    int len;			/* The length of the input. */
    int atEnd;			/* If non-zero, add at end of queue; otherwise
                                 * add at head of queue. */    
{
    Channel *chanPtr;		/* The real IO channel. */
    ChannelState *statePtr;	/* State of actual channel. */
    ChannelBuffer *bufPtr;	/* Buffer to contain the data. */
    int i, flags;

    chanPtr = (Channel *) chan;
    statePtr = chanPtr->state;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * CheckChannelErrors clears too many flag bits in this one case.
     */
     
    flags = statePtr->flags;
    if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
	len = -1;
	goto done;
    }
    statePtr->flags = flags;

    /*
     * If we have encountered a sticky EOF, just punt without storing.
     * (sticky EOF is set if we have seen the input eofChar, to prevent
     * reading beyond the eofChar). Otherwise, clear the EOF flags, and
     * clear the BLOCKED bit. We want to discover these conditions anew
     * in each operation.
     */

    if (statePtr->flags & CHANNEL_STICKY_EOF) {
	goto done;
    }
    statePtr->flags &= (~(CHANNEL_BLOCKED | CHANNEL_EOF));

    bufPtr = AllocChannelBuffer(len);
    for (i = 0; i < len; i++) {
        bufPtr->buf[i] = str[i];
    }
    bufPtr->nextAdded += len;

    if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        statePtr->inQueueHead = bufPtr;
        statePtr->inQueueTail = bufPtr;
    } else if (atEnd) {
        bufPtr->nextPtr = (ChannelBuffer *) NULL;
        statePtr->inQueueTail->nextPtr = bufPtr;
        statePtr->inQueueTail = bufPtr;
    } else {
        bufPtr->nextPtr = statePtr->inQueueHead;
        statePtr->inQueueHead = bufPtr;
    }

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */
4768
4769
4770
4771
4772
4773
4774
4775

4776




4777

4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
 */

int
Tcl_Flush(chan)
    Tcl_Channel chan;			/* The Channel to flush. */
{
    int result;				/* Of calling FlushChannel. */
    Channel *chanPtr;			/* The actual channel. */






    chanPtr = (Channel *) chan;

    if (CheckChannelErrors(chanPtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    /*
     * Force current output buffer to be output also.
     */
    
    if ((chanPtr->curOutPtr != NULL)
	    && (chanPtr->curOutPtr->nextAdded > 0)) {
        chanPtr->flags |= BUFFER_READY;
    }
    
    result = FlushChannel(NULL, chanPtr, 0);
    if (result != 0) {
        return TCL_ERROR;
    }








|
>

>
>
>
>
|
>
|






|
|
|
|







4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
 */

int
Tcl_Flush(chan)
    Tcl_Channel chan;			/* The Channel to flush. */
{
    int result;				/* Of calling FlushChannel. */
    Channel *chanPtr  = (Channel *) chan;	/* The actual channel. */
    ChannelState *statePtr = chanPtr->state;	/* State of actual channel. */

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) {
	return -1;
    }

    /*
     * Force current output buffer to be output also.
     */

    if ((statePtr->curOutPtr != NULL)
	    && (statePtr->curOutPtr->nextAdded > 0)) {
        statePtr->flags |= BUFFER_READY;
    }
    
    result = FlushChannel(NULL, chanPtr, 0);
    if (result != 0) {
        return TCL_ERROR;
    }

4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
 *	May discard input from the channel. If discardLastBuffer is zero,
 *	leaves one buffer in place for back-filling.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardInputQueued(chanPtr, discardSavedBuffers)
    Channel *chanPtr;		/* Channel on which to discard
                                 * the queued input. */
    int discardSavedBuffers;	/* If non-zero, discard all buffers including
                                 * last one. */
{
    ChannelBuffer *bufPtr, *nxtPtr;	/* Loop variables. */

    bufPtr = chanPtr->inQueueHead;
    chanPtr->inQueueHead = (ChannelBuffer *) NULL;
    chanPtr->inQueueTail = (ChannelBuffer *) NULL;
    for (; bufPtr != (ChannelBuffer *) NULL; bufPtr = nxtPtr) {
        nxtPtr = bufPtr->nextPtr;
        RecycleBuffer(chanPtr, bufPtr, discardSavedBuffers);
    }

    /*
     * If discardSavedBuffers is nonzero, must also discard any previously
     * saved buffer in the saveInBufPtr field.
     */
    
    if (discardSavedBuffers) {
        if (chanPtr->saveInBufPtr != (ChannelBuffer *) NULL) {
            ckfree((char *) chanPtr->saveInBufPtr);
            chanPtr->saveInBufPtr = (ChannelBuffer *) NULL;
        }
    }
}

/*
 *---------------------------------------------------------------------------
 *







|
|






|
|
|


|








|
|
|







4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
 *	May discard input from the channel. If discardLastBuffer is zero,
 *	leaves one buffer in place for back-filling.
 *
 *----------------------------------------------------------------------
 */

static void
DiscardInputQueued(statePtr, discardSavedBuffers)
    ChannelState *statePtr;	/* Channel on which to discard
                                 * the queued input. */
    int discardSavedBuffers;	/* If non-zero, discard all buffers including
                                 * last one. */
{
    ChannelBuffer *bufPtr, *nxtPtr;	/* Loop variables. */

    bufPtr = statePtr->inQueueHead;
    statePtr->inQueueHead = (ChannelBuffer *) NULL;
    statePtr->inQueueTail = (ChannelBuffer *) NULL;
    for (; bufPtr != (ChannelBuffer *) NULL; bufPtr = nxtPtr) {
        nxtPtr = bufPtr->nextPtr;
        RecycleBuffer(statePtr, bufPtr, discardSavedBuffers);
    }

    /*
     * If discardSavedBuffers is nonzero, must also discard any previously
     * saved buffer in the saveInBufPtr field.
     */
    
    if (discardSavedBuffers) {
        if (statePtr->saveInBufPtr != (ChannelBuffer *) NULL) {
            ckfree((char *) statePtr->saveInBufPtr);
            statePtr->saveInBufPtr = (ChannelBuffer *) NULL;
        }
    }
}

/*
 *---------------------------------------------------------------------------
 *
4865
4866
4867
4868
4869
4870
4871

4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883




























4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895













4896
4897
4898
4899
4900












4901

4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
GetInput(chanPtr)
    Channel *chanPtr;		/* Channel to read input from. */
{
    int toRead;			/* How much to read? */
    int result;			/* Of calling driver. */
    int nread;			/* How much was read from channel? */
    ChannelBuffer *bufPtr;	/* New buffer to add to input queue. */


    /*
     * Prevent reading from a dead channel -- a channel that has been closed
     * but not yet deallocated, which can happen if the exit handler for
     * channel cleanup has run but the channel is still registered in some
     * interpreter.
     */
    
    if (CheckForDeadChannel(NULL, chanPtr)) {
	return EINVAL;
    }





























    /*
     * See if we can fill an existing buffer. If we can, read only
     * as much as will fit in it. Otherwise allocate a new buffer,
     * add it to the input queue and attempt to fill it to the max.
     */

    bufPtr = chanPtr->inQueueTail;
    if ((bufPtr != NULL) && (bufPtr->nextAdded < bufPtr->bufLength)) {
        toRead = bufPtr->bufLength - bufPtr->nextAdded;
    } else {
	bufPtr = chanPtr->saveInBufPtr;
	chanPtr->saveInBufPtr = NULL;













	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(chanPtr->bufSize);
	}
        bufPtr->nextPtr = (ChannelBuffer *) NULL;













        toRead = chanPtr->bufSize;

        if (chanPtr->inQueueTail == NULL) {
            chanPtr->inQueueHead = bufPtr;
        } else {
            chanPtr->inQueueTail->nextPtr = bufPtr;
        }
        chanPtr->inQueueTail = bufPtr;
    }
      
    /*
     * If EOF is set, we should avoid calling the driver because on some
     * platforms it is impossible to read from a device after EOF.
     */

    if (chanPtr->flags & CHANNEL_EOF) {
	return 0;
    }

    nread = (*chanPtr->typePtr->inputProc)(chanPtr->instanceData,
	    bufPtr->buf + bufPtr->nextAdded, toRead, &result);

    if (nread > 0) {
	bufPtr->nextAdded += nread;

	/*
	 * If we get a short read, signal up that we may be BLOCKED. We
	 * should avoid calling the driver because on some platforms we
	 * will block in the low level reading code even though the
	 * channel is set into nonblocking mode.
	 */
            
	if (nread < toRead) {
	    chanPtr->flags |= CHANNEL_BLOCKED;
	}
    } else if (nread == 0) {
	chanPtr->flags |= CHANNEL_EOF;
	chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
    } else if (nread < 0) {
	if ((result == EWOULDBLOCK) || (result == EAGAIN)) {
	    chanPtr->flags |= CHANNEL_BLOCKED;
	    result = EAGAIN;
	}
	Tcl_SetErrno(result);
	return result;
    } 
    return 0;
}







>








|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






|

|

|
|
>
>
>
>
>
>
>
>
>
>
>
>
>

|

|

>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
|
|
|
|
|

|





|



|













|


|
|


|







4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
GetInput(chanPtr)
    Channel *chanPtr;		/* Channel to read input from. */
{
    int toRead;			/* How much to read? */
    int result;			/* Of calling driver. */
    int nread;			/* How much was read from channel? */
    ChannelBuffer *bufPtr;	/* New buffer to add to input queue. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    /*
     * Prevent reading from a dead channel -- a channel that has been closed
     * but not yet deallocated, which can happen if the exit handler for
     * channel cleanup has run but the channel is still registered in some
     * interpreter.
     */
    
    if (CheckForDeadChannel(NULL, statePtr)) {
	return EINVAL;
    }

    /*
     * First check for more buffers in the pushback area of the
     * topmost channel in the stack and use them. They can be the
     * result of a transformation which went away without reading all
     * the information placed in the area when it was stacked.
     *
     * Two possibilities for the state: No buffers in it, or a single
     * empty buffer. In the latter case we can recycle it now.
     */

    if (chanPtr->inQueueHead != (ChannelBuffer*) NULL) {
        if (statePtr->inQueueHead != (ChannelBuffer*) NULL) {
	    RecycleBuffer(statePtr, statePtr->inQueueHead, 0);
	    statePtr->inQueueHead = (ChannelBuffer*) NULL;
	}

	statePtr->inQueueHead = chanPtr->inQueueHead;
	statePtr->inQueueTail = chanPtr->inQueueTail;
	chanPtr->inQueueHead  = (ChannelBuffer*) NULL;
	chanPtr->inQueueTail  = (ChannelBuffer*) NULL;
	return 0;
    }

    /*
     * Nothing in the pushback area, fall back to the usual handling
     * (driver, etc.)
     */

    /*
     * See if we can fill an existing buffer. If we can, read only
     * as much as will fit in it. Otherwise allocate a new buffer,
     * add it to the input queue and attempt to fill it to the max.
     */

    bufPtr = statePtr->inQueueTail;
    if ((bufPtr != NULL) && (bufPtr->nextAdded < bufPtr->bufLength)) {
	toRead = bufPtr->bufLength - bufPtr->nextAdded;
    } else {
	bufPtr = statePtr->saveInBufPtr;
	statePtr->saveInBufPtr = NULL;

	/*
	 * Check the actual buffersize against the requested
	 * buffersize. Buffers which are smaller than requested aare
	 * squashed. This is done to honor dynamic changes of the
	 * buffersize made by the user.
	 */

	if ((bufPtr != NULL) && ((bufPtr->bufLength - BUFFER_PADDING) < statePtr->bufSize)) {
	  ckfree((char *) bufPtr);
	  bufPtr = NULL;
	}

	if (bufPtr == NULL) {
	    bufPtr = AllocChannelBuffer(statePtr->bufSize);
	}
	bufPtr->nextPtr = (ChannelBuffer *) NULL;

	/* SF #427196: Use the actual size of the buffer to determine
	 * the number of bytes to read from the channel and not the
	 * size for new buffers. They can be different if the
	 * buffersize was changed between reads.
	 *
	 * Note: This affects performance negatively if the buffersize
	 * was extended but this small buffer is reused for all
	 * subsequent reads. The system never uses buffers with the
	 * requested bigger size in that case. An adjunct patch could
	 * try and delete all unused buffers it encounters and which
	 * are smaller than the formally requested buffersize.
	 */

	toRead = bufPtr->bufLength - bufPtr->nextAdded;
	if (statePtr->inQueueTail == NULL) {
	    statePtr->inQueueHead = bufPtr;
	} else {
	    statePtr->inQueueTail->nextPtr = bufPtr;
	}
	statePtr->inQueueTail = bufPtr;
    }

    /*
     * If EOF is set, we should avoid calling the driver because on some
     * platforms it is impossible to read from a device after EOF.
     */

    if (statePtr->flags & CHANNEL_EOF) {
	return 0;
    }

    nread = (chanPtr->typePtr->inputProc)(chanPtr->instanceData,
	    bufPtr->buf + bufPtr->nextAdded, toRead, &result);

    if (nread > 0) {
	bufPtr->nextAdded += nread;

	/*
	 * If we get a short read, signal up that we may be BLOCKED. We
	 * should avoid calling the driver because on some platforms we
	 * will block in the low level reading code even though the
	 * channel is set into nonblocking mode.
	 */
            
	if (nread < toRead) {
	    statePtr->flags |= CHANNEL_BLOCKED;
	}
    } else if (nread == 0) {
	statePtr->flags |= CHANNEL_EOF;
	statePtr->inputEncodingFlags |= TCL_ENCODING_END;
    } else if (nread < 0) {
	if ((result == EWOULDBLOCK) || (result == EAGAIN)) {
	    statePtr->flags |= CHANNEL_BLOCKED;
	    result = EAGAIN;
	}
	Tcl_SetErrno(result);
	return result;
    } 
    return 0;
}
4966
4967
4968
4969
4970
4971
4972
4973

4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994






4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015











5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032

int
Tcl_Seek(chan, offset, mode)
    Tcl_Channel chan;		/* The channel on which to seek. */
    int offset;			/* Offset to seek to. */
    int mode;			/* Relative to which location to seek? */
{
    Channel *chanPtr;		/* The real IO channel. */

    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;			/* Of device driver operations. */
    int curPos;			/* Position on the device. */
    int wasAsync;		/* Was the channel nonblocking before the
                                 * seek operation? If so, must restore to
                                 * nonblocking mode after the seek. */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow seek on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) return -1;







    /*
     * Disallow seek on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = chanPtr->inQueueHead, inputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }











    for (bufPtr = chanPtr->outQueueHead, outputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
        outputBuffered +=
            (chanPtr->curOutPtr->nextAdded - chanPtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }








|
>








<
|










|
>
>
>
>
>
>
















|
|
|


>
>
>
>
>
>
>
>
>
>
>
|
|
|


|
|
|

|







4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837

4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904

int
Tcl_Seek(chan, offset, mode)
    Tcl_Channel chan;		/* The channel on which to seek. */
    int offset;			/* Offset to seek to. */
    int mode;			/* Relative to which location to seek? */
{
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;			/* Of device driver operations. */
    int curPos;			/* Position on the device. */
    int wasAsync;		/* Was the channel nonblocking before the
                                 * seek operation? If so, must restore to
                                 * nonblocking mode after the seek. */


    if (CheckChannelErrors(statePtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow seek on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL, statePtr)) return -1;

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * Disallow seek on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = statePtr->inQueueHead, inputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    /*
     * Don't forget the bytes in the topmost pushback area.
     */

    for (bufPtr = statePtr->topChanPtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    for (bufPtr = statePtr->outQueueHead, outputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
        outputBuffered +=
            (statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }

5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
    }

    /*
     * Discard any queued input - this input should not be read after
     * the seek.
     */

    DiscardInputQueued(chanPtr, 0);

    /*
     * Reset EOF and BLOCKED flags. We invalidate them by moving the
     * access point. Also clear CR related flags.
     */

    chanPtr->flags &=
        (~(CHANNEL_EOF | CHANNEL_STICKY_EOF | CHANNEL_BLOCKED | INPUT_SAW_CR));
    
    /*
     * If the channel is in asynchronous output mode, switch it back
     * to synchronous mode and cancel any async flush that may be
     * scheduled. After the flush, the channel will be put back into
     * asynchronous output mode.
     */

    wasAsync = 0;
    if (chanPtr->flags & CHANNEL_NONBLOCKING) {
        wasAsync = 1;
        result = 0;
        if (chanPtr->typePtr->blockModeProc != NULL) {
            result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
                    TCL_MODE_BLOCKING);
        }
        if (result != 0) {
            Tcl_SetErrno(result);
            return -1;
        }
        chanPtr->flags &= (~(CHANNEL_NONBLOCKING));
        if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
            chanPtr->flags &= (~(BG_FLUSH_SCHEDULED));
        }
    }
    
    /*
     * If the flush fails we cannot recover the original position. In
     * that case the seek is not attempted because we do not know where
     * the access position is - instead we return the error. FlushChannel







|






|










|

<
<
<
|
<
|
<
|
|
|
|
|







4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938



4939

4940

4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
    }

    /*
     * Discard any queued input - this input should not be read after
     * the seek.
     */

    DiscardInputQueued(statePtr, 0);

    /*
     * Reset EOF and BLOCKED flags. We invalidate them by moving the
     * access point. Also clear CR related flags.
     */

    statePtr->flags &=
        (~(CHANNEL_EOF | CHANNEL_STICKY_EOF | CHANNEL_BLOCKED | INPUT_SAW_CR));
    
    /*
     * If the channel is in asynchronous output mode, switch it back
     * to synchronous mode and cancel any async flush that may be
     * scheduled. After the flush, the channel will be put back into
     * asynchronous output mode.
     */

    wasAsync = 0;
    if (statePtr->flags & CHANNEL_NONBLOCKING) {
        wasAsync = 1;



        result = StackSetBlockMode(chanPtr, TCL_MODE_BLOCKING);

	if (result != 0) {

	    return -1;
	}
        statePtr->flags &= (~(CHANNEL_NONBLOCKING));
        if (statePtr->flags & BG_FLUSH_SCHEDULED) {
            statePtr->flags &= (~(BG_FLUSH_SCHEDULED));
        }
    }
    
    /*
     * If the flush fails we cannot recover the original position. In
     * that case the seek is not attempted because we do not know where
     * the access position is - instead we return the error. FlushChannel
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
     * Restore to nonblocking mode if that was the previous behavior.
     *
     * NOTE: Even if there was an async flush active we do not restore
     * it now because we already flushed all the queued output, above.
     */
    
    if (wasAsync) {
        chanPtr->flags |= CHANNEL_NONBLOCKING;
        result = 0;
        if (chanPtr->typePtr->blockModeProc != NULL) {
            result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
                    TCL_MODE_NONBLOCKING);
        }
        if (result != 0) {
            Tcl_SetErrno(result);
            return -1;
        }
    }

    return curPos;
}

/*
 *----------------------------------------------------------------------







|
<
<
<
|
<
|
<
|
|







4974
4975
4976
4977
4978
4979
4980
4981



4982

4983

4984
4985
4986
4987
4988
4989
4990
4991
4992
     * Restore to nonblocking mode if that was the previous behavior.
     *
     * NOTE: Even if there was an async flush active we do not restore
     * it now because we already flushed all the queued output, above.
     */
    
    if (wasAsync) {
        statePtr->flags |= CHANNEL_NONBLOCKING;



        result = StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING);

	if (result != 0) {

	    return -1;
	}
    }

    return curPos;
}

/*
 *----------------------------------------------------------------------
5145
5146
5147
5148
5149
5150
5151
5152

5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173






5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
 *----------------------------------------------------------------------
 */

int
Tcl_Tell(chan)
    Tcl_Channel chan;			/* The channel to return pos for. */
{
    Channel *chanPtr;			/* The actual channel to tell on. */

    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;				/* Of calling device driver. */
    int curPos;				/* Position on device. */

    chanPtr = (Channel *) chan;
    if (CheckChannelErrors(chanPtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow tell on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) {
	return -1;
    }







    /*
     * Disallow tell on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = chanPtr->inQueueHead, inputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    for (bufPtr = chanPtr->outQueueHead, outputBuffered = 0;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((chanPtr->curOutPtr != (ChannelBuffer *) NULL) &&
           (chanPtr->curOutPtr->nextAdded > chanPtr->curOutPtr->nextRemoved)) {
        chanPtr->flags |= BUFFER_READY;
        outputBuffered +=
            (chanPtr->curOutPtr->nextAdded - chanPtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }








|
>





<
|










|



>
>
>
>
>
>















|
|
|


|
|
|


|
|
|

|







5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020

5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
 *----------------------------------------------------------------------
 */

int
Tcl_Tell(chan)
    Tcl_Channel chan;			/* The channel to return pos for. */
{
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *bufPtr;
    int inputBuffered, outputBuffered;
    int result;				/* Of calling device driver. */
    int curPos;				/* Position on device. */


    if (CheckChannelErrors(statePtr, TCL_WRITABLE | TCL_READABLE) != 0) {
	return -1;
    }

    /*
     * Disallow tell on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL, statePtr)) {
	return -1;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * Disallow tell on channels whose type does not have a seek procedure
     * defined. This means that the channel does not support seeking.
     */

    if (chanPtr->typePtr->seekProc == (Tcl_DriverSeekProc *) NULL) {
        Tcl_SetErrno(EINVAL);
        return -1;
    }

    /*
     * Compute how much input and output is buffered. If both input and
     * output is buffered, cannot compute the current position.
     */

    for (bufPtr = statePtr->inQueueHead, inputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        inputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    for (bufPtr = statePtr->outQueueHead, outputBuffered = 0;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        outputBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }
    if ((statePtr->curOutPtr != (ChannelBuffer *) NULL) &&
	    (statePtr->curOutPtr->nextAdded > statePtr->curOutPtr->nextRemoved)) {
        statePtr->flags |= BUFFER_READY;
        outputBuffered +=
            (statePtr->curOutPtr->nextAdded - statePtr->curOutPtr->nextRemoved);
    }

    if ((inputBuffered != 0) && (outputBuffered != 0)) {
        Tcl_SetErrno(EFAULT);
        return -1;
    }

5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250


5251


5252
5253
5254
5255
5256
5257
5258











5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272




5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
 * Side effects:
 *	May clear the EOF and/or BLOCKED bits if reading from channel.
 *
 *---------------------------------------------------------------------------
 */
 
static int
CheckChannelErrors(chanPtr, direction)
    Channel *chanPtr;	    /* Channel to check. */
    int direction;	    /* Test if channel supports desired operation:
			     * TCL_READABLE, TCL_WRITABLE. */


{


    /*
     * Check for unreported error.
     */

    if (chanPtr->unreportedError != 0) {
        Tcl_SetErrno(chanPtr->unreportedError);
        chanPtr->unreportedError = 0;











        return -1;
    }

    /*
     * Fail if the channel is not opened for desired operation.
     */

    if ((chanPtr->flags & direction) == 0) {
        Tcl_SetErrno(EACCES);
        return -1;
    }

    /*
     * Fail if the channel is in the middle of a background copy.




     */

    if (chanPtr->csPtr != NULL) {
	Tcl_SetErrno(EBUSY);
	return -1;
    }

    if (direction == TCL_READABLE) {
	/*
	 * If we have not encountered a sticky EOF, clear the EOF bit
	 * (sticky EOF is set if we have seen the input eofChar, to prevent
	 * reading beyond the eofChar). Also, always clear the BLOCKED bit.
	 * We want to discover these conditions anew in each operation.
	 */
	
	if ((chanPtr->flags & CHANNEL_STICKY_EOF) == 0) {
	    chanPtr->flags &= ~CHANNEL_EOF;
	}
	chanPtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    }

    return 0;
}

/*
 *----------------------------------------------------------------------







|
|
|
|
>
>

>
>




|
|
|
>
>
>
>
>
>
>
>
>
>
>







|






>
>
>
>


|












|
|

|







5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
 * Side effects:
 *	May clear the EOF and/or BLOCKED bits if reading from channel.
 *
 *---------------------------------------------------------------------------
 */
 
static int
CheckChannelErrors(statePtr, flags)
    ChannelState *statePtr;	/* Channel to check. */
    int flags;			/* Test if channel supports desired operation:
				 * TCL_READABLE, TCL_WRITABLE.  Also indicates
				 * Raw read or write for special close
				 * processing*/
{
    int direction = flags & (TCL_READABLE|TCL_WRITABLE);

    /*
     * Check for unreported error.
     */

    if (statePtr->unreportedError != 0) {
        Tcl_SetErrno(statePtr->unreportedError);
        statePtr->unreportedError = 0;
        return -1;
    }

    /*
     * Only the raw read and write operations are allowed during close
     * in order to drain data from stacked channels.
     */

    if ((statePtr->flags & CHANNEL_CLOSED) &&
	    ((flags & CHANNEL_RAW_MODE) == 0)) {
        Tcl_SetErrno(EACCES);
        return -1;
    }

    /*
     * Fail if the channel is not opened for desired operation.
     */

    if ((statePtr->flags & direction) == 0) {
        Tcl_SetErrno(EACCES);
        return -1;
    }

    /*
     * Fail if the channel is in the middle of a background copy.
     *
     * Don't do this tests for raw channels here or else the chaining in the
     * transformation drivers will fail with 'file busy' error instead of
     * retrieving and transforming the data to copy.
     */

    if ((statePtr->csPtr != NULL) && ((flags & CHANNEL_RAW_MODE) == 0)) {
	Tcl_SetErrno(EBUSY);
	return -1;
    }

    if (direction == TCL_READABLE) {
	/*
	 * If we have not encountered a sticky EOF, clear the EOF bit
	 * (sticky EOF is set if we have seen the input eofChar, to prevent
	 * reading beyond the eofChar). Also, always clear the BLOCKED bit.
	 * We want to discover these conditions anew in each operation.
	 */
	
	if ((statePtr->flags & CHANNEL_STICKY_EOF) == 0) {
	    statePtr->flags &= ~CHANNEL_EOF;
	}
	statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    }

    return 0;
}

/*
 *----------------------------------------------------------------------
5310
5311
5312
5313
5314
5315
5316

5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
 *----------------------------------------------------------------------
 */

int
Tcl_Eof(chan)
    Tcl_Channel chan;			/* Does this channel have EOF? */
{

    Channel *chanPtr;		/* The real channel structure. */

    chanPtr = (Channel *) chan;
    return ((chanPtr->flags & CHANNEL_STICKY_EOF) ||
            ((chanPtr->flags & CHANNEL_EOF) && (Tcl_InputBuffered(chan) == 0)))
        ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBlocked --
 *







>
|

<
|
|
|







5197
5198
5199
5200
5201
5202
5203
5204
5205
5206

5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
 *----------------------------------------------------------------------
 */

int
Tcl_Eof(chan)
    Tcl_Channel chan;			/* Does this channel have EOF? */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */


    return ((statePtr->flags & CHANNEL_STICKY_EOF) ||
            ((statePtr->flags & CHANNEL_EOF) &&
		    (Tcl_InputBuffered(chan) == 0))) ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBlocked --
 *
5338
5339
5340
5341
5342
5343
5344

5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372


5373
5374























5375
5376

















5377




5378
5379
5380
5381
5382

5383
5384
5385
5386
5387
5388
5389
 *----------------------------------------------------------------------
 */

int
Tcl_InputBlocked(chan)
    Tcl_Channel chan;			/* Is this channel blocked? */
{

    Channel *chanPtr;		/* The real channel structure. */

    chanPtr = (Channel *) chan;
    return (chanPtr->flags & CHANNEL_BLOCKED) ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBuffered --
 *
 *	Returns the number of bytes of input currently buffered in the
 *	internal buffer of a channel.
 *
 * Results:
 *	The number of input bytes buffered, or zero if the channel is not
 *	open for reading.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_InputBuffered(chan)
    Tcl_Channel chan;			/* The channel to query. */
{


    Channel *chanPtr;
    int bytesBuffered;























    ChannelBuffer *bufPtr;


















    chanPtr = (Channel *) chan;




    for (bytesBuffered = 0, bufPtr = chanPtr->inQueueHead;
             bufPtr != (ChannelBuffer *) NULL;
             bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    return bytesBuffered;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_SetChannelBufferSize --







>
|

<
|








|















>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>

|
|


>







5225
5226
5227
5228
5229
5230
5231
5232
5233
5234

5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
 *----------------------------------------------------------------------
 */

int
Tcl_InputBlocked(chan)
    Tcl_Channel chan;			/* Is this channel blocked? */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */


    return (statePtr->flags & CHANNEL_BLOCKED) ? 1 : 0;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_InputBuffered --
 *
 *	Returns the number of bytes of input currently buffered in the
 *	common internal buffer of a channel.
 *
 * Results:
 *	The number of input bytes buffered, or zero if the channel is not
 *	open for reading.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_InputBuffered(chan)
    Tcl_Channel chan;			/* The channel to query. */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */
    ChannelBuffer *bufPtr;
    int bytesBuffered;

    for (bytesBuffered = 0, bufPtr = statePtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    /*
     * Don't forget the bytes in the topmost pushback area.
     */

    for (bufPtr = statePtr->topChanPtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    return bytesBuffered;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelBuffered --
 *
 *	Returns the number of bytes of input currently buffered in the
 *	internal buffer (push back area) of a channel.
 *
 * Results:
 *	The number of input bytes buffered, or zero if the channel is not
 *	open for reading.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ChannelBuffered(chan)
    Tcl_Channel chan;			/* The channel to query. */
{
    Channel *chanPtr = (Channel *) chan;
					/* real channel structure. */
    ChannelBuffer *bufPtr;
    int bytesBuffered;

    for (bytesBuffered = 0, bufPtr = chanPtr->inQueueHead;
	 bufPtr != (ChannelBuffer *) NULL;
	 bufPtr = bufPtr->nextPtr) {
        bytesBuffered += (bufPtr->nextAdded - bufPtr->nextRemoved);
    }

    return bytesBuffered;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_SetChannelBufferSize --
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439

void
Tcl_SetChannelBufferSize(chan, sz)
    Tcl_Channel chan;			/* The channel whose buffer size
                                         * to set. */
    int sz;				/* The size to set. */
{
    Channel *chanPtr;
    
    /*
     * If the buffer size is smaller than 10 bytes or larger than one MByte,
     * do not accept the requested size and leave the current buffer size.
     */
    
    if (sz < 10) {
        return;
    }
    if (sz > (1024 * 1024)) {
        return;
    }

    chanPtr = (Channel *) chan;
    chanPtr->bufSize = sz;

    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);
	chanPtr->outputStage = NULL;
    }
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *)
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelBufferSize --







|













|
|

|
|
|

|
|
|







5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373

void
Tcl_SetChannelBufferSize(chan, sz)
    Tcl_Channel chan;			/* The channel whose buffer size
                                         * to set. */
    int sz;				/* The size to set. */
{
    ChannelState *statePtr;		/* State of real channel structure. */
    
    /*
     * If the buffer size is smaller than 10 bytes or larger than one MByte,
     * do not accept the requested size and leave the current buffer size.
     */
    
    if (sz < 10) {
        return;
    }
    if (sz > (1024 * 1024)) {
        return;
    }

    statePtr = ((Channel *) chan)->state;
    statePtr->bufSize = sz;

    if (statePtr->outputStage != NULL) {
	ckfree((char *) statePtr->outputStage);
	statePtr->outputStage = NULL;
    }
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *)
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetChannelBufferSize --
5450
5451
5452
5453
5454
5455
5456
5457

5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
 */

int
Tcl_GetChannelBufferSize(chan)
    Tcl_Channel chan;		/* The channel for which to find the
                                 * buffer size. */
{
    Channel *chanPtr;


    chanPtr = (Channel *) chan;
    return chanPtr->bufSize;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_BadChannelOption --
 *







|
>

<
|







5384
5385
5386
5387
5388
5389
5390
5391
5392
5393

5394
5395
5396
5397
5398
5399
5400
5401
 */

int
Tcl_GetChannelBufferSize(chan)
    Tcl_Channel chan;		/* The channel for which to find the
                                 * buffer size. */
{
    ChannelState *statePtr = ((Channel *) chan)->state;
					/* State of real channel structure. */


    return statePtr->bufSize;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_BadChannelOption --
 *
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
					 * to the standard generic options.
					 * can be NULL for generic options 
					 * only.
					 */
{
    if (interp) {
	CONST char *genericopt = 
	    	"blocking buffering buffersize encoding eofchar translation";
	char **argv;
	int  argc, i;
	Tcl_DString ds;

	Tcl_DStringInit(&ds);
	Tcl_DStringAppend(&ds, (char *) genericopt, -1);
	if (optionList && (*optionList)) {
	    Tcl_DStringAppend(&ds, " ", 1);
	    Tcl_DStringAppend(&ds, optionList, -1);
	}
	if (Tcl_SplitList(interp, Tcl_DStringValue(&ds), 
	      	  &argc, &argv) != TCL_OK) {
	    panic("malformed option list in channel driver");
	}
	Tcl_ResetResult(interp);
	Tcl_AppendResult(interp, "bad option \"", optionName, 
		 "\": should be one of ", (char *) NULL);
	argc--;
	for (i = 0; i < argc; i++) {
	    Tcl_AppendResult(interp, "-", argv[i], ", ", (char *) NULL);
	}
	Tcl_AppendResult(interp, "or -", argv[i], (char *) NULL);
	Tcl_DStringFree(&ds);
	ckfree((char *) argv);







|











|




|







5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
					 * to the standard generic options.
					 * can be NULL for generic options 
					 * only.
					 */
{
    if (interp) {
	CONST char *genericopt = 
	    "blocking buffering buffersize encoding eofchar translation";
	char **argv;
	int  argc, i;
	Tcl_DString ds;

	Tcl_DStringInit(&ds);
	Tcl_DStringAppend(&ds, (char *) genericopt, -1);
	if (optionList && (*optionList)) {
	    Tcl_DStringAppend(&ds, " ", 1);
	    Tcl_DStringAppend(&ds, optionList, -1);
	}
	if (Tcl_SplitList(interp, Tcl_DStringValue(&ds), 
		&argc, &argv) != TCL_OK) {
	    panic("malformed option list in channel driver");
	}
	Tcl_ResetResult(interp);
	Tcl_AppendResult(interp, "bad option \"", optionName, 
		"\": should be one of ", (char *) NULL);
	argc--;
	for (i = 0; i < argc; i++) {
	    Tcl_AppendResult(interp, "-", argv[i], ", ", (char *) NULL);
	}
	Tcl_AppendResult(interp, "or -", argv[i], (char *) NULL);
	Tcl_DStringFree(&ds);
	ckfree((char *) argv);
5556
5557
5558
5559
5560
5561
5562

5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586






















5587
5588
5589
5590
5591
5592
5593
    Tcl_Channel chan;		/* Channel on which to get option. */
    char *optionName;		/* Option to get. */
    Tcl_DString *dsPtr;		/* Where to store value(s). */
{
    size_t len;			/* Length of optionName string. */
    char optionVal[128];	/* Buffer for sprintf. */
    Channel *chanPtr = (Channel *) chan;

    int flags;

    /*
     * If we are in the middle of a background copy, use the saved flags.
     */

    if (chanPtr->csPtr) {
	if (chanPtr == chanPtr->csPtr->readPtr) {
	    flags = chanPtr->csPtr->readFlags;
	} else {
	    flags = chanPtr->csPtr->writeFlags;
	}
    } else {
	flags = chanPtr->flags;
    }

    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(interp,chanPtr)) return TCL_ERROR;























    /*
     * If the optionName is NULL it means that we want a list of all
     * options and values.
     */
    
    if (optionName == (char *) NULL) {







>


<
<
<
<
<
<
<
<
<
<
<
<
<
<







|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







5490
5491
5492
5493
5494
5495
5496
5497
5498
5499














5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
    Tcl_Channel chan;		/* Channel on which to get option. */
    char *optionName;		/* Option to get. */
    Tcl_DString *dsPtr;		/* Where to store value(s). */
{
    size_t len;			/* Length of optionName string. */
    char optionVal[128];	/* Buffer for sprintf. */
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int flags;















    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(interp, statePtr)) {
	return TCL_ERROR;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    /*
     * If we are in the middle of a background copy, use the saved flags.
     */

    if (statePtr->csPtr) {
	if (chanPtr == statePtr->csPtr->readPtr) {
	    flags = statePtr->csPtr->readFlags;
	} else {
	    flags = statePtr->csPtr->writeFlags;
	}
    } else {
	flags = statePtr->flags;
    }

    /*
     * If the optionName is NULL it means that we want a list of all
     * options and values.
     */
    
    if (optionName == (char *) NULL) {
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
        }
    }
    if ((len == 0) || ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-buffersize");
        }
        TclFormatInt(optionVal, chanPtr->bufSize);
        Tcl_DStringAppendElement(dsPtr, optionVal);
        if (len > 0) {
            return TCL_OK;
        }
    }
    if ((len == 0) ||
	    ((len > 2) && (optionName[1] == 'e') &&
		    (strncmp(optionName, "-encoding", len) == 0))) {
	if (len == 0) {
	    Tcl_DStringAppendElement(dsPtr, "-encoding");
	}
	if (chanPtr->encoding == NULL) {
	    Tcl_DStringAppendElement(dsPtr, "binary");
	} else {
	    Tcl_DStringAppendElement(dsPtr,
		    Tcl_GetEncodingName(chanPtr->encoding));
	}
	if (len > 0) {
	    return TCL_OK;
	}
    }
    if ((len == 0) ||
            ((len > 2) && (optionName[1] == 'e') &&
                    (strncmp(optionName, "-eofchar", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-eofchar");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (chanPtr->inEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", chanPtr->inEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if (flags & TCL_WRITABLE) {
            if (chanPtr->outEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", chanPtr->outEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }







|











|



|
















|




|




|




|







5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
        }
    }
    if ((len == 0) || ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-buffersize");
        }
        TclFormatInt(optionVal, statePtr->bufSize);
        Tcl_DStringAppendElement(dsPtr, optionVal);
        if (len > 0) {
            return TCL_OK;
        }
    }
    if ((len == 0) ||
	    ((len > 2) && (optionName[1] == 'e') &&
		    (strncmp(optionName, "-encoding", len) == 0))) {
	if (len == 0) {
	    Tcl_DStringAppendElement(dsPtr, "-encoding");
	}
	if (statePtr->encoding == NULL) {
	    Tcl_DStringAppendElement(dsPtr, "binary");
	} else {
	    Tcl_DStringAppendElement(dsPtr,
		    Tcl_GetEncodingName(statePtr->encoding));
	}
	if (len > 0) {
	    return TCL_OK;
	}
    }
    if ((len == 0) ||
            ((len > 2) && (optionName[1] == 'e') &&
                    (strncmp(optionName, "-eofchar", len) == 0))) {
        if (len == 0) {
            Tcl_DStringAppendElement(dsPtr, "-eofchar");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (statePtr->inEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", statePtr->inEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if (flags & TCL_WRITABLE) {
            if (statePtr->outEofChar == 0) {
                Tcl_DStringAppendElement(dsPtr, "");
            } else {
                char buf[4];

                sprintf(buf, "%c", statePtr->outEofChar);
                Tcl_DStringAppendElement(dsPtr, buf);
            }
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
            Tcl_DStringAppendElement(dsPtr, "-translation");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (chanPtr->inputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if (flags & TCL_WRITABLE) {
            if (chanPtr->outputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }
        if (len > 0) {
            return TCL_OK;
        }
    }
    if (chanPtr->typePtr->getOptionProc != (Tcl_DriverGetOptionProc *) NULL) {
	/*
	 * let the driver specific handle additional options
	 * and result code and message.
	 */

        return (chanPtr->typePtr->getOptionProc) (chanPtr->instanceData,
		  interp, optionName, dsPtr);
    } else {
	/*
	 * no driver specific options case.
	 */

        if (len == 0) {
            return TCL_OK;







|

|

|






|

|

|




















|







5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
            Tcl_DStringAppendElement(dsPtr, "-translation");
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringStartSublist(dsPtr);
        }
        if (flags & TCL_READABLE) {
            if (statePtr->inputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (statePtr->inputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (statePtr->inputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if (flags & TCL_WRITABLE) {
            if (statePtr->outputTranslation == TCL_TRANSLATE_AUTO) {
                Tcl_DStringAppendElement(dsPtr, "auto");
            } else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
                Tcl_DStringAppendElement(dsPtr, "cr");
            } else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
                Tcl_DStringAppendElement(dsPtr, "crlf");
            } else {
                Tcl_DStringAppendElement(dsPtr, "lf");
            }
        }
        if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
                (TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
            Tcl_DStringEndSublist(dsPtr);
        }
        if (len > 0) {
            return TCL_OK;
        }
    }
    if (chanPtr->typePtr->getOptionProc != (Tcl_DriverGetOptionProc *) NULL) {
	/*
	 * let the driver specific handle additional options
	 * and result code and message.
	 */

        return (chanPtr->typePtr->getOptionProc) (chanPtr->instanceData,
		interp, optionName, dsPtr);
    } else {
	/*
	 * no driver specific options case.
	 */

        if (len == 0) {
            return TCL_OK;
5769
5770
5771
5772
5773
5774
5775
5776

5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804

5805







5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
Tcl_SetChannelOption(interp, chan, optionName, newValue)
    Tcl_Interp *interp;		/* For error reporting - can be NULL. */
    Tcl_Channel chan;		/* Channel on which to set mode. */
    char *optionName;		/* Which option to set? */
    char *newValue;		/* New value for option. */
{
    int newMode;		/* New (numeric) mode to sert. */
    Channel *chanPtr;		/* The real IO channel. */

    size_t len;			/* Length of optionName string. */
    int argc;
    char **argv;
    
    chanPtr = (Channel *) chan;

    /*
     * If the channel is in the middle of a background copy, fail.
     */

    if (chanPtr->csPtr) {
	if (interp) {
	    Tcl_AppendResult(interp,
	         "unable to set channel options: background copy in progress",
		 (char *) NULL);
	}
        return TCL_ERROR;
    }


    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL,chanPtr)) return TCL_ERROR;

    







    len = strlen(optionName);

    if ((len > 2) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-blocking", len) == 0)) {
        if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (newMode) {
            newMode = TCL_MODE_BLOCKING;
        } else {
            newMode = TCL_MODE_NONBLOCKING;
        }
	return SetBlockMode(interp, chanPtr, newMode);
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffering", len) == 0)) {
        len = strlen(newValue);
        if ((newValue[0] == 'f') && (strncmp(newValue, "full", len) == 0)) {
            chanPtr->flags &=
                (~(CHANNEL_UNBUFFERED|CHANNEL_LINEBUFFERED));
        } else if ((newValue[0] == 'l') &&
                (strncmp(newValue, "line", len) == 0)) {
            chanPtr->flags &= (~(CHANNEL_UNBUFFERED));
            chanPtr->flags |= CHANNEL_LINEBUFFERED;
        } else if ((newValue[0] == 'n') &&
                (strncmp(newValue, "none", len) == 0)) {
            chanPtr->flags &= (~(CHANNEL_LINEBUFFERED));
            chanPtr->flags |= CHANNEL_UNBUFFERED;
        } else {
            if (interp) {
                Tcl_AppendResult(interp, "bad value for -buffering: ",
                        "must be one of full, line, or none",
                        (char *) NULL);
                return TCL_ERROR;
            }
        }
	return TCL_OK;
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0)) {
        chanPtr->bufSize = atoi(newValue);	/* INTL: "C", UTF safe. */
        if ((chanPtr->bufSize < 10) || (chanPtr->bufSize > (1024 * 1024))) {
            chanPtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
        }
    } else if ((len > 2) && (optionName[1] == 'e') &&
	    (strncmp(optionName, "-encoding", len) == 0)) {
	Tcl_Encoding encoding;

	if ((newValue[0] == '\0') || (strcmp(newValue, "binary") == 0)) {
	    encoding = NULL;
	} else {
	    encoding = Tcl_GetEncoding(interp, newValue);
	    if (encoding == NULL) {
		return TCL_ERROR;
	    }
	}
	Tcl_FreeEncoding(chanPtr->encoding);
	chanPtr->encoding = encoding;
	chanPtr->inputEncodingState = NULL;
	chanPtr->inputEncodingFlags = TCL_ENCODING_START;
	chanPtr->outputEncodingState = NULL;
	chanPtr->outputEncodingFlags = TCL_ENCODING_START;
	chanPtr->flags &= ~CHANNEL_NEED_MORE_DATA;
	UpdateInterest(chanPtr);
    } else if ((len > 2) && (optionName[1] == 'e') &&
            (strncmp(optionName, "-eofchar", len) == 0)) {
        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (argc == 0) {
            chanPtr->inEofChar = 0;
            chanPtr->outEofChar = 0;
        } else if (argc == 1) {
            if (chanPtr->flags & TCL_WRITABLE) {
                chanPtr->outEofChar = (int) argv[0][0];
            }
            if (chanPtr->flags & TCL_READABLE) {
                chanPtr->inEofChar = (int) argv[0][0];
            }
        } else if (argc != 2) {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -eofchar: should be a list of one or",
                        " two elements", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
        } else {
            if (chanPtr->flags & TCL_READABLE) {
                chanPtr->inEofChar = (int) argv[0][0];
            }
            if (chanPtr->flags & TCL_WRITABLE) {
                chanPtr->outEofChar = (int) argv[1][0];
            }
        }
        if (argv != (char **) NULL) {
            ckfree((char *) argv);
        }
	return TCL_OK;
    } else if ((len > 1) && (optionName[1] == 't') &&
            (strncmp(optionName, "-translation", len) == 0)) {
	char *readMode, *writeMode;

        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }

        if (argc == 1) {
	    readMode = (chanPtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (chanPtr->flags & TCL_WRITABLE) ? argv[0] : NULL;
	} else if (argc == 2) {
	    readMode = (chanPtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (chanPtr->flags & TCL_WRITABLE) ? argv[1] : NULL;
	} else {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -translation: must be a one or two",
                        " element list", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
	}

	if (readMode) {
	    if (*readMode == '\0') {
		newMode = chanPtr->inputTranslation;
	    } else if (strcmp(readMode, "auto") == 0) {
		newMode = TCL_TRANSLATE_AUTO;
	    } else if (strcmp(readMode, "binary") == 0) {
		newMode = TCL_TRANSLATE_LF;
		chanPtr->inEofChar = 0;
		Tcl_FreeEncoding(chanPtr->encoding);		    
		chanPtr->encoding = NULL;
	    } else if (strcmp(readMode, "lf") == 0) {
		newMode = TCL_TRANSLATE_LF;
	    } else if (strcmp(readMode, "cr") == 0) {
		newMode = TCL_TRANSLATE_CR;
	    } else if (strcmp(readMode, "crlf") == 0) {
		newMode = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(readMode, "platform") == 0) {







|
>



<
<





|


|
|



<








|
>
|
>
>
>
>
>
>
>

















|



|
|


|
|











|
|
|













|
|
|
|
|
|
|







|
|

|
|

|
|










|
|

|
|















|
|

|
|












|




|
|
|







5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723


5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736

5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
Tcl_SetChannelOption(interp, chan, optionName, newValue)
    Tcl_Interp *interp;		/* For error reporting - can be NULL. */
    Tcl_Channel chan;		/* Channel on which to set mode. */
    char *optionName;		/* Which option to set? */
    char *newValue;		/* New value for option. */
{
    int newMode;		/* New (numeric) mode to sert. */
    Channel *chanPtr = (Channel *) chan;	/* The real IO channel. */
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    size_t len;			/* Length of optionName string. */
    int argc;
    char **argv;



    /*
     * If the channel is in the middle of a background copy, fail.
     */

    if (statePtr->csPtr) {
	if (interp) {
	    Tcl_AppendResult(interp,
		    "unable to set channel options: background copy in progress",
		    (char *) NULL);
	}
        return TCL_ERROR;
    }


    /*
     * Disallow options on dead channels -- channels that have been closed but
     * not yet been deallocated. Such channels can be found if the exit
     * handler for channel cleanup has run but the channel is still
     * registered in an interpreter.
     */

    if (CheckForDeadChannel(NULL, statePtr)) {
	return TCL_ERROR;
    }

    /*
     * This operation should occur at the top of a channel stack.
     */

    chanPtr = statePtr->topChanPtr;

    len = strlen(optionName);

    if ((len > 2) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-blocking", len) == 0)) {
        if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (newMode) {
            newMode = TCL_MODE_BLOCKING;
        } else {
            newMode = TCL_MODE_NONBLOCKING;
        }
	return SetBlockMode(interp, chanPtr, newMode);
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffering", len) == 0)) {
        len = strlen(newValue);
        if ((newValue[0] == 'f') && (strncmp(newValue, "full", len) == 0)) {
            statePtr->flags &=
                (~(CHANNEL_UNBUFFERED|CHANNEL_LINEBUFFERED));
        } else if ((newValue[0] == 'l') &&
                (strncmp(newValue, "line", len) == 0)) {
            statePtr->flags &= (~(CHANNEL_UNBUFFERED));
            statePtr->flags |= CHANNEL_LINEBUFFERED;
        } else if ((newValue[0] == 'n') &&
                (strncmp(newValue, "none", len) == 0)) {
            statePtr->flags &= (~(CHANNEL_LINEBUFFERED));
            statePtr->flags |= CHANNEL_UNBUFFERED;
        } else {
            if (interp) {
                Tcl_AppendResult(interp, "bad value for -buffering: ",
                        "must be one of full, line, or none",
                        (char *) NULL);
                return TCL_ERROR;
            }
        }
	return TCL_OK;
    } else if ((len > 7) && (optionName[1] == 'b') &&
            (strncmp(optionName, "-buffersize", len) == 0)) {
        statePtr->bufSize = atoi(newValue);	/* INTL: "C", UTF safe. */
        if ((statePtr->bufSize < 10) || (statePtr->bufSize > (1024 * 1024))) {
            statePtr->bufSize = CHANNELBUFFER_DEFAULT_SIZE;
        }
    } else if ((len > 2) && (optionName[1] == 'e') &&
	    (strncmp(optionName, "-encoding", len) == 0)) {
	Tcl_Encoding encoding;

	if ((newValue[0] == '\0') || (strcmp(newValue, "binary") == 0)) {
	    encoding = NULL;
	} else {
	    encoding = Tcl_GetEncoding(interp, newValue);
	    if (encoding == NULL) {
		return TCL_ERROR;
	    }
	}
	Tcl_FreeEncoding(statePtr->encoding);
	statePtr->encoding = encoding;
	statePtr->inputEncodingState = NULL;
	statePtr->inputEncodingFlags = TCL_ENCODING_START;
	statePtr->outputEncodingState = NULL;
	statePtr->outputEncodingFlags = TCL_ENCODING_START;
	statePtr->flags &= ~CHANNEL_NEED_MORE_DATA;
	UpdateInterest(chanPtr);
    } else if ((len > 2) && (optionName[1] == 'e') &&
            (strncmp(optionName, "-eofchar", len) == 0)) {
        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (argc == 0) {
            statePtr->inEofChar = 0;
            statePtr->outEofChar = 0;
        } else if (argc == 1) {
            if (statePtr->flags & TCL_WRITABLE) {
                statePtr->outEofChar = (int) argv[0][0];
            }
            if (statePtr->flags & TCL_READABLE) {
                statePtr->inEofChar = (int) argv[0][0];
            }
        } else if (argc != 2) {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -eofchar: should be a list of one or",
                        " two elements", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
        } else {
            if (statePtr->flags & TCL_READABLE) {
                statePtr->inEofChar = (int) argv[0][0];
            }
            if (statePtr->flags & TCL_WRITABLE) {
                statePtr->outEofChar = (int) argv[1][0];
            }
        }
        if (argv != (char **) NULL) {
            ckfree((char *) argv);
        }
	return TCL_OK;
    } else if ((len > 1) && (optionName[1] == 't') &&
            (strncmp(optionName, "-translation", len) == 0)) {
	char *readMode, *writeMode;

        if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
            return TCL_ERROR;
        }

        if (argc == 1) {
	    readMode = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (statePtr->flags & TCL_WRITABLE) ? argv[0] : NULL;
	} else if (argc == 2) {
	    readMode = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
	    writeMode = (statePtr->flags & TCL_WRITABLE) ? argv[1] : NULL;
	} else {
            if (interp) {
                Tcl_AppendResult(interp,
                        "bad value for -translation: must be a one or two",
                        " element list", (char *) NULL);
            }
            ckfree((char *) argv);
            return TCL_ERROR;
	}

	if (readMode) {
	    if (*readMode == '\0') {
		newMode = statePtr->inputTranslation;
	    } else if (strcmp(readMode, "auto") == 0) {
		newMode = TCL_TRANSLATE_AUTO;
	    } else if (strcmp(readMode, "binary") == 0) {
		newMode = TCL_TRANSLATE_LF;
		statePtr->inEofChar = 0;
		Tcl_FreeEncoding(statePtr->encoding);		    
		statePtr->encoding = NULL;
	    } else if (strcmp(readMode, "lf") == 0) {
		newMode = TCL_TRANSLATE_LF;
	    } else if (strcmp(readMode, "cr") == 0) {
		newMode = TCL_TRANSLATE_CR;
	    } else if (strcmp(readMode, "crlf") == 0) {
		newMode = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(readMode, "platform") == 0) {
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004

	    /*
	     * Reset the EOL flags since we need to look at any buffered
	     * data to see if the new translation mode allows us to
	     * complete the line.
	     */

	    if (newMode != chanPtr->inputTranslation) {
		chanPtr->inputTranslation = (Tcl_EolTranslation) newMode;
		chanPtr->flags &= ~(INPUT_SAW_CR);
		chanPtr->flags &= ~(CHANNEL_NEED_MORE_DATA);
		UpdateInterest(chanPtr);
	    }
	}
	if (writeMode) {
	    if (*writeMode == '\0') {
		/* Do nothing. */
	    } else if (strcmp(writeMode, "auto") == 0) {
		/*
		 * This is a hack to get TCP sockets to produce output
		 * in CRLF mode if they are being set into AUTO mode.
		 * A better solution for achieving this effect will be
		 * coded later.
		 */

		if (strcmp(chanPtr->typePtr->typeName, "tcp") == 0) {
		    chanPtr->outputTranslation = TCL_TRANSLATE_CRLF;
		} else {
		    chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
		}
	    } else if (strcmp(writeMode, "binary") == 0) {
		chanPtr->outEofChar = 0;
		chanPtr->outputTranslation = TCL_TRANSLATE_LF;
		Tcl_FreeEncoding(chanPtr->encoding);		    
		chanPtr->encoding = NULL;
	    } else if (strcmp(writeMode, "lf") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_LF;
	    } else if (strcmp(writeMode, "cr") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_CR;
	    } else if (strcmp(writeMode, "crlf") == 0) {
		chanPtr->outputTranslation = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(writeMode, "platform") == 0) {
		chanPtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
	    } else {
		if (interp) {
		    Tcl_AppendResult(interp,
			    "bad value for -translation: ",
			    "must be one of auto, binary, cr, lf, crlf,",
			    " or platform", (char *) NULL);
		}







|
|
|
|














|
|

|


|
|
|
|

|

|

|

|







5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953

	    /*
	     * Reset the EOL flags since we need to look at any buffered
	     * data to see if the new translation mode allows us to
	     * complete the line.
	     */

	    if (newMode != statePtr->inputTranslation) {
		statePtr->inputTranslation = (Tcl_EolTranslation) newMode;
		statePtr->flags &= ~(INPUT_SAW_CR);
		statePtr->flags &= ~(CHANNEL_NEED_MORE_DATA);
		UpdateInterest(chanPtr);
	    }
	}
	if (writeMode) {
	    if (*writeMode == '\0') {
		/* Do nothing. */
	    } else if (strcmp(writeMode, "auto") == 0) {
		/*
		 * This is a hack to get TCP sockets to produce output
		 * in CRLF mode if they are being set into AUTO mode.
		 * A better solution for achieving this effect will be
		 * coded later.
		 */

		if (strcmp(Tcl_ChannelName(chanPtr->typePtr), "tcp") == 0) {
		    statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
		} else {
		    statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
		}
	    } else if (strcmp(writeMode, "binary") == 0) {
		statePtr->outEofChar = 0;
		statePtr->outputTranslation = TCL_TRANSLATE_LF;
		Tcl_FreeEncoding(statePtr->encoding);		    
		statePtr->encoding = NULL;
	    } else if (strcmp(writeMode, "lf") == 0) {
		statePtr->outputTranslation = TCL_TRANSLATE_LF;
	    } else if (strcmp(writeMode, "cr") == 0) {
		statePtr->outputTranslation = TCL_TRANSLATE_CR;
	    } else if (strcmp(writeMode, "crlf") == 0) {
		statePtr->outputTranslation = TCL_TRANSLATE_CRLF;
	    } else if (strcmp(writeMode, "platform") == 0) {
		statePtr->outputTranslation = TCL_PLATFORM_TRANSLATION;
	    } else {
		if (interp) {
		    Tcl_AppendResult(interp,
			    "bad value for -translation: ",
			    "must be one of auto, binary, cr, lf, crlf,",
			    " or platform", (char *) NULL);
		}
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
	return Tcl_BadChannelOption(interp, optionName, (char *) NULL);
    }

    /*
     * If bufsize changes, need to get rid of old utility buffer.
     */

    if (chanPtr->saveInBufPtr != NULL) {
	RecycleBuffer(chanPtr, chanPtr->saveInBufPtr, 1);
	chanPtr->saveInBufPtr = NULL;
    }
    if (chanPtr->inQueueHead != NULL) {
	if ((chanPtr->inQueueHead->nextPtr == NULL)
		&& (chanPtr->inQueueHead->nextAdded ==
			chanPtr->inQueueHead->nextRemoved)) {
	    RecycleBuffer(chanPtr, chanPtr->inQueueHead, 1);
	    chanPtr->inQueueHead = NULL;
	    chanPtr->inQueueTail = NULL;
	}
    }

    /*
     * If encoding or bufsize changes, need to update output staging buffer.
     */

    if (chanPtr->outputStage != NULL) {
	ckfree((char *) chanPtr->outputStage);
	chanPtr->outputStage = NULL;
    }
    if ((chanPtr->encoding != NULL) && (chanPtr->flags & TCL_WRITABLE)) {
	chanPtr->outputStage = (char *) 
		ckalloc((unsigned) (chanPtr->bufSize + 2));
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *







|
|
|

|
|
|
|
|
|
|







|
|
|

|
|
|







5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
	return Tcl_BadChannelOption(interp, optionName, (char *) NULL);
    }

    /*
     * If bufsize changes, need to get rid of old utility buffer.
     */

    if (statePtr->saveInBufPtr != NULL) {
	RecycleBuffer(statePtr, statePtr->saveInBufPtr, 1);
	statePtr->saveInBufPtr = NULL;
    }
    if (statePtr->inQueueHead != NULL) {
	if ((statePtr->inQueueHead->nextPtr == NULL)
		&& (statePtr->inQueueHead->nextAdded ==
			statePtr->inQueueHead->nextRemoved)) {
	    RecycleBuffer(statePtr, statePtr->inQueueHead, 1);
	    statePtr->inQueueHead = NULL;
	    statePtr->inQueueTail = NULL;
	}
    }

    /*
     * If encoding or bufsize changes, need to update output staging buffer.
     */

    if (statePtr->outputStage != NULL) {
	ckfree((char *) statePtr->outputStage);
	statePtr->outputStage = NULL;
    }
    if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) {
	statePtr->outputStage = (char *) 
	    ckalloc((unsigned) (statePtr->bufSize + 2));
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
6069
6070
6071
6072
6073
6074
6075

6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
 */

static void
CleanupChannelHandlers(interp, chanPtr)
    Tcl_Interp *interp;
    Channel *chanPtr;
{

    EventScriptRecord *sPtr, *prevPtr, *nextPtr;

    /*
     * Remove fileevent records on this channel that refer to the
     * given interpreter.
     */
    
    for (sPtr = chanPtr->scriptRecordPtr,
             prevPtr = (EventScriptRecord *) NULL;
             sPtr != (EventScriptRecord *) NULL;
             sPtr = nextPtr) {
        nextPtr = sPtr->nextPtr;
        if (sPtr->interp == interp) {
            if (prevPtr == (EventScriptRecord *) NULL) {
                chanPtr->scriptRecordPtr = nextPtr;
            } else {
                prevPtr->nextPtr = nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) sPtr);

	    Tcl_DecrRefCount(sPtr->scriptPtr);
            ckfree((char *) sPtr);
        } else {
            prevPtr = sPtr;
        }
    }







>







|

|
|



|





|







6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
 */

static void
CleanupChannelHandlers(interp, chanPtr)
    Tcl_Interp *interp;
    Channel *chanPtr;
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *sPtr, *prevPtr, *nextPtr;

    /*
     * Remove fileevent records on this channel that refer to the
     * given interpreter.
     */
    
    for (sPtr = statePtr->scriptRecordPtr,
             prevPtr = (EventScriptRecord *) NULL;
	 sPtr != (EventScriptRecord *) NULL;
	 sPtr = nextPtr) {
        nextPtr = sPtr->nextPtr;
        if (sPtr->interp == interp) {
            if (prevPtr == (EventScriptRecord *) NULL) {
                statePtr->scriptRecordPtr = nextPtr;
            } else {
                prevPtr->nextPtr = nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    TclChannelEventScriptInvoker, (ClientData) sPtr);

	    Tcl_DecrRefCount(sPtr->scriptPtr);
            ckfree((char *) sPtr);
        } else {
            prevPtr = sPtr;
        }
    }
6126
6127
6128
6129
6130
6131
6132

6133
6134
6135


6136











6137


















6138
6139


6140


6141












6142
6143
6144
6145

6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
Tcl_NotifyChannel(channel, mask)
    Tcl_Channel channel;	/* Channel that detected an event. */
    int mask;			/* OR'ed combination of TCL_READABLE,
				 * TCL_WRITABLE, or TCL_EXCEPTION: indicates
				 * which events were detected. */
{
    Channel *chanPtr = (Channel *) channel;

    ChannelHandler *chPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler nh;














    /* Walk all channels in a stack ! and notify them in order.


















     */



    while (chanPtr !=  (Channel *) NULL) {


        /*












	 * Preserve the channel struct in case the script closes it.
	 */
     
        Tcl_Preserve((ClientData) channel);


	/*
	 * If we are flushing in the background, be sure to call FlushChannel
	 * for writable events.  Note that we have to discard the writable
	 * event so we don't call any write handlers before the flush is
	 * complete.
	 */

	if ((chanPtr->flags & BG_FLUSH_SCHEDULED) && (mask & TCL_WRITABLE)) {
	    FlushChannel(NULL, chanPtr, 1);
	    mask &= ~TCL_WRITABLE;
	}

	/*
	 * Add this invocation to the list of recursive invocations of
	 * ChannelHandlerEventProc.
	 */
    
	nh.nextHandlerPtr = (ChannelHandler *) NULL;
	nh.nestedHandlerPtr = tsdPtr->nestedHandlerPtr;
	tsdPtr->nestedHandlerPtr = &nh;
    
	for (chPtr = chanPtr->chPtr; chPtr != (ChannelHandler *) NULL; ) {

	    /*
	     * If this channel handler is interested in any of the events that
	     * have occurred on the channel, invoke its procedure.
	     */
        
	  if ((chPtr->mask & mask) != 0) {
              nh.nextHandlerPtr = chPtr->nextPtr;
	      (*(chPtr->proc))(chPtr->clientData, mask);
	      chPtr = nh.nextHandlerPtr;
	  } else {
              chPtr = chPtr->nextPtr;
	  }
	}

	/*
	 * Update the notifier interest, since it may have changed after
	 * invoking event handlers. Skip that if the channel was deleted
	 * in the call to the channel handler.
	 */

	if (chanPtr->typePtr != NULL) {
	    UpdateInterest(chanPtr);

	    /* Walk down the stack.
	     */
	  chanPtr = chanPtr-> supercedes;
	} else {
	    /* Stop walking the chain, the whole stack was destroyed!
	     */
	    chanPtr = (Channel*) NULL;
	}

	Tcl_Release((ClientData) channel);

	tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;

	channel = (Tcl_Channel) chanPtr;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * UpdateInterest --
 *







>



>
>

>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
|

|
>

|
|
|
|
|
|

|
|
|
|

|
|
|
|

|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|

|
|
|
|
|

|
|
|
<
<
<
<
<
<
<
|
|
|

|
<
<
<







6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191







6192
6193
6194
6195
6196



6197
6198
6199
6200
6201
6202
6203
Tcl_NotifyChannel(channel, mask)
    Tcl_Channel channel;	/* Channel that detected an event. */
    int mask;			/* OR'ed combination of TCL_READABLE,
				 * TCL_WRITABLE, or TCL_EXCEPTION: indicates
				 * which events were detected. */
{
    Channel *chanPtr = (Channel *) channel;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelHandler *chPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler nh;
    Channel* upChanPtr;
    Tcl_ChannelType* upTypePtr;

    /*
     * In contrast to the other API functions this procedure walks towards
     * the top of a stack and not down from it.
     *
     * The channel calling this procedure is the one who generated the event,
     * and thus does not take part in handling it. IOW, its HandlerProc is
     * not called, instead we begin with the channel above it.
     *
     * This behaviour also allows the transformation channels to
     * generate their own events and pass them upward.
     */

    while (mask && (chanPtr->upChanPtr != ((Channel*) NULL))) {
        upChanPtr = chanPtr->upChanPtr;
	upTypePtr = upChanPtr->typePtr;

	if ((Tcl_ChannelVersion(upTypePtr) == TCL_CHANNEL_VERSION_2) &&
		(Tcl_ChannelHandlerProc(upTypePtr) !=
			((Tcl_DriverHandlerProc *) NULL))) {

	    Tcl_DriverHandlerProc* handlerProc =
		Tcl_ChannelHandlerProc(upTypePtr);

	  mask = (*handlerProc) (upChanPtr->instanceData, mask);
	}

	/* ELSE:
	 * Ignore transformations which are unable to handle the event
	 * coming from below. Assume that they don't change the mask and
	 * pass it on.
	 */

	chanPtr = upChanPtr;
    }

    channel = (Tcl_Channel) chanPtr;

    /*
     * Here we have either reached the top of the stack or the mask is
     * empty.  We break out of the procedure if it is the latter.
     */

    if (!mask) {
        return;
    }

    /*
     * We are now above the topmost channel in a stack and have events
     * left. Now call the channel handlers as usual.
     *
     * Preserve the channel struct in case the script closes it.
     */
     
    Tcl_Preserve((ClientData) channel);
    Tcl_Preserve((ClientData) statePtr);

    /*
     * If we are flushing in the background, be sure to call FlushChannel
     * for writable events.  Note that we have to discard the writable
     * event so we don't call any write handlers before the flush is
     * complete.
     */

    if ((statePtr->flags & BG_FLUSH_SCHEDULED) && (mask & TCL_WRITABLE)) {
      FlushChannel(NULL, chanPtr, 1);
      mask &= ~TCL_WRITABLE;
    }

    /*
     * Add this invocation to the list of recursive invocations of
     * ChannelHandlerEventProc.
     */
    
    nh.nextHandlerPtr = (ChannelHandler *) NULL;
    nh.nestedHandlerPtr = tsdPtr->nestedHandlerPtr;
    tsdPtr->nestedHandlerPtr = &nh;

    for (chPtr = statePtr->chPtr; chPtr != (ChannelHandler *) NULL; ) {

      /*
       * If this channel handler is interested in any of the events that
       * have occurred on the channel, invoke its procedure.
       */
        
      if ((chPtr->mask & mask) != 0) {
	nh.nextHandlerPtr = chPtr->nextPtr;
	(*(chPtr->proc))(chPtr->clientData, mask);
	chPtr = nh.nextHandlerPtr;
      } else {
	chPtr = chPtr->nextPtr;
      }
    }

    /*
     * Update the notifier interest, since it may have changed after
     * invoking event handlers. Skip that if the channel was deleted
     * in the call to the channel handler.
     */

    if (chanPtr->typePtr != NULL) {
        UpdateInterest(chanPtr);
    }








    Tcl_Release((ClientData) statePtr);
    Tcl_Release((ClientData) channel);

    tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;



}

/*
 *----------------------------------------------------------------------
 *
 * UpdateInterest --
 *
6224
6225
6226
6227
6228
6229
6230

6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
 *----------------------------------------------------------------------
 */

static void
UpdateInterest(chanPtr)
    Channel *chanPtr;		/* Channel to update. */
{

    int mask = chanPtr->interestMask;

    /*
     * If there are flushed buffers waiting to be written, then
     * we need to watch for the channel to become writable.
     */

    if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
	mask |= TCL_WRITABLE;
    }

    /*
     * If there is data in the input queue, and we aren't waiting for more
     * data, then we need to schedule a timer so we don't block in the
     * notifier.  Also, cancel the read interest so we don't get duplicate
     * events.
     */

    if (mask & TCL_READABLE) {
	if (!(chanPtr->flags & CHANNEL_NEED_MORE_DATA)
		&& (chanPtr->inQueueHead != (ChannelBuffer *) NULL)
		&& (chanPtr->inQueueHead->nextRemoved <
			chanPtr->inQueueHead->nextAdded)) {
	    mask &= ~TCL_READABLE;
	    if (!chanPtr->timer) {
		chanPtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
			(ClientData) chanPtr);
	    }
	}
    }
    (chanPtr->typePtr->watchProc)(chanPtr->instanceData, mask);
}








>
|






|











|
|
|
|

|
|







6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
 *----------------------------------------------------------------------
 */

static void
UpdateInterest(chanPtr)
    Channel *chanPtr;		/* Channel to update. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int mask = statePtr->interestMask;

    /*
     * If there are flushed buffers waiting to be written, then
     * we need to watch for the channel to become writable.
     */

    if (statePtr->flags & BG_FLUSH_SCHEDULED) {
	mask |= TCL_WRITABLE;
    }

    /*
     * If there is data in the input queue, and we aren't waiting for more
     * data, then we need to schedule a timer so we don't block in the
     * notifier.  Also, cancel the read interest so we don't get duplicate
     * events.
     */

    if (mask & TCL_READABLE) {
	if (!(statePtr->flags & CHANNEL_NEED_MORE_DATA)
		&& (statePtr->inQueueHead != (ChannelBuffer *) NULL)
		&& (statePtr->inQueueHead->nextRemoved <
			statePtr->inQueueHead->nextAdded)) {
	    mask &= ~TCL_READABLE;
	    if (!statePtr->timer) {
		statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
			(ClientData) chanPtr);
	    }
	}
    }
    (chanPtr->typePtr->watchProc)(chanPtr->instanceData, mask);
}

6279
6280
6281
6282
6283
6284
6285

6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
 */

static void
ChannelTimerProc(clientData)
    ClientData clientData;
{
    Channel *chanPtr = (Channel *) clientData;


    if (!(chanPtr->flags & CHANNEL_NEED_MORE_DATA)
	    && (chanPtr->interestMask & TCL_READABLE)
	    && (chanPtr->inQueueHead != (ChannelBuffer *) NULL)
	    && (chanPtr->inQueueHead->nextRemoved <
		    chanPtr->inQueueHead->nextAdded)) {
	/*
	 * Restart the timer in case a channel handler reenters the
	 * event loop before UpdateInterest gets called by Tcl_NotifyChannel.
	 */

	chanPtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
			(ClientData) chanPtr);
	Tcl_NotifyChannel((Tcl_Channel)chanPtr, TCL_READABLE);
 
   } else {
	chanPtr->timer = NULL;
	UpdateInterest(chanPtr);
    }
}

/*
 *----------------------------------------------------------------------
 *







>

|
|
|
|
|





|
|


|
|







6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
 */

static void
ChannelTimerProc(clientData)
    ClientData clientData;
{
    Channel *chanPtr = (Channel *) clientData;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */

    if (!(statePtr->flags & CHANNEL_NEED_MORE_DATA)
	    && (statePtr->interestMask & TCL_READABLE)
	    && (statePtr->inQueueHead != (ChannelBuffer *) NULL)
	    && (statePtr->inQueueHead->nextRemoved <
		    statePtr->inQueueHead->nextAdded)) {
	/*
	 * Restart the timer in case a channel handler reenters the
	 * event loop before UpdateInterest gets called by Tcl_NotifyChannel.
	 */

	statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,
		(ClientData) chanPtr);
	Tcl_NotifyChannel((Tcl_Channel)chanPtr, TCL_READABLE);
 
    } else {
	statePtr->timer = NULL;
	UpdateInterest(chanPtr);
    }
}

/*
 *----------------------------------------------------------------------
 *
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
				 * proc should be called. Use 0 to
                                 * disable a registered handler. */
    Tcl_ChannelProc *proc;	/* Procedure to call for each
				 * selected event. */
    ClientData clientData;	/* Arbitrary data to pass to proc. */
{
    ChannelHandler *chPtr;
    Channel *chanPtr;

    chanPtr = (Channel *) chan;
    
    /*
     * Check whether this channel handler is not already registered. If
     * it is not, create a new record, else reuse existing record (smash
     * current values).
     */

    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->proc == proc) &&
                (chPtr->clientData == clientData)) {
            break;
        }
    }
    if (chPtr == (ChannelHandler *) NULL) {
        chPtr = (ChannelHandler *) ckalloc((unsigned) sizeof(ChannelHandler));
        chPtr->mask = 0;
        chPtr->proc = proc;
        chPtr->clientData = clientData;
        chPtr->chanPtr = chanPtr;
        chPtr->nextPtr = chanPtr->chPtr;
        chanPtr->chPtr = chPtr;
    }

    /*
     * The remainder of the initialization below is done regardless of
     * whether or not this is a new record or a modification of an old
     * one.
     */

    chPtr->mask = mask;

    /*
     * Recompute the interest mask for the channel - this call may actually
     * be disabling an existing handler.
     */
    
    chanPtr->interestMask = 0;
    for (chPtr = chanPtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
	chanPtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(chanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteChannelHandler --
 *







|
|
<
|






|
|
|











|
|















|
|


|


|







6326
6327
6328
6329
6330
6331
6332
6333
6334

6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
				 * proc should be called. Use 0 to
                                 * disable a registered handler. */
    Tcl_ChannelProc *proc;	/* Procedure to call for each
				 * selected event. */
    ClientData clientData;	/* Arbitrary data to pass to proc. */
{
    ChannelHandler *chPtr;
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */


    /*
     * Check whether this channel handler is not already registered. If
     * it is not, create a new record, else reuse existing record (smash
     * current values).
     */

    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->proc == proc) &&
                (chPtr->clientData == clientData)) {
            break;
        }
    }
    if (chPtr == (ChannelHandler *) NULL) {
        chPtr = (ChannelHandler *) ckalloc((unsigned) sizeof(ChannelHandler));
        chPtr->mask = 0;
        chPtr->proc = proc;
        chPtr->clientData = clientData;
        chPtr->chanPtr = chanPtr;
        chPtr->nextPtr = statePtr->chPtr;
        statePtr->chPtr = chPtr;
    }

    /*
     * The remainder of the initialization below is done regardless of
     * whether or not this is a new record or a modification of an old
     * one.
     */

    chPtr->mask = mask;

    /*
     * Recompute the interest mask for the channel - this call may actually
     * be disabling an existing handler.
     */
    
    statePtr->interestMask = 0;
    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
	statePtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(statePtr->topChanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_DeleteChannelHandler --
 *
6414
6415
6416
6417
6418
6419
6420

6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
    Tcl_Channel chan;		/* The channel for which to remove the
                                 * callback. */
    Tcl_ChannelProc *proc;	/* The procedure in the callback to delete. */
    ClientData clientData;	/* The client data in the callback
                                 * to delete. */
    
{

    ChannelHandler *chPtr, *prevChPtr;
    Channel *chanPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    NextChannelHandler *nhPtr;

    chanPtr = (Channel *) chan;

    /*
     * Find the entry and the previous one in the list.
     */

    for (prevChPtr = (ChannelHandler *) NULL, chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->clientData == clientData)
                && (chPtr->proc == proc)) {
            break;
        }
        prevChPtr = chPtr;
    }
    
    /*
     * If not found, return without doing anything.
     */

    if (chPtr == (ChannelHandler *) NULL) {
        return;
    }

    /*
     * If ChannelHandlerEventProc is about to process this handler, tell it to
     * process the next one instead - we are going to delete *this* one.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
             nhPtr != (NextChannelHandler *) NULL;
             nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr == chPtr) {
            nhPtr->nextHandlerPtr = chPtr->nextPtr;
        }
    }

    /*
     * Splice it out of the list of channel handlers.
     */
    
    if (prevChPtr == (ChannelHandler *) NULL) {
        chanPtr->chPtr = chPtr->nextPtr;
    } else {
        prevChPtr->nextPtr = chPtr->nextPtr;
    }
    ckfree((char *) chPtr);

    /*
     * Recompute the interest list for the channel, so that infinite loops
     * will not result if Tcl_DeleteChannelHandler is called inside an
     * event.
     */

    chanPtr->interestMask = 0;
    for (chPtr = chanPtr->chPtr;
             chPtr != (ChannelHandler *) NULL;
             chPtr = chPtr->nextPtr) {
        chanPtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(chanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * DeleteScriptRecord --
 *







>

|
|


<
<




|
|
|






|














|
|










|











|
|
|
|
|


|







6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416


6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
    Tcl_Channel chan;		/* The channel for which to remove the
                                 * callback. */
    Tcl_ChannelProc *proc;	/* The procedure in the callback to delete. */
    ClientData clientData;	/* The client data in the callback
                                 * to delete. */
    
{
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    ChannelHandler *chPtr, *prevChPtr;
    Channel *chanPtr = (Channel *) chan;
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    NextChannelHandler *nhPtr;



    /*
     * Find the entry and the previous one in the list.
     */

    for (prevChPtr = (ChannelHandler *) NULL, chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        if ((chPtr->chanPtr == chanPtr) && (chPtr->clientData == clientData)
                && (chPtr->proc == proc)) {
            break;
        }
        prevChPtr = chPtr;
    }

    /*
     * If not found, return without doing anything.
     */

    if (chPtr == (ChannelHandler *) NULL) {
        return;
    }

    /*
     * If ChannelHandlerEventProc is about to process this handler, tell it to
     * process the next one instead - we are going to delete *this* one.
     */

    for (nhPtr = tsdPtr->nestedHandlerPtr;
	 nhPtr != (NextChannelHandler *) NULL;
	 nhPtr = nhPtr->nestedHandlerPtr) {
        if (nhPtr->nextHandlerPtr == chPtr) {
            nhPtr->nextHandlerPtr = chPtr->nextPtr;
        }
    }

    /*
     * Splice it out of the list of channel handlers.
     */
    
    if (prevChPtr == (ChannelHandler *) NULL) {
        statePtr->chPtr = chPtr->nextPtr;
    } else {
        prevChPtr->nextPtr = chPtr->nextPtr;
    }
    ckfree((char *) chPtr);

    /*
     * Recompute the interest list for the channel, so that infinite loops
     * will not result if Tcl_DeleteChannelHandler is called inside an
     * event.
     */

    statePtr->interestMask = 0;
    for (chPtr = statePtr->chPtr;
	 chPtr != (ChannelHandler *) NULL;
	 chPtr = chPtr->nextPtr) {
        statePtr->interestMask |= chPtr->mask;
    }

    UpdateInterest(statePtr->topChanPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * DeleteScriptRecord --
 *
6509
6510
6511
6512
6513
6514
6515

6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
    Tcl_Interp *interp;		/* Interpreter in which script was to be
                                 * executed. */
    Channel *chanPtr;		/* The channel for which to delete the
                                 * script record (if any). */
    int mask;			/* Events in mask must exactly match mask
                                 * of script to delete. */
{

    EventScriptRecord *esPtr, *prevEsPtr;

    for (esPtr = chanPtr->scriptRecordPtr,
             prevEsPtr = (EventScriptRecord *) NULL;
             esPtr != (EventScriptRecord *) NULL;
             prevEsPtr = esPtr, esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
            if (esPtr == chanPtr->scriptRecordPtr) {
                chanPtr->scriptRecordPtr = esPtr->nextPtr;
            } else {
                prevEsPtr->nextPtr = esPtr->nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) esPtr);
            
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);

            break;
        }
    }







>


|

|
|

|
|





|







6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
    Tcl_Interp *interp;		/* Interpreter in which script was to be
                                 * executed. */
    Channel *chanPtr;		/* The channel for which to delete the
                                 * script record (if any). */
    int mask;			/* Events in mask must exactly match mask
                                 * of script to delete. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *esPtr, *prevEsPtr;

    for (esPtr = statePtr->scriptRecordPtr,
             prevEsPtr = (EventScriptRecord *) NULL;
	 esPtr != (EventScriptRecord *) NULL;
	 prevEsPtr = esPtr, esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
            if (esPtr == statePtr->scriptRecordPtr) {
                statePtr->scriptRecordPtr = esPtr->nextPtr;
            } else {
                prevEsPtr->nextPtr = esPtr->nextPtr;
            }

            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    TclChannelEventScriptInvoker, (ClientData) esPtr);
            
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);

            break;
        }
    }
6560
6561
6562
6563
6564
6565
6566

6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
                                         * the stored script. */
    Channel *chanPtr;			/* Channel for which script is to
                                         * be stored. */
    int mask;				/* Set of events for which script
                                         * will be invoked. */
    Tcl_Obj *scriptPtr;			/* Pointer to script object. */
{

    EventScriptRecord *esPtr;

    for (esPtr = chanPtr->scriptRecordPtr;
             esPtr != (EventScriptRecord *) NULL;
             esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
	    Tcl_DecrRefCount(esPtr->scriptPtr);
	    esPtr->scriptPtr = (Tcl_Obj *) NULL;
            break;
        }
    }
    if (esPtr == (EventScriptRecord *) NULL) {
        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
        esPtr->nextPtr = chanPtr->scriptRecordPtr;
        chanPtr->scriptRecordPtr = esPtr;
    }
    esPtr->chanPtr = chanPtr;
    esPtr->interp = interp;
    esPtr->mask = mask;
    Tcl_IncrRefCount(scriptPtr);
    esPtr->scriptPtr = scriptPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * ChannelEventScriptInvoker --
 *
 *	Invokes a script scheduled by "fileevent" for when the channel
 *	becomes ready for IO. This function is invoked by the channel
 *	handler which was created by the Tcl "fileevent" command.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Whatever the script does.
 *
 *----------------------------------------------------------------------
 */

static void
ChannelEventScriptInvoker(clientData, mask)
    ClientData clientData;	/* The script+interp record. */
    int mask;			/* Not used. */
{
    Tcl_Interp *interp;		/* Interpreter in which to eval the script. */
    Channel *chanPtr;		/* The channel for which this handler is
                                 * registered. */
    EventScriptRecord *esPtr;	/* The event script + interpreter to eval it
                                 * in. */
    int result;			/* Result of call to eval script. */

    esPtr = (EventScriptRecord *) clientData;

    chanPtr = esPtr->chanPtr;
    mask = esPtr->mask;
    interp = esPtr->interp;
    
    /*
     * We must preserve the interpreter so we can report errors on it
     * later.  Note that we do not need to preserve the channel because
     * that is done by Tcl_NotifyChannel before calling channel handlers.
     */
    
    Tcl_Preserve((ClientData) interp);







>


|
|
|










|
|
|











|














|
|










|
<
|
|
|
|







6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614

6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
                                         * the stored script. */
    Channel *chanPtr;			/* Channel for which script is to
                                         * be stored. */
    int mask;				/* Set of events for which script
                                         * will be invoked. */
    Tcl_Obj *scriptPtr;			/* Pointer to script object. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    EventScriptRecord *esPtr;

    for (esPtr = statePtr->scriptRecordPtr;
	 esPtr != (EventScriptRecord *) NULL;
	 esPtr = esPtr->nextPtr) {
        if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
	    Tcl_DecrRefCount(esPtr->scriptPtr);
	    esPtr->scriptPtr = (Tcl_Obj *) NULL;
            break;
        }
    }
    if (esPtr == (EventScriptRecord *) NULL) {
        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
        esPtr->nextPtr = statePtr->scriptRecordPtr;
        statePtr->scriptRecordPtr = esPtr;
    }
    esPtr->chanPtr = chanPtr;
    esPtr->interp = interp;
    esPtr->mask = mask;
    Tcl_IncrRefCount(scriptPtr);
    esPtr->scriptPtr = scriptPtr;
}

/*
 *----------------------------------------------------------------------
 *
 * TclChannelEventScriptInvoker --
 *
 *	Invokes a script scheduled by "fileevent" for when the channel
 *	becomes ready for IO. This function is invoked by the channel
 *	handler which was created by the Tcl "fileevent" command.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Whatever the script does.
 *
 *----------------------------------------------------------------------
 */

void
TclChannelEventScriptInvoker(clientData, mask)
    ClientData clientData;	/* The script+interp record. */
    int mask;			/* Not used. */
{
    Tcl_Interp *interp;		/* Interpreter in which to eval the script. */
    Channel *chanPtr;		/* The channel for which this handler is
                                 * registered. */
    EventScriptRecord *esPtr;	/* The event script + interpreter to eval it
                                 * in. */
    int result;			/* Result of call to eval script. */

    esPtr	= (EventScriptRecord *) clientData;

    chanPtr	= esPtr->chanPtr;
    mask	= esPtr->mask;
    interp	= esPtr->interp;

    /*
     * We must preserve the interpreter so we can report errors on it
     * later.  Note that we do not need to preserve the channel because
     * that is done by Tcl_NotifyChannel before calling channel handlers.
     */
    
    Tcl_Preserve((ClientData) interp);
6679
6680
6681
6682
6683
6684
6685

6686
6687
6688
6689
6690
6691
6692
                                         * for which to create the handler
                                         * is found. */
    int objc;				/* Number of arguments. */
    Tcl_Obj *CONST objv[];		/* Argument objects. */
{
    Channel *chanPtr;			/* The channel to create
                                         * the handler for. */

    Tcl_Channel chan;			/* The opaque type for the channel. */
    char *chanName;
    int modeIndex;			/* Index of mode argument. */
    int mask;
    static char *modeOptions[] = {"readable", "writable", NULL};
    static int maskArray[] = {TCL_READABLE, TCL_WRITABLE};








>







6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
                                         * for which to create the handler
                                         * is found. */
    int objc;				/* Number of arguments. */
    Tcl_Obj *CONST objv[];		/* Argument objects. */
{
    Channel *chanPtr;			/* The channel to create
                                         * the handler for. */
    ChannelState *statePtr;		/* state info for channel */
    Tcl_Channel chan;			/* The opaque type for the channel. */
    char *chanName;
    int modeIndex;			/* Index of mode argument. */
    int mask;
    static char *modeOptions[] = {"readable", "writable", NULL};
    static int maskArray[] = {TCL_READABLE, TCL_WRITABLE};

6701
6702
6703
6704
6705
6706
6707
6708

6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
    mask = maskArray[modeIndex];

    chanName = Tcl_GetString(objv[1]);
    chan = Tcl_GetChannel(interp, chanName, NULL);
    if (chan == (Tcl_Channel) NULL) {
	return TCL_ERROR;
    }
    chanPtr = (Channel *) chan;

    if ((chanPtr->flags & mask) == 0) {
        Tcl_AppendResult(interp, "channel is not ",
                (mask == TCL_READABLE) ? "readable" : "writable",
                (char *) NULL);
        return TCL_ERROR;
    }
    
    /*
     * If we are supposed to return the script, do so.
     */

    if (objc == 3) {
	EventScriptRecord *esPtr;
	for (esPtr = chanPtr->scriptRecordPtr;
             esPtr != (EventScriptRecord *) NULL;
             esPtr = esPtr->nextPtr) {
	    if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
		Tcl_SetObjResult(interp, esPtr->scriptPtr);
		break;
	    }
	}







|
>
|












|







6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
    mask = maskArray[modeIndex];

    chanName = Tcl_GetString(objv[1]);
    chan = Tcl_GetChannel(interp, chanName, NULL);
    if (chan == (Tcl_Channel) NULL) {
	return TCL_ERROR;
    }
    chanPtr  = (Channel *) chan;
    statePtr = chanPtr->state;
    if ((statePtr->flags & mask) == 0) {
        Tcl_AppendResult(interp, "channel is not ",
                (mask == TCL_READABLE) ? "readable" : "writable",
                (char *) NULL);
        return TCL_ERROR;
    }
    
    /*
     * If we are supposed to return the script, do so.
     */

    if (objc == 3) {
	EventScriptRecord *esPtr;
	for (esPtr = statePtr->scriptRecordPtr;
             esPtr != (EventScriptRecord *) NULL;
             esPtr = esPtr->nextPtr) {
	    if ((esPtr->interp == interp) && (esPtr->mask == mask)) {
		Tcl_SetObjResult(interp, esPtr->scriptPtr);
		break;
	    }
	}
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
    
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * TclTestChannelCmd --
 *
 *	Implements the Tcl "testchannel" debugging command and its
 *	subcommands. This is part of the testing environment but must be
 *	in this file instead of tclTest.c because it needs access to the
 *	fields of struct Channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclTestChannelCmd(clientData, interp, argc, argv)
    ClientData clientData;	/* Not used. */
    Tcl_Interp *interp;		/* Interpreter for result. */
    int argc;			/* Count of additional args. */
    char **argv;		/* Additional arg strings. */
{
    char *cmdName;		/* Sub command. */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The actual channel. */
    Tcl_Channel chan;		/* The opaque type. */
    size_t len;			/* Length of subcommand string. */
    int IOQueued;		/* How much IO is queued inside channel? */
    ChannelBuffer *bufPtr;	/* For iterating over queued IO. */
    char buf[TCL_INTEGER_SPACE];/* For sprintf. */
    
    if (argc < 2) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " subcommand ?additional args..?\"", (char *) NULL);
        return TCL_ERROR;
    }
    cmdName = argv[1];
    len = strlen(cmdName);

    chanPtr = (Channel *) NULL;

    if (argc > 2) {
        chan = Tcl_GetChannel(interp, argv[2], NULL);
        if (chan == (Tcl_Channel) NULL) {
            return TCL_ERROR;
        }
        chanPtr = (Channel *) chan;
    }


    if ((cmdName[0] == 'i') && (strncmp(cmdName, "info", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " info channelName\"", (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendElement(interp, argv[2]);
        Tcl_AppendElement(interp, chanPtr->typePtr->typeName);
        if (chanPtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_NONBLOCKING) {
            Tcl_AppendElement(interp, "nonblocking");
        } else {
            Tcl_AppendElement(interp, "blocking");
        }
        if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
            Tcl_AppendElement(interp, "line");
        } else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
            Tcl_AppendElement(interp, "none");
        } else {
            Tcl_AppendElement(interp, "full");
        }
        if (chanPtr->flags & BG_FLUSH_SCHEDULED) {
            Tcl_AppendElement(interp, "async_flush");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_EOF) {
            Tcl_AppendElement(interp, "eof");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & CHANNEL_BLOCKED) {
            Tcl_AppendElement(interp, "blocked");
        } else {
            Tcl_AppendElement(interp, "unblocked");
        }
        if (chanPtr->inputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
            if (chanPtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "saw_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
            Tcl_AppendElement(interp, "");
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
            Tcl_AppendElement(interp, "");
        } else if (chanPtr->inputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
            if (chanPtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "queued_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        }
        if (chanPtr->outputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
        } else if (chanPtr->outputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
        }
        for (IOQueued = 0, bufPtr = chanPtr->inQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        IOQueued = 0;
        if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = chanPtr->curOutPtr->nextAdded -
                chanPtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = chanPtr->outQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        TclFormatInt(buf, Tcl_Tell((Tcl_Channel) chanPtr));
        Tcl_AppendElement(interp, buf);

        TclFormatInt(buf, chanPtr->refCount);
        Tcl_AppendElement(interp, buf);

        return TCL_OK;
    }

    if ((cmdName[0] == 'i') &&
            (strncmp(cmdName, "inputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        for (IOQueued = 0, bufPtr = chanPtr->inQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
        
    if ((cmdName[0] == 'm') && (strncmp(cmdName, "mode", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        if (chanPtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (chanPtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'n') && (strncmp(cmdName, "name", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->channelName, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'o') && (strncmp(cmdName, "open", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') &&
            (strncmp(cmdName, "outputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        IOQueued = 0;
        if (chanPtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = chanPtr->curOutPtr->nextAdded -
                chanPtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = chanPtr->outQueueHead;
                 bufPtr != (ChannelBuffer *) NULL;
                 bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
        
    if ((cmdName[0] == 'q') &&
            (strncmp(cmdName, "queuedcr", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        Tcl_AppendResult(interp,
                (chanPtr->flags & INPUT_SAW_CR) ? "1" : "0",
                (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'r') && (strncmp(cmdName, "readable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
            if (chanPtr->flags & TCL_READABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "refcount", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        TclFormatInt(buf, chanPtr->refCount);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 't') && (strncmp(cmdName, "type", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->typePtr->typeName, (char *) NULL);
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'w') && (strncmp(cmdName, "writable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
                 hPtr != (Tcl_HashEntry *) NULL;
                 hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
            if (chanPtr->flags & TCL_WRITABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    Tcl_AppendResult(interp, "bad option \"", cmdName, "\": should be ",
            "info, open, readable, or writable",
            (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TclTestChannelEventCmd --
 *
 *	This procedure implements the "testchannelevent" command. It is
 *	used to test the Tcl channel event mechanism. It is present in
 *	this file instead of tclTest.c because it needs access to the
 *	internal structure of the channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	Creates, deletes and returns channel event handlers.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclTestChannelEventCmd(dummy, interp, argc, argv)
    ClientData dummy;			/* Not used. */
    Tcl_Interp *interp;			/* Current interpreter. */
    int argc;				/* Number of arguments. */
    char **argv;			/* Argument strings. */
{
    Tcl_Obj *resultListPtr;
    Channel *chanPtr;
    EventScriptRecord *esPtr, *prevEsPtr, *nextEsPtr;
    char *cmd;
    int index, i, mask, len;

    if ((argc < 3) || (argc > 5)) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " channelName cmd ?arg1? ?arg2?\"", (char *) NULL);
        return TCL_ERROR;
    }
    chanPtr = (Channel *) Tcl_GetChannel(interp, argv[1], NULL);
    if (chanPtr == (Channel *) NULL) {
        return TCL_ERROR;
    }
    cmd = argv[2];
    len = strlen(cmd);
    if ((cmd[0] == 'a') && (strncmp(cmd, "add", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName add eventSpec script\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (strcmp(argv[3], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[3], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[3], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[3],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }

        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        esPtr->nextPtr = chanPtr->scriptRecordPtr;
        chanPtr->scriptRecordPtr = esPtr;
        
        esPtr->chanPtr = chanPtr;
        esPtr->interp = interp;
        esPtr->mask = mask;
	esPtr->scriptPtr = Tcl_NewStringObj(argv[4], -1);
	Tcl_IncrRefCount(esPtr->scriptPtr);

        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
        
        return TCL_OK;
    }

    if ((cmd[0] == 'd') && (strncmp(cmd, "delete", (unsigned) len) == 0)) {
        if (argc != 4) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = chanPtr->scriptRecordPtr;
                 (i < index) && (esPtr != (EventScriptRecord *) NULL);
                 i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }
        if (esPtr == chanPtr->scriptRecordPtr) {
            chanPtr->scriptRecordPtr = esPtr->nextPtr;
        } else {
            for (prevEsPtr = chanPtr->scriptRecordPtr;
                     (prevEsPtr != (EventScriptRecord *) NULL) &&
                         (prevEsPtr->nextPtr != esPtr);
                     prevEsPtr = prevEsPtr->nextPtr) {
                /* Empty loop body. */
            }
            if (prevEsPtr == (EventScriptRecord *) NULL) {
                panic("TclTestChannelEventCmd: damaged event script list");
            }
            prevEsPtr->nextPtr = esPtr->nextPtr;
        }
        Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                ChannelEventScriptInvoker, (ClientData) esPtr);
	Tcl_DecrRefCount(esPtr->scriptPtr);
        ckfree((char *) esPtr);

        return TCL_OK;
    }

    if ((cmd[0] == 'l') && (strncmp(cmd, "list", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName list\"", (char *) NULL);
            return TCL_ERROR;
        }
	resultListPtr = Tcl_GetObjResult(interp);
        for (esPtr = chanPtr->scriptRecordPtr;
                 esPtr != (EventScriptRecord *) NULL;
                 esPtr = esPtr->nextPtr) {
	    if (esPtr->mask) {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, Tcl_NewStringObj(
		    (esPtr->mask == TCL_READABLE) ? "readable" : "writable", -1));
 	    } else {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, 
                    Tcl_NewStringObj("none", -1));
	    }
  	    Tcl_ListObjAppendElement(interp, resultListPtr, esPtr->scriptPtr);
        }
	Tcl_SetObjResult(interp, resultListPtr);
        return TCL_OK;
    }

    if ((cmd[0] == 'r') && (strncmp(cmd, "removeall", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName removeall\"", (char *) NULL);
            return TCL_ERROR;
        }
        for (esPtr = chanPtr->scriptRecordPtr;
                 esPtr != (EventScriptRecord *) NULL;
                 esPtr = nextEsPtr) {
            nextEsPtr = esPtr->nextPtr;
            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    ChannelEventScriptInvoker, (ClientData) esPtr);
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);
        }
        chanPtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        return TCL_OK;
    }

    if  ((cmd[0] == 's') && (strncmp(cmd, "set", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index event\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = chanPtr->scriptRecordPtr;
                 (i < index) && (esPtr != (EventScriptRecord *) NULL);
                 i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }

        if (strcmp(argv[4], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[4], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[4], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[4],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }
	esPtr->mask = mask;
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                ChannelEventScriptInvoker, (ClientData) esPtr);
	return TCL_OK;
    }    
    Tcl_AppendResult(interp, "bad command ", cmd, ", must be one of ",
            "add, delete, list, set, or removeall", (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TclCopyChannel --
 *
 *	This routine copies data from one channel to another, either
 *	synchronously or asynchronously.  If a command script is
 *	supplied, the operation runs in the background.  The script
 *	is invoked when the copy completes.  Otherwise the function
 *	waits until the copy is completed before returning.







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







6741
6742
6743
6744
6745
6746
6747





















































































































































































































































































































































































































































































































































6748
6749
6750
6751
6752
6753
6754
    
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *





















































































































































































































































































































































































































































































































































 * TclCopyChannel --
 *
 *	This routine copies data from one channel to another, either
 *	synchronously or asynchronously.  If a command script is
 *	supplied, the operation runs in the background.  The script
 *	is invoked when the copy completes.  Otherwise the function
 *	waits until the copy is completed before returning.
7310
7311
7312
7313
7314
7315
7316

7317
7318
7319
7320



7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
    Tcl_Channel inChan;		/* Channel to read from. */
    Tcl_Channel outChan;	/* Channel to write to. */
    int toRead;			/* Amount of data to copy, or -1 for all. */
    Tcl_Obj *cmdPtr;		/* Pointer to script to execute or NULL. */
{
    Channel *inPtr = (Channel *) inChan;
    Channel *outPtr = (Channel *) outChan;

    int readFlags, writeFlags;
    CopyState *csPtr;
    int nonBlocking = (cmdPtr) ? CHANNEL_NONBLOCKING : 0;




    if (inPtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(inChan), "\" is busy", NULL);
	return TCL_ERROR;
    }
    if (outPtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(outChan), "\" is busy", NULL);
	return TCL_ERROR;
    }

    readFlags = inPtr->flags;
    writeFlags = outPtr->flags;

    /*
     * Set up the blocking mode appropriately.  Background copies need
     * non-blocking channels.  Foreground copies need blocking channels.
     * If there is an error, restore the old blocking mode.
     */








>




>
>
>
|




|





|
|







6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
    Tcl_Channel inChan;		/* Channel to read from. */
    Tcl_Channel outChan;	/* Channel to write to. */
    int toRead;			/* Amount of data to copy, or -1 for all. */
    Tcl_Obj *cmdPtr;		/* Pointer to script to execute or NULL. */
{
    Channel *inPtr = (Channel *) inChan;
    Channel *outPtr = (Channel *) outChan;
    ChannelState *inStatePtr, *outStatePtr;
    int readFlags, writeFlags;
    CopyState *csPtr;
    int nonBlocking = (cmdPtr) ? CHANNEL_NONBLOCKING : 0;

    inStatePtr	= inPtr->state;
    outStatePtr	= outPtr->state;

    if (inStatePtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(inChan), "\" is busy", NULL);
	return TCL_ERROR;
    }
    if (outStatePtr->csPtr) {
	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "channel \"",
		Tcl_GetChannelName(outChan), "\" is busy", NULL);
	return TCL_ERROR;
    }

    readFlags	= inStatePtr->flags;
    writeFlags	= outStatePtr->flags;

    /*
     * Set up the blocking mode appropriately.  Background copies need
     * non-blocking channels.  Foreground copies need blocking channels.
     * If there is an error, restore the old blocking mode.
     */

7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
	}
    }

    /*
     * Make sure the output side is unbuffered.
     */

    outPtr->flags = (outPtr->flags & ~(CHANNEL_LINEBUFFERED))
	| CHANNEL_UNBUFFERED;

    /*
     * Allocate a new CopyState to maintain info about the current copy in
     * progress.  This structure will be deallocated when the copy is
     * completed.
     */

    csPtr = (CopyState*) ckalloc(sizeof(CopyState) + inPtr->bufSize);
    csPtr->bufSize = inPtr->bufSize;
    csPtr->readPtr = inPtr;
    csPtr->writePtr = outPtr;
    csPtr->readFlags = readFlags;
    csPtr->writeFlags = writeFlags;
    csPtr->toRead = toRead;
    csPtr->total = 0;
    csPtr->interp = interp;
    if (cmdPtr) {
	Tcl_IncrRefCount(cmdPtr);
    }
    csPtr->cmdPtr = cmdPtr;
    inPtr->csPtr = csPtr;
    outPtr->csPtr = csPtr;

    /*
     * Start copying data between the channels.
     */

    return CopyData(csPtr, 0);
}







|








|
|
|
|
|

|
|
|




|
|







6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
	}
    }

    /*
     * Make sure the output side is unbuffered.
     */

    outStatePtr->flags = (outStatePtr->flags & ~(CHANNEL_LINEBUFFERED))
	| CHANNEL_UNBUFFERED;

    /*
     * Allocate a new CopyState to maintain info about the current copy in
     * progress.  This structure will be deallocated when the copy is
     * completed.
     */

    csPtr = (CopyState*) ckalloc(sizeof(CopyState) + inStatePtr->bufSize);
    csPtr->bufSize    = inStatePtr->bufSize;
    csPtr->readPtr    = inPtr;
    csPtr->writePtr   = outPtr;
    csPtr->readFlags  = readFlags;
    csPtr->writeFlags = writeFlags;
    csPtr->toRead     = toRead;
    csPtr->total      = 0;
    csPtr->interp     = interp;
    if (cmdPtr) {
	Tcl_IncrRefCount(cmdPtr);
    }
    csPtr->cmdPtr = cmdPtr;
    inStatePtr->csPtr = csPtr;
    outStatePtr->csPtr = csPtr;

    /*
     * Start copying data between the channels.
     */

    return CopyData(csPtr, 0);
}
7417
7418
7419
7420
7421
7422
7423

7424
7425
7426
7427
7428


7429
7430
7431
7432
7433
7434




7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
CopyData(csPtr, mask)
    CopyState *csPtr;		/* State of copy operation. */
    int mask;			/* Current channel event flags. */
{
    Tcl_Interp *interp;
    Tcl_Obj *cmdPtr, *errObj = NULL;
    Tcl_Channel inChan, outChan;

    int result = TCL_OK;
    int size;
    int total;

    inChan = (Tcl_Channel)csPtr->readPtr;


    outChan = (Tcl_Channel)csPtr->writePtr;
    interp = csPtr->interp;
    cmdPtr = csPtr->cmdPtr;

    /*
     * Copy the data the slow way, using the translation mechanism.




     */

    while (csPtr->toRead != 0) {

	/*
	 * Check for unreported background errors.
	 */

	if (csPtr->readPtr->unreportedError != 0) {
	    Tcl_SetErrno(csPtr->readPtr->unreportedError);
	    csPtr->readPtr->unreportedError = 0;
	    goto readError;
	}
	if (csPtr->writePtr->unreportedError != 0) {
	    Tcl_SetErrno(csPtr->writePtr->unreportedError);
	    csPtr->writePtr->unreportedError = 0;
	    goto writeError;
	}
	
	/*
	 * Read up to bufSize bytes.
	 */

	if ((csPtr->toRead == -1)
		|| (csPtr->toRead > csPtr->bufSize)) {
	    size = csPtr->bufSize;
	} else {
	    size = csPtr->toRead;
	}
	size = DoRead(csPtr->readPtr, csPtr->buffer, size);

	if (size < 0) {
	    readError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error reading \"",
		    Tcl_GetChannelName(inChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);







>




|
>
>
|
|
|



>
>
>
>








|
|
|


|
|
|







|
<




|







6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928

6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
CopyData(csPtr, mask)
    CopyState *csPtr;		/* State of copy operation. */
    int mask;			/* Current channel event flags. */
{
    Tcl_Interp *interp;
    Tcl_Obj *cmdPtr, *errObj = NULL;
    Tcl_Channel inChan, outChan;
    ChannelState *inStatePtr, *outStatePtr;
    int result = TCL_OK;
    int size;
    int total;

    inChan	= (Tcl_Channel) csPtr->readPtr;
    outChan	= (Tcl_Channel) csPtr->writePtr;
    inStatePtr	= csPtr->readPtr->state;
    outStatePtr	= csPtr->writePtr->state;
    interp	= csPtr->interp;
    cmdPtr	= csPtr->cmdPtr;

    /*
     * Copy the data the slow way, using the translation mechanism.
     *
     * Note: We have make sure that we use the topmost channel in a stack
     * for the copying. The caller uses Tcl_GetChannel to access it, and
     * thus gets the bottom of the stack.
     */

    while (csPtr->toRead != 0) {

	/*
	 * Check for unreported background errors.
	 */

	if (inStatePtr->unreportedError != 0) {
	    Tcl_SetErrno(inStatePtr->unreportedError);
	    inStatePtr->unreportedError = 0;
	    goto readError;
	}
	if (outStatePtr->unreportedError != 0) {
	    Tcl_SetErrno(outStatePtr->unreportedError);
	    outStatePtr->unreportedError = 0;
	    goto writeError;
	}
	
	/*
	 * Read up to bufSize bytes.
	 */

	if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {

	    size = csPtr->bufSize;
	} else {
	    size = csPtr->toRead;
	}
	size = DoRead(inStatePtr->topChanPtr, csPtr->buffer, size);

	if (size < 0) {
	    readError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error reading \"",
		    Tcl_GetChannelName(inChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506












7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
	    return TCL_OK;
	}

	/*
	 * Now write the buffer out.
	 */

	size = DoWrite(csPtr->writePtr, csPtr->buffer, size);
	if (size < 0) {
	    writeError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error writing \"",
		    Tcl_GetChannelName(outChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
	    break;
	}













	/*
	 * Check to see if the write is happening in the background.  If so,
	 * stop copying and wait for the channel to become writable again.
	 */

	if (csPtr->writePtr->flags & BG_FLUSH_SCHEDULED) {
	    if (!(mask & TCL_WRITABLE)) {
		if (mask & TCL_READABLE) {
		    Tcl_DeleteChannelHandler(outChan, CopyEventProc,
			    (ClientData) csPtr);
		}
		Tcl_CreateChannelHandler(outChan, TCL_WRITABLE,
			CopyEventProc, (ClientData) csPtr);
	    }
	    return TCL_OK;
	}

	/*
	 * Update the current byte count if we care.
	 */

	if (csPtr->toRead != -1) {
	    csPtr->toRead -= size;
	}
	csPtr->total += size;

	/*
	 * For background copies, we only do one buffer per invocation so
	 * we don't starve the rest of the system.
	 */

	if (cmdPtr) {
	    /*







|









>
>
>
>
>
>
>
>
>
>
>
>





|


|








<
<
<
<
<
<
<
<
<







6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004









7005
7006
7007
7008
7009
7010
7011
	    return TCL_OK;
	}

	/*
	 * Now write the buffer out.
	 */

	size = DoWrite(outStatePtr->topChanPtr, csPtr->buffer, size);
	if (size < 0) {
	    writeError:
	    errObj = Tcl_NewObj();
	    Tcl_AppendStringsToObj(errObj, "error writing \"",
		    Tcl_GetChannelName(outChan), "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
	    break;
	}

	/*
	 * Update the current byte count.  Do it now so the count is
	 * valid before a return or break takes us out of the loop.
	 * The invariant at the top of the loop should be that 
	 * csPtr->toRead holds the number of bytes left to copy.
	 */

	if (csPtr->toRead != -1) {
	    csPtr->toRead -= size;
	}
	csPtr->total += size;

	/*
	 * Check to see if the write is happening in the background.  If so,
	 * stop copying and wait for the channel to become writable again.
	 */

	if (outStatePtr->flags & BG_FLUSH_SCHEDULED) {
	    if (!(mask & TCL_WRITABLE)) {
		if (mask & TCL_READABLE) {
		    Tcl_DeleteChannelHandler(inChan, CopyEventProc,
			    (ClientData) csPtr);
		}
		Tcl_CreateChannelHandler(outChan, TCL_WRITABLE,
			CopyEventProc, (ClientData) csPtr);
	    }
	    return TCL_OK;
	}










	/*
	 * For background copies, we only do one buffer per invocation so
	 * we don't starve the rest of the system.
	 */

	if (cmdPtr) {
	    /*
7609
7610
7611
7612
7613
7614
7615

7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663

static int
DoRead(chanPtr, bufPtr, toRead)
    Channel *chanPtr;		/* The channel from which to read. */
    char *bufPtr;		/* Where to store input read. */
    int toRead;			/* Maximum number of bytes to read. */
{

    int copied;			/* How many characters were copied into
                                 * the result string? */
    int copiedNow;		/* How many characters were copied from
                                 * the current input buffer? */
    int result;			/* Of calling GetInput. */
    
    /*
     * If we have not encountered a sticky EOF, clear the EOF bit. Either
     * way clear the BLOCKED bit. We want to discover these anew during
     * each operation.
     */

    if (!(chanPtr->flags & CHANNEL_STICKY_EOF)) {
        chanPtr->flags &= ~CHANNEL_EOF;
    }
    chanPtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    
    for (copied = 0; copied < toRead; copied += copiedNow) {
        copiedNow = CopyAndTranslateBuffer(chanPtr, bufPtr + copied,
                toRead - copied);
        if (copiedNow == 0) {
            if (chanPtr->flags & CHANNEL_EOF) {
		goto done;
            }
            if (chanPtr->flags & CHANNEL_BLOCKED) {
                if (chanPtr->flags & CHANNEL_NONBLOCKING) {
		    goto done;
                }
                chanPtr->flags &= (~(CHANNEL_BLOCKED));
            }
            result = GetInput(chanPtr);
            if (result != 0) {
                if (result != EAGAIN) {
                    copied = -1;
                }
		goto done;
            }
        }
    }

    chanPtr->flags &= (~(CHANNEL_BLOCKED));

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */








>





|






|
|

|


|


|


|
|


|











|







7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136

static int
DoRead(chanPtr, bufPtr, toRead)
    Channel *chanPtr;		/* The channel from which to read. */
    char *bufPtr;		/* Where to store input read. */
    int toRead;			/* Maximum number of bytes to read. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int copied;			/* How many characters were copied into
                                 * the result string? */
    int copiedNow;		/* How many characters were copied from
                                 * the current input buffer? */
    int result;			/* Of calling GetInput. */

    /*
     * If we have not encountered a sticky EOF, clear the EOF bit. Either
     * way clear the BLOCKED bit. We want to discover these anew during
     * each operation.
     */

    if (!(statePtr->flags & CHANNEL_STICKY_EOF)) {
        statePtr->flags &= ~CHANNEL_EOF;
    }
    statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA);
    
    for (copied = 0; copied < toRead; copied += copiedNow) {
        copiedNow = CopyAndTranslateBuffer(statePtr, bufPtr + copied,
                toRead - copied);
        if (copiedNow == 0) {
            if (statePtr->flags & CHANNEL_EOF) {
		goto done;
            }
            if (statePtr->flags & CHANNEL_BLOCKED) {
                if (statePtr->flags & CHANNEL_NONBLOCKING) {
		    goto done;
                }
                statePtr->flags &= (~(CHANNEL_BLOCKED));
            }
            result = GetInput(chanPtr);
            if (result != 0) {
                if (result != EAGAIN) {
                    copied = -1;
                }
		goto done;
            }
        }
    }

    statePtr->flags &= (~(CHANNEL_BLOCKED));

    done:
    /*
     * Update the notifier state so we don't block while there is still
     * data in the buffers.
     */

7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693

7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
 * Side effects:
 *	Consumes buffered input. May deallocate one buffer.
 *
 *----------------------------------------------------------------------
 */

static int
CopyAndTranslateBuffer(chanPtr, result, space)
    Channel *chanPtr;		/* The channel from which to read input. */
    char *result;		/* Where to store the copied input. */
    int space;			/* How many bytes are available in result
                                 * to store the copied input? */
{

    int bytesInBuffer;		/* How many bytes are available to be
                                 * copied in the current input buffer? */
    int copied;			/* How many characters were already copied
                                 * into the destination space? */
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int i;			/* Iterates over the copied input looking
                                 * for the input eofChar. */
    
    /*
     * If there is no input at all, return zero. The invariant is that either
     * there is no buffer in the queue, or if the first buffer is empty, it
     * is also the last buffer (and thus there is no input in the queue).
     * Note also that if the buffer is empty, we leave it in the queue.
     */
    
    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
        return 0;
    }
    bufPtr = chanPtr->inQueueHead;
    bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;

    copied = 0;
    switch (chanPtr->inputTranslation) {
        case TCL_TRANSLATE_LF: {
            if (bytesInBuffer == 0) {
                return 0;
            }

	    /*
             * Copy the current chunk into the result buffer.







|
|




>




<










|


|



|







7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171

7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
 * Side effects:
 *	Consumes buffered input. May deallocate one buffer.
 *
 *----------------------------------------------------------------------
 */

static int
CopyAndTranslateBuffer(statePtr, result, space)
    ChannelState *statePtr;	/* Channel state from which to read input. */
    char *result;		/* Where to store the copied input. */
    int space;			/* How many bytes are available in result
                                 * to store the copied input? */
{
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int bytesInBuffer;		/* How many bytes are available to be
                                 * copied in the current input buffer? */
    int copied;			/* How many characters were already copied
                                 * into the destination space? */

    int i;			/* Iterates over the copied input looking
                                 * for the input eofChar. */
    
    /*
     * If there is no input at all, return zero. The invariant is that either
     * there is no buffer in the queue, or if the first buffer is empty, it
     * is also the last buffer (and thus there is no input in the queue).
     * Note also that if the buffer is empty, we leave it in the queue.
     */
    
    if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
        return 0;
    }
    bufPtr = statePtr->inQueueHead;
    bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;

    copied = 0;
    switch (statePtr->inputTranslation) {
        case TCL_TRANSLATE_LF: {
            if (bytesInBuffer == 0) {
                return 0;
            }

	    /*
             * Copy the current chunk into the result buffer.
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
	    int curByte;
	    
            /*
             * If there is a held-back "\r" at EOF, produce it now.
             */
            
	    if (bytesInBuffer == 0) {
                if ((chanPtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) ==
                        (INPUT_SAW_CR | CHANNEL_EOF)) {
                    result[0] = '\r';
                    chanPtr->flags &= ~INPUT_SAW_CR;
                    return 1;
                }
                return 0;
            }

            /*
             * Copy the current chunk and replace "\r\n" with "\n"







|


|







7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
	    int curByte;
	    
            /*
             * If there is a held-back "\r" at EOF, produce it now.
             */
            
	    if (bytesInBuffer == 0) {
                if ((statePtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) ==
                        (INPUT_SAW_CR | CHANNEL_EOF)) {
                    result[0] = '\r';
                    statePtr->flags &= ~INPUT_SAW_CR;
                    return 1;
                }
                return 0;
            }

            /*
             * Copy the current chunk and replace "\r\n" with "\n"
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\n') {
                    chanPtr->flags &= ~INPUT_SAW_CR;
		} else if (chanPtr->flags & INPUT_SAW_CR) {
		    chanPtr->flags &= ~INPUT_SAW_CR;
		    *dst = '\r';
		    dst++;
		}
		if (curByte == '\r') {
		    chanPtr->flags |= INPUT_SAW_CR;
		} else {
		    *dst = (char) curByte;
		    dst++;
		}
	    }
	    copied = dst - result;
	    break;







|
|
|




|







7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\n') {
                    statePtr->flags &= ~INPUT_SAW_CR;
		} else if (statePtr->flags & INPUT_SAW_CR) {
		    statePtr->flags &= ~INPUT_SAW_CR;
		    *dst = '\r';
		    dst++;
		}
		if (curByte == '\r') {
		    statePtr->flags |= INPUT_SAW_CR;
		} else {
		    *dst = (char) curByte;
		    dst++;
		}
	    }
	    copied = dst - result;
	    break;
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902




























































































7903
7904
7905
7906
7907
7908
7909
	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\r') {
		    chanPtr->flags |= INPUT_SAW_CR;
		    *dst = '\n';
		    dst++;
		} else {
		    if ((curByte != '\n') || 
			    !(chanPtr->flags & INPUT_SAW_CR)) {
			*dst = (char) curByte;
			dst++;
		    }
		    chanPtr->flags &= ~INPUT_SAW_CR;
		}
	    }
	    copied = dst - result;
            break;
	}
        default: {
            panic("unknown eol translation mode");
	}
    }

    /*
     * If an in-stream EOF character is set for this channel, check that
     * the input we copied so far does not contain the EOF char.  If it does,
     * copy only up to and excluding that character.
     */
    
    if (chanPtr->inEofChar != 0) {
        for (i = 0; i < copied; i++) {
            if (result[i] == (char) chanPtr->inEofChar) {
		/*
		 * Set sticky EOF so that no further input is presented
		 * to the caller.
		 */
		
		chanPtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
		chanPtr->inputEncodingFlags |= TCL_ENCODING_END;
		copied = i;
                break;
            }
        }
    }

    /*
     * If the current buffer is empty recycle it.
     */

    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
        chanPtr->inQueueHead = bufPtr->nextPtr;
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueTail = (ChannelBuffer *) NULL;
        }
        RecycleBuffer(chanPtr, bufPtr, 0);
    }

    /*
     * Return the number of characters copied into the result buffer.
     * This may be different from the number of bytes consumed, because
     * of EOL translations.
     */





























































































    return copied;
}

/*
 *----------------------------------------------------------------------
 *







|




|



|
















|

|





|
|











|
|
|

|







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
	    copied = space;

	    end = result + copied;
	    dst = result;
	    for (src = result; src < end; src++) {
		curByte = *src;
		if (curByte == '\r') {
		    statePtr->flags |= INPUT_SAW_CR;
		    *dst = '\n';
		    dst++;
		} else {
		    if ((curByte != '\n') || 
			    !(statePtr->flags & INPUT_SAW_CR)) {
			*dst = (char) curByte;
			dst++;
		    }
		    statePtr->flags &= ~INPUT_SAW_CR;
		}
	    }
	    copied = dst - result;
            break;
	}
        default: {
            panic("unknown eol translation mode");
	}
    }

    /*
     * If an in-stream EOF character is set for this channel, check that
     * the input we copied so far does not contain the EOF char.  If it does,
     * copy only up to and excluding that character.
     */
    
    if (statePtr->inEofChar != 0) {
        for (i = 0; i < copied; i++) {
            if (result[i] == (char) statePtr->inEofChar) {
		/*
		 * Set sticky EOF so that no further input is presented
		 * to the caller.
		 */
		
		statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
		statePtr->inputEncodingFlags |= TCL_ENCODING_END;
		copied = i;
                break;
            }
        }
    }

    /*
     * If the current buffer is empty recycle it.
     */

    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
        statePtr->inQueueHead = bufPtr->nextPtr;
        if (statePtr->inQueueHead == (ChannelBuffer *) NULL) {
            statePtr->inQueueTail = (ChannelBuffer *) NULL;
        }
        RecycleBuffer(statePtr, bufPtr, 0);
    }

    /*
     * Return the number of characters copied into the result buffer.
     * This may be different from the number of bytes consumed, because
     * of EOL translations.
     */

    return copied;
}

/*
 *----------------------------------------------------------------------
 *
 * CopyBuffer --
 *
 *	Copy at most one buffer of input to the result space.
 *
 * Results:
 *	Number of bytes stored in the result buffer.  May return
 *	zero if no input is available.
 *
 * Side effects:
 *	Consumes buffered input. May deallocate one buffer.
 *
 *----------------------------------------------------------------------
 */

static int
CopyBuffer(chanPtr, result, space)
    Channel *chanPtr;		/* Channel from which to read input. */
    char *result;		/* Where to store the copied input. */
    int space;			/* How many bytes are available in result
                                 * to store the copied input? */
{
    ChannelBuffer *bufPtr;	/* The buffer from which to copy bytes. */
    int bytesInBuffer;		/* How many bytes are available to be
                                 * copied in the current input buffer? */
    int copied;			/* How many characters were already copied
                                 * into the destination space? */
    
    /*
     * If there is no input at all, return zero. The invariant is that
     * either there is no buffer in the queue, or if the first buffer
     * is empty, it is also the last buffer (and thus there is no
     * input in the queue).  Note also that if the buffer is empty, we
     * don't leave it in the queue, but recycle it.
     */
    
    if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
        return 0;
    }
    bufPtr = chanPtr->inQueueHead;
    bytesInBuffer = bufPtr->nextAdded - bufPtr->nextRemoved;

    copied = 0;

    if (bytesInBuffer == 0) {
        RecycleBuffer(chanPtr->state, bufPtr, 0);
	chanPtr->inQueueHead = (ChannelBuffer*) NULL;
	chanPtr->inQueueTail = (ChannelBuffer*) NULL;
        return 0;
    }

    /*
     * Copy the current chunk into the result buffer.
     */

    if (bytesInBuffer < space) {
        space = bytesInBuffer;
    }

    memcpy((VOID *) result,
	   (VOID *) (bufPtr->buf + bufPtr->nextRemoved),
	   (size_t) space);
    bufPtr->nextRemoved += space;
    copied = space;

    /*
     * We don't care about in-stream EOF characters here as the data
     * read here may still flow through one or more transformations,
     * i.e. is not in its final state yet.
     */

    /*
     * If the current buffer is empty recycle it.
     */

    if (bufPtr->nextRemoved == bufPtr->nextAdded) {
        chanPtr->inQueueHead = bufPtr->nextPtr;
        if (chanPtr->inQueueHead == (ChannelBuffer *) NULL) {
            chanPtr->inQueueTail = (ChannelBuffer *) NULL;
        }
        RecycleBuffer(chanPtr->state, bufPtr, 0);
    }

    /*
     * Return the number of characters copied into the result buffer.
     */

    return copied;
}

/*
 *----------------------------------------------------------------------
 *
7927
7928
7929
7930
7931
7932
7933

7934
7935
7936
7937
7938
7939
7940

static int
DoWrite(chanPtr, src, srcLen)
    Channel *chanPtr;			/* The channel to buffer output for. */
    char *src;				/* Data to write. */
    int srcLen;				/* Number of bytes to write. */
{

    ChannelBuffer *outBufPtr;		/* Current output buffer. */
    int foundNewline;			/* Did we find a newline in output? */
    char *dPtr;
    char *sPtr;				/* Search variables for newline. */
    int crsent;				/* In CRLF eol translation mode,
                                         * remember the fact that a CR was
                                         * output to the channel without







>







7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506

static int
DoWrite(chanPtr, src, srcLen)
    Channel *chanPtr;			/* The channel to buffer output for. */
    char *src;				/* Data to write. */
    int srcLen;				/* Number of bytes to write. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    ChannelBuffer *outBufPtr;		/* Current output buffer. */
    int foundNewline;			/* Did we find a newline in output? */
    char *dPtr;
    char *sPtr;				/* Search variables for newline. */
    int crsent;				/* In CRLF eol translation mode,
                                         * remember the fact that a CR was
                                         * output to the channel without
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992

    while (srcLen > 0) {
        
        /*
         * Make sure there is a current output buffer to accept output.
         */

        if (chanPtr->curOutPtr == (ChannelBuffer *) NULL) {
            chanPtr->curOutPtr = AllocChannelBuffer(chanPtr->bufSize);
        }

        outBufPtr = chanPtr->curOutPtr;

        destCopied = outBufPtr->bufLength - outBufPtr->nextAdded;
        if (destCopied > srcLen) {
            destCopied = srcLen;
        }
        
        destPtr = outBufPtr->buf + outBufPtr->nextAdded;
        switch (chanPtr->outputTranslation) {
            case TCL_TRANSLATE_LF:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);
                break;
            case TCL_TRANSLATE_CR:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);







|
|


|







|







7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558

    while (srcLen > 0) {
        
        /*
         * Make sure there is a current output buffer to accept output.
         */

        if (statePtr->curOutPtr == (ChannelBuffer *) NULL) {
            statePtr->curOutPtr = AllocChannelBuffer(statePtr->bufSize);
        }

        outBufPtr = statePtr->curOutPtr;

        destCopied = outBufPtr->bufLength - outBufPtr->nextAdded;
        if (destCopied > srcLen) {
            destCopied = srcLen;
        }
        
        destPtr = outBufPtr->buf + outBufPtr->nextAdded;
        switch (statePtr->outputTranslation) {
            case TCL_TRANSLATE_LF:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);
                break;
            case TCL_TRANSLATE_CR:
                srcCopied = destCopied;
                memcpy((VOID *) destPtr, (VOID *) src, (size_t) destCopied);
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
        /*
         * The current buffer is ready for output if it is full, or if it
         * contains a newline and this channel is line-buffered, or if it
         * contains any output and this channel is unbuffered.
         */

        outBufPtr->nextAdded += destCopied;
        if (!(chanPtr->flags & BUFFER_READY)) {
            if (outBufPtr->nextAdded == outBufPtr->bufLength) {
                chanPtr->flags |= BUFFER_READY;
            } else if (chanPtr->flags & CHANNEL_LINEBUFFERED) {
                for (sPtr = src, i = 0, foundNewline = 0;
                         (i < srcCopied) && (!foundNewline);
                         i++, sPtr++) {
                    if (*sPtr == '\n') {
                        foundNewline = 1;
                        break;
                    }
                }
                if (foundNewline) {
                    chanPtr->flags |= BUFFER_READY;
                }
            } else if (chanPtr->flags & CHANNEL_UNBUFFERED) {
                chanPtr->flags |= BUFFER_READY;
            }
        }
        
        totalDestCopied += srcCopied;
        src += srcCopied;
        srcLen -= srcCopied;

        if (chanPtr->flags & BUFFER_READY) {
            if (FlushChannel(NULL, chanPtr, 0) != 0) {
                return -1;
            }
        }
    } /* Closes "while" */

    return totalDestCopied;







|

|
|

|
|






|

|
|







|







7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
        /*
         * The current buffer is ready for output if it is full, or if it
         * contains a newline and this channel is line-buffered, or if it
         * contains any output and this channel is unbuffered.
         */

        outBufPtr->nextAdded += destCopied;
        if (!(statePtr->flags & BUFFER_READY)) {
            if (outBufPtr->nextAdded == outBufPtr->bufLength) {
                statePtr->flags |= BUFFER_READY;
            } else if (statePtr->flags & CHANNEL_LINEBUFFERED) {
                for (sPtr = src, i = 0, foundNewline = 0;
		     (i < srcCopied) && (!foundNewline);
		     i++, sPtr++) {
                    if (*sPtr == '\n') {
                        foundNewline = 1;
                        break;
                    }
                }
                if (foundNewline) {
                    statePtr->flags |= BUFFER_READY;
                }
            } else if (statePtr->flags & CHANNEL_UNBUFFERED) {
                statePtr->flags |= BUFFER_READY;
            }
        }
        
        totalDestCopied += srcCopied;
        src += srcCopied;
        srcLen -= srcCopied;

        if (statePtr->flags & BUFFER_READY) {
            if (FlushChannel(NULL, chanPtr, 0) != 0) {
                return -1;
            }
        }
    } /* Closes "while" */

    return totalDestCopied;
8104
8105
8106
8107
8108
8109
8110

8111
8112
8113
8114
8115
8116



8117
8118
8119
8120
8121
8122
8123
8124
8125
8126

8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149














































8150
8151
8152
8153
8154
8155
8156
 *----------------------------------------------------------------------
 */

static void
StopCopy(csPtr)
    CopyState *csPtr;		/* State for bg copy to stop . */
{

    int nonBlocking;

    if (!csPtr) {
	return;
    }




    /*
     * Restore the old blocking mode and output buffering mode.
     */

    nonBlocking = (csPtr->readFlags & CHANNEL_NONBLOCKING);
    if (nonBlocking != (csPtr->readPtr->flags & CHANNEL_NONBLOCKING)) {
	SetBlockMode(NULL, csPtr->readPtr,
		nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
    }
    if (csPtr->writePtr != csPtr->writePtr) {

	if (nonBlocking != (csPtr->writePtr->flags & CHANNEL_NONBLOCKING)) {
	    SetBlockMode(NULL, csPtr->writePtr,
		    nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
	}
    }
    csPtr->writePtr->flags &= ~(CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
    csPtr->writePtr->flags |=
	csPtr->writeFlags & (CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
	    

    if (csPtr->cmdPtr) {
	Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->readPtr, CopyEventProc,
	    (ClientData)csPtr);
	if (csPtr->readPtr != csPtr->writePtr) {
	    Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->writePtr,
		    CopyEventProc, (ClientData)csPtr);
	}
        Tcl_DecrRefCount(csPtr->cmdPtr);
    }
    csPtr->readPtr->csPtr = NULL;
    csPtr->writePtr->csPtr = NULL;
    ckfree((char*) csPtr);
}















































/*
 *----------------------------------------------------------------------
 *
 * SetBlockMode --
 *
 *	This function sets the blocking mode for a channel and updates







>






>
>
>





|



|
>
|




|
|

<



|






|
|


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705

7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
 *----------------------------------------------------------------------
 */

static void
StopCopy(csPtr)
    CopyState *csPtr;		/* State for bg copy to stop . */
{
    ChannelState *inStatePtr, *outStatePtr;
    int nonBlocking;

    if (!csPtr) {
	return;
    }

    inStatePtr	= csPtr->readPtr->state;
    outStatePtr	= csPtr->writePtr->state;

    /*
     * Restore the old blocking mode and output buffering mode.
     */

    nonBlocking = (csPtr->readFlags & CHANNEL_NONBLOCKING);
    if (nonBlocking != (inStatePtr->flags & CHANNEL_NONBLOCKING)) {
	SetBlockMode(NULL, csPtr->readPtr,
		nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
    }
    if (csPtr->readPtr != csPtr->writePtr) {
	nonBlocking = (csPtr->writeFlags & CHANNEL_NONBLOCKING);
	if (nonBlocking != (outStatePtr->flags & CHANNEL_NONBLOCKING)) {
	    SetBlockMode(NULL, csPtr->writePtr,
		    nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
	}
    }
    outStatePtr->flags &= ~(CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
    outStatePtr->flags |=
	csPtr->writeFlags & (CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);


    if (csPtr->cmdPtr) {
	Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->readPtr, CopyEventProc,
		(ClientData)csPtr);
	if (csPtr->readPtr != csPtr->writePtr) {
	    Tcl_DeleteChannelHandler((Tcl_Channel)csPtr->writePtr,
		    CopyEventProc, (ClientData)csPtr);
	}
        Tcl_DecrRefCount(csPtr->cmdPtr);
    }
    inStatePtr->csPtr  = NULL;
    outStatePtr->csPtr = NULL;
    ckfree((char*) csPtr);
}

/*
 *----------------------------------------------------------------------
 *
 * StackSetBlockMode --
 *
 *	This function sets the blocking mode for a channel, iterating
 *	through each channel in a stack and updates the state flags.
 *
 * Results:
 *	0 if OK, result code from failed blockModeProc otherwise.
 *
 * Side effects:
 *	Modifies the blocking mode of the channel and possibly generates
 *	an error.
 *
 *----------------------------------------------------------------------
 */

static int
StackSetBlockMode(chanPtr, mode)
    Channel *chanPtr;		/* Channel to modify. */
    int mode;			/* One of TCL_MODE_BLOCKING or
				 * TCL_MODE_NONBLOCKING. */
{
    int result = 0;
    Tcl_DriverBlockModeProc *blockModeProc;

    /*
     * Start at the top of the channel stack
     */

    chanPtr = chanPtr->state->topChanPtr;
    while (chanPtr != (Channel *) NULL) {
	blockModeProc = Tcl_ChannelBlockModeProc(chanPtr->typePtr);
	if (blockModeProc != NULL) {
	    result = (*blockModeProc) (chanPtr->instanceData, mode);
	    if (result != 0) {
		Tcl_SetErrno(result);
		return result;
	    }
	}
	chanPtr = chanPtr->downChanPtr;
    }
    return 0;
}

/*
 *----------------------------------------------------------------------
 *
 * SetBlockMode --
 *
 *	This function sets the blocking mode for a channel and updates
8169
8170
8171
8172
8173
8174
8175

8176
8177
8178
8179
8180

8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
static int
SetBlockMode(interp, chanPtr, mode)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    Channel *chanPtr;		/* Channel to modify. */
    int mode;			/* One of TCL_MODE_BLOCKING or
				 * TCL_MODE_NONBLOCKING. */
{

    int result = 0;
    if (chanPtr->typePtr->blockModeProc != NULL) {
	result = (chanPtr->typePtr->blockModeProc) (chanPtr->instanceData,
		mode);
    }

    if (result != 0) {
	Tcl_SetErrno(result);
	if (interp != (Tcl_Interp *) NULL) {
	    Tcl_AppendResult(interp, "error setting blocking mode: ",
		    Tcl_PosixError(interp), (char *) NULL);
	}
	return TCL_ERROR;
    }
    if (mode == TCL_MODE_BLOCKING) {
	chanPtr->flags &= (~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED));
    } else {
	chanPtr->flags |= CHANNEL_NONBLOCKING;
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *







>

<
<
<
|
>

<







|

|







7785
7786
7787
7788
7789
7790
7791
7792
7793



7794
7795
7796

7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
static int
SetBlockMode(interp, chanPtr, mode)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    Channel *chanPtr;		/* Channel to modify. */
    int mode;			/* One of TCL_MODE_BLOCKING or
				 * TCL_MODE_NONBLOCKING. */
{
    ChannelState *statePtr = chanPtr->state;	/* state info for channel */
    int result = 0;




    result = StackSetBlockMode(chanPtr, mode);
    if (result != 0) {

	if (interp != (Tcl_Interp *) NULL) {
	    Tcl_AppendResult(interp, "error setting blocking mode: ",
		    Tcl_PosixError(interp), (char *) NULL);
	}
	return TCL_ERROR;
    }
    if (mode == TCL_MODE_BLOCKING) {
	statePtr->flags &= (~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED));
    } else {
	statePtr->flags |= CHANNEL_NONBLOCKING;
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
8236
8237
8238
8239
8240
8241
8242
8243
8244

8245
8246



8247









8248
8249

8250

8251

8252
8253
8254
8255
8256
8257
8258




8259
8260

8261
8262
8263
8264
8265
8266
8267
8268














































































































































































































































































































































 */

int
Tcl_GetChannelNamesEx(interp, pattern)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    char *pattern;		/* pattern to filter on. */
{
    Channel *chanPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);

    char *name;
    Tcl_Obj *resultPtr;













    resultPtr = Tcl_GetObjResult(interp);
    for (chanPtr = tsdPtr->firstChanPtr;

	 chanPtr != NULL;

	 chanPtr = chanPtr->nextChanPtr) {

        if (chanPtr == (Channel *) tsdPtr->stdinChannel) {
	    name = "stdin";
	} else if (chanPtr == (Channel *) tsdPtr->stdoutChannel) {
	    name = "stdout";
	} else if (chanPtr == (Channel *) tsdPtr->stderrChannel) {
	    name = "stderr";
	} else {




	    name = chanPtr->channelName;
	}

	if (((pattern == NULL) || Tcl_StringMatch(name, pattern)) &&
		(Tcl_ListObjAppendElement(interp, resultPtr,
			Tcl_NewStringObj(name, -1)) != TCL_OK)) {
	    return TCL_ERROR;
	}
    }
    return TCL_OK;
}





















































































































































































































































































































































<

>
|
|
>
>
>

>
>
>
>
>
>
>
>
>
|
|
>
|
>
|
>
|

|

|


>
>
>
>
|

>








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
7850
7851
7852
7853
7854
7855
7856

7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
 */

int
Tcl_GetChannelNamesEx(interp, pattern)
    Tcl_Interp *interp;		/* Interp for error reporting. */
    char *pattern;		/* pattern to filter on. */
{

    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    ChannelState *statePtr;
    char *name;			/* name for channel */
    Tcl_Obj *resultPtr;		/* pointer to result object */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Tcl_HashSearch hSearch;	/* Search variable. */

    if (interp == (Tcl_Interp *) NULL) {
	return TCL_OK;
    }

    /*
     * Get the channel table that stores the channels registered
     * for this interpreter.
     */
    hTblPtr	= GetChannelTable(interp);
    resultPtr	= Tcl_GetObjResult(interp);

    for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	 hPtr != (Tcl_HashEntry *) NULL;
	 hPtr = Tcl_NextHashEntry(&hSearch)) {

	statePtr = ((Channel *) Tcl_GetHashValue(hPtr))->state;
        if (statePtr->topChanPtr == (Channel *) tsdPtr->stdinChannel) {
	    name = "stdin";
	} else if (statePtr->topChanPtr == (Channel *) tsdPtr->stdoutChannel) {
	    name = "stdout";
	} else if (statePtr->topChanPtr == (Channel *) tsdPtr->stderrChannel) {
	    name = "stderr";
	} else {
	    /*
	     * This is also stored in Tcl_GetHashKey(hTblPtr, hPtr),
	     * but it's simpler to just grab the name from the statePtr.
	     */
	    name = statePtr->channelName;
	}

	if (((pattern == NULL) || Tcl_StringMatch(name, pattern)) &&
		(Tcl_ListObjAppendElement(interp, resultPtr,
			Tcl_NewStringObj(name, -1)) != TCL_OK)) {
	    return TCL_ERROR;
	}
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelName --
 *
 *	Return the name of the channel type.
 *
 * Results:
 *	A pointer the name of the channel type.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

char *
Tcl_ChannelName(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->typeName);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelVersion --
 *
 *	Return the of version of the channel type.
 *
 * Results:
 *	TCL_CHANNEL_VERSION_2 or TCL_CHANNEL_VERSION_1.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_ChannelTypeVersion
Tcl_ChannelVersion(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    if (chanTypePtr->version == TCL_CHANNEL_VERSION_2) {
	return TCL_CHANNEL_VERSION_2;
    } else {
	/*
	 * In <v2 channel versions, the version field is occupied
	 * by the Tcl_DriverBlockModeProc
	 */
	return TCL_CHANNEL_VERSION_1;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelBlockModeProc --
 *
 *	Return the Tcl_DriverBlockModeProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverBlockModeProc *
Tcl_ChannelBlockModeProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    if (chanTypePtr->version == TCL_CHANNEL_VERSION_2) {
	return (chanTypePtr->blockModeProc);
    } else {
	return (Tcl_DriverBlockModeProc *) (chanTypePtr->version);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelCloseProc --
 *
 *	Return the Tcl_DriverCloseProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverCloseProc *
Tcl_ChannelCloseProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->closeProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelClose2Proc --
 *
 *	Return the Tcl_DriverClose2Proc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverClose2Proc *
Tcl_ChannelClose2Proc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->close2Proc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelInputProc --
 *
 *	Return the Tcl_DriverInputProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverInputProc *
Tcl_ChannelInputProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->inputProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelOutputProc --
 *
 *	Return the Tcl_DriverOutputProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverOutputProc *
Tcl_ChannelOutputProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->outputProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelSeekProc --
 *
 *	Return the Tcl_DriverSeekProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverSeekProc *
Tcl_ChannelSeekProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->seekProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelSetOptionProc --
 *
 *	Return the Tcl_DriverSetOptionProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverSetOptionProc *
Tcl_ChannelSetOptionProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->setOptionProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelGetOptionProc --
 *
 *	Return the Tcl_DriverGetOptionProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverGetOptionProc *
Tcl_ChannelGetOptionProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->getOptionProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelWatchProc --
 *
 *	Return the Tcl_DriverWatchProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverWatchProc *
Tcl_ChannelWatchProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->watchProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelGetHandleProc --
 *
 *	Return the Tcl_DriverGetHandleProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverGetHandleProc *
Tcl_ChannelGetHandleProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->getHandleProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelFlushProc --
 *
 *	Return the Tcl_DriverFlushProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverFlushProc *
Tcl_ChannelFlushProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->flushProc);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ChannelHandlerProc --
 *
 *	Return the Tcl_DriverHandlerProc of the channel type.
 *
 * Results:
 *	A pointer to the proc.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

Tcl_DriverHandlerProc *
Tcl_ChannelHandlerProc(chanTypePtr)
    Tcl_ChannelType *chanTypePtr;	/* Pointer to channel type. */
{
    return (chanTypePtr->handlerProc);
}
Added generic/tclIO.h.






















































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
/* 
 * tclIO.h --
 *
 *	This file provides the generic portions (those that are the same on
 *	all platforms and for all channel types) of Tcl's IO facilities.
 *
 * Copyright (c) 1998-2000 Ajuba Solutions
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIO.h,v 1.1.4.1 2000/07/27 01:39:17 hobbs Exp $
 */

/*
 * Make sure that both EAGAIN and EWOULDBLOCK are defined. This does not
 * compile on systems where neither is defined. We want both defined so
 * that we can test safely for both. In the code we still have to test for
 * both because there may be systems on which both are defined and have
 * different values.
 */

#if ((!defined(EWOULDBLOCK)) && (defined(EAGAIN)))
#   define EWOULDBLOCK EAGAIN
#endif
#if ((!defined(EAGAIN)) && (defined(EWOULDBLOCK)))
#   define EAGAIN EWOULDBLOCK
#endif
#if ((!defined(EAGAIN)) && (!defined(EWOULDBLOCK)))
error one of EWOULDBLOCK or EAGAIN must be defined
#endif

/*
 * The following structure encapsulates the state for a background channel
 * copy.  Note that the data buffer for the copy will be appended to this
 * structure.
 */

typedef struct CopyState {
    struct Channel *readPtr;	/* Pointer to input channel. */
    struct Channel *writePtr;	/* Pointer to output channel. */
    int readFlags;		/* Original read channel flags. */
    int writeFlags;		/* Original write channel flags. */
    int toRead;			/* Number of bytes to copy, or -1. */
    int total;			/* Total bytes transferred (written). */
    Tcl_Interp *interp;		/* Interp that started the copy. */
    Tcl_Obj *cmdPtr;		/* Command to be invoked at completion. */
    int bufSize;		/* Size of appended buffer. */
    char buffer[1];		/* Copy buffer, this must be the last
				 * field. */
} CopyState;

/*
 * struct ChannelBuffer:
 *
 * Buffers data being sent to or from a channel.
 */

typedef struct ChannelBuffer {
    int nextAdded;		/* The next position into which a character
                                 * will be put in the buffer. */
    int nextRemoved;		/* Position of next byte to be removed
                                 * from the buffer. */
    int bufLength;		/* How big is the buffer? */
    struct ChannelBuffer *nextPtr;
    				/* Next buffer in chain. */
    char buf[4];		/* Placeholder for real buffer. The real
                                 * buffer occuppies this space + bufSize-4
                                 * bytes. This must be the last field in
                                 * the structure. */
} ChannelBuffer;

#define CHANNELBUFFER_HEADER_SIZE	(sizeof(ChannelBuffer) - 4)

/*
 * How much extra space to allocate in buffer to hold bytes from previous
 * buffer (when converting to UTF-8) or to hold bytes that will go to
 * next buffer (when converting from UTF-8).
 */
 
#define BUFFER_PADDING	    16
 
/*
 * The following defines the *default* buffer size for channels.
 */

#define CHANNELBUFFER_DEFAULT_SIZE	(1024 * 4)

/*
 * Structure to record a close callback. One such record exists for
 * each close callback registered for a channel.
 */

typedef struct CloseCallback {
    Tcl_CloseProc *proc;		/* The procedure to call. */
    ClientData clientData;		/* Arbitrary one-word data to pass
					 * to the callback. */
    struct CloseCallback *nextPtr;	/* For chaining close callbacks. */
} CloseCallback;

/*
 * The following structure describes the information saved from a call to
 * "fileevent". This is used later when the event being waited for to
 * invoke the saved script in the interpreter designed in this record.
 */

typedef struct EventScriptRecord {
    struct Channel *chanPtr;	/* The channel for which this script is
				 * registered. This is used only when an
				 * error occurs during evaluation of the
				 * script, to delete the handler. */
    Tcl_Obj *scriptPtr;		/* Script to invoke. */
    Tcl_Interp *interp;		/* In what interpreter to invoke script? */
    int mask;			/* Events must overlap current mask for the
				 * stored script to be invoked. */
    struct EventScriptRecord *nextPtr;
				/* Next in chain of records. */
} EventScriptRecord;

/*
 * struct Channel:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct Channel {
    struct ChannelState *state; /* Split out state information */

    ClientData instanceData;	/* Instance-specific data provided by
				 * creator of channel. */
    Tcl_ChannelType *typePtr;	/* Pointer to channel type structure. */

    struct Channel *downChanPtr;/* Refers to channel this one was stacked
				 * upon.  This reference is NULL for normal
				 * channels.  See Tcl_StackChannel. */
    struct Channel *upChanPtr;	/* Refers to the channel above stacked this
				 * one. NULL for the top most channel. */

    /*
     * Intermediate buffers to hold pre-read data for consumption by a
     * newly stacked transformation. See 'Tcl_StackChannel'.
     */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */
} Channel;

/*
 * struct ChannelState:
 *
 * One of these structures is allocated for each open channel. It contains data
 * specific to the channel but which belongs to the generic part of the Tcl
 * channel mechanism, and it points at an instance specific (and type
 * specific) * instance data, and at a channel type structure.
 */

typedef struct ChannelState {
    char *channelName;		/* The name of the channel instance in Tcl
				 * commands. Storage is owned by the generic IO
				 * code, is dynamically allocated. */
    int	flags;			/* ORed combination of the flags defined
				 * below. */
    Tcl_Encoding encoding;	/* Encoding to apply when reading or writing
				 * data on this channel.  NULL means no
				 * encoding is applied to data. */
    Tcl_EncodingState inputEncodingState;
				/* Current encoding state, used when converting
				 * input data bytes to UTF-8. */
    int inputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting input data bytes to
				 * UTF-8.  May be TCL_ENCODING_START before
				 * converting first byte and TCL_ENCODING_END
				 * when EOF is seen. */
    Tcl_EncodingState outputEncodingState;
				/* Current encoding state, used when converting
				 * UTF-8 to output data bytes. */
    int outputEncodingFlags;	/* Encoding flags to pass to conversion
				 * routine when converting UTF-8 to output
				 * data bytes.  May be TCL_ENCODING_START
				 * before converting first byte and
				 * TCL_ENCODING_END when EOF is seen. */
    Tcl_EolTranslation inputTranslation;
				/* What translation to apply for end of line
				 * sequences on input? */    
    Tcl_EolTranslation outputTranslation;
				/* What translation to use for generating
				 * end of line sequences in output? */
    int inEofChar;		/* If nonzero, use this as a signal of EOF
				 * on input. */
    int outEofChar;             /* If nonzero, append this to the channel
				 * when it is closed if it is open for
				 * writing. */
    int unreportedError;	/* Non-zero if an error report was deferred
				 * because it happened in the background. The
				 * value is the POSIX error code. */
    int refCount;		/* How many interpreters hold references to
				 * this IO channel? */

    CloseCallback *closeCbPtr;	/* Callbacks registered to be called when the
				 * channel is closed. */
    char *outputStage;		/* Temporary staging buffer used when
				 * translating EOL before converting from
				 * UTF-8 to external form. */
    ChannelBuffer *curOutPtr;	/* Current output buffer being filled. */
    ChannelBuffer *outQueueHead;/* Points at first buffer in output queue. */
    ChannelBuffer *outQueueTail;/* Points at last buffer in output queue. */

    ChannelBuffer *saveInBufPtr;/* Buffer saved for input queue - eliminates
				 * need to allocate a new buffer for "gets"
				 * that crosses buffer boundaries. */
    ChannelBuffer *inQueueHead;	/* Points at first buffer in input queue. */
    ChannelBuffer *inQueueTail;	/* Points at last buffer in input queue. */

    struct ChannelHandler *chPtr;/* List of channel handlers registered
				  * for this channel. */
    int interestMask;		/* Mask of all events this channel has
				 * handlers for. */
    EventScriptRecord *scriptRecordPtr;
				/* Chain of all scripts registered for
				 * event handlers ("fileevent") on this
				 * channel. */

    int bufSize;		/* What size buffers to allocate? */
    Tcl_TimerToken timer;	/* Handle to wakeup timer for this channel. */
    CopyState *csPtr;		/* State of background copy, or NULL. */
    Channel *topChanPtr;	/* Refers to topmost channel in a stack.
				 * Never NULL. */
    Channel *bottomChanPtr;	/* Refers to bottommost channel in a stack.
				 * This channel can be relied on to live as
				 * long as the channel state. Never NULL. */
    struct ChannelState *nextCSPtr;
				/* Next in list of channels currently open. */
} ChannelState;
    
/*
 * Values for the flags field in Channel. Any ORed combination of the
 * following flags can be stored in the field. These flags record various
 * options and state bits about the channel. In addition to the flags below,
 * the channel can also have TCL_READABLE (1<<1) and TCL_WRITABLE (1<<2) set.
 */

#define CHANNEL_NONBLOCKING	(1<<3)	/* Channel is currently in
					 * nonblocking mode. */
#define CHANNEL_LINEBUFFERED	(1<<4)	/* Output to the channel must be
					 * flushed after every newline. */
#define CHANNEL_UNBUFFERED	(1<<5)	/* Output to the channel must always
					 * be flushed immediately. */
#define BUFFER_READY		(1<<6)	/* Current output buffer (the
					 * curOutPtr field in the
                                         * channel structure) should be
                                         * output as soon as possible even
                                         * though it may not be full. */
#define BG_FLUSH_SCHEDULED	(1<<7)	/* A background flush of the
					 * queued output buffers has been
                                         * scheduled. */
#define CHANNEL_CLOSED		(1<<8)	/* Channel has been closed. No
					 * further Tcl-level IO on the
                                         * channel is allowed. */
#define CHANNEL_EOF		(1<<9)	/* EOF occurred on this channel.
					 * This bit is cleared before every
                                         * input operation. */
#define CHANNEL_STICKY_EOF	(1<<10)	/* EOF occurred on this channel because
					 * we saw the input eofChar. This bit
                                         * prevents clearing of the EOF bit
                                         * before every input operation. */
#define CHANNEL_BLOCKED		(1<<11)	/* EWOULDBLOCK or EAGAIN occurred
					 * on this channel. This bit is
					 * cleared before every input or
					 * output operation. */
#define INPUT_SAW_CR		(1<<12)	/* Channel is in CRLF eol input
					 * translation mode and the last
                                         * byte seen was a "\r". */
#define INPUT_NEED_NL		(1<<15)	/* Saw a '\r' at end of last buffer,
					 * and there should be a '\n' at
					 * beginning of next buffer. */
#define CHANNEL_DEAD		(1<<13)	/* The channel has been closed by
					 * the exit handler (on exit) but
                                         * not deallocated. When any IO
                                         * operation sees this flag on a
                                         * channel, it does not call driver
                                         * level functions to avoid referring
                                         * to deallocated data. */
#define CHANNEL_NEED_MORE_DATA	(1<<14)	/* The last input operation failed
					 * because there was not enough data
					 * to complete the operation.  This
					 * flag is set when gets fails to
					 * get a complete line or when read
					 * fails to get a complete character.
					 * When set, file events will not be
					 * delivered for buffered data until
					 * the state of the channel changes. */
#define CHANNEL_RAW_MODE	(1<<16)	/* When set, notes that the Raw API is
					 * being used. */

/*
 * For each channel handler registered in a call to Tcl_CreateChannelHandler,
 * there is one record of the following type. All of records for a specific
 * channel are chained together in a singly linked list which is stored in
 * the channel structure.
 */

typedef struct ChannelHandler {
    Channel *chanPtr;		/* The channel structure for this channel. */
    int mask;			/* Mask of desired events. */
    Tcl_ChannelProc *proc;	/* Procedure to call in the type of
                                 * Tcl_CreateChannelHandler. */
    ClientData clientData;	/* Argument to pass to procedure. */
    struct ChannelHandler *nextPtr;
    				/* Next one in list of registered handlers. */
} ChannelHandler;

/*
 * This structure keeps track of the current ChannelHandler being invoked in
 * the current invocation of ChannelHandlerEventProc. There is a potential
 * problem if a ChannelHandler is deleted while it is the current one, since
 * ChannelHandlerEventProc needs to look at the nextPtr field. To handle this
 * problem, structures of the type below indicate the next handler to be
 * processed for any (recursively nested) dispatches in progress. The
 * nextHandlerPtr field is updated if the handler being pointed to is deleted.
 * The nextPtr field is used to chain together all recursive invocations, so
 * that Tcl_DeleteChannelHandler can find all the recursively nested
 * invocations of ChannelHandlerEventProc and compare the handler being
 * deleted against the NEXT handler to be invoked in that invocation; when it
 * finds such a situation, Tcl_DeleteChannelHandler updates the nextHandlerPtr
 * field of the structure to the next handler.
 */

typedef struct NextChannelHandler {
    ChannelHandler *nextHandlerPtr;	/* The next handler to be invoked in
                                         * this invocation. */
    struct NextChannelHandler *nestedHandlerPtr;
    /* Next nested invocation of
     * ChannelHandlerEventProc. */
} NextChannelHandler;


/*
 * The following structure describes the event that is added to the Tcl
 * event queue by the channel handler check procedure.
 */

typedef struct ChannelHandlerEvent {
    Tcl_Event header;		/* Standard header for all events. */
    Channel *chanPtr;		/* The channel that is ready. */
    int readyMask;		/* Events that have occurred. */
} ChannelHandlerEvent;

/*
 * The following structure is used by Tcl_GetsObj() to encapsulates the
 * state for a "gets" operation.
 */
 
typedef struct GetsState {
    Tcl_Obj *objPtr;		/* The object to which UTF-8 characters
				 * will be appended. */
    char **dstPtr;		/* Pointer into objPtr's string rep where
				 * next character should be stored. */
    Tcl_Encoding encoding;	/* The encoding to use to convert raw bytes
				 * to UTF-8.  */
    ChannelBuffer *bufPtr;	/* The current buffer of raw bytes being
				 * emptied. */
    Tcl_EncodingState state;	/* The encoding state just before the last
				 * external to UTF-8 conversion in
				 * FilterInputBytes(). */
    int rawRead;		/* The number of bytes removed from bufPtr
				 * in the last call to FilterInputBytes(). */
    int bytesWrote;		/* The number of bytes of UTF-8 data
				 * appended to objPtr during the last call to
				 * FilterInputBytes(). */
    int charsWrote;		/* The corresponding number of UTF-8
				 * characters appended to objPtr during the
				 * last call to FilterInputBytes(). */
    int totalChars;		/* The total number of UTF-8 characters
				 * appended to objPtr so far, just before the
				 * last call to FilterInputBytes(). */
} GetsState;
Changes to generic/tclIOCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclIOCmd.c --
 *
 *	Contains the definitions of most of the Tcl commands relating to IO.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIOCmd.c,v 1.7 1999/09/21 04:20:40 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Callback structure for accept callback in a TCP server.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclIOCmd.c --
 *
 *	Contains the definitions of most of the Tcl commands relating to IO.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIOCmd.c,v 1.7.2.1 2001/08/06 22:24:11 andreas_kupries Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Callback structure for accept callback in a TCP server.
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239



240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

260
261
262
263
264
265
266
    }
    if ((mode & TCL_READABLE) == 0) {
	Tcl_AppendResult(interp, "channel \"", name,
		"\" wasn't opened for reading", (char *) NULL);
        return TCL_ERROR;
    }

    resultPtr = Tcl_GetObjResult(interp);
    linePtr = resultPtr;
    if (objc == 3) {
	/*
	 * Variable gets line, interp get bytecount.
	 */

	linePtr = Tcl_NewObj();
    }




    lineLen = Tcl_GetsObj(chan, linePtr);
    if (lineLen < 0) {
        if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) {
	    if (linePtr != resultPtr) {
		Tcl_DecrRefCount(linePtr);
	    }
	    Tcl_ResetResult(interp);
	    Tcl_AppendResult(interp, "error reading \"", name, "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
            return TCL_ERROR;
        }
        lineLen = -1;
    }
    if (objc == 3) {
	if (Tcl_ObjSetVar2(interp, objv[2], NULL, linePtr,
		TCL_LEAVE_ERR_MSG) == NULL) {
	    Tcl_DecrRefCount(linePtr);
            return TCL_ERROR;
        }

	Tcl_SetIntObj(resultPtr, lineLen);
        return TCL_OK;
    }
    return TCL_OK;
}

/*







<
<







>
>
>




|















>







224
225
226
227
228
229
230


231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
    }
    if ((mode & TCL_READABLE) == 0) {
	Tcl_AppendResult(interp, "channel \"", name,
		"\" wasn't opened for reading", (char *) NULL);
        return TCL_ERROR;
    }



    if (objc == 3) {
	/*
	 * Variable gets line, interp get bytecount.
	 */

	linePtr = Tcl_NewObj();
    }
    else {
	linePtr = Tcl_GetObjResult(interp);
    }

    lineLen = Tcl_GetsObj(chan, linePtr);
    if (lineLen < 0) {
        if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) {
	    if (objc == 3) {
		Tcl_DecrRefCount(linePtr);
	    }
	    Tcl_ResetResult(interp);
	    Tcl_AppendResult(interp, "error reading \"", name, "\": ",
		    Tcl_PosixError(interp), (char *) NULL);
            return TCL_ERROR;
        }
        lineLen = -1;
    }
    if (objc == 3) {
	if (Tcl_ObjSetVar2(interp, objv[2], NULL, linePtr,
		TCL_LEAVE_ERR_MSG) == NULL) {
	    Tcl_DecrRefCount(linePtr);
            return TCL_ERROR;
        }
	resultPtr = Tcl_GetObjResult(interp);
	Tcl_SetIntObj(resultPtr, lineLen);
        return TCL_OK;
    }
    return TCL_OK;
}

/*
Added generic/tclIOGT.c.






























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
/*
 * tclIOGT.c --
 *
 *	Implements a generic transformation exposing the underlying API
 *	at the script level.  Contributed by Andreas Kupries.
 *
 * Copyright (c) 2000 Ajuba Solutions
 * Copyright (c) 1999-2000 Andreas Kupries (a.kupries@westend.com)
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * CVS: $Id: tclIOGT.c,v 1.1.4.3 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclIO.h"


/*
 * Forward declarations of internal procedures.
 * First the driver procedures of the transformation.
 */

static int		TransformBlockModeProc _ANSI_ARGS_ ((
				ClientData instanceData, int mode));
static int		TransformCloseProc _ANSI_ARGS_ ((
				ClientData instanceData, Tcl_Interp* interp));
static int		TransformInputProc _ANSI_ARGS_ ((
				ClientData instanceData,
				char* buf, int toRead, int* errorCodePtr));
static int		TransformOutputProc _ANSI_ARGS_ ((
				ClientData instanceData,
				char*  buf, int toWrite, int* errorCodePtr));
static int		TransformSeekProc _ANSI_ARGS_ ((
				ClientData instanceData, long offset,
				int mode, int* errorCodePtr));
static int		TransformSetOptionProc _ANSI_ARGS_((
				ClientData instanceData, Tcl_Interp *interp,
				char *optionName, char *value));
static int		TransformGetOptionProc _ANSI_ARGS_((
				ClientData instanceData, Tcl_Interp *interp,
				char *optionName, Tcl_DString *dsPtr));
static void		TransformWatchProc _ANSI_ARGS_ ((
				ClientData instanceData, int mask));
static int		TransformGetFileHandleProc _ANSI_ARGS_ ((
				ClientData instanceData, int direction,
				ClientData* handlePtr));
static int		TransformNotifyProc _ANSI_ARGS_ ((
				ClientData instanceData, int mask));

/*
 * Forward declarations of internal procedures.
 * Secondly the procedures for handling and generating fileeevents.
 */

static void		TransformChannelHandlerTimer _ANSI_ARGS_ ((
				ClientData clientData));

/*
 * Forward declarations of internal procedures.
 * Third, helper procedures encapsulating essential tasks.
 */

typedef struct TransformChannelData TransformChannelData;

static int		ExecuteCallback _ANSI_ARGS_ ((
				TransformChannelData* ctrl, Tcl_Interp* interp,
				unsigned char* op, unsigned char* buf,
				int bufLen, int transmit, int preserve));

/*
 * Action codes to give to 'ExecuteCallback' (argument 'transmit')
 * confering to the procedure what to do with the result of the script
 * it calls.
 */

#define TRANSMIT_DONT  (0) /* No transfer to do */
#define TRANSMIT_DOWN  (1) /* Transfer to the underlying channel */
#define TRANSMIT_SELF  (2) /* Transfer into our channel. */
#define TRANSMIT_IBUF  (3) /* Transfer to internal input buffer */
#define TRANSMIT_NUM   (4) /* Transfer number to 'maxRead' */

/*
 * Codes for 'preserve' of 'ExecuteCallback'
 */

#define P_PRESERVE    (1)
#define P_NO_PRESERVE (0)

/*
 * Strings for the action codes delivered to the script implementing
 * a transformation. Argument 'op' of 'ExecuteCallback'.
 */

#define A_CREATE_WRITE	(UCHARP ("create/write"))
#define A_DELETE_WRITE	(UCHARP ("delete/write"))
#define A_FLUSH_WRITE	(UCHARP ("flush/write"))
#define A_WRITE		(UCHARP ("write"))

#define A_CREATE_READ	(UCHARP ("create/read"))
#define A_DELETE_READ	(UCHARP ("delete/read"))
#define A_FLUSH_READ	(UCHARP ("flush/read"))
#define A_READ		(UCHARP ("read"))

#define A_QUERY_MAXREAD (UCHARP ("query/maxRead"))
#define A_CLEAR_READ	(UCHARP ("clear/read"))

/*
 * Management of a simple buffer.
 */

typedef struct ResultBuffer ResultBuffer;

static void		ResultClear  _ANSI_ARGS_ ((ResultBuffer* r));
static void		ResultInit   _ANSI_ARGS_ ((ResultBuffer* r));
static int		ResultLength _ANSI_ARGS_ ((ResultBuffer* r));
static int		ResultCopy   _ANSI_ARGS_ ((ResultBuffer* r,
				unsigned char* buf, int toRead));
static void		ResultAdd    _ANSI_ARGS_ ((ResultBuffer* r,
				unsigned char* buf, int toWrite));

/*
 * This structure describes the channel type structure for tcl based
 * transformations.
 */

static Tcl_ChannelType transformChannelType = {
    "transform",			/* Type name. */
    TCL_CHANNEL_VERSION_2,
    TransformCloseProc,			/* Close proc. */
    TransformInputProc,			/* Input proc. */
    TransformOutputProc,		/* Output proc. */
    TransformSeekProc,			/* Seek proc. */
    TransformSetOptionProc,		/* Set option proc. */
    TransformGetOptionProc,		/* Get option proc. */
    TransformWatchProc,			/* Initialize notifier. */
    TransformGetFileHandleProc,		/* Get OS handles out of channel. */
    NULL,				/* close2proc */
    TransformBlockModeProc,		/* Set blocking/nonblocking mode.*/
    NULL,				/* Flush proc. */
    TransformNotifyProc,                /* Handling of events bubbling up */
};

/*
 * Possible values for 'flags' field in control structure, see below.
 */

#define CHANNEL_ASYNC		(1<<0) /* non-blocking mode */

/*
 * Definition of the structure containing the information about the
 * internal input buffer.
 */

struct ResultBuffer {
    unsigned char* buf;       /* Reference to the buffer area */
    int            allocated; /* Allocated size of the buffer area */
    int            used;      /* Number of bytes in the buffer, <= allocated */
};

/*
 * Additional bytes to allocate during buffer expansion
 */

#define INCREMENT (512)

/*
 * Number of milliseconds to wait before firing an event to flush
 * out information waiting in buffers (fileevent support).
 */

#define FLUSH_DELAY (5)

/*
 * Convenience macro to make some casts easier to use.
 */

#define UCHARP(x) ((unsigned char*) (x))
#define NO_INTERP ((Tcl_Interp*) NULL)

/*
 * Definition of a structure used by all transformations generated here to
 * maintain their local state.
 */

struct TransformChannelData {

    /*
     * General section. Data to integrate the transformation into the channel
     * system.
     */

    Tcl_Channel self;     /* Our own Channel handle */
    int readIsFlushed;    /* Flag to note wether in.flushProc was called or not
			   */
    int flags;            /* Currently CHANNEL_ASYNC or zero */
    int watchMask;        /* Current watch/event/interest mask */
    int mode;             /* mode of parent channel, OR'ed combination of
			   * TCL_READABLE, TCL_WRITABLE */
    Tcl_TimerToken timer; /* Timer for automatic flushing of information
			   * sitting in an internal buffer. Required for full
			   * fileevent support */
    /*
     * Transformation specific data.
     */

    int maxRead;            /* Maximum allowed number of bytes to read, as
			     * given to us by the tcl script implementing the
			     * transformation. */
    Tcl_Interp*    interp;  /* Reference to the interpreter which created the
			     * transformation. Used to execute the code
			     * below. */
    Tcl_Obj*       command; /* Tcl code to execute for a buffer */
    ResultBuffer   result;  /* Internal buffer used to store the result of a
			     * transformation of incoming data. Additionally
			     * serves as buffer of all data not yet consumed by
			     * the reader. */
};


/*
 *----------------------------------------------------------------------
 *
 * TclChannelTransform --
 *
 *	Implements the Tcl "testchannel transform" debugging command.
 *	This is part of the testing environment.  This sets up a tcl
 *	script (cmdObjPtr) to be used as a transform on the channel.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TclChannelTransform(interp, chan, cmdObjPtr)
    Tcl_Interp	*interp;	/* Interpreter for result. */
    Tcl_Channel chan;		/* Channel to transform. */
    Tcl_Obj	*cmdObjPtr;	/* Script to use for transform. */
{
    Channel			*chanPtr;	/* The actual channel. */
    ChannelState		*statePtr;	/* state info for channel */
    int				mode;		/* rw mode of the channel */
    TransformChannelData	*dataPtr;
    int				res;
    Tcl_DString			ds;

    if (chan == (Tcl_Channel) NULL) {
	return TCL_ERROR;
    }
    chanPtr	= (Channel *) chan;
    statePtr	= chanPtr->state;
    chanPtr	= statePtr->topChanPtr;
    chan	= (Tcl_Channel) chanPtr;
    mode	= (statePtr->flags & (TCL_READABLE|TCL_WRITABLE));

    /*
     * Now initialize the transformation state and stack it upon the
     * specified channel. One of the necessary things to do is to
     * retrieve the blocking regime of the underlying channel and to
     * use the same for us too.
     */

    dataPtr = (TransformChannelData*) ckalloc(sizeof(TransformChannelData));

    Tcl_DStringInit (&ds);
    Tcl_GetChannelOption(interp, chan, "-blocking", &ds);

    dataPtr->readIsFlushed = 0;
    dataPtr->flags	= 0;

    if (ds.string[0] == '0') {
	dataPtr->flags |= CHANNEL_ASYNC;
    }

    Tcl_DStringFree (&ds);

    dataPtr->self	= chan;
    dataPtr->watchMask	= 0;
    dataPtr->mode	= mode;
    dataPtr->timer	= (Tcl_TimerToken) NULL;
    dataPtr->maxRead	= 4096; /* Initial value not relevant */
    dataPtr->interp	= interp;
    dataPtr->command	= cmdObjPtr;

    Tcl_IncrRefCount(dataPtr->command);

    ResultInit(&dataPtr->result);

    dataPtr->self = Tcl_StackChannel(interp, &transformChannelType,
	    (ClientData) dataPtr, mode, chan);
    if (dataPtr->self == (Tcl_Channel) NULL) {
	Tcl_AppendResult(interp, "\nfailed to stack channel \"",
		Tcl_GetChannelName(chan), "\"", (char *) NULL);

	Tcl_DecrRefCount(dataPtr->command);
	ResultClear(&dataPtr->result);
	ckfree((VOID *) dataPtr);
	return TCL_ERROR;
    }

    /*
     * At last initialize the transformation at the script level.
     */

    if (dataPtr->mode & TCL_WRITABLE) {
	res = ExecuteCallback (dataPtr, NO_INTERP, A_CREATE_WRITE,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	if (res != TCL_OK) {
	    Tcl_UnstackChannel(interp, chan);
	    return TCL_ERROR;
	}
    }

    if (dataPtr->mode & TCL_READABLE) {
	res = ExecuteCallback (dataPtr, NO_INTERP, A_CREATE_READ,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	if (res != TCL_OK) {
	    ExecuteCallback (dataPtr, NO_INTERP, A_DELETE_WRITE,
		    NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);

	    Tcl_UnstackChannel(interp, chan);
	    return TCL_ERROR;
	}
    }

    return TCL_OK;
}

/*
 *------------------------------------------------------*
 *
 *	ExecuteCallback --
 *
 *	Executes the defined callback for buffer and
 *	operation.
 *
 *	Sideeffects:
 *		As of the executed tcl script.
 *
 *	Result:
 *		A standard TCL error code. In case of an
 *		error a message is left in the result area
 *		of the specified interpreter.
 *
 *------------------------------------------------------*
 */

static int
ExecuteCallback (dataPtr, interp, op, buf, bufLen, transmit, preserve)
    TransformChannelData* dataPtr;     /* Transformation with the callback */
    Tcl_Interp*           interp;   /* Current interpreter, possibly NULL */
    unsigned char*        op;       /* Operation invoking the callback */
    unsigned char*        buf;      /* Buffer to give to the script. */
    int                   bufLen;   /* Ands its length */
    int                   transmit; /* Flag, determines whether the result
				     * of the callback is sent to the
				     * underlying channel or not. */
    int                   preserve; /* Flag. If true the procedure will
				     * preserver the result state of all
				     * accessed interpreters. */
{
    /*
     * Step 1, create the complete command to execute. Do this by appending
     * operation and buffer to operate upon to a copy of the callback
     * definition. We *cannot* create a list containing 3 objects and then use
     * 'Tcl_EvalObjv', because the command may contain additional prefixed
     * arguments. Feather's curried commands would come in handy here.
     */

    Tcl_Obj*        resObj; /* See below, switch (transmit) */
    int             resLen;
    unsigned char*  resBuf;
    Tcl_SavedResult ciSave;

    int res = TCL_OK;
    Tcl_Obj* command = Tcl_DuplicateObj (dataPtr->command);
    Tcl_Obj* temp;


    if (preserve) {
	Tcl_SaveResult (dataPtr->interp, &ciSave);
    }

    if (command == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
        res = TCL_ERROR;
        goto cleanup;
    }

    Tcl_IncrRefCount(command);

    temp = Tcl_NewStringObj((char*) op, -1);

    if (temp == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
        res = TCL_ERROR;
        goto cleanup;
    }

    res = Tcl_ListObjAppendElement(dataPtr->interp, command, temp);

    if (res != TCL_OK)
	goto cleanup;

    /*
     * Use a byte-array to prevent the misinterpretation of binary data
     * coming through as UTF while at the tcl level.
     */

    temp = Tcl_NewByteArrayObj(buf, bufLen);

    if (temp == (Tcl_Obj*) NULL) {
        /* Memory allocation problem */
	res = TCL_ERROR;
        goto cleanup;
    }

    res = Tcl_ListObjAppendElement (dataPtr->interp, command, temp);

    if (res != TCL_OK)
        goto cleanup;

    /*
     * Step 2, execute the command at the global level of the interpreter
     * used to create the transformation. Destroy the command afterward.
     * If an error occured and the current interpreter is defined and not
     * equal to the interpreter for the callback, then copy the error
     * message into current interpreter. Don't copy if in preservation mode.
     */

    res = Tcl_GlobalEvalObj (dataPtr->interp, command);
    Tcl_DecrRefCount (command);
    command = (Tcl_Obj*) NULL;

    if ((res != TCL_OK) && (interp != NO_INTERP) &&
	    (dataPtr->interp != interp) && !preserve) {
        Tcl_SetObjResult(interp, Tcl_GetObjResult(dataPtr->interp));
	return res;
    }

    /*
     * Step 3, transmit a possible conversion result to the underlying
     * channel, or ourselves.
     */

    switch (transmit) {
	case TRANSMIT_DONT:
	    /* nothing to do */
	    break;

	case TRANSMIT_DOWN:
	    resObj = Tcl_GetObjResult(dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    Tcl_WriteRaw(Tcl_GetStackedChannel(dataPtr->self),
		    (char*) resBuf, resLen);
	    break;

	case TRANSMIT_SELF:
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    Tcl_WriteRaw(dataPtr->self, (char*) resBuf, resLen);
	    break;

	case TRANSMIT_IBUF:
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    resBuf = (unsigned char*) Tcl_GetByteArrayFromObj(resObj, &resLen);
	    ResultAdd(&dataPtr->result, resBuf, resLen);
	    break;

	case TRANSMIT_NUM:
	    /* Interpret result as integer number */
	    resObj = Tcl_GetObjResult (dataPtr->interp);
	    Tcl_GetIntFromObj(dataPtr->interp, resObj, &dataPtr->maxRead);
	    break;
    }

    Tcl_ResetResult(dataPtr->interp);

    if (preserve) {
	Tcl_RestoreResult(dataPtr->interp, &ciSave);
    }

    return res;

    cleanup:
    if (preserve) {
	Tcl_RestoreResult(dataPtr->interp, &ciSave);
    }

    if (command != (Tcl_Obj*) NULL) {
        Tcl_DecrRefCount(command);
    }

    return res;
}

/*
 *------------------------------------------------------*
 *
 *	TransformBlockModeProc --
 *
 *	Trap handler. Called by the generic IO system
 *	during option processing to change the blocking
 *	mode of the channel.
 *
 *	Sideeffects:
 *		Forwards the request to the underlying
 *		channel.
 *
 *	Result:
 *		0 if successful, errno when failed.
 *
 *------------------------------------------------------*
 */

static int
TransformBlockModeProc (instanceData, mode)
    ClientData  instanceData; /* State of transformation */
    int         mode;         /* New blocking mode */
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    if (mode == TCL_MODE_NONBLOCKING) {
        dataPtr->flags |= CHANNEL_ASYNC;
    } else {
        dataPtr->flags &= ~(CHANNEL_ASYNC);
    }
    return 0;
}

/*
 *------------------------------------------------------*
 *
 *	TransformCloseProc --
 *
 *	Trap handler. Called by the generic IO system
 *	during destruction of the transformation channel.
 *
 *	Sideeffects:
 *		Releases the memory allocated in
 *		'Tcl_TransformObjCmd'.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static int
TransformCloseProc (instanceData, interp)
    ClientData  instanceData;
    Tcl_Interp* interp;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    /*
     * Important: In this procedure 'dataPtr->self' already points to
     * the underlying channel.
     */

    /*
     * There is no need to cancel an existing channel handler, this is already
     * done. Either by 'Tcl_UnstackChannel' or by the general cleanup in
     * 'Tcl_Close'.
     *
     * But we have to cancel an active timer to prevent it from firing on the
     * removed channel.
     */

    if (dataPtr->timer != (Tcl_TimerToken) NULL) {
        Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    /*
     * Now flush data waiting in internal buffers to output and input. The
     * input must be done despite the fact that there is no real receiver
     * for it anymore. But the scripts might have sideeffects other parts
     * of the system rely on (f.e. signaling the close to interested parties).
     */

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, interp, A_FLUSH_WRITE,
		NULL, 0, TRANSMIT_DOWN, 1);
    }

    if ((dataPtr->mode & TCL_READABLE) && !dataPtr->readIsFlushed) {
	dataPtr->readIsFlushed = 1;
        ExecuteCallback (dataPtr, interp, A_FLUSH_READ,
		NULL, 0, TRANSMIT_IBUF, 1);
    }

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, interp, A_DELETE_WRITE,
		NULL, 0, TRANSMIT_DONT, 1);
    }

    if (dataPtr->mode & TCL_READABLE) {
        ExecuteCallback (dataPtr, interp, A_DELETE_READ,
		NULL, 0, TRANSMIT_DONT, 1);
    }

    /*
     * General cleanup
     */

    ResultClear(&dataPtr->result);
    Tcl_DecrRefCount(dataPtr->command);
    ckfree((VOID*) dataPtr);

    return TCL_OK;
}

/*
 *------------------------------------------------------*
 *
 *	TransformInputProc --
 *
 *	Called by the generic IO system to convert read data.
 *
 *	Sideeffects:
 *		As defined by the conversion.
 *
 *	Result:
 *		A transformed buffer.
 *
 *------------------------------------------------------*
 */

static int
TransformInputProc (instanceData, buf, toRead, errorCodePtr)
    ClientData instanceData;
    char*      buf;
    int        toRead;
    int*       errorCodePtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    int gotBytes, read, res, copied;
    Tcl_Channel downChan;

    /* should assert (dataPtr->mode & TCL_READABLE) */

    if (toRead == 0) {
	/* Catch a no-op.
	 */
	return 0;
    }

    gotBytes = 0;
    downChan = Tcl_GetStackedChannel(dataPtr->self);

    while (toRead > 0) {
        /*
	 * Loop until the request is satisfied (or no data is available from
	 * below, possibly EOF).
	 */

        copied    = ResultCopy (&dataPtr->result, UCHARP (buf), toRead);

	toRead   -= copied;
	buf      += copied;
	gotBytes += copied;

	if (toRead == 0) {
	    /* The request was completely satisfied from our buffers.
	     * We can break out of the loop and return to the caller.
	     */
	    return gotBytes;
	}

	/*
	 * Length (dataPtr->result) == 0, toRead > 0 here . Use the incoming
	 * 'buf'! as target to store the intermediary information read
	 * from the underlying channel.
	 *
	 * Ask the tcl level how much data it allows us to read from
	 * the underlying channel. This feature allows the transform to
	 * signal EOF upstream although there is none downstream. Useful
	 * to control an unbounded 'fcopy', either through counting bytes,
	 * or by pattern matching.
	 */

	ExecuteCallback (dataPtr, NO_INTERP, A_QUERY_MAXREAD,
		NULL, 0, TRANSMIT_NUM /* -> maxRead */, 1);

	if (dataPtr->maxRead >= 0) {
	    if (dataPtr->maxRead < toRead) {
	        toRead = dataPtr->maxRead;
	    }
	} /* else: 'maxRead < 0' == Accept the current value of toRead */

	if (toRead <= 0) {
	    return gotBytes;
	}

	read = Tcl_ReadRaw(downChan, buf, toRead);

	if (read < 0) {
	    /* Report errors to caller. EAGAIN is a special situation.
	     * If we had some data before we report that instead of the
	     * request to re-try.
	     */

	    if ((Tcl_GetErrno() == EAGAIN) && (gotBytes > 0)) {
	        return gotBytes;
	    }

	    *errorCodePtr = Tcl_GetErrno();
	    return -1;      
	}

	if (read == 0) {
	    /*
	     * Check wether we hit on EOF in the underlying channel or
	     * not. If not differentiate between blocking and
	     * non-blocking modes. In non-blocking mode we ran
	     * temporarily out of data. Signal this to the caller via
	     * EWOULDBLOCK and error return (-1). In the other cases
	     * we simply return what we got and let the caller wait
	     * for more. On the other hand, if we got an EOF we have
	     * to convert and flush all waiting partial data.
	     */

	    if (! Tcl_Eof (downChan)) {
	        if ((gotBytes == 0) && (dataPtr->flags & CHANNEL_ASYNC)) {
		    *errorCodePtr = EWOULDBLOCK;
		    return -1;
		} else {
		    return gotBytes;
		}
	    } else {
	        if (dataPtr->readIsFlushed) {
		    /* Already flushed, nothing to do anymore
		     */
		    return gotBytes;
		}

		dataPtr->readIsFlushed = 1;

		ExecuteCallback (dataPtr, NO_INTERP, A_FLUSH_READ,
			NULL, 0, TRANSMIT_IBUF, P_PRESERVE);

		if (ResultLength (&dataPtr->result) == 0) {
		    /* we had nothing to flush */
		    return gotBytes;
		}

		continue; /* at: while (toRead > 0) */
	    }
	} /* read == 0 */

	/* Transform the read chunk and add the result to our
	 * read buffer (dataPtr->result)
	 */

	res = ExecuteCallback (dataPtr, NO_INTERP, A_READ,
		UCHARP (buf), read, TRANSMIT_IBUF,
		P_PRESERVE);

	if (res != TCL_OK) {
	    *errorCodePtr = EINVAL;
	    return -1;
	}
    } /* while toRead > 0 */

    return gotBytes;
}

/*
 *------------------------------------------------------*
 *
 *	TransformOutputProc --
 *
 *	Called by the generic IO system to convert data
 *	waiting to be written.
 *
 *	Sideeffects:
 *		As defined by the transformation.
 *
 *	Result:
 *		A transformed buffer.
 *
 *------------------------------------------------------*
 */

static int
TransformOutputProc (instanceData, buf, toWrite, errorCodePtr)
    ClientData instanceData;
    char*      buf;
    int        toWrite;
    int*       errorCodePtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    int res;

    /* should assert (dataPtr->mode & TCL_WRITABLE) */

    if (toWrite == 0) {
	/* Catch a no-op.
	 */
	return 0;
    }

    res = ExecuteCallback (dataPtr, NO_INTERP, A_WRITE,
	    UCHARP (buf), toWrite,
	    TRANSMIT_DOWN, P_NO_PRESERVE);

    if (res != TCL_OK) {
        *errorCodePtr = EINVAL;
	return -1;
    }

    return toWrite;
}

/*
 *------------------------------------------------------*
 *
 *	TransformSeekProc --
 *
 *	This procedure is called by the generic IO level
 *	to move the access point in a channel.
 *
 *	Sideeffects:
 *		Moves the location at which the channel
 *		will be accessed in future operations.
 *		Flushes all transformation buffers, then
 *		forwards it to the underlying channel.
 *
 *	Result:
 *		-1 if failed, the new position if
 *		successful. An output argument contains
 *		the POSIX error code if an error
 *		occurred, or zero.
 *
 *------------------------------------------------------*
 */

static int
TransformSeekProc (instanceData, offset, mode, errorCodePtr)
    ClientData instanceData;	/* The channel to manipulate */
    long       offset;		/* Size of movement. */
    int        mode;		/* How to move */
    int*       errorCodePtr;	/* Location of error flag. */
{
    int result;
    TransformChannelData* dataPtr	= (TransformChannelData*) instanceData;
    Tcl_Channel           parent        = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_ChannelType*      parentType	= Tcl_GetChannelType(parent);
    Tcl_DriverSeekProc*   parentSeekProc = Tcl_ChannelSeekProc(parentType);

    if ((offset == 0) && (mode == SEEK_CUR)) {
        /* This is no seek but a request to tell the caller the current
	 * location. Simply pass the request down.
	 */

	result = (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
		offset, mode, errorCodePtr);
	return result;
    }

    /*
     * It is a real request to change the position. Flush all data waiting
     * for output and discard everything in the input buffers. Then pass
     * the request down, unchanged.
     */

    if (dataPtr->mode & TCL_WRITABLE) {
        ExecuteCallback (dataPtr, NO_INTERP, A_FLUSH_WRITE,
		NULL, 0, TRANSMIT_DOWN, P_NO_PRESERVE);
    }

    if (dataPtr->mode & TCL_READABLE) {
        ExecuteCallback (dataPtr, NO_INTERP, A_CLEAR_READ,
		NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE);
	ResultClear(&dataPtr->result);
	dataPtr->readIsFlushed = 0;
    }

    result = (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
	    offset, mode, errorCodePtr);
    return result;
}

/*
 *------------------------------------------------------*
 *
 *	TransformSetOptionProc --
 *
 *	Called by generic layer to handle the reconfi-
 *	guration of channel specific options. As this
 *	channel type does not have such, it simply passes
 *	all requests downstream.
 *
 *	Sideeffects:
 *		As defined by the channel downstream.
 *
 *	Result:
 *		A standard TCL error code.
 *
 *------------------------------------------------------*
 */

static int
TransformSetOptionProc (instanceData, interp, optionName, value)
    ClientData instanceData;
    Tcl_Interp *interp;
    char *optionName;
    char *value;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_DriverSetOptionProc *setOptionProc;

    setOptionProc = Tcl_ChannelSetOptionProc(Tcl_GetChannelType(downChan));
    if (setOptionProc != NULL) {
	return (*setOptionProc)(Tcl_GetChannelInstanceData(downChan),
		interp, optionName, value);
    }
    return TCL_ERROR;
}

/*
 *------------------------------------------------------*
 *
 *	TransformGetOptionProc --
 *
 *	Called by generic layer to handle requests for
 *	the values of channel specific options. As this
 *	channel type does not have such, it simply passes
 *	all requests downstream.
 *
 *	Sideeffects:
 *		As defined by the channel downstream.
 *
 *	Result:
 *		A standard TCL error code.
 *
 *------------------------------------------------------*
 */

static int
TransformGetOptionProc (instanceData, interp, optionName, dsPtr)
    ClientData   instanceData;
    Tcl_Interp*  interp;
    char*        optionName;
    Tcl_DString* dsPtr;
{
    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
    Tcl_DriverGetOptionProc *getOptionProc;

    getOptionProc = Tcl_ChannelGetOptionProc(Tcl_GetChannelType(downChan));
    if (getOptionProc != NULL) {
	return (*getOptionProc)(Tcl_GetChannelInstanceData(downChan),
		interp, optionName, dsPtr);
    } else if (optionName == (char*) NULL) {
	/*
	 * Request is query for all options, this is ok.
	 */
	return TCL_OK;
    }
    /*
     * Request for a specific option has to fail, we don't have any.
     */
    return TCL_ERROR;
}

/*
 *------------------------------------------------------*
 *
 *	TransformWatchProc --
 *
 *	Initialize the notifier to watch for events from
 *	this channel.
 *
 *	Sideeffects:
 *		Sets up the notifier so that a future
 *		event on the channel will be seen by Tcl.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */
	/* ARGSUSED */
static void
TransformWatchProc (instanceData, mask)
    ClientData instanceData;	/* Channel to watch */
    int        mask;		/* Events of interest */
{
    /* The caller expressed interest in events occuring for this
     * channel. We are forwarding the call to the underlying
     * channel now.
     */

    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
    Tcl_Channel     downChan;

    dataPtr->watchMask = mask;

    /* No channel handlers any more. We will be notified automatically
     * about events on the channel below via a call to our
     * 'TransformNotifyProc'. But we have to pass the interest down now.
     * We are allowed to add additional 'interest' to the mask if we want
     * to. But this transformation has no such interest. It just passes
     * the request down, unchanged.
     */

    downChan = Tcl_GetStackedChannel(dataPtr->self);

    (Tcl_GetChannelType(downChan))
	->watchProc(Tcl_GetChannelInstanceData(downChan), mask);

    /*
     * Management of the internal timer.
     */

    if ((dataPtr->timer != (Tcl_TimerToken) NULL) &&
	    (!(mask & TCL_READABLE) || (ResultLength(&dataPtr->result) == 0))) {

        /* A pending timer exists, but either is there no (more)
	 * interest in the events it generates or nothing is availablee
	 * for reading, so remove it.
	 */

        Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    if ((dataPtr->timer == (Tcl_TimerToken) NULL) &&
	    (mask & TCL_READABLE) && (ResultLength (&dataPtr->result) > 0)) {

        /* There is no pending timer, but there is interest in readable
	 * events and we actually have data waiting, so generate a timer
	 * to flush that.
	 */

	dataPtr->timer = Tcl_CreateTimerHandler (FLUSH_DELAY,
		TransformChannelHandlerTimer, (ClientData) dataPtr);
    }
}

/*
 *------------------------------------------------------*
 *
 *	TransformGetFileHandleProc --
 *
 *	Called from Tcl_GetChannelHandle to retrieve
 *	OS specific file handle from inside this channel.
 *
 *	Sideeffects:
 *		None.
 *
 *	Result:
 *		The appropriate Tcl_File or NULL if not
 *		present. 
 *
 *------------------------------------------------------*
 */
static int
TransformGetFileHandleProc (instanceData, direction, handlePtr)
    ClientData  instanceData;	/* Channel to query */
    int         direction;	/* Direction of interest */
    ClientData* handlePtr;	/* Place to store the handle into */
{
    /*
     * Return the handle belonging to parent channel.
     * IOW, pass the request down and the result up.
     */

    TransformChannelData* dataPtr = (TransformChannelData*) instanceData;

    return Tcl_GetChannelHandle(Tcl_GetStackedChannel(dataPtr->self),
	    direction, handlePtr);
}

/*
 *------------------------------------------------------*
 *
 *	TransformNotifyProc --
 *
 *	------------------------------------------------*
 *	Handler called by Tcl to inform us of activity
 *	on the underlying channel.
 *	------------------------------------------------*
 *
 *	Sideeffects:
 *		May process the incoming event by itself.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static int
TransformNotifyProc (clientData, mask)
    ClientData	   clientData; /* The state of the notified transformation */
    int		   mask;       /* The mask of occuring events */
{
    TransformChannelData* dataPtr = (TransformChannelData*) clientData;

    /*
     * An event occured in the underlying channel.  This
     * transformation doesn't process such events thus returns the
     * incoming mask unchanged.
     */

    if (dataPtr->timer != (Tcl_TimerToken) NULL) {
	/*
	 * Delete an existing timer. It was not fired, yet we are
	 * here, so the channel below generated such an event and we
	 * don't have to. The renewal of the interest after the
	 * execution of channel handlers will eventually cause us to
	 * recreate the timer (in TransformWatchProc).
	 */

	Tcl_DeleteTimerHandler (dataPtr->timer);
	dataPtr->timer = (Tcl_TimerToken) NULL;
    }

    return mask;
}

/*
 *------------------------------------------------------*
 *
 *	TransformChannelHandlerTimer --
 *
 *	Called by the notifier (-> timer) to flush out
 *	information waiting in the input buffer.
 *
 *	Sideeffects:
 *		As of 'Tcl_NotifyChannel'.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
TransformChannelHandlerTimer (clientData)
    ClientData clientData; /* Transformation to query */
{
    TransformChannelData* dataPtr = (TransformChannelData*) clientData;

    dataPtr->timer = (Tcl_TimerToken) NULL;

    if (!(dataPtr->watchMask & TCL_READABLE) ||
	    (ResultLength (&dataPtr->result) == 0)) {
	/* The timer fired, but either is there no (more)
	 * interest in the events it generates or nothing is available
	 * for reading, so ignore it and don't recreate it.
	 */

	return;
    }

    Tcl_NotifyChannel(dataPtr->self, TCL_READABLE);
}

/*
 *------------------------------------------------------*
 *
 *	ResultClear --
 *
 *	Deallocates any memory allocated by 'ResultAdd'.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultClear (r)
    ResultBuffer* r; /* Reference to the buffer to clear out */
{
    r->used = 0;

    if (r->allocated) {
        ckfree((char*) r->buf);
	r->buf       = UCHARP (NULL);
	r->allocated = 0;
    }
}

/*
 *------------------------------------------------------*
 *
 *	ResultInit --
 *
 *	Initializes the specified buffer structure. The
 *	structure will contain valid information for an
 *	emtpy buffer.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultInit (r)
    ResultBuffer* r; /* Reference to the structure to initialize */
{
    r->used      = 0;
    r->allocated = 0;
    r->buf       = UCHARP (NULL);
}

/*
 *------------------------------------------------------*
 *
 *	ResultLength --
 *
 *	Returns the number of bytes stored in the buffer.
 *
 *	Sideeffects:
 *		None.
 *
 *	Result:
 *		An integer, see above too.
 *
 *------------------------------------------------------*
 */

static int
ResultLength (r)
    ResultBuffer* r; /* The structure to query */
{
    return r->used;
}

/*
 *------------------------------------------------------*
 *
 *	ResultCopy --
 *
 *	Copies the requested number of bytes from the
 *	buffer into the specified array and removes them
 *	from the buffer afterward. Copies less if there
 *	is not enough data in the buffer.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		The number of actually copied bytes,
 *		possibly less than 'toRead'.
 *
 *------------------------------------------------------*
 */

static int
ResultCopy (r, buf, toRead)
    ResultBuffer*  r;      /* The buffer to read from */
    unsigned char* buf;    /* The buffer to copy into */
    int            toRead; /* Number of requested bytes */
{
    if (r->used == 0) {
        /* Nothing to copy in the case of an empty buffer.
	 */

        return 0;
    }

    if (r->used == toRead) {
        /* We have just enough. Copy everything to the caller.
	 */

        memcpy ((VOID*) buf, (VOID*) r->buf, (size_t) toRead);
	r->used = 0;
	return toRead;
    }

    if (r->used > toRead) {
        /* The internal buffer contains more than requested.
	 * Copy the requested subset to the caller, and shift
	 * the remaining bytes down.
	 */

        memcpy  ((VOID*) buf,    (VOID*) r->buf,            (size_t) toRead);
	memmove ((VOID*) r->buf, (VOID*) (r->buf + toRead),
		(size_t) r->used - toRead);

	r->used -= toRead;
	return toRead;
    }

    /* There is not enough in the buffer to satisfy the caller, so
     * take everything.
     */

    memcpy((VOID*) buf, (VOID*) r->buf, (size_t) r->used);
    toRead  = r->used;
    r->used = 0;
    return toRead;
}

/*
 *------------------------------------------------------*
 *
 *	ResultAdd --
 *
 *	Adds the bytes in the specified array to the
 *	buffer, by appending it.
 *
 *	Sideeffects:
 *		See above.
 *
 *	Result:
 *		None.
 *
 *------------------------------------------------------*
 */

static void
ResultAdd (r, buf, toWrite)
    ResultBuffer*  r;       /* The buffer to extend */
    unsigned char* buf;     /* The buffer to read from */
    int            toWrite; /* The number of bytes in 'buf' */
{
    if ((r->used + toWrite) > r->allocated) {
        /* Extension of the internal buffer is required.
	 */

        if (r->allocated == 0) {
	    r->allocated = toWrite + INCREMENT;
	    r->buf       = UCHARP (ckalloc((unsigned) r->allocated));
	} else {
	    r->allocated += toWrite + INCREMENT;
	    r->buf        = UCHARP (ckrealloc((char*) r->buf,
		    (unsigned) r->allocated));
	}
    }

    /* now copy data */
    memcpy(r->buf + r->used, buf, (size_t) toWrite);
    r->used += toWrite;
}
Changes to generic/tclIndexObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclIndexObj.c --
 *
 *	This file implements objects of type "index".  This object type
 *	is used to lookup a keyword in a table of valid values and cache
 *	the index of the matching entry.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIndexObj.c,v 1.4 1999/06/28 23:49:31 redman Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclIndexObj.c --
 *
 *	This file implements objects of type "index".  This object type
 *	is used to lookup a keyword in a table of valid values and cache
 *	the index of the matching entry.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIndexObj.c,v 1.4.10.2 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */
31
32
33
34
35
36
37










38
39
40
41
42
43
44
    "index",				/* name */
    (Tcl_FreeInternalRepProc *) NULL,	/* freeIntRepProc */
    (Tcl_DupInternalRepProc *) NULL,	/* dupIntRepProc */
    (Tcl_UpdateStringProc *) NULL,	/* updateStringProc */
    SetIndexFromAny			/* setFromAnyProc */
};











/*
 * Boolean flag indicating whether or not the tclIndexType object
 * type has been registered with the Tcl compiler.
 */

static int indexTypeInitialized = 0;








>
>
>
>
>
>
>
>
>
>







31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    "index",				/* name */
    (Tcl_FreeInternalRepProc *) NULL,	/* freeIntRepProc */
    (Tcl_DupInternalRepProc *) NULL,	/* dupIntRepProc */
    (Tcl_UpdateStringProc *) NULL,	/* updateStringProc */
    SetIndexFromAny			/* setFromAnyProc */
};

/*
 * DKF - Just noting that the data format used in objects with the
 * above type is that the ptr1 field will contain a pointer to the
 * table that the last lookup was performed in, and the ptr2 field
 * will contain the sizeof(char) offset of the string within that
 * table.  Note that we assume that each table is only ever called
 * with a single offset, but this is a pretty safe assumption in
 * practise...
 */

/*
 * Boolean flag indicating whether or not the tclIndexType object
 * type has been registered with the Tcl compiler.
 */

static int indexTypeInitialized = 0;

86
87
88
89
90
91
92
93

94
95
96
97
98
99
100
     * (doing the check here saves the overhead of calling
     * Tcl_GetIndexFromObjStruct in the common case where the result
     * is cached).
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = (int) objPtr->internalRep.twoPtrValue.ptr2;

	return TCL_OK;
    }
    return Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, sizeof(char *),
	    msg, flags, indexPtr);
}

/*







|
>







96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
     * (doing the check here saves the overhead of calling
     * Tcl_GetIndexFromObjStruct in the common case where the result
     * is cached).
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = ((int) objPtr->internalRep.twoPtrValue.ptr2)
	                   / sizeof(char *);
	return TCL_OK;
    }
    return Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, sizeof(char *),
	    msg, flags, indexPtr);
}

/*
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

    /*
     * See if there is a valid cached result from a previous lookup.
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = (int) objPtr->internalRep.twoPtrValue.ptr2;
	return TCL_OK;
    }

    /*
     * Lookup the value of the object in the table.  Accept unique
     * abbreviations unless TCL_EXACT is set in flags.
     */







|







158
159
160
161
162
163
164
165
166
167
168
169
170
171
172

    /*
     * See if there is a valid cached result from a previous lookup.
     */

    if ((objPtr->typePtr == &tclIndexType)
	    && (objPtr->internalRep.twoPtrValue.ptr1 == (VOID *) tablePtr)) {
	*indexPtr = ((int) objPtr->internalRep.twoPtrValue.ptr2) / offset;
	return TCL_OK;
    }

    /*
     * Lookup the value of the object in the table.  Accept unique
     * abbreviations unless TCL_EXACT is set in flags.
     */
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
     */
    
    if (key[0] == '\0') {
	goto error;
    }
    
    for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; 
	    entryPtr = (char **) ((long) entryPtr + offset), i++) {
	for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) {
	    if (*p1 == 0) {
		index = i;
		goto done;
	    }
	}
	if (*p1 == 0) {







|







190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
     */
    
    if (key[0] == '\0') {
	goto error;
    }
    
    for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; 
	    entryPtr = (char **) ((size_t) entryPtr + offset), i++) {
	for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) {
	    if (*p1 == 0) {
		index = i;
		goto done;
	    }
	}
	if (*p1 == 0) {
209
210
211
212
213
214
215



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238

    done:
    if ((objPtr->typePtr != NULL)
	    && (objPtr->typePtr->freeIntRepProc != NULL)) {
	objPtr->typePtr->freeIntRepProc(objPtr);
    }
    objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) tablePtr;



    objPtr->internalRep.twoPtrValue.ptr2 = (VOID *) index;
    objPtr->typePtr = &tclIndexType;
    *indexPtr = index;
    return TCL_OK;

    error:
    if (interp != NULL) {
	int count;
	resultPtr = Tcl_GetObjResult(interp);
	Tcl_AppendStringsToObj(resultPtr,
		(numAbbrev > 1) ? "ambiguous " : "bad ", msg, " \"",
		key, "\": must be ", *tablePtr, (char *) NULL);
	for (entryPtr = (char **) ((long) tablePtr + offset), count = 0;
		*entryPtr != NULL;
		entryPtr = (char **) ((long) entryPtr + offset), count++) {
	    if ((*((char **) ((long) entryPtr + offset))) == NULL) {
		Tcl_AppendStringsToObj(resultPtr,
			(count > 0) ? ", or " : " or ", *entryPtr,
			(char *) NULL);
	    } else {
		Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr,
			(char *) NULL);
	    }







>
>
>
|











|

|
|







220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252

    done:
    if ((objPtr->typePtr != NULL)
	    && (objPtr->typePtr->freeIntRepProc != NULL)) {
	objPtr->typePtr->freeIntRepProc(objPtr);
    }
    objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) tablePtr;
    /*
     * Make sure to account for offsets != sizeof(char *).  [Bug 5153]
     */
    objPtr->internalRep.twoPtrValue.ptr2 = (VOID *) (index * offset);
    objPtr->typePtr = &tclIndexType;
    *indexPtr = index;
    return TCL_OK;

    error:
    if (interp != NULL) {
	int count;
	resultPtr = Tcl_GetObjResult(interp);
	Tcl_AppendStringsToObj(resultPtr,
		(numAbbrev > 1) ? "ambiguous " : "bad ", msg, " \"",
		key, "\": must be ", *tablePtr, (char *) NULL);
	for (entryPtr = (char **) ((size_t) tablePtr + offset), count = 0;
		*entryPtr != NULL;
		entryPtr = (char **) ((size_t) entryPtr + offset), count++) {
	    if ((*((char **) ((size_t) entryPtr + offset))) == NULL) {
		Tcl_AppendStringsToObj(resultPtr,
			(count > 0) ? ", or " : " or ", *entryPtr,
			(char *) NULL);
	    } else {
		Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr,
			(char *) NULL);
	    }
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325

326
327
328
329
330
331
332





333
334
335
336

337
338
339
340
341
					 * message. */
    char *message;			/* Error message to print after the
					 * leading objects in objv. The
					 * message may be NULL. */
{
    Tcl_Obj *objPtr;
    char **tablePtr;
    int i;

    objPtr = Tcl_GetObjResult(interp);
    Tcl_AppendToObj(objPtr, "wrong # args: should be \"", -1);
    for (i = 0; i < objc; i++) {
	/*
	 * If the object is an index type use the index table which allows
	 * for the correct error message even if the subcommand was
	 * abbreviated.  Otherwise, just use the string rep.
	 */
	
	if (objv[i]->typePtr == &tclIndexType) {
	    tablePtr = ((char **) objv[i]->internalRep.twoPtrValue.ptr1);

	    Tcl_AppendStringsToObj(objPtr,
		    tablePtr[(int) objv[i]->internalRep.twoPtrValue.ptr2],
		    (char *) NULL);
	} else {
	    Tcl_AppendStringsToObj(objPtr, Tcl_GetString(objv[i]),
		    (char *) NULL);
	}





	if (i < (objc - 1)) {
	    Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL);
	}
    }

    if (message) {
      Tcl_AppendStringsToObj(objPtr, " ", message, (char *) NULL);
    }
    Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL);
}







|












>

|





>
>
>
>
>
|



>

|



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
					 * message. */
    char *message;			/* Error message to print after the
					 * leading objects in objv. The
					 * message may be NULL. */
{
    Tcl_Obj *objPtr;
    char **tablePtr;
    int i, offset;

    objPtr = Tcl_GetObjResult(interp);
    Tcl_AppendToObj(objPtr, "wrong # args: should be \"", -1);
    for (i = 0; i < objc; i++) {
	/*
	 * If the object is an index type use the index table which allows
	 * for the correct error message even if the subcommand was
	 * abbreviated.  Otherwise, just use the string rep.
	 */
	
	if (objv[i]->typePtr == &tclIndexType) {
	    tablePtr = ((char **) objv[i]->internalRep.twoPtrValue.ptr1);
	    offset = ((int) objv[i]->internalRep.twoPtrValue.ptr2);
	    Tcl_AppendStringsToObj(objPtr,
		    *((char **)(((char *)tablePtr)+offset)),
		    (char *) NULL);
	} else {
	    Tcl_AppendStringsToObj(objPtr, Tcl_GetString(objv[i]),
		    (char *) NULL);
	}

	/*
	 * Append a space character (" ") if there is more text to follow
	 * (either another element from objv, or the message string).
	 */
	if ((i < (objc - 1)) || message) {
	    Tcl_AppendStringsToObj(objPtr, " ", (char *) NULL);
	}
    }

    if (message) {
	Tcl_AppendStringsToObj(objPtr, message, (char *) NULL);
    }
    Tcl_AppendStringsToObj(objPtr, "\"", (char *) NULL);
}
Changes to generic/tclInt.decls.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# tclInt.decls --
#
#	This file contains the declarations for all unsupported
#	functions that are exported by the Tcl library.  This file
#	is used to generate the tclIntDecls.h, tclIntPlatDecls.h,
#	tclIntStub.c, tclPlatStub.c, tclCompileDecls.h and tclCompileStub.c
#	files
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tclInt.decls,v 1.20 2000/03/31 08:52:04 hobbs Exp $

library tcl

# Define the unsupported generic interfaces.

interface tclInt













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# tclInt.decls --
#
#	This file contains the declarations for all unsupported
#	functions that are exported by the Tcl library.  This file
#	is used to generate the tclIntDecls.h, tclIntPlatDecls.h,
#	tclIntStub.c, tclPlatStub.c, tclCompileDecls.h and tclCompileStub.c
#	files
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tclInt.decls,v 1.20.2.2 2001/04/04 21:22:18 hobbs Exp $

library tcl

# Define the unsupported generic interfaces.

interface tclInt

573
574
575
576
577
578
579

580
581
582
583

584
585
586

587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604









605
606
607
608
609
610
611
declare 152 generic {
    void TclSetLibraryPath(Tcl_Obj *pathPtr)
}
declare 153 generic {
    Tcl_Obj *TclGetLibraryPath(void)
}


declare 154 generic {
    int TclTestChannelCmd(ClientData clientData,
    Tcl_Interp *interp, int argc, char **argv)
}

declare 155 generic {
    int TclTestChannelEventCmd(ClientData clientData, \
	    Tcl_Interp *interp, int argc, char **argv)

}
declare 156 generic {
    void TclRegError (Tcl_Interp *interp, char *msg, \
	    int status)
}
declare 157 generic {
    Var * TclVarTraceExists (Tcl_Interp *interp, char *varName)
}
declare 158 generic {
    void TclSetStartupScriptFileName(char *filename)
}
declare 159 generic {
    char *TclGetStartupScriptFileName(void)
}
declare 160 generic {
    int TclpMatchFilesTypes(Tcl_Interp *interp, char *separators, \
	    Tcl_DString *dirPtr, char *pattern, char *tail, GlobTypeData *types)
}










##############################################################################

# Define the platform specific internal Tcl interface. These functions are
# only available on the designated platform.

interface tclIntPlat







>
|
|
|
<
>
|
|
|
>
|

















>
>
>
>
>
>
>
>
>







573
574
575
576
577
578
579
580
581
582
583

584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
declare 152 generic {
    void TclSetLibraryPath(Tcl_Obj *pathPtr)
}
declare 153 generic {
    Tcl_Obj *TclGetLibraryPath(void)
}

# moved to tclTest.c in 8.3.2/8.4a2
#declare 154 generic {
#    int TclTestChannelCmd(ClientData clientData,
#    Tcl_Interp *interp, int argc, char **argv)

#}
#declare 155 generic {
#    int TclTestChannelEventCmd(ClientData clientData, \
#	     Tcl_Interp *interp, int argc, char **argv)
#}

declare 156 generic {
    void TclRegError (Tcl_Interp *interp, char *msg, \
	    int status)
}
declare 157 generic {
    Var * TclVarTraceExists (Tcl_Interp *interp, char *varName)
}
declare 158 generic {
    void TclSetStartupScriptFileName(char *filename)
}
declare 159 generic {
    char *TclGetStartupScriptFileName(void)
}
declare 160 generic {
    int TclpMatchFilesTypes(Tcl_Interp *interp, char *separators, \
	    Tcl_DString *dirPtr, char *pattern, char *tail, GlobTypeData *types)
}

# new in 8.3.2/8.4a2
declare 161 generic {
    int TclChannelTransform(Tcl_Interp *interp, Tcl_Channel chan, \
	    Tcl_Obj *cmdObjPtr)
}
declare 162 generic {
    void TclChannelEventScriptInvoker(ClientData clientData, int flags)
}

##############################################################################

# Define the platform specific internal Tcl interface. These functions are
# only available on the designated platform.

interface tclIntPlat
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
    int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
    OSErr FSpFindFolder(short vRefNum, OSType folderType, \
	    Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
    void GetGlobalMouse(Point *mouse)
}

# The following routines are utility functions in Tcl.  They are exported
# here because they are needed in Tk.  They are not officially supported,
# however.  The first set are from the MoreFiles package.

declare 8 mac {
    pascal OSErr FSpGetDirectoryID(CONST FSSpec *spec, long *theDirID, \
	    Boolean *isDirectory)
}
declare 9 mac {
    pascal short FSpOpenResFileCompat(CONST FSSpec *spec, \
	    SignedByte permission)
}
declare 10 mac {
    pascal void FSpCreateResFileCompat(CONST FSSpec *spec, OSType creator, \
	    OSType fileType, ScriptCode scriptTag)
}

# Like the MoreFiles routines these fix problems in the standard
# Mac calls.  These routines are from tclMacUtils.h.

declare 11 mac {







|







|



|



|







646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
    int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
    OSErr FSpFindFolder(short vRefNum, OSType folderType, \
	    Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
    void GetGlobalMouseTcl(Point *mouse)
}

# The following routines are utility functions in Tcl.  They are exported
# here because they are needed in Tk.  They are not officially supported,
# however.  The first set are from the MoreFiles package.

declare 8 mac {
    pascal OSErr FSpGetDirectoryIDTcl(CONST FSSpec *spec, long *theDirID, \
	    Boolean *isDirectory)
}
declare 9 mac {
    pascal short FSpOpenResFileCompatTcl(CONST FSSpec *spec, \
	    SignedByte permission)
}
declare 10 mac {
    pascal void FSpCreateResFileCompatTcl(CONST FSSpec *spec, OSType creator, \
	    OSType fileType, ScriptCode scriptTag)
}

# Like the MoreFiles routines these fix problems in the standard
# Mac calls.  These routines are from tclMacUtils.h.

declare 11 mac {
Changes to generic/tclInt.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclInt.h --
 *
 *	Declarations of things used internally by the Tcl interpreter.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInt.h,v 1.42 2000/04/09 16:04:18 kupries Exp $
 */

#ifndef _TCLINT
#define _TCLINT

/*
 * Common include files needed by most of the Tcl source files are













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclInt.h --
 *
 *	Declarations of things used internally by the Tcl interpreter.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1993-1997 Lucent Technologies.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInt.h,v 1.42.2.1 2001/04/03 22:54:37 hobbs Exp $
 */

#ifndef _TCLINT
#define _TCLINT

/*
 * Common include files needed by most of the Tcl source files are
1545
1546
1547
1548
1549
1550
1551


1552
1553
1554
1555
1556
1557
1558
 */

extern Tcl_Obj *	tclFreeObjList;

#ifdef TCL_COMPILE_STATS
extern long		tclObjsAlloced;
extern long		tclObjsFreed;


#endif /* TCL_COMPILE_STATS */

/*
 * Pointer to a heap-allocated string of length zero that the Tcl core uses
 * as the value of an empty string representation for an object. This value
 * is shared by all new objects allocated by Tcl_NewObj.
 */







>
>







1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
 */

extern Tcl_Obj *	tclFreeObjList;

#ifdef TCL_COMPILE_STATS
extern long		tclObjsAlloced;
extern long		tclObjsFreed;
#define TCL_MAX_SHARED_OBJ_STATS 5
extern long		tclObjsShared[TCL_MAX_SHARED_OBJ_STATS];
#endif /* TCL_COMPILE_STATS */

/*
 * Pointer to a heap-allocated string of length zero that the Tcl core uses
 * as the value of an empty string representation for an object. This value
 * is shared by all new objects allocated by Tcl_NewObj.
 */
Changes to generic/tclIntDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclIntDecls.h --
 *
 *	This file contains the declarations for all unsupported
 *	functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIntDecls.h,v 1.19 1999/12/12 22:46:42 hobbs Exp $
 */

#ifndef _TCLINTDECLS
#define _TCLINTDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclIntDecls.h --
 *
 *	This file contains the declarations for all unsupported
 *	functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclIntDecls.h,v 1.19.2.1 2000/07/27 01:39:18 hobbs Exp $
 */

#ifndef _TCLINTDECLS
#define _TCLINTDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531






532
533
534
535
536
537
538
/* 151 */
EXTERN void		TclRegExpRangeUniChar _ANSI_ARGS_((Tcl_RegExp re, 
				int index, int * startPtr, int * endPtr));
/* 152 */
EXTERN void		TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr));
/* 153 */
EXTERN Tcl_Obj *	TclGetLibraryPath _ANSI_ARGS_((void));
/* 154 */
EXTERN int		TclTestChannelCmd _ANSI_ARGS_((ClientData clientData, 
				Tcl_Interp * interp, int argc, char ** argv));
/* 155 */
EXTERN int		TclTestChannelEventCmd _ANSI_ARGS_((
				ClientData clientData, Tcl_Interp * interp, 
				int argc, char ** argv));
/* 156 */
EXTERN void		TclRegError _ANSI_ARGS_((Tcl_Interp * interp, 
				char * msg, int status));
/* 157 */
EXTERN Var *		TclVarTraceExists _ANSI_ARGS_((Tcl_Interp * interp, 
				char * varName));
/* 158 */
EXTERN void		TclSetStartupScriptFileName _ANSI_ARGS_((
				char * filename));
/* 159 */
EXTERN char *		TclGetStartupScriptFileName _ANSI_ARGS_((void));
/* 160 */
EXTERN int		TclpMatchFilesTypes _ANSI_ARGS_((Tcl_Interp * interp, 
				char * separators, Tcl_DString * dirPtr, 
				char * pattern, char * tail, 
				GlobTypeData * types));







typedef struct TclIntStubs {
    int magic;
    struct TclIntStubHooks *hooks;

    int (*tclAccess) _ANSI_ARGS_((CONST char * path, int mode)); /* 0 */
    int (*tclAccessDeleteProc) _ANSI_ARGS_((TclAccessProc_ * proc)); /* 1 */







|
<
<
|
<
<
<
















>
>
>
>
>
>







502
503
504
505
506
507
508
509


510



511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
/* 151 */
EXTERN void		TclRegExpRangeUniChar _ANSI_ARGS_((Tcl_RegExp re, 
				int index, int * startPtr, int * endPtr));
/* 152 */
EXTERN void		TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr));
/* 153 */
EXTERN Tcl_Obj *	TclGetLibraryPath _ANSI_ARGS_((void));
/* Slot 154 is reserved */


/* Slot 155 is reserved */



/* 156 */
EXTERN void		TclRegError _ANSI_ARGS_((Tcl_Interp * interp, 
				char * msg, int status));
/* 157 */
EXTERN Var *		TclVarTraceExists _ANSI_ARGS_((Tcl_Interp * interp, 
				char * varName));
/* 158 */
EXTERN void		TclSetStartupScriptFileName _ANSI_ARGS_((
				char * filename));
/* 159 */
EXTERN char *		TclGetStartupScriptFileName _ANSI_ARGS_((void));
/* 160 */
EXTERN int		TclpMatchFilesTypes _ANSI_ARGS_((Tcl_Interp * interp, 
				char * separators, Tcl_DString * dirPtr, 
				char * pattern, char * tail, 
				GlobTypeData * types));
/* 161 */
EXTERN int		TclChannelTransform _ANSI_ARGS_((Tcl_Interp * interp, 
				Tcl_Channel chan, Tcl_Obj * cmdObjPtr));
/* 162 */
EXTERN void		TclChannelEventScriptInvoker _ANSI_ARGS_((
				ClientData clientData, int flags));

typedef struct TclIntStubs {
    int magic;
    struct TclIntStubHooks *hooks;

    int (*tclAccess) _ANSI_ARGS_((CONST char * path, int mode)); /* 0 */
    int (*tclAccessDeleteProc) _ANSI_ARGS_((TclAccessProc_ * proc)); /* 1 */
716
717
718
719
720
721
722
723
724
725
726
727
728
729


730
731
732
733
734
735
736
    void (*tclHandleFree) _ANSI_ARGS_((TclHandle handle)); /* 147 */
    TclHandle (*tclHandlePreserve) _ANSI_ARGS_((TclHandle handle)); /* 148 */
    void (*tclHandleRelease) _ANSI_ARGS_((TclHandle handle)); /* 149 */
    int (*tclRegAbout) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp re)); /* 150 */
    void (*tclRegExpRangeUniChar) _ANSI_ARGS_((Tcl_RegExp re, int index, int * startPtr, int * endPtr)); /* 151 */
    void (*tclSetLibraryPath) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 152 */
    Tcl_Obj * (*tclGetLibraryPath) _ANSI_ARGS_((void)); /* 153 */
    int (*tclTestChannelCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int argc, char ** argv)); /* 154 */
    int (*tclTestChannelEventCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int argc, char ** argv)); /* 155 */
    void (*tclRegError) _ANSI_ARGS_((Tcl_Interp * interp, char * msg, int status)); /* 156 */
    Var * (*tclVarTraceExists) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 157 */
    void (*tclSetStartupScriptFileName) _ANSI_ARGS_((char * filename)); /* 158 */
    char * (*tclGetStartupScriptFileName) _ANSI_ARGS_((void)); /* 159 */
    int (*tclpMatchFilesTypes) _ANSI_ARGS_((Tcl_Interp * interp, char * separators, Tcl_DString * dirPtr, char * pattern, char * tail, GlobTypeData * types)); /* 160 */


} TclIntStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclIntStubs *tclIntStubsPtr;
#ifdef __cplusplus







|
|





>
>







717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
    void (*tclHandleFree) _ANSI_ARGS_((TclHandle handle)); /* 147 */
    TclHandle (*tclHandlePreserve) _ANSI_ARGS_((TclHandle handle)); /* 148 */
    void (*tclHandleRelease) _ANSI_ARGS_((TclHandle handle)); /* 149 */
    int (*tclRegAbout) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp re)); /* 150 */
    void (*tclRegExpRangeUniChar) _ANSI_ARGS_((Tcl_RegExp re, int index, int * startPtr, int * endPtr)); /* 151 */
    void (*tclSetLibraryPath) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 152 */
    Tcl_Obj * (*tclGetLibraryPath) _ANSI_ARGS_((void)); /* 153 */
    void *reserved154;
    void *reserved155;
    void (*tclRegError) _ANSI_ARGS_((Tcl_Interp * interp, char * msg, int status)); /* 156 */
    Var * (*tclVarTraceExists) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 157 */
    void (*tclSetStartupScriptFileName) _ANSI_ARGS_((char * filename)); /* 158 */
    char * (*tclGetStartupScriptFileName) _ANSI_ARGS_((void)); /* 159 */
    int (*tclpMatchFilesTypes) _ANSI_ARGS_((Tcl_Interp * interp, char * separators, Tcl_DString * dirPtr, char * pattern, char * tail, GlobTypeData * types)); /* 160 */
    int (*tclChannelTransform) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan, Tcl_Obj * cmdObjPtr)); /* 161 */
    void (*tclChannelEventScriptInvoker) _ANSI_ARGS_((ClientData clientData, int flags)); /* 162 */
} TclIntStubs;

#ifdef __cplusplus
extern "C" {
#endif
extern TclIntStubs *tclIntStubsPtr;
#ifdef __cplusplus
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382








1383
1384
1385
1386
1387
1388
#define TclSetLibraryPath \
	(tclIntStubsPtr->tclSetLibraryPath) /* 152 */
#endif
#ifndef TclGetLibraryPath
#define TclGetLibraryPath \
	(tclIntStubsPtr->tclGetLibraryPath) /* 153 */
#endif
#ifndef TclTestChannelCmd
#define TclTestChannelCmd \
	(tclIntStubsPtr->tclTestChannelCmd) /* 154 */
#endif
#ifndef TclTestChannelEventCmd
#define TclTestChannelEventCmd \
	(tclIntStubsPtr->tclTestChannelEventCmd) /* 155 */
#endif
#ifndef TclRegError
#define TclRegError \
	(tclIntStubsPtr->tclRegError) /* 156 */
#endif
#ifndef TclVarTraceExists
#define TclVarTraceExists \
	(tclIntStubsPtr->tclVarTraceExists) /* 157 */
#endif
#ifndef TclSetStartupScriptFileName
#define TclSetStartupScriptFileName \
	(tclIntStubsPtr->tclSetStartupScriptFileName) /* 158 */
#endif
#ifndef TclGetStartupScriptFileName
#define TclGetStartupScriptFileName \
	(tclIntStubsPtr->tclGetStartupScriptFileName) /* 159 */
#endif
#ifndef TclpMatchFilesTypes
#define TclpMatchFilesTypes \
	(tclIntStubsPtr->tclpMatchFilesTypes) /* 160 */
#endif









#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLINTDECLS */







<
<
|
<
<
<
|
<




















>
>
>
>
>
>
>
>






1351
1352
1353
1354
1355
1356
1357


1358



1359

1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
#define TclSetLibraryPath \
	(tclIntStubsPtr->tclSetLibraryPath) /* 152 */
#endif
#ifndef TclGetLibraryPath
#define TclGetLibraryPath \
	(tclIntStubsPtr->tclGetLibraryPath) /* 153 */
#endif


/* Slot 154 is reserved */



/* Slot 155 is reserved */

#ifndef TclRegError
#define TclRegError \
	(tclIntStubsPtr->tclRegError) /* 156 */
#endif
#ifndef TclVarTraceExists
#define TclVarTraceExists \
	(tclIntStubsPtr->tclVarTraceExists) /* 157 */
#endif
#ifndef TclSetStartupScriptFileName
#define TclSetStartupScriptFileName \
	(tclIntStubsPtr->tclSetStartupScriptFileName) /* 158 */
#endif
#ifndef TclGetStartupScriptFileName
#define TclGetStartupScriptFileName \
	(tclIntStubsPtr->tclGetStartupScriptFileName) /* 159 */
#endif
#ifndef TclpMatchFilesTypes
#define TclpMatchFilesTypes \
	(tclIntStubsPtr->tclpMatchFilesTypes) /* 160 */
#endif
#ifndef TclChannelTransform
#define TclChannelTransform \
	(tclIntStubsPtr->tclChannelTransform) /* 161 */
#endif
#ifndef TclChannelEventScriptInvoker
#define TclChannelEventScriptInvoker \
	(tclIntStubsPtr->tclChannelEventScriptInvoker) /* 162 */
#endif

#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */

/* !END!: Do not edit above this line. */

#endif /* _TCLINTDECLS */
Changes to generic/tclIntPlatDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * tclIntPlatDecls.h --
 *
 *	This file contains the declarations for all platform dependent
 *	unsupported functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.8 2000/03/31 08:52:05 hobbs Exp $
 */

#ifndef _TCLINTPLATDECLS
#define _TCLINTPLATDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * tclIntPlatDecls.h --
 *
 *	This file contains the declarations for all platform dependent
 *	unsupported functions that are exported by the Tcl library.  These
 *	interfaces are not guaranteed to remain the same between
 *	versions.  Use at your own risk.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.8.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

#ifndef _TCLINTPLATDECLS
#define _TCLINTPLATDECLS

/*
 * WARNING: This file is automatically generated by the tools/genStubs.tcl
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/* 5 */
EXTERN int		FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec));
/* 6 */
EXTERN OSErr		FSpFindFolder _ANSI_ARGS_((short vRefNum, 
				OSType folderType, Boolean createFolder, 
				FSSpec * spec));
/* 7 */
EXTERN void		GetGlobalMouse _ANSI_ARGS_((Point * mouse));
/* 8 */
EXTERN pascal OSErr	FSpGetDirectoryID _ANSI_ARGS_((CONST FSSpec * spec, 
				long * theDirID, Boolean * isDirectory));
/* 9 */
EXTERN pascal short	FSpOpenResFileCompat _ANSI_ARGS_((
				CONST FSSpec * spec, SignedByte permission));
/* 10 */
EXTERN pascal void	FSpCreateResFileCompat _ANSI_ARGS_((
				CONST FSSpec * spec, OSType creator, 
				OSType fileType, ScriptCode scriptTag));
/* 11 */
EXTERN int		FSpLocationFromPath _ANSI_ARGS_((int length, 
				CONST char * path, FSSpecPtr theSpec));
/* 12 */
EXTERN OSErr		FSpPathFromLocation _ANSI_ARGS_((FSSpecPtr theSpec, 







|

|


|


|







144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/* 5 */
EXTERN int		FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec));
/* 6 */
EXTERN OSErr		FSpFindFolder _ANSI_ARGS_((short vRefNum, 
				OSType folderType, Boolean createFolder, 
				FSSpec * spec));
/* 7 */
EXTERN void		GetGlobalMouseTcl _ANSI_ARGS_((Point * mouse));
/* 8 */
EXTERN pascal OSErr	FSpGetDirectoryIDTcl _ANSI_ARGS_((CONST FSSpec * spec, 
				long * theDirID, Boolean * isDirectory));
/* 9 */
EXTERN pascal short	FSpOpenResFileCompatTcl _ANSI_ARGS_((
				CONST FSSpec * spec, SignedByte permission));
/* 10 */
EXTERN pascal void	FSpCreateResFileCompatTcl _ANSI_ARGS_((
				CONST FSSpec * spec, OSType creator, 
				OSType fileType, ScriptCode scriptTag));
/* 11 */
EXTERN int		FSpLocationFromPath _ANSI_ARGS_((int length, 
				CONST char * path, FSSpecPtr theSpec));
/* 12 */
EXTERN OSErr		FSpPathFromLocation _ANSI_ARGS_((FSSpecPtr theSpec, 
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
    VOID * (*tclpSysAlloc) _ANSI_ARGS_((long size, int isBin)); /* 0 */
    void (*tclpSysFree) _ANSI_ARGS_((VOID * ptr)); /* 1 */
    VOID * (*tclpSysRealloc) _ANSI_ARGS_((VOID * cp, unsigned int size)); /* 2 */
    void (*tclpExit) _ANSI_ARGS_((int status)); /* 3 */
    int (*fSpGetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 4 */
    int (*fSpSetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 5 */
    OSErr (*fSpFindFolder) _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 6 */
    void (*getGlobalMouse) _ANSI_ARGS_((Point * mouse)); /* 7 */
    pascal OSErr (*fSpGetDirectoryID) _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 8 */
    pascal short (*fSpOpenResFileCompat) _ANSI_ARGS_((CONST FSSpec * spec, SignedByte permission)); /* 9 */
    pascal void (*fSpCreateResFileCompat) _ANSI_ARGS_((CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 10 */
    int (*fSpLocationFromPath) _ANSI_ARGS_((int length, CONST char * path, FSSpecPtr theSpec)); /* 11 */
    OSErr (*fSpPathFromLocation) _ANSI_ARGS_((FSSpecPtr theSpec, int * length, Handle * fullPath)); /* 12 */
    void (*tclMacExitHandler) _ANSI_ARGS_((void)); /* 13 */
    void (*tclMacInitExitToShell) _ANSI_ARGS_((int usePatch)); /* 14 */
    OSErr (*tclMacInstallExitToShellPatch) _ANSI_ARGS_((ExitToShellProcPtr newProc)); /* 15 */
    int (*tclMacOSErrorToPosixError) _ANSI_ARGS_((int error)); /* 16 */
    void (*tclMacRemoveTimer) _ANSI_ARGS_((void * timerToken)); /* 17 */







|
|
|
|







246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
    VOID * (*tclpSysAlloc) _ANSI_ARGS_((long size, int isBin)); /* 0 */
    void (*tclpSysFree) _ANSI_ARGS_((VOID * ptr)); /* 1 */
    VOID * (*tclpSysRealloc) _ANSI_ARGS_((VOID * cp, unsigned int size)); /* 2 */
    void (*tclpExit) _ANSI_ARGS_((int status)); /* 3 */
    int (*fSpGetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 4 */
    int (*fSpSetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 5 */
    OSErr (*fSpFindFolder) _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 6 */
    void (*getGlobalMouseTcl) _ANSI_ARGS_((Point * mouse)); /* 7 */
    pascal OSErr (*fSpGetDirectoryIDTcl) _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 8 */
    pascal short (*fSpOpenResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, SignedByte permission)); /* 9 */
    pascal void (*fSpCreateResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 10 */
    int (*fSpLocationFromPath) _ANSI_ARGS_((int length, CONST char * path, FSSpecPtr theSpec)); /* 11 */
    OSErr (*fSpPathFromLocation) _ANSI_ARGS_((FSSpecPtr theSpec, int * length, Handle * fullPath)); /* 12 */
    void (*tclMacExitHandler) _ANSI_ARGS_((void)); /* 13 */
    void (*tclMacInitExitToShell) _ANSI_ARGS_((int usePatch)); /* 14 */
    OSErr (*tclMacInstallExitToShellPatch) _ANSI_ARGS_((ExitToShellProcPtr newProc)); /* 15 */
    int (*tclMacOSErrorToPosixError) _ANSI_ARGS_((int error)); /* 16 */
    void (*tclMacRemoveTimer) _ANSI_ARGS_((void * timerToken)); /* 17 */
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
#define FSpSetDefaultDir \
	(tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */
#endif
#ifndef FSpFindFolder
#define FSpFindFolder \
	(tclIntPlatStubsPtr->fSpFindFolder) /* 6 */
#endif
#ifndef GetGlobalMouse
#define GetGlobalMouse \
	(tclIntPlatStubsPtr->getGlobalMouse) /* 7 */
#endif
#ifndef FSpGetDirectoryID
#define FSpGetDirectoryID \
	(tclIntPlatStubsPtr->fSpGetDirectoryID) /* 8 */
#endif
#ifndef FSpOpenResFileCompat
#define FSpOpenResFileCompat \
	(tclIntPlatStubsPtr->fSpOpenResFileCompat) /* 9 */
#endif
#ifndef FSpCreateResFileCompat
#define FSpCreateResFileCompat \
	(tclIntPlatStubsPtr->fSpCreateResFileCompat) /* 10 */
#endif
#ifndef FSpLocationFromPath
#define FSpLocationFromPath \
	(tclIntPlatStubsPtr->fSpLocationFromPath) /* 11 */
#endif
#ifndef FSpPathFromLocation
#define FSpPathFromLocation \







|
|
|

|
|
|

|
|
|

|
|
|







448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
#define FSpSetDefaultDir \
	(tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */
#endif
#ifndef FSpFindFolder
#define FSpFindFolder \
	(tclIntPlatStubsPtr->fSpFindFolder) /* 6 */
#endif
#ifndef GetGlobalMouseTcl
#define GetGlobalMouseTcl \
	(tclIntPlatStubsPtr->getGlobalMouseTcl) /* 7 */
#endif
#ifndef FSpGetDirectoryIDTcl
#define FSpGetDirectoryIDTcl \
	(tclIntPlatStubsPtr->fSpGetDirectoryIDTcl) /* 8 */
#endif
#ifndef FSpOpenResFileCompatTcl
#define FSpOpenResFileCompatTcl \
	(tclIntPlatStubsPtr->fSpOpenResFileCompatTcl) /* 9 */
#endif
#ifndef FSpCreateResFileCompatTcl
#define FSpCreateResFileCompatTcl \
	(tclIntPlatStubsPtr->fSpCreateResFileCompatTcl) /* 10 */
#endif
#ifndef FSpLocationFromPath
#define FSpLocationFromPath \
	(tclIntPlatStubsPtr->fSpLocationFromPath) /* 11 */
#endif
#ifndef FSpPathFromLocation
#define FSpPathFromLocation \
Changes to generic/tclInterp.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclInterp.c --
 *
 *	This file implements the "interp" command which allows creation
 *	and manipulation of Tcl interpreters from within Tcl scripts.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInterp.c,v 1.5 1999/04/16 00:46:49 stanton Exp $
 */

#include <stdio.h>
#include "tclInt.h"
#include "tclPort.h"

/*











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclInterp.c --
 *
 *	This file implements the "interp" command which allows creation
 *	and manipulation of Tcl interpreters from within Tcl scripts.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclInterp.c,v 1.5.12.1 2001/04/04 14:47:16 dgp Exp $
 */

#include <stdio.h>
#include "tclInt.h"
#include "tclPort.h"

/*
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ObjGetAlias --
 *
 *	Object version: Gets information about an alias.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:







|







945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
    }
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_GetAliasObj --
 *
 *	Object version: Gets information about an alias.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
Changes to generic/tclListObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclListObj.c --
 *
 *	This file contains procedures that implement the Tcl list object
 *	type.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclListObj.c,v 1.7 1999/08/10 22:45:11 redman Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclListObj.c --
 *
 *	This file contains procedures that implement the Tcl list object
 *	type.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclListObj.c,v 1.7.8.1 2001/04/04 07:38:47 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Prototypes for procedures defined later in this file:
 */
261
262
263
264
265
266
267

268
269
270
271
272
273
274
	listRepPtr->elemCount    = objc;
	listRepPtr->elements     = elemPtrs;
	
	objPtr->internalRep.otherValuePtr = (VOID *) listRepPtr;
	objPtr->typePtr = &tclListType;
    } else {
	objPtr->bytes = tclEmptyStringRep;

    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjGetElements --







>







261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
	listRepPtr->elemCount    = objc;
	listRepPtr->elements     = elemPtrs;
	
	objPtr->internalRep.otherValuePtr = (VOID *) listRepPtr;
	objPtr->typePtr = &tclListType;
    } else {
	objPtr->bytes = tclEmptyStringRep;
	objPtr->length = 0;
    }
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_ListObjGetElements --
Changes to generic/tclMain.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMain.c --
 *
 *	Main program for Tcl shells and other Tcl-based applications.
 *
 * Copyright (c) 1988-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMain.c,v 1.7 1999/12/12 02:26:42 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMain.c --
 *
 *	Main program for Tcl shells and other Tcl-based applications.
 *
 * Copyright (c) 1988-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMain.c,v 1.7.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
33
34
35
36
37
38
39

40



41
42
43
44
45
46
47
 * to include tclPort.h here, because people might copy this file out of
 * the Tcl source directory to make their own modified versions).
 * Note:  "exit" should really be declared here, but there's no way to
 * declare it without causing conflicts with other definitions elsewher
 * on some systems, so it's better just to leave it out.
 */


extern int		isatty _ANSI_ARGS_((int fd));



extern char *		strcpy _ANSI_ARGS_((char *dst, CONST char *src));

static char *tclStartupScriptFileName = NULL;











>

>
>
>







33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 * to include tclPort.h here, because people might copy this file out of
 * the Tcl source directory to make their own modified versions).
 * Note:  "exit" should really be declared here, but there's no way to
 * declare it without causing conflicts with other definitions elsewher
 * on some systems, so it's better just to leave it out.
 */

#if !defined(MAC_TCL)
extern int		isatty _ANSI_ARGS_((int fd));
#else
#include <unistd.h>
#endif
extern char *		strcpy _ANSI_ARGS_((char *dst, CONST char *src));

static char *tclStartupScriptFileName = NULL;




Changes to generic/tclNamesp.c.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 *   Michael J. McLennan
 *   Bell Labs Innovations for Lucent Technologies
 *   mmclennan@lucent.com
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclNamesp.c,v 1.17 2000/03/27 22:18:56 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Flag passed to TclGetNamespaceForQualName to indicate that it should
 * search for a namespace rather than a command or variable inside a







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 *   Michael J. McLennan
 *   Bell Labs Innovations for Lucent Technologies
 *   mmclennan@lucent.com
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclNamesp.c,v 1.17.2.1 2001/04/03 22:54:37 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Flag passed to TclGetNamespaceForQualName to indicate that it should
 * search for a namespace rather than a command or variable inside a
1261
1262
1263
1264
1265
1266
1267

1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279

1280
1281
1282
1283
1284
1285
1286
			    && (realCmdPtr->nsPtr == currNsPtr)
			    && (Tcl_FindHashEntry(&currNsPtr->cmdTable,
			            cmdName) != NULL)) {
			Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
			        "import pattern \"", pattern,
				"\" would create a loop containing command \"",
				Tcl_DStringValue(&ds), "\"", (char *) NULL);

			return TCL_ERROR;
		    }
		}

		dataPtr = (ImportedCmdData *)
		        ckalloc(sizeof(ImportedCmdData));
                importedCmd = Tcl_CreateObjCommand(interp, 
                        Tcl_DStringValue(&ds), InvokeImportedCmd,
                        (ClientData) dataPtr, DeleteImportedCmd);
		dataPtr->realCmdPtr = cmdPtr;
		dataPtr->selfPtr = (Command *) importedCmd;
		dataPtr->selfPtr->compileProc = cmdPtr->compileProc;


		/*
		 * Create an ImportRef structure describing this new import
		 * command and add it to the import ref list in the "real"
		 * command.
		 */








>












>







1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
			    && (realCmdPtr->nsPtr == currNsPtr)
			    && (Tcl_FindHashEntry(&currNsPtr->cmdTable,
			            cmdName) != NULL)) {
			Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
			        "import pattern \"", pattern,
				"\" would create a loop containing command \"",
				Tcl_DStringValue(&ds), "\"", (char *) NULL);
			Tcl_DStringFree(&ds);
			return TCL_ERROR;
		    }
		}

		dataPtr = (ImportedCmdData *)
		        ckalloc(sizeof(ImportedCmdData));
                importedCmd = Tcl_CreateObjCommand(interp, 
                        Tcl_DStringValue(&ds), InvokeImportedCmd,
                        (ClientData) dataPtr, DeleteImportedCmd);
		dataPtr->realCmdPtr = cmdPtr;
		dataPtr->selfPtr = (Command *) importedCmd;
		dataPtr->selfPtr->compileProc = cmdPtr->compileProc;
		Tcl_DStringFree(&ds);

		/*
		 * Create an ImportRef structure describing this new import
		 * command and add it to the import ref list in the "real"
		 * command.
		 */

Changes to generic/tclObj.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclObj.c --
 *
 *	This file contains Tcl object-related procedures that are used by
 * 	many Tcl commands.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclObj.c,v 1.12 1999/12/04 06:15:41 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Table of all object types.












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclObj.c --
 *
 *	This file contains Tcl object-related procedures that are used by
 * 	many Tcl commands.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclObj.c,v 1.12.2.3 2001/07/16 23:14:13 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Table of all object types.
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
 */

#define OBJS_TO_ALLOC_EACH_TIME 100

void
TclAllocateFreeObjects()
{
    Tcl_Obj tmp[2];
    size_t objSizePlusPadding =	/* NB: this assumes byte addressing. */
	((int)(&(tmp[1])) - (int)(&(tmp[0])));
    size_t bytesToAlloc = (OBJS_TO_ALLOC_EACH_TIME * objSizePlusPadding);
    char *basePtr;
    register Tcl_Obj *prevPtr, *objPtr;
    register int i;

    basePtr = (char *) ckalloc(bytesToAlloc);
    memset(basePtr, 0, bytesToAlloc);

    prevPtr = NULL;
    objPtr = (Tcl_Obj *) basePtr;
    for (i = 0;  i < OBJS_TO_ALLOC_EACH_TIME;  i++) {
	objPtr->internalRep.otherValuePtr = (VOID *) prevPtr;
	prevPtr = objPtr;
	objPtr = (Tcl_Obj *) (((char *)objPtr) + objSizePlusPadding);
    }
    tclFreeObjList = prevPtr;
}
#undef OBJS_TO_ALLOC_EACH_TIME

/*
 *----------------------------------------------------------------------







<
<
<
|









|


|







519
520
521
522
523
524
525



526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
 */

#define OBJS_TO_ALLOC_EACH_TIME 100

void
TclAllocateFreeObjects()
{



    size_t bytesToAlloc = (OBJS_TO_ALLOC_EACH_TIME * sizeof(Tcl_Obj));
    char *basePtr;
    register Tcl_Obj *prevPtr, *objPtr;
    register int i;

    basePtr = (char *) ckalloc(bytesToAlloc);
    memset(basePtr, 0, bytesToAlloc);

    prevPtr = NULL;
    objPtr = (Tcl_Obj *) basePtr;
    for (i = 0; i < OBJS_TO_ALLOC_EACH_TIME; i++) {
	objPtr->internalRep.otherValuePtr = (VOID *) prevPtr;
	prevPtr = objPtr;
	objPtr++;
    }
    tclFreeObjList = prevPtr;
}
#undef OBJS_TO_ALLOC_EACH_TIME

/*
 *----------------------------------------------------------------------
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
    register Tcl_Obj *dupPtr;

    TclNewObj(dupPtr);

    if (objPtr->bytes == NULL) {
	dupPtr->bytes = NULL;
    } else if (objPtr->bytes != tclEmptyStringRep) {
	int len = objPtr->length;
	
	dupPtr->bytes = (char *) ckalloc((unsigned) len+1);
	if (len > 0) {
	    memcpy((VOID *) dupPtr->bytes, (VOID *) objPtr->bytes,
		   (unsigned) len);
	}
	dupPtr->bytes[len] = '\0';
	dupPtr->length = len;
    }
    
    if (typePtr != NULL) {
	if (typePtr->dupIntRepProc == NULL) {
	    dupPtr->internalRep = objPtr->internalRep;
	    dupPtr->typePtr = typePtr;
	} else {







|
<
<
<
<
<
<
<
<







641
642
643
644
645
646
647
648








649
650
651
652
653
654
655
    register Tcl_Obj *dupPtr;

    TclNewObj(dupPtr);

    if (objPtr->bytes == NULL) {
	dupPtr->bytes = NULL;
    } else if (objPtr->bytes != tclEmptyStringRep) {
	TclInitStringRep(dupPtr, objPtr->bytes, objPtr->length);








    }
    
    if (typePtr != NULL) {
	if (typePtr->dupIntRepProc == NULL) {
	    dupPtr->internalRep = objPtr->internalRep;
	    dupPtr->typePtr = typePtr;
	} else {
Changes to generic/tclParse.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 
 * tclParse.c --
 *
 *	This file contains procedures that parse Tcl scripts.  They
 *	do so in a general-purpose fashion that can be used for many
 *	different purposes, including compilation, direct execution,
 *	code analysis, etc.  This file also includes a few additional
 *	procedures such as Tcl_EvalObjv, Tcl_Eval, and Tcl_EvalEx, which
 *	allow scripts to be evaluated directly, without compiling.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclParse.c,v 1.13 1999/11/10 02:51:57 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following table provides parsing information about each possible











|




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 
 * tclParse.c --
 *
 *	This file contains procedures that parse Tcl scripts.  They
 *	do so in a general-purpose fashion that can be used for many
 *	different purposes, including compilation, direct execution,
 *	code analysis, etc.  This file also includes a few additional
 *	procedures such as Tcl_EvalObjv, Tcl_Eval, and Tcl_EvalEx, which
 *	allow scripts to be evaluated directly, without compiling.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 Ajuba Solutions.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclParse.c,v 1.13.2.1 2001/04/03 22:54:38 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following table provides parsing information about each possible
1452
1453
1454
1455
1456
1457
1458
1459


1460

1461


1462
1463
1464




1465










1466
1467

















1468
1469
1470
1471
1472
1473
1474
	Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
    }
    
    for (i = 0; i < objectsUsed; i++) {
	Tcl_DecrRefCount(objv[i]);
    }
    if (gotParse) {
	p = parse.commandStart + parse.commandSize;


	Tcl_FreeParse(&parse);

	if ((nested != 0) && (p > script) && (p[-1] == ']')) {


	    /*
	     * We get here in the special case where the TCL_BRACKET_TERM
	     * flag was set in the interpreter and we reached a close




	     * bracket in the script.  Return immediately.










	     */


















	    iPtr->termOffset = (p - 1) - script;
	} else {
	    iPtr->termOffset = p - script;
	}    
    }
    if (objv != staticObjArray) {
	ckfree((char *) objv);







|
>
>

>
|
>
>


|
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
	Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
    }
    
    for (i = 0; i < objectsUsed; i++) {
	Tcl_DecrRefCount(objv[i]);
    }
    if (gotParse) {
	next = parse.commandStart + parse.commandSize;
	bytesLeft -= next - p;
	p = next;
	Tcl_FreeParse(&parse);

	if ((nested != 0) && (p > script)) {
	    char *nextCmd = NULL;	/* pointer to start of next command */

	    /*
	     * We get here in the special case where the TCL_BRACKET_TERM
	     * flag was set in the interpreter.
	     *
	     * At this point, we want to find the end of the script
	     * (either end of script or the closing ']').
	     */

	    while ((p[-1] != ']') && bytesLeft) {
		if (Tcl_ParseCommand(NULL, p, bytesLeft, nested, &parse)
			!= TCL_OK) {
		    /*
		     * We were looking for the ']' to close the script.
		     * But if we find a syntax error, it is ok to quit
		     * early since in that case we no longer need to know
		     * where the ']' is (if there was one).  We reset the
		     * pointer to the start of the command that after the
		     * one causing the return.  -- hobbs
		     */

		    p = (nextCmd == NULL) ? parse.commandStart : nextCmd;
		    break;
		}

		if (nextCmd == NULL) {
		    nextCmd = parse.commandStart;
		}

		/*
		 * Advance to the next command in the script.
		 */

		next = parse.commandStart + parse.commandSize;
		bytesLeft -= next - p;
		p = next;
		Tcl_FreeParse(&parse);
	    }
	    iPtr->termOffset = (p - 1) - script;
	} else {
	    iPtr->termOffset = p - script;
	}    
    }
    if (objv != staticObjArray) {
	ckfree((char *) objv);
Changes to generic/tclPlatDecls.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14









15
16
17
18
19
20
21
/*
 * tclPlatDecls.h --
 *
 *	Declarations of platform specific Tcl APIs.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclPlatDecls.h,v 1.5 1999/04/30 22:45:02 stanton Exp $
 */

#ifndef _TCLPLATDECLS
#define _TCLPLATDECLS










/* !BEGIN!: Do not edit below this line. */

/*
 * Exported function declarations:
 */

#ifdef __WIN32__








|





>
>
>
>
>
>
>
>
>







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
26
27
28
29
30
/*
 * tclPlatDecls.h --
 *
 *	Declarations of platform specific Tcl APIs.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclPlatDecls.h,v 1.5.12.1 2001/04/03 22:54:38 hobbs Exp $
 */

#ifndef _TCLPLATDECLS
#define _TCLPLATDECLS

/*
 *  Pull in the definition of TCHAR.  Hopefully the compile flags
 *  of the core are matching against your project build for these
 *  public functions.  BE AWARE.
 */
#if defined(__WIN32__) && !defined(_INC_TCHAR)
#include <tchar.h>
#endif

/* !BEGIN!: Do not edit below this line. */

/*
 * Exported function declarations:
 */

#ifdef __WIN32__
Changes to generic/tclPosixStr.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclPosixStr.c --
 *
 *	This file contains procedures that generate strings
 *	corresponding to various POSIX-related codes, such
 *	as errno and signals.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclPosixStr.c,v 1.5 1999/08/21 19:41:04 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 *----------------------------------------------------------------------













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclPosixStr.c --
 *
 *	This file contains procedures that generate strings
 *	corresponding to various POSIX-related codes, such
 *	as errno and signals.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclPosixStr.c,v 1.5.2.1 2000/08/07 21:32:40 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 *----------------------------------------------------------------------
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "SIGPOLL";
#endif
#ifdef SIGPROF
	case SIGPROF: return "SIGPROF";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
	case SIGPWR: return "SIGPWR";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "SIGQUIT";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "SIGSEGV";







|







982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "SIGPOLL";
#endif
#ifdef SIGPROF
	case SIGPROF: return "SIGPROF";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ)) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
	case SIGPWR: return "SIGPWR";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "SIGQUIT";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "SIGSEGV";
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "input/output possible on file";
#endif
#ifdef SIGPROF
	case SIGPROF: return "profiling alarm";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
	case SIGPWR: return "power-fail restart";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "quit signal";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "segmentation violation";







|







1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
#endif
#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
	case SIGPOLL: return "input/output possible on file";
#endif
#ifdef SIGPROF
	case SIGPROF: return "profiling alarm";
#endif
#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ)) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
	case SIGPWR: return "power-fail restart";
#endif
#ifdef SIGQUIT
	case SIGQUIT: return "quit signal";
#endif
#ifdef SIGSEGV
	case SIGSEGV: return "segmentation violation";
Changes to generic/tclScan.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclScan.c --
 *
 *	This file contains the implementation of the "scan" command.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclScan.c,v 1.6 1999/11/30 01:42:59 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Flag values used by Tcl_ScanObjCmd.
 */










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclScan.c --
 *
 *	This file contains the implementation of the "scan" command.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclScan.c,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Flag values used by Tcl_ScanObjCmd.
 */
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
		op = 'i';
		base = 0;
		fn = (long (*)())strtol;
		break;
	    case 'o':
		op = 'i';
		base = 8;
		fn = (long (*)())strtol;
		break;
	    case 'x':
		op = 'i';
		base = 16;
		fn = (long (*)())strtol;
		break;
	    case 'u':
		op = 'i';
		base = 10;
		flags |= SCAN_UNSIGNED;
		fn = (long (*)())strtoul;
		break;







|




|







690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
		op = 'i';
		base = 0;
		fn = (long (*)())strtol;
		break;
	    case 'o':
		op = 'i';
		base = 8;
		fn = (long (*)())strtoul;
		break;
	    case 'x':
		op = 'i';
		base = 16;
		fn = (long (*)())strtoul;
		break;
	    case 'u':
		op = 'i';
		base = 10;
		flags |= SCAN_UNSIGNED;
		fn = (long (*)())strtoul;
		break;
Changes to generic/tclStubInit.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclStubInit.c --
 *
 *	This file contains the initializers for the Tcl stub vectors.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclStubInit.c,v 1.35 2000/04/09 16:04:18 kupries Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Remove macros that will interfere with the definitions below.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclStubInit.c --
 *
 *	This file contains the initializers for the Tcl stub vectors.
 *
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclStubInit.c,v 1.35.2.2 2001/04/04 21:22:18 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * Remove macros that will interfere with the definitions below.
225
226
227
228
229
230
231
232
233
234
235
236
237
238


239
240
241
242
243
244
245
    TclHandleFree, /* 147 */
    TclHandlePreserve, /* 148 */
    TclHandleRelease, /* 149 */
    TclRegAbout, /* 150 */
    TclRegExpRangeUniChar, /* 151 */
    TclSetLibraryPath, /* 152 */
    TclGetLibraryPath, /* 153 */
    TclTestChannelCmd, /* 154 */
    TclTestChannelEventCmd, /* 155 */
    TclRegError, /* 156 */
    TclVarTraceExists, /* 157 */
    TclSetStartupScriptFileName, /* 158 */
    TclGetStartupScriptFileName, /* 159 */
    TclpMatchFilesTypes, /* 160 */


};

TclIntPlatStubs tclIntPlatStubs = {
    TCL_STUB_MAGIC,
    NULL,
#if !defined(__WIN32__) && !defined(MAC_TCL) /* UNIX */
    TclGetAndDetachPids, /* 0 */







|
|





>
>







225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
    TclHandleFree, /* 147 */
    TclHandlePreserve, /* 148 */
    TclHandleRelease, /* 149 */
    TclRegAbout, /* 150 */
    TclRegExpRangeUniChar, /* 151 */
    TclSetLibraryPath, /* 152 */
    TclGetLibraryPath, /* 153 */
    NULL, /* 154 */
    NULL, /* 155 */
    TclRegError, /* 156 */
    TclVarTraceExists, /* 157 */
    TclSetStartupScriptFileName, /* 158 */
    TclGetStartupScriptFileName, /* 159 */
    TclpMatchFilesTypes, /* 160 */
    TclChannelTransform, /* 161 */
    TclChannelEventScriptInvoker, /* 162 */
};

TclIntPlatStubs tclIntPlatStubs = {
    TCL_STUB_MAGIC,
    NULL,
#if !defined(__WIN32__) && !defined(MAC_TCL) /* UNIX */
    TclGetAndDetachPids, /* 0 */
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
    TclpSysAlloc, /* 0 */
    TclpSysFree, /* 1 */
    TclpSysRealloc, /* 2 */
    TclpExit, /* 3 */
    FSpGetDefaultDir, /* 4 */
    FSpSetDefaultDir, /* 5 */
    FSpFindFolder, /* 6 */
    GetGlobalMouse, /* 7 */
    FSpGetDirectoryID, /* 8 */
    FSpOpenResFileCompat, /* 9 */
    FSpCreateResFileCompat, /* 10 */
    FSpLocationFromPath, /* 11 */
    FSpPathFromLocation, /* 12 */
    TclMacExitHandler, /* 13 */
    TclMacInitExitToShell, /* 14 */
    TclMacInstallExitToShellPatch, /* 15 */
    TclMacOSErrorToPosixError, /* 16 */
    TclMacRemoveTimer, /* 17 */







|
|
|
|







288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
    TclpSysAlloc, /* 0 */
    TclpSysFree, /* 1 */
    TclpSysRealloc, /* 2 */
    TclpExit, /* 3 */
    FSpGetDefaultDir, /* 4 */
    FSpSetDefaultDir, /* 5 */
    FSpFindFolder, /* 6 */
    GetGlobalMouseTcl, /* 7 */
    FSpGetDirectoryIDTcl, /* 8 */
    FSpOpenResFileCompatTcl, /* 9 */
    FSpCreateResFileCompatTcl, /* 10 */
    FSpLocationFromPath, /* 11 */
    FSpPathFromLocation, /* 12 */
    TclMacExitHandler, /* 13 */
    TclMacInitExitToShell, /* 14 */
    TclMacInstallExitToShellPatch, /* 15 */
    TclMacOSErrorToPosixError, /* 16 */
    TclMacRemoveTimer, /* 17 */
787
788
789
790
791
792
793


















794
795
796
    Tcl_GetAllocMutex, /* 387 */
    Tcl_GetChannelNames, /* 388 */
    Tcl_GetChannelNamesEx, /* 389 */
    Tcl_ProcObjCmd, /* 390 */
    Tcl_ConditionFinalize, /* 391 */
    Tcl_MutexFinalize, /* 392 */
    Tcl_CreateThread, /* 393 */


















};

/* !END!: Do not edit above this line. */







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
    Tcl_GetAllocMutex, /* 387 */
    Tcl_GetChannelNames, /* 388 */
    Tcl_GetChannelNamesEx, /* 389 */
    Tcl_ProcObjCmd, /* 390 */
    Tcl_ConditionFinalize, /* 391 */
    Tcl_MutexFinalize, /* 392 */
    Tcl_CreateThread, /* 393 */
    Tcl_ReadRaw, /* 394 */
    Tcl_WriteRaw, /* 395 */
    Tcl_GetTopChannel, /* 396 */
    Tcl_ChannelBuffered, /* 397 */
    Tcl_ChannelName, /* 398 */
    Tcl_ChannelVersion, /* 399 */
    Tcl_ChannelBlockModeProc, /* 400 */
    Tcl_ChannelCloseProc, /* 401 */
    Tcl_ChannelClose2Proc, /* 402 */
    Tcl_ChannelInputProc, /* 403 */
    Tcl_ChannelOutputProc, /* 404 */
    Tcl_ChannelSeekProc, /* 405 */
    Tcl_ChannelSetOptionProc, /* 406 */
    Tcl_ChannelGetOptionProc, /* 407 */
    Tcl_ChannelWatchProc, /* 408 */
    Tcl_ChannelGetHandleProc, /* 409 */
    Tcl_ChannelFlushProc, /* 410 */
    Tcl_ChannelHandlerProc, /* 411 */
};

/* !END!: Do not edit above this line. */
Changes to generic/tclTest.c.
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
26
27
28
29
30
/* 
 * tclTest.c --
 *
 *	This file contains C command procedures for a bunch of additional
 *	Tcl commands that are used for testing out Tcl's C interfaces.
 *	These commands are not normally included in Tcl applications;
 *	they're only used for testing.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTest.c,v 1.17 1999/10/13 02:22:18 hobbs Exp $
 */

#define TCL_TEST

#include "tclInt.h"
#include "tclPort.h"
#include "tclRegexp.h"

#include <locale.h>

/*
 * Declare external functions used in Windows tests.
 */

/*










|




|







>







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
26
27
28
29
30
31
/* 
 * tclTest.c --
 *
 *	This file contains C command procedures for a bunch of additional
 *	Tcl commands that are used for testing out Tcl's C interfaces.
 *	These commands are not normally included in Tcl applications;
 *	they're only used for testing.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 Ajuba Solutions.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTest.c,v 1.17.2.2 2000/08/06 00:20:10 hobbs Exp $
 */

#define TCL_TEST

#include "tclInt.h"
#include "tclPort.h"
#include "tclRegexp.h"
#include "tclIO.h"
#include <locale.h>

/*
 * Declare external functions used in Windows tests.
 */

/*
272
273
274
275
276
277
278




279
280
281
282
283
284
285
			    struct stat *buf));
static int		TeststatprocCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TesttranslatefilenameCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestupvarCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));





/*
 * External (platform specific) initialization routine, these declarations
 * explicitly don't use EXTERN since this code does not get compiled
 * into the library:
 */








>
>
>
>







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
			    struct stat *buf));
static int		TeststatprocCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TesttranslatefilenameCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestupvarCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestChannelCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));
static int		TestChannelEventCmd _ANSI_ARGS_((ClientData dummy,
			    Tcl_Interp *interp, int argc, char **argv));

/*
 * External (platform specific) initialization routine, these declarations
 * explicitly don't use EXTERN since this code does not get compiled
 * into the library:
 */

325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateObjCommand(interp, "noop", NoopObjCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testaccessproc", TestaccessprocCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testasync", TestasyncCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannel", TclTestChannelCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannelevent", TclTestChannelEventCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchmod", TestchmodCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdtoken", TestcmdtokenCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdinfo", TestcmdinfoCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);







|

|







330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateObjCommand(interp, "noop", NoopObjCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testaccessproc", TestaccessprocCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testasync", TestasyncCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannel", TestChannelCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchannelevent", TestChannelEventCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testchmod", TestchmodCmd,
            (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdtoken", TestcmdtokenCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
    Tcl_CreateCommand(interp, "testcmdinfo", TestcmdinfoCmd, (ClientData) 0,
	    (Tcl_CmdDeleteProc *) NULL);
4238
4239
4240
4241
4242
4243
4244
































































































































































































































































































































































































































































































































































































    if (!strcmp("testOpenFileChannel3%.fil", fileName)) {
	return (TclpOpenFileChannel(interp, "__testOpenFileChannel3%__.fil",
		modeString, permissions));
    } else {
	return (NULL);
    }
}







































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
    if (!strcmp("testOpenFileChannel3%.fil", fileName)) {
	return (TclpOpenFileChannel(interp, "__testOpenFileChannel3%__.fil",
		modeString, permissions));
    } else {
	return (NULL);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * TestChannelCmd --
 *
 *	Implements the Tcl "testchannel" debugging command and its
 *	subcommands. This is part of the testing environment.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TestChannelCmd(clientData, interp, argc, argv)
    ClientData clientData;	/* Not used. */
    Tcl_Interp *interp;		/* Interpreter for result. */
    int argc;			/* Count of additional args. */
    char **argv;		/* Additional arg strings. */
{
    char *cmdName;		/* Sub command. */
    Tcl_HashTable *hTblPtr;	/* Hash table of channels. */
    Tcl_HashSearch hSearch;	/* Search variable. */
    Tcl_HashEntry *hPtr;	/* Search variable. */
    Channel *chanPtr;		/* The actual channel. */
    ChannelState *statePtr;	/* state info for channel */
    Tcl_Channel chan;		/* The opaque type. */
    size_t len;			/* Length of subcommand string. */
    int IOQueued;		/* How much IO is queued inside channel? */
    ChannelBuffer *bufPtr;	/* For iterating over queued IO. */
    char buf[TCL_INTEGER_SPACE];/* For sprintf. */
    int mode;			/* rw mode of the channel */
    
    if (argc < 2) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " subcommand ?additional args..?\"", (char *) NULL);
        return TCL_ERROR;
    }
    cmdName = argv[1];
    len = strlen(cmdName);

    chanPtr = (Channel *) NULL;

    if (argc > 2) {
        chan = Tcl_GetChannel(interp, argv[2], &mode);
        if (chan == (Tcl_Channel) NULL) {
            return TCL_ERROR;
        }
        chanPtr		= (Channel *) chan;
	statePtr	= chanPtr->state;
        chanPtr		= statePtr->topChanPtr;
	chan		= (Tcl_Channel) chanPtr;
    } else {
	/* lint */
	statePtr	= NULL;
	chan		= NULL;
    }

    if ((cmdName[0] == 'i') && (strncmp(cmdName, "info", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " info channelName\"", (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendElement(interp, argv[2]);
        Tcl_AppendElement(interp, chanPtr->typePtr->typeName);
        if (statePtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_NONBLOCKING) {
            Tcl_AppendElement(interp, "nonblocking");
        } else {
            Tcl_AppendElement(interp, "blocking");
        }
        if (statePtr->flags & CHANNEL_LINEBUFFERED) {
            Tcl_AppendElement(interp, "line");
        } else if (statePtr->flags & CHANNEL_UNBUFFERED) {
            Tcl_AppendElement(interp, "none");
        } else {
            Tcl_AppendElement(interp, "full");
        }
        if (statePtr->flags & BG_FLUSH_SCHEDULED) {
            Tcl_AppendElement(interp, "async_flush");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_EOF) {
            Tcl_AppendElement(interp, "eof");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & CHANNEL_BLOCKED) {
            Tcl_AppendElement(interp, "blocked");
        } else {
            Tcl_AppendElement(interp, "unblocked");
        }
        if (statePtr->inputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
            if (statePtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "saw_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
            Tcl_AppendElement(interp, "");
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
            Tcl_AppendElement(interp, "");
        } else if (statePtr->inputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
            if (statePtr->flags & INPUT_SAW_CR) {
                Tcl_AppendElement(interp, "queued_cr");
            } else {
                Tcl_AppendElement(interp, "");
            }
        }
        if (statePtr->outputTranslation == TCL_TRANSLATE_AUTO) {
            Tcl_AppendElement(interp, "auto");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_LF) {
            Tcl_AppendElement(interp, "lf");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
            Tcl_AppendElement(interp, "cr");
        } else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
            Tcl_AppendElement(interp, "crlf");
        }
        for (IOQueued = 0, bufPtr = statePtr->inQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        IOQueued = 0;
        if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = statePtr->curOutPtr->nextAdded -
                statePtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = statePtr->outQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendElement(interp, buf);
        
        TclFormatInt(buf, Tcl_Tell((Tcl_Channel) chanPtr));
        Tcl_AppendElement(interp, buf);

        TclFormatInt(buf, statePtr->refCount);
        Tcl_AppendElement(interp, buf);

        return TCL_OK;
    }

    if ((cmdName[0] == 'i') &&
            (strncmp(cmdName, "inputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        for (IOQueued = 0, bufPtr = statePtr->inQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += bufPtr->nextAdded - bufPtr->nextRemoved;
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'm') && (strncmp(cmdName, "mode", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        if (statePtr->flags & TCL_READABLE) {
            Tcl_AppendElement(interp, "read");
        } else {
            Tcl_AppendElement(interp, "");
        }
        if (statePtr->flags & TCL_WRITABLE) {
            Tcl_AppendElement(interp, "write");
        } else {
            Tcl_AppendElement(interp, "");
        }
        return TCL_OK;
    }
    
    if ((cmdName[0] == 'n') && (strncmp(cmdName, "name", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, statePtr->channelName, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') && (strncmp(cmdName, "open", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'o') &&
            (strncmp(cmdName, "outputbuffered", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }

        IOQueued = 0;
        if (statePtr->curOutPtr != (ChannelBuffer *) NULL) {
            IOQueued = statePtr->curOutPtr->nextAdded -
                statePtr->curOutPtr->nextRemoved;
        }
        for (bufPtr = statePtr->outQueueHead;
	     bufPtr != (ChannelBuffer *) NULL;
	     bufPtr = bufPtr->nextPtr) {
            IOQueued += (bufPtr->nextAdded - bufPtr->nextRemoved);
        }
        TclFormatInt(buf, IOQueued);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'q') &&
            (strncmp(cmdName, "queuedcr", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }

        Tcl_AppendResult(interp,
                (statePtr->flags & INPUT_SAW_CR) ? "1" : "0",
                (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "readable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr  = (Channel *) Tcl_GetHashValue(hPtr);
	    statePtr = chanPtr->state;
            if (statePtr->flags & TCL_READABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 'r') && (strncmp(cmdName, "refcount", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        
        TclFormatInt(buf, statePtr->refCount);
        Tcl_AppendResult(interp, buf, (char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 't') && (strncmp(cmdName, "type", len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "channel name required",
                    (char *) NULL);
            return TCL_ERROR;
        }
        Tcl_AppendResult(interp, chanPtr->typePtr->typeName,
		(char *) NULL);
        return TCL_OK;
    }

    if ((cmdName[0] == 'w') && (strncmp(cmdName, "writable", len) == 0)) {
        hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclIO", NULL);
        if (hTblPtr == (Tcl_HashTable *) NULL) {
            return TCL_OK;
        }
        for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch);
	     hPtr != (Tcl_HashEntry *) NULL;
	     hPtr = Tcl_NextHashEntry(&hSearch)) {
            chanPtr = (Channel *) Tcl_GetHashValue(hPtr);
	    statePtr = chanPtr->state;
            if (statePtr->flags & TCL_WRITABLE) {
                Tcl_AppendElement(interp, Tcl_GetHashKey(hTblPtr, hPtr));
            }
        }
        return TCL_OK;
    }

    if ((cmdName[0] == 't') && (strncmp(cmdName, "transform", len) == 0)) {
	/*
	 * Syntax: transform channel -command command
	 */

        if (argc != 5) {
	    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
		    " transform channelId -command cmd\"", (char *) NULL);
            return TCL_ERROR;
        }
	if (strcmp(argv[3], "-command") != 0) {
	    Tcl_AppendResult(interp, "bad argument \"", argv[3],
		    "\": should be \"-command\"", (char *) NULL);
	    return TCL_ERROR;
	}

	return TclChannelTransform(interp, chan,
		Tcl_NewStringObj(argv[4], -1));
    }

    if ((cmdName[0] == 'u') && (strncmp(cmdName, "unstack", len) == 0)) {
	/*
	 * Syntax: unstack channel
	 */

        if (argc != 3) {
	    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
		    " unstack channel\"", (char *) NULL);
            return TCL_ERROR;
        }
	return Tcl_UnstackChannel(interp, chan);
    }

    Tcl_AppendResult(interp, "bad option \"", cmdName, "\": should be ",
            "info, open, readable, writable, transform, unstack",
            (char *) NULL);
    return TCL_ERROR;
}

/*
 *----------------------------------------------------------------------
 *
 * TestChannelEventCmd --
 *
 *	This procedure implements the "testchannelevent" command. It is
 *	used to test the Tcl channel event mechanism.
 *
 * Results:
 *	A standard Tcl result.
 *
 * Side effects:
 *	Creates, deletes and returns channel event handlers.
 *
 *----------------------------------------------------------------------
 */

	/* ARGSUSED */
int
TestChannelEventCmd(dummy, interp, argc, argv)
    ClientData dummy;			/* Not used. */
    Tcl_Interp *interp;			/* Current interpreter. */
    int argc;				/* Number of arguments. */
    char **argv;			/* Argument strings. */
{
    Tcl_Obj *resultListPtr;
    Channel *chanPtr;
    ChannelState *statePtr;	/* state info for channel */
    EventScriptRecord *esPtr, *prevEsPtr, *nextEsPtr;
    char *cmd;
    int index, i, mask, len;

    if ((argc < 3) || (argc > 5)) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " channelName cmd ?arg1? ?arg2?\"", (char *) NULL);
        return TCL_ERROR;
    }
    chanPtr = (Channel *) Tcl_GetChannel(interp, argv[1], NULL);
    if (chanPtr == (Channel *) NULL) {
        return TCL_ERROR;
    }
    statePtr = chanPtr->state;

    cmd = argv[2];
    len = strlen(cmd);
    if ((cmd[0] == 'a') && (strncmp(cmd, "add", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName add eventSpec script\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (strcmp(argv[3], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[3], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[3], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[3],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }

        esPtr = (EventScriptRecord *) ckalloc((unsigned)
                sizeof(EventScriptRecord));
        esPtr->nextPtr = statePtr->scriptRecordPtr;
        statePtr->scriptRecordPtr = esPtr;
        
        esPtr->chanPtr = chanPtr;
        esPtr->interp = interp;
        esPtr->mask = mask;
	esPtr->scriptPtr = Tcl_NewStringObj(argv[4], -1);
	Tcl_IncrRefCount(esPtr->scriptPtr);

        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
        
        return TCL_OK;
    }

    if ((cmd[0] == 'd') && (strncmp(cmd, "delete", (unsigned) len) == 0)) {
        if (argc != 4) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = statePtr->scriptRecordPtr;
	     (i < index) && (esPtr != (EventScriptRecord *) NULL);
	     i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }
        if (esPtr == statePtr->scriptRecordPtr) {
            statePtr->scriptRecordPtr = esPtr->nextPtr;
        } else {
            for (prevEsPtr = statePtr->scriptRecordPtr;
		 (prevEsPtr != (EventScriptRecord *) NULL) &&
		     (prevEsPtr->nextPtr != esPtr);
		 prevEsPtr = prevEsPtr->nextPtr) {
                /* Empty loop body. */
            }
            if (prevEsPtr == (EventScriptRecord *) NULL) {
                panic("TestChannelEventCmd: damaged event script list");
            }
            prevEsPtr->nextPtr = esPtr->nextPtr;
        }
        Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
	Tcl_DecrRefCount(esPtr->scriptPtr);
        ckfree((char *) esPtr);

        return TCL_OK;
    }

    if ((cmd[0] == 'l') && (strncmp(cmd, "list", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName list\"", (char *) NULL);
            return TCL_ERROR;
        }
	resultListPtr = Tcl_GetObjResult(interp);
        for (esPtr = statePtr->scriptRecordPtr;
	     esPtr != (EventScriptRecord *) NULL;
	     esPtr = esPtr->nextPtr) {
	    if (esPtr->mask) {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, Tcl_NewStringObj(
		    (esPtr->mask == TCL_READABLE) ? "readable" : "writable", -1));
 	    } else {
 	        Tcl_ListObjAppendElement(interp, resultListPtr, 
			Tcl_NewStringObj("none", -1));
	    }
  	    Tcl_ListObjAppendElement(interp, resultListPtr, esPtr->scriptPtr);
        }
	Tcl_SetObjResult(interp, resultListPtr);
        return TCL_OK;
    }

    if ((cmd[0] == 'r') && (strncmp(cmd, "removeall", (unsigned) len) == 0)) {
        if (argc != 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName removeall\"", (char *) NULL);
            return TCL_ERROR;
        }
        for (esPtr = statePtr->scriptRecordPtr;
	     esPtr != (EventScriptRecord *) NULL;
	     esPtr = nextEsPtr) {
            nextEsPtr = esPtr->nextPtr;
            Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr,
                    TclChannelEventScriptInvoker, (ClientData) esPtr);
	    Tcl_DecrRefCount(esPtr->scriptPtr);
            ckfree((char *) esPtr);
        }
        statePtr->scriptRecordPtr = (EventScriptRecord *) NULL;
        return TCL_OK;
    }

    if  ((cmd[0] == 's') && (strncmp(cmd, "set", (unsigned) len) == 0)) {
        if (argc != 5) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                    " channelName delete index event\"", (char *) NULL);
            return TCL_ERROR;
        }
        if (Tcl_GetInt(interp, argv[3], &index) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (index < 0) {
            Tcl_AppendResult(interp, "bad event index: ", argv[3],
                    ": must be nonnegative", (char *) NULL);
            return TCL_ERROR;
        }
        for (i = 0, esPtr = statePtr->scriptRecordPtr;
	     (i < index) && (esPtr != (EventScriptRecord *) NULL);
	     i++, esPtr = esPtr->nextPtr) {
	    /* Empty loop body. */
        }
        if (esPtr == (EventScriptRecord *) NULL) {
            Tcl_AppendResult(interp, "bad event index ", argv[3],
                    ": out of range", (char *) NULL);
            return TCL_ERROR;
        }

        if (strcmp(argv[4], "readable") == 0) {
            mask = TCL_READABLE;
        } else if (strcmp(argv[4], "writable") == 0) {
            mask = TCL_WRITABLE;
        } else if (strcmp(argv[4], "none") == 0) {
            mask = 0;
	} else {
            Tcl_AppendResult(interp, "bad event name \"", argv[4],
                    "\": must be readable, writable, or none", (char *) NULL);
            return TCL_ERROR;
        }
	esPtr->mask = mask;
        Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask,
                TclChannelEventScriptInvoker, (ClientData) esPtr);
	return TCL_OK;
    }    
    Tcl_AppendResult(interp, "bad command ", cmd, ", must be one of ",
            "add, delete, list, set, or removeall", (char *) NULL);
    return TCL_ERROR;
}
Changes to generic/tclTestObj.c.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTestObj.c,v 1.6 1999/06/15 22:06:17 hershey Exp $
 */

#include "tclInt.h"

/*
 * An array of Tcl_Obj pointers used in the commands that operate on or get
 * the values of Tcl object-valued variables. varPtr[i] is the i-th







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTestObj.c,v 1.6.10.1 2001/04/03 22:54:38 hobbs Exp $
 */

#include "tclInt.h"

/*
 * An array of Tcl_Obj pointers used in the commands that operate on or get
 * the values of Tcl object-valued variables. varPtr[i] is the i-th
416
417
418
419
420
421
422
423

424
425
426
427
428
429
430
	 */

	Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1], tablePtr,
		"token", 0, &index);
	if (Tcl_GetIntFromObj(interp, objv[2], &index2) != TCL_OK) {
	    return TCL_ERROR;
	}
	objv[1]->internalRep.twoPtrValue.ptr2 = (VOID *) index2;

	result = Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1],
		tablePtr, "token", 0, &index);
	if (result == TCL_OK) {
	    Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
	}
	return result;
    }







|
>







416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
	 */

	Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1], tablePtr,
		"token", 0, &index);
	if (Tcl_GetIntFromObj(interp, objv[2], &index2) != TCL_OK) {
	    return TCL_ERROR;
	}
	objv[1]->internalRep.twoPtrValue.ptr2 =
		(VOID *) (index2 * sizeof(char *));
	result = Tcl_GetIndexFromObj((Tcl_Interp *) NULL, objv[1],
		tablePtr, "token", 0, &index);
	if (result == TCL_OK) {
	    Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
	}
	return result;
    }
Changes to generic/tclThreadTest.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclThreadTest.c --
 *
 *	This file implements the testthread command.  Eventually this
 *	should be tclThreadCmd.c
 *	Some of this code is based on work done by Richard Hipp on behalf of
 *	Conservation Through Innovation, Limited, with their permission.
 *
 * Copyright (c) 1998 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclThreadTest.c,v 1.9 2000/04/17 20:32:22 welch Exp $
 */

#include "tclInt.h"

#ifdef TCL_THREADS
/*
 * Each thread has an single instance of the following structure.  There













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclThreadTest.c --
 *
 *	This file implements the testthread command.  Eventually this
 *	should be tclThreadCmd.c
 *	Some of this code is based on work done by Richard Hipp on behalf of
 *	Conservation Through Innovation, Limited, with their permission.
 *
 * Copyright (c) 1998 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclThreadTest.c,v 1.9.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

#include "tclInt.h"

#ifdef TCL_THREADS
/*
 * Each thread has an single instance of the following structure.  There
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
EXTERN int	TclThreadList _ANSI_ARGS_((Tcl_Interp *interp));
EXTERN int	TclThreadSend _ANSI_ARGS_((Tcl_Interp *interp, Tcl_ThreadId id,
	char *script, int wait));

#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLIMPORT

Tcl_ThreadCreateType	NewThread _ANSI_ARGS_((ClientData clientData));
static void	ListRemove _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static void	ListUpdateInner _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static int	ThreadEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int mask));
static void	ThreadErrorProc _ANSI_ARGS_((Tcl_Interp *interp));
static void	ThreadFreeProc _ANSI_ARGS_((ClientData clientData));
static int	ThreadDeleteEvent _ANSI_ARGS_((Tcl_Event *eventPtr,
	ClientData clientData));







|







122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
EXTERN int	TclThreadList _ANSI_ARGS_((Tcl_Interp *interp));
EXTERN int	TclThreadSend _ANSI_ARGS_((Tcl_Interp *interp, Tcl_ThreadId id,
	char *script, int wait));

#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLIMPORT

Tcl_ThreadCreateType	NewTestThread _ANSI_ARGS_((ClientData clientData));
static void	ListRemove _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static void	ListUpdateInner _ANSI_ARGS_((ThreadSpecificData *tsdPtr));
static int	ThreadEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int mask));
static void	ThreadErrorProc _ANSI_ARGS_((Tcl_Interp *interp));
static void	ThreadFreeProc _ANSI_ARGS_((ClientData clientData));
static int	ThreadDeleteEvent _ANSI_ARGS_((Tcl_Event *eventPtr,
	ClientData clientData));
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
    Tcl_ThreadId id;

    ctrl.script = (char *) script;
    ctrl.condWait = NULL;
    ctrl.flags = 0;

    Tcl_MutexLock(&threadMutex);
    if (Tcl_CreateThread(&id, NewThread, (ClientData) &ctrl,
		 TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS) != TCL_OK) {
	Tcl_MutexUnlock(&threadMutex);
        Tcl_AppendResult(interp,"can't create a new thread",0);
	ckfree((void*)ctrl.script);
	return TCL_ERROR;
    }








|







351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
    Tcl_ThreadId id;

    ctrl.script = (char *) script;
    ctrl.condWait = NULL;
    ctrl.flags = 0;

    Tcl_MutexLock(&threadMutex);
    if (Tcl_CreateThread(&id, NewTestThread, (ClientData) &ctrl,
		 TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS) != TCL_OK) {
	Tcl_MutexUnlock(&threadMutex);
        Tcl_AppendResult(interp,"can't create a new thread",0);
	ckfree((void*)ctrl.script);
	return TCL_ERROR;
    }

373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
    Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
    return TCL_OK;
}

/*
 *------------------------------------------------------------------------
 *
 * NewThread --
 *
 *    This routine is the "main()" for a new thread whose task is to
 *    execute a single TCL script.  The argument to this function is
 *    a pointer to a structure that contains the text of the TCL script
 *    to be executed.
 *
 *    Space to hold the script field of the ThreadControl structure passed 







|







373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
    Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
    return TCL_OK;
}

/*
 *------------------------------------------------------------------------
 *
 * NewTestThread --
 *
 *    This routine is the "main()" for a new thread whose task is to
 *    execute a single TCL script.  The argument to this function is
 *    a pointer to a structure that contains the text of the TCL script
 *    to be executed.
 *
 *    Space to hold the script field of the ThreadControl structure passed 
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
 *
 * Side effects:
 *    A TCL script is executed in a new thread.
 *
 *------------------------------------------------------------------------
 */
Tcl_ThreadCreateType
NewThread(clientData)
    ClientData clientData;
{
    ThreadCtrl *ctrlPtr = (ThreadCtrl*)clientData;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    int result;
    char *threadEvalScript;








|







399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
 *
 * Side effects:
 *    A TCL script is executed in a new thread.
 *
 *------------------------------------------------------------------------
 */
Tcl_ThreadCreateType
NewTestThread(clientData)
    ClientData clientData;
{
    ThreadCtrl *ctrlPtr = (ThreadCtrl*)clientData;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    int result;
    char *threadEvalScript;

Changes to generic/tclUtf.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclUtf.c --
 *
 *	Routines for manipulating UTF-8 strings.
 *
 * Copyright (c) 1997-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUtf.c,v 1.11 2000/01/11 22:09:00 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Include the static character classification tables and macros.
 */










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclUtf.c --
 *
 *	Routines for manipulating UTF-8 strings.
 *
 * Copyright (c) 1997-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUtf.c,v 1.11.2.1 2001/07/16 23:14:13 hobbs Exp $
 */

#include "tclInt.h"

/*
 * Include the static character classification tables and macros.
 */
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 *
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */
 
static int
UtfCount(ch)
    int ch;			/* The Tcl_UniChar whose size is returned. */
{
    if ((ch > 0) && (ch < UNICODE_SELF)) {
	return 1;
    }
    if (ch <= 0x7FF) {







|







107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 *
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */
 
INLINE static int
UtfCount(ch)
    int ch;			/* The Tcl_UniChar whose size is returned. */
{
    if ((ch > 0) && (ch < UNICODE_SELF)) {
	return 1;
    }
    if (ch <= 0x7FF) {
777
778
779
780
781
782
783

784
785
786
787
788
789
790
791
				 * a backslash sequence. */
    int *readPtr;		/* Fill in with number of characters read
				 * from src, unless NULL. */
    char *dst;			/* Filled with the bytes represented by the
				 * backslash sequence. */
{
    register CONST char *p = src+1;

    int result, count, n;
    char buf[TCL_UTF_MAX];

    if (dst == NULL) {
	dst = buf;
    }

    count = 2;







>
|







777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
				 * a backslash sequence. */
    int *readPtr;		/* Fill in with number of characters read
				 * from src, unless NULL. */
    char *dst;			/* Filled with the bytes represented by the
				 * backslash sequence. */
{
    register CONST char *p = src+1;
    Tcl_UniChar result;
    int count, n;
    char buf[TCL_UTF_MAX];

    if (dst == NULL) {
	dst = buf;
    }

    count = 2;
879
880
881
882
883
884
885

886
887









888
889
890
891
892
893
894
895
896
897
898
899
900
901
		if (!isdigit(UCHAR(*p)) || (UCHAR(*p) >= '8')) { /* INTL: digit */
		    break;
		}
		count = 4;
		result = (unsigned char)((result << 3) + (*p - '0'));
		break;
	    }

	    result = *p;
	    count = 2;









	    break;
    }

    if (readPtr != NULL) {
	*readPtr = count;
    }
    return Tcl_UniCharToUtf(result, dst);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UtfToUpper --
 *







>


>
>
>
>
>
>
>
>
>






|







880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
		if (!isdigit(UCHAR(*p)) || (UCHAR(*p) >= '8')) { /* INTL: digit */
		    break;
		}
		count = 4;
		result = (unsigned char)((result << 3) + (*p - '0'));
		break;
	    }
	    if (UCHAR(*p) < UNICODE_SELF) {
	    result = *p;
	    count = 2;
	    } else {
		/*
		 * We have to convert here because the user has put a
		 * backslash in front of a multi-byte utf-8 character.
		 * While this means nothing special, we shouldn't break up
		 * a correct utf-8 character. [Bug #217987] test subst-3.2
		 */
		count = Tcl_UtfToUniChar(p, &result) + 1; /* +1 for '\' */
	    }
	    break;
    }

    if (readPtr != NULL) {
	*readPtr = count;
    }
    return Tcl_UniCharToUtf((int) result, dst);
}

/*
 *----------------------------------------------------------------------
 *
 * Tcl_UtfToUpper --
 *
Changes to generic/tclUtil.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUtil.c --
 *
 *	This file contains utility procedures that are used by many Tcl
 *	commands.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 *  RCS: @(#) $Id: tclUtil.c,v 1.17 1999/12/12 02:26:43 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following variable holds the full path name of the binary












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUtil.c --
 *
 *	This file contains utility procedures that are used by many Tcl
 *	commands.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 *  RCS: @(#) $Id: tclUtil.c,v 1.17.2.1 2001/07/16 23:14:13 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following variable holds the full path name of the binary
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
    if (objc == 0) {
	*concatStr = '\0';
    } else {
	p = concatStr;
        for (i = 0;  i < objc;  i++) {
	    objPtr = objv[i];
	    element = Tcl_GetStringFromObj(objPtr, &elemLength);
	    while ((elemLength > 0)
		    && (isspace(UCHAR(*element)))) { /* INTL: ISO space. */
	         element++;
		 elemLength--;
	    }

	    /*
	     * Trim trailing white space.  But, be careful not to trim
	     * a space character if it is preceded by a backslash: in
	     * this case it could be significant.
	     */

	    while ((elemLength > 0)
		    && isspace(UCHAR(element[elemLength-1])) /* INTL: ISO space. */
		    && ((elemLength < 2) || (element[elemLength-2] != '\\'))) {
		elemLength--;
	    }
	    if (elemLength == 0) {
	         continue;	/* nothing left of this element */
	    }







|











|







1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
    if (objc == 0) {
	*concatStr = '\0';
    } else {
	p = concatStr;
        for (i = 0;  i < objc;  i++) {
	    objPtr = objv[i];
	    element = Tcl_GetStringFromObj(objPtr, &elemLength);
	    while ((elemLength > 0) && (UCHAR(*element) < 127)
		    && (isspace(UCHAR(*element)))) { /* INTL: ISO space. */
	         element++;
		 elemLength--;
	    }

	    /*
	     * Trim trailing white space.  But, be careful not to trim
	     * a space character if it is preceded by a backslash: in
	     * this case it could be significant.
	     */

	    while ((elemLength > 0) && (UCHAR(element[elemLength-1]) < 127)
		    && isspace(UCHAR(element[elemLength-1])) /* INTL: ISO space. */
		    && ((elemLength < 2) || (element[elemLength-2] != '\\'))) {
		elemLength--;
	    }
	    if (elemLength == 0) {
	         continue;	/* nothing left of this element */
	    }
Changes to generic/tclVar.c.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 * Copyright (c) 1987-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclVar.c,v 1.16 2000/01/21 03:29:14 ericm Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The strings below are used to indicate what went wrong when a







|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 * Copyright (c) 1987-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclVar.c,v 1.16.2.1 2001/04/03 22:54:38 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The strings below are used to indicate what went wrong when a
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
	"anymore", "donesearch", "exists", "get", "names", "nextelement",
	"set", "size", "startsearch", "unset", (char *) NULL
    };

    Interp *iPtr = (Interp *) interp;
    Var *varPtr, *arrayPtr;
    Tcl_HashEntry *hPtr;
    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
    int notArray;
    char *varName, *msg;
    int index, result;


    if (objc < 3) {
	Tcl_WrongNumArgs(interp, 1, objv, "option arrayName ?arg ...?");
	return TCL_ERROR;
    }

    if (Tcl_GetIndexFromObj(interp, objv[1], arrayOptions, "option",







|



<







2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876

2877
2878
2879
2880
2881
2882
2883
	"anymore", "donesearch", "exists", "get", "names", "nextelement",
	"set", "size", "startsearch", "unset", (char *) NULL
    };

    Interp *iPtr = (Interp *) interp;
    Var *varPtr, *arrayPtr;
    Tcl_HashEntry *hPtr;
    Tcl_Obj *resultPtr;
    int notArray;
    char *varName, *msg;
    int index, result;


    if (objc < 3) {
	Tcl_WrongNumArgs(interp, 1, objv, "option arrayName ?arg ...?");
	return TCL_ERROR;
    }

    if (Tcl_GetIndexFromObj(interp, objv[1], arrayOptions, "option",
2911
2912
2913
2914
2915
2916
2917







2918
2919
2920
2921
2922
2923
2924
		TCL_TRACE_ARRAY));
	if (msg != NULL) {
	    VarErrMsg(interp, varName, NULL, "trace array", msg);
	    return TCL_ERROR;
	}
    }








    switch (index) {
        case ARRAY_ANYMORE: {
	    ArraySearch *searchPtr;
	    char *searchId;
	    
	    if (objc != 4) {
	        Tcl_WrongNumArgs(interp, 2, objv, 







>
>
>
>
>
>
>







2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
		TCL_TRACE_ARRAY));
	if (msg != NULL) {
	    VarErrMsg(interp, varName, NULL, "trace array", msg);
	    return TCL_ERROR;
	}
    }

    /*
     * We have to wait to get the resultPtr until here because
     * CallTraces can affect the result.
     */

    resultPtr = Tcl_GetObjResult(interp);

    switch (index) {
        case ARRAY_ANYMORE: {
	    ArraySearch *searchPtr;
	    char *searchId;
	    
	    if (objc != 4) {
	        Tcl_WrongNumArgs(interp, 2, objv, 
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786

4787
4788
4789
4790
4791
4792
4793
4794

4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
Var *
TclVarTraceExists(interp, varName)
    Tcl_Interp *interp;		/* The interpreter */
    char *varName;		/* The variable name */
{
    Var *varPtr;
    Var *arrayPtr;
    char *msg;

    /*
     * The choice of "create" flag values is delicate here, and
     * matches the semantics of GetVar.  Things are still not perfect,
     * however, because if you do "info exists x" you get a varPtr
     * and therefore trigger traces.  However, if you do 
     * "info exists x(i)", then you only get a varPtr if x is already
     * known to be an array.  Otherwise you get NULL, and no trace
     * is triggered.  This matches Tcl 7.6 semantics.
     */

    varPtr = TclLookupVar(interp, varName, (char *) NULL,
            0, "access",
            /*createPart1*/ 0, /*createPart2*/ 1, &arrayPtr);

    if (varPtr == NULL) {
	return NULL;
    }
    if ((varPtr != NULL) &&
	    ((varPtr->tracePtr != NULL)
	    || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL)))) {
	msg = CallTraces((Interp *)interp, arrayPtr, varPtr, varName,
		(char *) NULL, TCL_TRACE_READS);

	if (msg != NULL) {
	    /*
	     * If the variable doesn't exist anymore and no-one's using
	     * it, then free up the relevant structures and hash table entries.
	     */

	    if (TclIsVarUndefined(varPtr)) {
		CleanupVar(varPtr, arrayPtr);
	    }
	    return NULL;
	}
    }
    return varPtr;
}







<












<
|
>



|
|
|
|

>
|
|
|
|
|

|
|
<
|
|
|


4771
4772
4773
4774
4775
4776
4777

4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789

4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808

4809
4810
4811
4812
4813
Var *
TclVarTraceExists(interp, varName)
    Tcl_Interp *interp;		/* The interpreter */
    char *varName;		/* The variable name */
{
    Var *varPtr;
    Var *arrayPtr;


    /*
     * The choice of "create" flag values is delicate here, and
     * matches the semantics of GetVar.  Things are still not perfect,
     * however, because if you do "info exists x" you get a varPtr
     * and therefore trigger traces.  However, if you do 
     * "info exists x(i)", then you only get a varPtr if x is already
     * known to be an array.  Otherwise you get NULL, and no trace
     * is triggered.  This matches Tcl 7.6 semantics.
     */

    varPtr = TclLookupVar(interp, varName, (char *) NULL,

            0, "access", /*createPart1*/ 0, /*createPart2*/ 1, &arrayPtr);

    if (varPtr == NULL) {
	return NULL;
    }

    if ((varPtr->tracePtr != NULL)
	    || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
	CallTraces((Interp *)interp, arrayPtr, varPtr, varName,
		(char *) NULL, TCL_TRACE_READS);
    }

    /*
     * If the variable doesn't exist anymore and no-one's using
     * it, then free up the relevant structures and hash table entries.
     */

    if (TclIsVarUndefined(varPtr)) {
	CleanupVar(varPtr, arrayPtr);

	return NULL;
    }

    return varPtr;
}
Deleted library/dde/pkgIndex.tcl.
1
2
3
4
5
if {[info exists tcl_platform(debug)]} {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83d.dll] dde]
} else {
    package ifneeded dde 1.1 [list load [file join $dir tcldde83.dll] dde]
}
<
<
<
<
<










Changes to library/history.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
# history.tcl --
#
# Implementation of the history command.
#
# RCS: @(#) $Id: history.tcl,v 1.3 1998/09/14 18:40:03 stanton Exp $
#
# Copyright (c) 1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#





|







1
2
3
4
5
6
7
8
9
10
11
12
# history.tcl --
#
# Implementation of the history command.
#
# RCS: @(#) $Id: history.tcl,v 1.3.18.1 2000/08/07 21:31:47 hobbs Exp $
#
# Copyright (c) 1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#

301
302
303
304
305
306
307

308
309
310
311
312
313
314
315
#
# Results:
#	The index into history, or an error if the index didn't match.

 proc tcl::HistIndex {event} {
    variable history
    if {[catch {expr {~$event}}]} {

	for {set i $history(nextid)} {[info exists history($i)]} {incr i -1} {
	    if {[string match $event* $history($i)]} {
		return $i;
	    }
	    if {[string match $event $history($i)]} {
		return $i;
	    }
	}







>
|







301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
#
# Results:
#	The index into history, or an error if the index didn't match.

 proc tcl::HistIndex {event} {
    variable history
    if {[catch {expr {~$event}}]} {
	for {set i [expr {$history(nextid)-1}]} {[info exists history($i)]} \
		{incr i -1} {
	    if {[string match $event* $history($i)]} {
		return $i;
	    }
	    if {[string match $event $history($i)]} {
		return $i;
	    }
	}
Changes to library/http/http.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# http.tcl --
#
#	Client-side HTTP for GET, POST, and HEAD commands.
#	These routines can be used in untrusted code that uses 
#	the Safesock security policy.  These procedures use a 
#	callback interface to avoid using vwait, which is not 
#	defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.32 2000/04/22 07:07:59 sandeep Exp $

# Rough version history:
# 1.0	Old http_get interface
# 2.0	http:: namespace and http::geturl
# 2.1	Added callbacks to handle arriving data, and timeouts
# 2.2	Added ability to fetch into a channel
# 2.3	Added SSL support, and ability to post from a channel











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# http.tcl --
#
#	Client-side HTTP for GET, POST, and HEAD commands.
#	These routines can be used in untrusted code that uses 
#	the Safesock security policy.  These procedures use a 
#	callback interface to avoid using vwait, which is not 
#	defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.32.2.1 2000/05/31 01:28:57 sandeep Exp $

# Rough version history:
# 1.0	Old http_get interface
# 2.0	http:: namespace and http::geturl
# 2.1	Added callbacks to handle arriving data, and timeouts
# 2.2	Added ability to fetch into a channel
# 2.3	Added SSL support, and ability to post from a channel
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
    }

    # Validate URL, determine the server host and port, and check proxy case

    if {![regexp -nocase {^(([^:]*)://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \
	    x prefix proto host y port srvurl]} {
	unset $token
	error "Unsupported URL: $url"
    }
    if {[string length $proto] == 0} {
	set proto http
	set url ${proto}://$url
    }
    if {![info exists urlTypes($proto)]} {
	unset $token
	return -code error "unsupported url type \"$proto\""
    }
    set defport [lindex $urlTypes($proto) 0]
    set defcmd [lindex $urlTypes($proto) 1]

    if {[string length $port] == 0} {
	set port $defport
    }







|







|







276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
    }

    # Validate URL, determine the server host and port, and check proxy case

    if {![regexp -nocase {^(([^:]*)://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \
	    x prefix proto host y port srvurl]} {
	unset $token
	return -code error "Unsupported URL: $url"
    }
    if {[string length $proto] == 0} {
	set proto http
	set url ${proto}://$url
    }
    if {![info exists urlTypes($proto)]} {
	unset $token
	return -code error "Unsupported URL type \"$proto\""
    }
    set defport [lindex $urlTypes($proto) 0]
    set defcmd [lindex $urlTypes($proto) 1]

    if {[string length $port] == 0} {
	set port $defport
    }
341
342
343
344
345
346
347
348
349









350
351
352
353
354
355
356
357
358
359
360
    set state(sock) $s

    # Wait for the connection to complete

    if {$state(-timeout) > 0} {
	fileevent $s writable [list http::Connect $token]
	http::wait $token
	if {$state(status) != "connect"} {
	    









	    # Likely to be connection timeout.  If there was a connection
	    # error, (e.g., bad port), then http::wait will have 
	    # raised an error already

	    return $token
	}
	set state(status) ""
    }

    # Send data in cr-lf format, but accept any line terminators








<
|
>
>
>
>
>
>
>
>
>
|
<
<
<







341
342
343
344
345
346
347

348
349
350
351
352
353
354
355
356
357
358



359
360
361
362
363
364
365
    set state(sock) $s

    # Wait for the connection to complete

    if {$state(-timeout) > 0} {
	fileevent $s writable [list http::Connect $token]
	http::wait $token


	if {[string equal $state(status) "error"]} {
	    # something went wrong while trying to establish the connection
	    # Clean up after events and such, but DON'T call the command
	    # callback (if available) because we're going to throw an 
	    # exception from here instead.
	    set err [lindex $state(error) 0]
	    cleanup $token
	    return -code error $err
	} elseif {![string equal $state(status) "connect"]} {
	    # Likely to be connection timeout



	    return $token
	}
	set state(status) ""
    }

    # Send data in cr-lf format, but accept any line terminators

445
446
447
448
449
450
451





452
453
454
455
456
457
458
459
460



461

462
463
464
465
466
467
468

	if {! [info exists state(-command)]} {

	    # geturl does EVERYTHING asynchronously, so if the user
	    # calls it synchronously, we just do a wait here.

	    wait $token





	}
    } err]} {
	# The socket probably was never connected,
	# or the connection dropped later.

	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.




	Finish $token $err 1

	cleanup $token
	return -code error $err
    }

    return $token
}








>
>
>
>
>








|
>
>
>
|
>







450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482

	if {! [info exists state(-command)]} {

	    # geturl does EVERYTHING asynchronously, so if the user
	    # calls it synchronously, we just do a wait here.

	    wait $token
	    if {[string equal $state(status) "error"]} {
		# Something went wrong, so throw the exception, and the
		# enclosing catch will do cleanup.
		return -code error [lindex $state(error) 0]
	    }		
	}
    } err]} {
	# The socket probably was never connected,
	# or the connection dropped later.

	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.
	
	# if state(status) is error, it means someone's already called Finish
	# to do the above-described clean up.
	if {[string equal $state(status) "error"]} {
	    Finish $token $err 1
	}
	cleanup $token
	return -code error $err
    }

    return $token
}

497
498
499
500
501
502
503









504
505
506
507
508
509
510
    }
}
proc http::size {token} {
    variable $token
    upvar 0 $token state
    return $state(currentsize)
}










# http::cleanup
#
#	Garbage collect the state associated with a transaction
#
# Arguments
#	token	The token returned from http::geturl







>
>
>
>
>
>
>
>
>







511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
    }
}
proc http::size {token} {
    variable $token
    upvar 0 $token state
    return $state(currentsize)
}

proc http::error {token} {
    variable $token
    upvar 0 $token state
    if {[info exists state(error)]} {
	return $state(error)
    }
    return ""
}

# http::cleanup
#
#	Garbage collect the state associated with a transaction
#
# Arguments
#	token	The token returned from http::geturl
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548


549
550
551
552
553
554
555
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Sets the status of the connection, which unblocks
# 	the waiting geturl call

 proc http::Connect {token} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[eof $state(sock)] ||
	    [string length [fconfigure $state(sock) -error]]} {
	set state(status) error
	set state(error) [list \
		"connect failed [fconfigure $state(sock) -error]" \
		$errorInfo $errorCode]
    } else {
	set state(status) connect
    }
    fileevent $state(sock) writable {}
 }



# http::Write
#
#	Write POST query data to the socket
#
# Arguments
#	token	The token for the connection







|




|
<
<
|
<


<
|
|
>
>







550
551
552
553
554
555
556
557
558
559
560
561
562


563

564
565

566
567
568
569
570
571
572
573
574
575
576
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Sets the status of the connection, which unblocks
# 	the waiting geturl call

proc http::Connect {token} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[eof $state(sock)] ||
	[string length [fconfigure $state(sock) -error]]} {


	    Finish $token "connect failed [fconfigure $state(sock) -error]" 1

    } else {
	set state(status) connect

	fileevent $state(sock) writable {}
    }
    return
}

# http::Write
#
#	Write POST query data to the socket
#
# Arguments
#	token	The token for the connection
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
    variable $token
    upvar 0 $token state

    if {![info exists state(status)] || [string length $state(status)] == 0} {
	# We must wait on the original variable name, not the upvar alias
	vwait $token\(status)
    }
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }
    return $state(status)
}

# http::formatQuery --
#
#	See documentaion for details.
#	Call http::formatQuery with an even number of arguments, where 







<
<
<
<
|







797
798
799
800
801
802
803




804
805
806
807
808
809
810
811
    variable $token
    upvar 0 $token state

    if {![info exists state(status)] || [string length $state(status)] == 0} {
	# We must wait on the original variable name, not the upvar alias
	vwait $token\(status)
    }





    return $state(status)
}

# http::formatQuery --
#
#	See documentaion for details.
#	Call http::formatQuery with an even number of arguments, where 
Deleted library/http2.3/http.tcl.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
# http.tcl --
#
#	Client-side HTTP for GET, POST, and HEAD commands.
#	These routines can be used in untrusted code that uses 
#	the Safesock security policy.  These procedures use a 
#	callback interface to avoid using vwait, which is not 
#	defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.32 2000/04/22 07:07:59 sandeep Exp $

# Rough version history:
# 1.0	Old http_get interface
# 2.0	http:: namespace and http::geturl
# 2.1	Added callbacks to handle arriving data, and timeouts
# 2.2	Added ability to fetch into a channel
# 2.3	Added SSL support, and ability to post from a channel
#	This version also cleans up error cases and eliminates the
#	"ioerror" status in favor of raising an error

package provide http 2.3

namespace eval http {
    variable http
    array set http {
	-accept */*
	-proxyhost {}
	-proxyport {}
	-useragent {Tcl http client package 2.3}
	-proxyfilter http::ProxyRequired
    }

    variable formMap
    variable alphanumeric a-zA-Z0-9
    variable c
    variable i 0
    for {} {$i <= 256} {incr i} {
	set c [format %c $i]
	if {![string match \[$alphanumeric\] $c]} {
	    set formMap($c) %[format %.2x $i]
	}
    }
    # These are handled specially
    array set formMap {
	" " +   \n %0d%0a
    }

    variable urlTypes
    array set urlTypes {
	http	{80 ::socket}
    }

    namespace export geturl config reset wait formatQuery register unregister
    # Useful, but not exported: data size status code
}

# http::register --
#
#     See documentaion for details.
#
# Arguments:
#     proto           URL protocol prefix, e.g. https
#     port            Default port for protocol
#     command         Command to use to create socket
# Results:
#     list of port and command that was registered.

proc http::register {proto port command} {
    variable urlTypes
    set urlTypes($proto) [list $port $command]
}

# http::unregister --
#
#     Unregisters URL protocol handler
#
# Arguments:
#     proto           URL protocol prefix, e.g. https
# Results:
#     list of port and command that was unregistered.

proc http::unregister {proto} {
    variable urlTypes
    if {![info exists urlTypes($proto)]} {
	return -code error "unsupported url type \"$proto\""
    }
    set old $urlTypes($proto)
    unset urlTypes($proto)
    return $old
}

# http::config --
#
#	See documentaion for details.
#
# Arguments:
#	args		Options parsed by the procedure.
# Results:
#        TODO

proc http::config {args} {
    variable http
    set options [lsort [array names http -*]]
    set usage [join $options ", "]
    if {[llength $args] == 0} {
	set result {}
	foreach name $options {
	    lappend result $name $http($name)
	}
	return $result
    }
    regsub -all -- - $options {} options
    set pat ^-([join $options |])$
    if {[llength $args] == 1} {
	set flag [lindex $args 0]
	if {[regexp -- $pat $flag]} {
	    return $http($flag)
	} else {
	    return -code error "Unknown option $flag, must be: $usage"
	}
    } else {
	foreach {flag value} $args {
	    if {[regexp -- $pat $flag]} {
		set http($flag) $value
	    } else {
		return -code error "Unknown option $flag, must be: $usage"
	    }
	}
    }
}

# http::Finish --
#
#	Clean up the socket and eval close time callbacks
#
# Arguments:
#	token	    Connection token.
#	errormsg    (optional) If set, forces status to error.
#       skipCB      (optional) If set, don't call the -command callback.  This
#                   is useful when geturl wants to throw an exception instead
#                   of calling the callback.  That way, the same error isn't
#                   reported to two places.
#
# Side Effects:
#        Closes the socket

proc http::Finish { token {errormsg ""} {skipCB 0}} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[string length $errormsg] != 0} {
	set state(error) [list $errormsg $errorInfo $errorCode]
	set state(status) error
    }
    catch {close $state(sock)}
    catch {after cancel $state(after)}
    if {[info exists state(-command)] && !$skipCB} {
	if {[catch {eval $state(-command) {$token}} err]} {
	    if {[string length $errormsg] == 0} {
		set state(error) [list $err $errorInfo $errorCode]
		set state(status) error
	    }
	}
	if {[info exist state(-command)]} {
	    # Command callback may already have unset our state
	    unset state(-command)
	}
    }
}

# http::reset --
#
#	See documentaion for details.
#
# Arguments:
#	token	Connection token.
#	why	Status info.
#
# Side Effects:
#       See Finish

proc http::reset { token {why reset} } {
    variable $token
    upvar 0 $token state
    set state(status) $why
    catch {fileevent $state(sock) readable {}}
    catch {fileevent $state(sock) writable {}}
    Finish $token
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }
}

# http::geturl --
#
#	Establishes a connection to a remote url via http.
#
# Arguments:
#       url		The http URL to goget.
#       args		Option value pairs. Valid options include:
#				-blocksize, -validate, -headers, -timeout
# Results:
#	Returns a token for this connection.
#	This token is the name of an array that the caller should
#	unset to garbage collect the state.

proc http::geturl { url args } {
    variable http
    variable urlTypes

    # Initialize the state variable, an array.  We'll return the
    # name of this array as the token for the transaction.

    if {![info exists http(uid)]} {
	set http(uid) 0
    }
    set token [namespace current]::[incr http(uid)]
    variable $token
    upvar 0 $token state
    reset $token

    # Process command options.

    array set state {
	-blocksize 	8192
	-queryblocksize 8192
	-validate 	0
	-headers 	{}
	-timeout 	0
	-type           application/x-www-form-urlencoded
	-queryprogress	{}
	state		header
	meta		{}
	currentsize	0
	totalsize	0
	querylength	0
	queryoffset	0
        type            text/html
        body            {}
	status		""
	http            ""
    }
    set options {-blocksize -channel -command -handler -headers \
	    -progress -query -queryblocksize -querychannel -queryprogress\
	    -validate -timeout -type}
    set usage [join $options ", "]
    regsub -all -- - $options {} options
    set pat ^-([join $options |])$
    foreach {flag value} $args {
	if {[regexp $pat $flag]} {
	    # Validate numbers
	    if {[info exists state($flag)] && \
		    [string is integer -strict $state($flag)] && \
		    ![string is integer -strict $value]} {
		unset $token
		return -code error "Bad value for $flag ($value), must be integer"
	    }
	    set state($flag) $value
	} else {
	    unset $token
	    return -code error "Unknown option $flag, can be: $usage"
	}
    }

    # Make sure -query and -querychannel aren't both specified

    set isQueryChannel [info exists state(-querychannel)]
    set isQuery [info exists state(-query)]
    if {$isQuery && $isQueryChannel} {
	unset $token
	return -code error "Can't combine -query and -querychannel options!"
    }

    # Validate URL, determine the server host and port, and check proxy case

    if {![regexp -nocase {^(([^:]*)://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \
	    x prefix proto host y port srvurl]} {
	unset $token
	error "Unsupported URL: $url"
    }
    if {[string length $proto] == 0} {
	set proto http
	set url ${proto}://$url
    }
    if {![info exists urlTypes($proto)]} {
	unset $token
	return -code error "unsupported url type \"$proto\""
    }
    set defport [lindex $urlTypes($proto) 0]
    set defcmd [lindex $urlTypes($proto) 1]

    if {[string length $port] == 0} {
	set port $defport
    }
    if {[string length $srvurl] == 0} {
	set srvurl /
    }
    if {[string length $proto] == 0} {
	set url http://$url
    }
    set state(url) $url
    if {![catch {$http(-proxyfilter) $host} proxy]} {
	set phost [lindex $proxy 0]
	set pport [lindex $proxy 1]
    }

    # If a timeout is specified we set up the after event
    # and arrange for an asynchronous socket connection.

    if {$state(-timeout) > 0} {
	set state(after) [after $state(-timeout) \
		[list http::reset $token timeout]]
	set async -async
    } else {
	set async ""
    }

    # If we are using the proxy, we must pass in the full URL that
    # includes the server name.

    if {[info exists phost] && [string length $phost]} {
	set srvurl $url
	set conStat [catch {eval $defcmd $async {$phost $pport}} s]
    } else {
	set conStat [catch {eval $defcmd $async {$host $port}} s]
    }
    if {$conStat} {

	# something went wrong while trying to establish the connection
	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.
	Finish $token "" 1
	cleanup $token
	return -code error $s
    }
    set state(sock) $s

    # Wait for the connection to complete

    if {$state(-timeout) > 0} {
	fileevent $s writable [list http::Connect $token]
	http::wait $token
	if {$state(status) != "connect"} {
	    
	    # Likely to be connection timeout.  If there was a connection
	    # error, (e.g., bad port), then http::wait will have 
	    # raised an error already

	    return $token
	}
	set state(status) ""
    }

    # Send data in cr-lf format, but accept any line terminators

    fconfigure $s -translation {auto crlf} -buffersize $state(-blocksize)

    # The following is disallowed in safe interpreters, but the socket
    # is already in non-blocking mode in that case.

    catch {fconfigure $s -blocking off}
    set how GET
    if {$isQuery} {
	set state(querylength) [string length $state(-query)]
	if {$state(querylength) > 0} {
	    set how POST
	    set contDone 0
	} else {
	    # there's no query data
	    unset state(-query)
	    set isQuery 0
	}
    } elseif {$state(-validate)} {
	set how HEAD
    } elseif {$isQueryChannel} {
	set how POST
	# The query channel must be blocking for the async Write to
	# work properly.
	fconfigure $state(-querychannel) -blocking 1 -translation binary
	set contDone 0
    }

    if {[catch {
	puts $s "$how $srvurl HTTP/1.0"
	puts $s "Accept: $http(-accept)"
	puts $s "Host: $host"
	puts $s "User-Agent: $http(-useragent)"
	foreach {key value} $state(-headers) {
	    regsub -all \[\n\r\]  $value {} value
	    set key [string trim $key]
	    if {[string equal $key "Content-Length"]} {
		set contDone 1
		set state(querylength) $value
	    }
	    if {[string length $key]} {
		puts $s "$key: $value"
	    }
	}
	if {$isQueryChannel && $state(querylength) == 0} {
	    # Try to determine size of data in channel
	    # If we cannot seek, the surrounding catch will trap us

	    set start [tell $state(-querychannel)]
	    seek $state(-querychannel) 0 end
	    set state(querylength) \
		    [expr {[tell $state(-querychannel)] - $start}]
	    seek $state(-querychannel) $start
	}

	# Flush the request header and set up the fileevent that will
	# either push the POST data or read the response.
	#
	# fileevent note:
	#
	# It is possible to have both the read and write fileevents active
	# at this point.  The only scenario it seems to affect is a server
	# that closes the connection without reading the POST data.
	# (e.g., early versions TclHttpd in various error cases).
	# Depending on the platform, the client may or may not be able to
	# get the response from the server because of the error it will
	# get trying to write the post data.  Having both fileevents active
	# changes the timing and the behavior, but no two platforms
	# (among Solaris, Linux, and NT)  behave the same, and none 
	# behave all that well in any case.  Servers should always read thier
	# POST data if they expect the client to read their response.
		
	if {$isQuery || $isQueryChannel} {
	    puts $s "Content-Type: $state(-type)"
	    if {!$contDone} {
		puts $s "Content-Length: $state(querylength)"
	    }
	    puts $s ""
	    fconfigure $s -translation {auto binary}
	    fileevent $s writable [list http::Write $token]
	} else {
	    puts $s ""
	    flush $s
	    fileevent $s readable [list http::Event $token]
	}

	if {! [info exists state(-command)]} {

	    # geturl does EVERYTHING asynchronously, so if the user
	    # calls it synchronously, we just do a wait here.

	    wait $token
	}
    } err]} {
	# The socket probably was never connected,
	# or the connection dropped later.

	# Clean up after events and such, but DON'T call the command callback
	# (if available) because we're going to throw an exception from here
	# instead.

	Finish $token $err 1
	cleanup $token
	return -code error $err
    }

    return $token
}

# Data access functions:
# Data - the URL data
# Status - the transaction status: ok, reset, eof, timeout
# Code - the HTTP transaction code, e.g., 200
# Size - the size of the URL data

proc http::data {token} {
    variable $token
    upvar 0 $token state
    return $state(body)
}
proc http::status {token} {
    variable $token
    upvar 0 $token state
    return $state(status)
}
proc http::code {token} {
    variable $token
    upvar 0 $token state
    return $state(http)
}
proc http::ncode {token} {
    variable $token
    upvar 0 $token state
    if {[regexp {[0-9]{3}} $state(http) numeric_code]} {
	return $numeric_code
    } else {
	return $state(http)
    }
}
proc http::size {token} {
    variable $token
    upvar 0 $token state
    return $state(currentsize)
}

# http::cleanup
#
#	Garbage collect the state associated with a transaction
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	unsets the state array

proc http::cleanup {token} {
    variable $token
    upvar 0 $token state
    if {[info exist state]} {
	unset state
    }
}

# http::Connect
#
#	This callback is made when an asyncronous connection completes.
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Sets the status of the connection, which unblocks
# 	the waiting geturl call

 proc http::Connect {token} {
    variable $token
    upvar 0 $token state
    global errorInfo errorCode
    if {[eof $state(sock)] ||
	    [string length [fconfigure $state(sock) -error]]} {
	set state(status) error
	set state(error) [list \
		"connect failed [fconfigure $state(sock) -error]" \
		$errorInfo $errorCode]
    } else {
	set state(status) connect
    }
    fileevent $state(sock) writable {}
 }

# http::Write
#
#	Write POST query data to the socket
#
# Arguments
#	token	The token for the connection
#
# Side Effects
#	Write the socket and handle callbacks.

proc http::Write {token} {
    variable $token
    upvar 0 $token state
    set s $state(sock)
    
    # Output a block.  Tcl will buffer this if the socket blocks
    
    set done 0
    if {[catch {
	
	# Catch I/O errors on dead sockets

	if {[info exists state(-query)]} {
	    
	    # Chop up large query strings so queryprogress callback
	    # can give smooth feedback

	    puts -nonewline $s \
		    [string range $state(-query) $state(queryoffset) \
		    [expr {$state(queryoffset) + $state(-queryblocksize) - 1}]]
	    incr state(queryoffset) $state(-queryblocksize)
	    if {$state(queryoffset) >= $state(querylength)} {
		set state(queryoffset) $state(querylength)
		set done 1
	    }
	} else {
	    
	    # Copy blocks from the query channel

	    set outStr [read $state(-querychannel) $state(-queryblocksize)]
	    puts -nonewline $s $outStr
	    incr state(queryoffset) [string length $outStr]
	    if {[eof $state(-querychannel)]} {
		set done 1
	    }
	}
    } err]} {
	# Do not call Finish here, but instead let the read half of
	# the socket process whatever server reply there is to get.

	set state(posterror) $err
	set done 1
    }
    if {$done} {
	catch {flush $s}
	fileevent $s writable {}
	fileevent $s readable [list http::Event $token]
    }

    # Callback to the client after we've completely handled everything

    if {[string length $state(-queryprogress)]} {
	eval $state(-queryprogress) [list $token $state(querylength)\
		$state(queryoffset)]
    }
}

# http::Event
#
#	Handle input on the socket
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Read the socket and handle callbacks.

 proc http::Event {token} {
    variable $token
    upvar 0 $token state
    set s $state(sock)

     if {[eof $s]} {
	Eof $token
	return
    }
    if {[string equal $state(state) "header"]} {
	if {[catch {gets $s line} n]} {
	    Finish $token $n
	} elseif {$n == 0} {
	    set state(state) body
	    if {![regexp -nocase ^text $state(type)]} {
		# Turn off conversions for non-text data
		fconfigure $s -translation binary
		if {[info exists state(-channel)]} {
		    fconfigure $state(-channel) -translation binary
		}
	    }
	    if {[info exists state(-channel)] &&
		    ![info exists state(-handler)]} {
		# Initiate a sequence of background fcopies
		fileevent $s readable {}
		CopyStart $s $token
	    }
	} elseif {$n > 0} {
	    if {[regexp -nocase {^content-type:(.+)$} $line x type]} {
		set state(type) [string trim $type]
	    }
	    if {[regexp -nocase {^content-length:(.+)$} $line x length]} {
		set state(totalsize) [string trim $length]
	    }
	    if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} {
		lappend state(meta) $key [string trim $value]
	    } elseif {[regexp ^HTTP $line]} {
		set state(http) $line
	    }
	}
    } else {
	if {[catch {
	    if {[info exists state(-handler)]} {
		set n [eval $state(-handler) {$s $token}]
	    } else {
		set block [read $s $state(-blocksize)]
		set n [string length $block]
		if {$n >= 0} {
		    append state(body) $block
		}
	    }
	    if {$n >= 0} {
		incr state(currentsize) $n
	    }
	} err]} {
	    Finish $token $err
	} else {
	    if {[info exists state(-progress)]} {
		eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
	    }
	}
    }
}

# http::CopyStart
#
#	Error handling wrapper around fcopy
#
# Arguments
#	s	The socket to copy from
#	token	The token returned from http::geturl
#
# Side Effects
#	This closes the connection upon error

 proc http::CopyStart {s token} {
    variable $token
    upvar 0 $token state
    if {[catch {
	fcopy $s $state(-channel) -size $state(-blocksize) -command \
	    [list http::CopyDone $token]
    } err]} {
	Finish $token $err
    }
}

# http::CopyDone
#
#	fcopy completion callback
#
# Arguments
#	token	The token returned from http::geturl
#	count	The amount transfered
#
# Side Effects
#	Invokes callbacks

 proc http::CopyDone {token count {error {}}} {
    variable $token
    upvar 0 $token state
    set s $state(sock)
    incr state(currentsize) $count
    if {[info exists state(-progress)]} {
	eval $state(-progress) {$token $state(totalsize) $state(currentsize)}
    }
    # At this point the token may have been reset
    if {[string length $error]} {
	Finish $token $error
    } elseif {[catch {eof $s} iseof] || $iseof} {
	Eof $token
    } else {
	CopyStart $s $token
    }
}

# http::Eof
#
#	Handle eof on the socket
#
# Arguments
#	token	The token returned from http::geturl
#
# Side Effects
#	Clean up the socket

 proc http::Eof {token} {
    variable $token
    upvar 0 $token state
    if {[string equal $state(state) "header"]} {
	# Premature eof
	set state(status) eof
    } else {
	set state(status) ok
    }
    set state(state) eof
    Finish $token
}

# http::wait --
#
#	See documentaion for details.
#
# Arguments:
#	token	Connection token.
#
# Results:
#        The status after the wait.

proc http::wait {token} {
    variable $token
    upvar 0 $token state

    if {![info exists state(status)] || [string length $state(status)] == 0} {
	# We must wait on the original variable name, not the upvar alias
	vwait $token\(status)
    }
    if {[info exists state(error)]} {
	set errorlist $state(error)
	unset state
	eval error $errorlist
    }
    return $state(status)
}

# http::formatQuery --
#
#	See documentaion for details.
#	Call http::formatQuery with an even number of arguments, where 
#	the first is a name, the second is a value, the third is another 
#	name, and so on.
#
# Arguments:
#	args	A list of name-value pairs.
#
# Results:
#        TODO

proc http::formatQuery {args} {
    set result ""
    set sep ""
    foreach i $args {
	append result $sep [mapReply $i]
	if {[string compare $sep "="]} {
	    set sep =
	} else {
	    set sep &
	}
    }
    return $result
}

# http::mapReply --
#
#	Do x-www-urlencoded character mapping
#
# Arguments:
#	string	The string the needs to be encoded
#
# Results:
#       The encoded string

 proc http::mapReply {string} {
    variable formMap

    # The spec says: "non-alphanumeric characters are replaced by '%HH'"
    # 1 leave alphanumerics characters alone
    # 2 Convert every other character to an array lookup
    # 3 Escape constructs that are "special" to the tcl parser
    # 4 "subst" the result, doing all the array substitutions

    set alphanumeric	a-zA-Z0-9
    regsub -all \[^$alphanumeric\] $string {$formMap(&)} string
    regsub -all \n $string {\\n} string
    regsub -all \t $string {\\t} string
    regsub -all {[][{})\\]\)} $string {\\&} string
    return [subst $string]
}

# http::ProxyRequired --
#	Default proxy filter. 
#
# Arguments:
#	host	The destination host
#
# Results:
#       The current proxy settings

 proc http::ProxyRequired {host} {
    variable http
    if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} {
	if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} {
	    set http(-proxyport) 8080
	}
	return [list $http(-proxyhost) $http(-proxyport)]
    } else {
	return {}
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted library/http2.3/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded http 2.3 [list tclPkgSetup $dir http 2.3 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister}}}]
<
<
<
<
<
<
<
<
<
<
<






















Changes to library/init.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
# init.tcl --
#
# Default system startup file for Tcl-based applications.  Defines
# "unknown" procedure and auto-load facilities.
#
# RCS: @(#) $Id: init.tcl,v 1.39 2000/02/01 19:26:08 ericm Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.





|







1
2
3
4
5
6
7
8
9
10
11
12
13
# init.tcl --
#
# Default system startup file for Tcl-based applications.  Defines
# "unknown" procedure and auto-load facilities.
#
# RCS: @(#) $Id: init.tcl,v 1.39.2.2 2001/04/03 22:54:38 hobbs Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175

    # If the command word has the form "namespace inscope ns cmd"
    # then concatenate its arguments onto the end and evaluate it.

    set cmd [lindex $args 0]
    if {[regexp "^namespace\[ \t\n\]+inscope" $cmd] && [llength $cmd] == 4} {
        set arglist [lrange $args 1 end]
	set ret [catch {uplevel $cmd $arglist} result]
        if {$ret == 0} {
            return $result
        } else {
	    return -code $ret -errorcode $errorCode $result
        }
    }








|







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175

    # If the command word has the form "namespace inscope ns cmd"
    # then concatenate its arguments onto the end and evaluate it.

    set cmd [lindex $args 0]
    if {[regexp "^namespace\[ \t\n\]+inscope" $cmd] && [llength $cmd] == 4} {
        set arglist [lrange $args 1 end]
	set ret [catch {uplevel 1 ::$cmd $arglist} result]
        if {$ret == 0} {
            return $result
        } else {
	    return -code $ret -errorcode $errorCode $result
        }
    }

184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
	#
	# Make sure we're not trying to load the same proc twice.
	#
	if {[info exists unknown_pending($name)]} {
	    return -code error "self-referential recursion in \"unknown\" for command \"$name\"";
	}
	set unknown_pending($name) pending;
	set ret [catch {auto_load $name [uplevel 1 {namespace current}]} msg]
	unset unknown_pending($name);
	if {$ret != 0} {
	    append errorInfo "\n    (autoloading \"$name\")"
	    return -code $ret -errorcode $errorCode -errorinfo $errorInfo $msg
	}
	if {![array size unknown_pending]} {
	    unset unknown_pending







|







184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
	#
	# Make sure we're not trying to load the same proc twice.
	#
	if {[info exists unknown_pending($name)]} {
	    return -code error "self-referential recursion in \"unknown\" for command \"$name\"";
	}
	set unknown_pending($name) pending;
	set ret [catch {auto_load $name [uplevel 1 {::namespace current}]} msg]
	unset unknown_pending($name);
	if {$ret != 0} {
	    append errorInfo "\n    (autoloading \"$name\")"
	    return -code $ret -errorcode $errorCode -errorinfo $errorInfo $msg
	}
	if {![array size unknown_pending]} {
	    unset unknown_pending
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
	    if {[string compare {} $new]} {
		set errorCode $savedErrorCode
		set errorInfo $savedErrorInfo
		set redir ""
		if {[string equal [info commands console] ""]} {
		    set redir ">&@stdout <@stdin"
		}
		return [uplevel exec $redir $new [lrange $args 1 end]]
	    }
	}
	set errorCode $savedErrorCode
	set errorInfo $savedErrorInfo
	if {[string equal $name "!!"]} {
	    set newcmd [history event]
	} elseif {[regexp {^!(.+)$} $name dummy event]} {
	    set newcmd [history event $event]
	} elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new]} {
	    set newcmd [history event -1]
	    catch {regsub -all -- $old $newcmd $new newcmd}
	}
	if {[info exists newcmd]} {
	    tclLog $newcmd
	    history change $newcmd 0
	    return [uplevel $newcmd]
	}

	set ret [catch {set cmds [info commands $name*]} msg]
	if {[string equal $name "::"]} {
	    set name ""
	}
	if {$ret != 0} {
	    return -code $ret -errorcode $errorCode \
		"error in unknown while checking if \"$name\" is a unique command abbreviation: $msg"
	}
	if {[llength $cmds] == 1} {
	    return [uplevel [lreplace $args 0 0 $cmds]]
	}
	if {[llength $cmds]} {
	    if {[string equal $name ""]} {
		return -code error "empty command name \"\""
	    } else {
		return -code error \
			"ambiguous command name \"$name\": [lsort $cmds]"







|















|











|







224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
	    if {[string compare {} $new]} {
		set errorCode $savedErrorCode
		set errorInfo $savedErrorInfo
		set redir ""
		if {[string equal [info commands console] ""]} {
		    set redir ">&@stdout <@stdin"
		}
		return [uplevel 1 exec $redir $new [lrange $args 1 end]]
	    }
	}
	set errorCode $savedErrorCode
	set errorInfo $savedErrorInfo
	if {[string equal $name "!!"]} {
	    set newcmd [history event]
	} elseif {[regexp {^!(.+)$} $name dummy event]} {
	    set newcmd [history event $event]
	} elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new]} {
	    set newcmd [history event -1]
	    catch {regsub -all -- $old $newcmd $new newcmd}
	}
	if {[info exists newcmd]} {
	    tclLog $newcmd
	    history change $newcmd 0
	    return [uplevel 1 $newcmd]
	}

	set ret [catch {set cmds [info commands $name*]} msg]
	if {[string equal $name "::"]} {
	    set name ""
	}
	if {$ret != 0} {
	    return -code $ret -errorcode $errorCode \
		"error in unknown while checking if \"$name\" is a unique command abbreviation: $msg"
	}
	if {[llength $cmds] == 1} {
	    return [uplevel 1 [lreplace $args 0 0 $cmds]]
	}
	if {[llength $cmds]} {
	    if {[string equal $name ""]} {
		return -code error "empty command name \"\""
	    } else {
		return -code error \
			"ambiguous command name \"$name\": [lsort $cmds]"
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#                       a canonical namespace as returned [namespace current]
#                       for instance. If not given, namespace current is used.

proc auto_load {cmd {namespace {}}} {
    global auto_index auto_oldpath auto_path

    if {[string length $namespace] == 0} {
	set namespace [uplevel {namespace current}]
    }
    set nameList [auto_qualify $cmd $namespace]
    # workaround non canonical auto_index entries that might be around
    # from older auto_mkindex versions
    lappend nameList $cmd
    foreach name $nameList {
	if {[info exists auto_index($name)]} {







|







282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#                       a canonical namespace as returned [namespace current]
#                       for instance. If not given, namespace current is used.

proc auto_load {cmd {namespace {}}} {
    global auto_index auto_oldpath auto_path

    if {[string length $namespace] == 0} {
	set namespace [uplevel 1 [list ::namespace current]]
    }
    set nameList [auto_qualify $cmd $namespace]
    # workaround non canonical auto_index entries that might be around
    # from older auto_mkindex versions
    lappend nameList $cmd
    foreach name $nameList {
	if {[info exists auto_index($name)]} {
451
452
453
454
455
456
457






458
459
460
461
462
463
464
465
# Arguments -
# pattern	The pattern of commands being imported (like "foo::*")
#               a canonical namespace as returned by [namespace current]

proc auto_import {pattern} {
    global auto_index







    set ns [uplevel namespace current]
    set patternList [auto_qualify $pattern $ns]

    auto_load_index

    foreach pattern $patternList {
        foreach name [array names auto_index] {
            if {[string match $pattern $name] && \







>
>
>
>
>
>
|







451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
# Arguments -
# pattern	The pattern of commands being imported (like "foo::*")
#               a canonical namespace as returned by [namespace current]

proc auto_import {pattern} {
    global auto_index

    # If no namespace is specified, this will be an error case

    if {![string match *::* $pattern]} {
	return
    }

    set ns [uplevel 1 [list ::namespace current]]
    set patternList [auto_qualify $pattern $ns]

    auto_load_index

    foreach pattern $patternList {
        foreach name [array names auto_index] {
            if {[string match $pattern $name] && \
499
500
501
502
503
504
505






506
507
508
509
510
511
512
513
514
515
516
517
518
519

    set shellBuiltins [list cls copy date del erase dir echo mkdir \
	    md rename ren rmdir rd time type ver vol]
    if {[string equal $tcl_platform(os) "Windows NT"]} {
	# NT includes the 'start' built-in
	lappend shellBuiltins "start"
    }







    if {[lsearch -exact $shellBuiltins $name] != -1} {
	return [set auto_execs($name) [list $env(COMSPEC) /c $name]]
    }

    if {[llength [file split $name]] != 1} {
	foreach ext {{} .com .exe .bat} {
	    set file ${name}${ext}
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
	return ""
    }







>
>
>
>
>
>






|







505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531

    set shellBuiltins [list cls copy date del erase dir echo mkdir \
	    md rename ren rmdir rd time type ver vol]
    if {[string equal $tcl_platform(os) "Windows NT"]} {
	# NT includes the 'start' built-in
	lappend shellBuiltins "start"
    }
    if {[info exists env(PATHEXT)]} {
	# Add an initial ; to have the {} extension check first.
	set execExtensions [split ";$env(PATHEXT)" ";"]
    } else {
	set execExtensions [list {} .com .exe .bat]
    }

    if {[lsearch -exact $shellBuiltins $name] != -1} {
	return [set auto_execs($name) [list $env(COMSPEC) /c $name]]
    }

    if {[llength [file split $name]] != 1} {
	foreach ext $execExtensions {
	    set file ${name}${ext}
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
	return ""
    }
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
	}
    }

    foreach dir [split $path {;}] {
	# Skip already checked directories
	if {[info exists checked($dir)] || [string equal {} $dir]} { continue }
	set checked($dir) {}
	foreach ext {{} .com .exe .bat} {
	    set file [file join $dir ${name}${ext}]
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
    }
    return ""







|







547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
	}
    }

    foreach dir [split $path {;}] {
	# Skip already checked directories
	if {[info exists checked($dir)] || [string equal {} $dir]} { continue }
	set checked($dir) {}
	foreach ext $execExtensions {
	    set file [file join $dir ${name}${ext}]
	    if {[file exists $file] && ![file isdirectory $file]} {
		return [set auto_execs($name) [list $file]]
	    }
	}
    }
    return ""
Changes to library/msgcat/msgcat.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# msgcat.tcl --
#
#	This file defines various procedures which implement a
#	message catalog facility for Tcl programs.  It should be
#	loaded with the command "package require msgcat".
#
# Copyright (c) 1998 by Scriptics Corporation.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: msgcat.tcl,v 1.4 2000/04/11 21:16:18 ericm Exp $

package provide msgcat 1.0

namespace eval msgcat {
    namespace export mc mcset mclocale mcpreferences mcunknown

    # Records the current locale as passed to mclocale
    variable locale ""













|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# msgcat.tcl --
#
#	This file defines various procedures which implement a
#	message catalog facility for Tcl programs.  It should be
#	loaded with the command "package require msgcat".
#
# Copyright (c) 1998 by Scriptics Corporation.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: msgcat.tcl,v 1.4.2.3 2000/08/08 17:53:42 hobbs Exp $

package provide msgcat 1.1

namespace eval msgcat {
    namespace export mc mcset mclocale mcpreferences mcunknown

    # Records the current locale as passed to mclocale
    variable locale ""

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
		}
	    }
	}
	set ns [namespace parent $ns]
    }
    # we have not found the translation
    return [uplevel 1 [list [namespace origin mcunknown] \
	    $::msgcat::locale $src]]
}

# msgcat::mclocale --
#
#	Query or set the current locale.
#
# Arguments:







|







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
		}
	    }
	}
	set ns [namespace parent $ns]
    }
    # we have not found the translation
    return [uplevel 1 [list [namespace origin mcunknown] \
	    $::msgcat::locale $src] $args]
}

# msgcat::mclocale --
#
#	Query or set the current locale.
#
# Arguments:
166
167
168
169
170
171
172


173
174
175
176

177
178
179
180
181



182

183
184
185
186
187
188
189
190
191
192
193
194

# msgcat::mcunknown --
#
#	This routine is called by msgcat::mc if a translation cannot
#	be found for a string.  This routine is intended to be replaced
#	by an application specific routine for error reporting
#	purposes.  The default behavior is to return the source string.  


#
# Arguments:
#	locale		The current locale.
#	src		The string to be translated.

#
# Results:
#	Returns the translated value.

proc msgcat::mcunknown {locale src} {



    return $src

}

# Initialize the default locale

namespace eval msgcat {
    # set default locale, try to get from environment
    if {[info exists ::env(LANG)]} {
        mclocale $::env(LANG)
    } else {
        mclocale "C"
    }
}







>
>




>




|
>
>
>
|
>












166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201

# msgcat::mcunknown --
#
#	This routine is called by msgcat::mc if a translation cannot
#	be found for a string.  This routine is intended to be replaced
#	by an application specific routine for error reporting
#	purposes.  The default behavior is to return the source string.  
#	If additional args are specified, the format command will be used
#	to work them into the traslated string.
#
# Arguments:
#	locale		The current locale.
#	src		The string to be translated.
#	args		Args to pass to the format command
#
# Results:
#	Returns the translated value.

proc msgcat::mcunknown {locale src args} {
    if {[llength $args]} {
	return [eval [list format $src] $args]
    } else {
	return $src
    }
}

# Initialize the default locale

namespace eval msgcat {
    # set default locale, try to get from environment
    if {[info exists ::env(LANG)]} {
        mclocale $::env(LANG)
    } else {
        mclocale "C"
    }
}
Changes to library/msgcat/pkgIndex.tcl.
1
package ifneeded msgcat 1.0 [list source [file join $dir msgcat.tcl]]
|
1
package ifneeded msgcat 1.1 [list source [file join $dir msgcat.tcl]]
Deleted library/msgcat1.0/msgcat.tcl.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# msgcat.tcl --
#
#	This file defines various procedures which implement a
#	message catalog facility for Tcl programs.  It should be
#	loaded with the command "package require msgcat".
#
# Copyright (c) 1998 by Scriptics Corporation.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: msgcat.tcl,v 1.4 2000/04/11 21:16:18 ericm Exp $

package provide msgcat 1.0

namespace eval msgcat {
    namespace export mc mcset mclocale mcpreferences mcunknown

    # Records the current locale as passed to mclocale
    variable locale ""

    # Records the list of locales to search
    variable loclist {}

    # Records the mapping between source strings and translated strings.  The
    # array key is of the form "<locale>,<namespace>,<src>" and the value is
    # the translated string.
    array set msgs {}
}

# msgcat::mc --
#
#	Find the translation for the given string based on the current
#	locale setting. Check the local namespace first, then look in each
#	parent namespace until the source is found.  If additional args are
#	specified, use the format command to work them into the traslated
#	string.
#
# Arguments:
#	src	The string to translate.
#	args	Args to pass to the format command
#
# Results:
#	Returns the translatd string.  Propagates errors thrown by the 
#	format command.

proc msgcat::mc {src args} {
    # Check for the src in each namespace starting from the local and
    # ending in the global.

    set ns [uplevel {namespace current}]
    
    while {$ns != ""} {
	foreach loc $::msgcat::loclist {
	    if {[info exists ::msgcat::msgs($loc,$ns,$src)]} {
		if {[llength $args] == 0} {
		    return $::msgcat::msgs($loc,$ns,$src)
		} else {
		    return [eval \
			    [list format $::msgcat::msgs($loc,$ns,$src)] \
			    $args]
		}
	    }
	}
	set ns [namespace parent $ns]
    }
    # we have not found the translation
    return [uplevel 1 [list [namespace origin mcunknown] \
	    $::msgcat::locale $src]]
}

# msgcat::mclocale --
#
#	Query or set the current locale.
#
# Arguments:
#	newLocale	(Optional) The new locale string. Locale strings
#			should be composed of one or more sublocale parts
#			separated by underscores (e.g. en_US).
#
# Results:
#	Returns the current locale.

proc msgcat::mclocale {args} {
    set len [llength $args]

    if {$len > 1} {
	error {wrong # args: should be "mclocale ?newLocale?"}
    }

    set args [string tolower $args]
    if {$len == 1} {
	set ::msgcat::locale $args
	set ::msgcat::loclist {}
	set word ""
	foreach part [split $args _] {
	    set word [string trimleft "${word}_${part}" _]
	    set ::msgcat::loclist [linsert $::msgcat::loclist 0 $word]
	}
    }
    return $::msgcat::locale
}

# msgcat::mcpreferences --
#
#	Fetch the list of locales used to look up strings, ordered from
#	most preferred to least preferred.
#
# Arguments:
#	None.
#
# Results:
#	Returns an ordered list of the locales preferred by the user.

proc msgcat::mcpreferences {} {
    return $::msgcat::loclist
}

# msgcat::mcload --
#
#	Attempt to load message catalogs for each locale in the
#	preference list from the specified directory.
#
# Arguments:
#	langdir		The directory to search.
#
# Results:
#	Returns the number of message catalogs that were loaded.

proc msgcat::mcload {langdir} {
    set x 0
    foreach p [::msgcat::mcpreferences] {
	set langfile [file join $langdir $p.msg]
	if {[file exists $langfile]} {
	    incr x
	    uplevel [list source $langfile]
	}
    }
    return $x
}

# msgcat::mcset --
#
#	Set the translation for a given string in a specified locale.
#
# Arguments:
#	locale		The locale to use.
#	src		The source string.
#	dest		(Optional) The translated string.  If omitted,
#			the source string is used.
#
# Results:
#	Returns the new locale.

proc msgcat::mcset {locale src {dest ""}} {
    if {[string equal $dest ""]} {
	set dest $src
    }

    set ns [uplevel {namespace current}]

    set ::msgcat::msgs([string tolower $locale],$ns,$src) $dest
    return $dest
}

# msgcat::mcunknown --
#
#	This routine is called by msgcat::mc if a translation cannot
#	be found for a string.  This routine is intended to be replaced
#	by an application specific routine for error reporting
#	purposes.  The default behavior is to return the source string.  
#
# Arguments:
#	locale		The current locale.
#	src		The string to be translated.
#
# Results:
#	Returns the translated value.

proc msgcat::mcunknown {locale src} {
    return $src
}

# Initialize the default locale

namespace eval msgcat {
    # set default locale, try to get from environment
    if {[info exists ::env(LANG)]} {
        mclocale $::env(LANG)
    } else {
        mclocale "C"
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































Deleted library/msgcat1.0/pkgIndex.tcl.
1
package ifneeded msgcat 1.0 [list source [file join $dir msgcat.tcl]]
<


Changes to library/opt/optparse.tcl.
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
26
27
28
# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2 1999/04/16 00:47:18 stanton Exp $

package provide opt 0.4.1

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr Lfirst Lrest \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {











|

|







|







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
26
27
28
# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2.12.2 2001/04/03 22:54:38 hobbs Exp $

package provide opt 0.4.2

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {

105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [Lfirst $program] >= 2
# while
#   llength [Lfirst $singleStep] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"







|

|







105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [lindex $program 0] >= 2
# while
#   llength [lindex $singleStep 0] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [Lfirst $res];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of







|







170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [lindex $res 0];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# Parse entry point for ppl who don't want to register with a key,
# for instance because the description changes dynamically.
#  (otherwise one should really use OptKeyRegister once + OptKeyParse
#   as it is way faster or simply OptProc which does it all)
# Assign a temporary key, call OptKeyParse and then free the storage
proc ::tcl::OptParse {desc arglist} {
    set tempkey [OptKeyRegister $desc];
    set ret [catch {uplevel [list ::tcl::OptKeyParse $tempkey $arglist]} res];
    OptKeyDelete $tempkey;
    return -code $ret $res;
}

# Helper function, replacement for proc that both
# register the description under a key which is the name of the proc
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel namespace current];
    if {   ([string match $name "::*"]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }
    OptKeyRegister $desc $key;
    uplevel [list proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"];
    return $key;
}
# Check that a argument has been given
# assumes that "OptProc" has been used as it will check in "Args" list
proc ::tcl::OptProcArgGiven {argname} {
    upvar Args alist;
    expr {[lsearch $alist $argname] >=0}
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	Lfirst $lst;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[Lfirst $item]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [Lfirst $lst] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {
        uplevel [list Lvarincr $descName {0 1}];
    }

    # Get the current description, eventually descend
    proc OptCurDesc {descriptions} {
        lindex $descriptions [OptGetPrgCounter $descriptions];
    }
    # get the current description, eventually descend







|












|
|








|














|







|













|







|







235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# Parse entry point for ppl who don't want to register with a key,
# for instance because the description changes dynamically.
#  (otherwise one should really use OptKeyRegister once + OptKeyParse
#   as it is way faster or simply OptProc which does it all)
# Assign a temporary key, call OptKeyParse and then free the storage
proc ::tcl::OptParse {desc arglist} {
    set tempkey [OptKeyRegister $desc];
    set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res];
    OptKeyDelete $tempkey;
    return -code $ret $res;
}

# Helper function, replacement for proc that both
# register the description under a key which is the name of the proc
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel 1 [list ::namespace current]];
    if {   ([string match "::*" $name]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }
    OptKeyRegister $desc $key;
    uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"];
    return $key;
}
# Check that a argument has been given
# assumes that "OptProc" has been used as it will check in "Args" list
proc ::tcl::OptProcArgGiven {argname} {
    upvar Args alist;
    expr {[lsearch $alist $argname] >=0}
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	lindex $lst 0;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[lindex $item 0]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [lindex $lst 0] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {
        uplevel 1 [list Lvarincr $descName {0 1}];
    }

    # Get the current description, eventually descend
    proc OptCurDesc {descriptions} {
        lindex $descriptions [OptGetPrgCounter $descriptions];
    }
    # get the current description, eventually descend
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        Lfirst $item
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        Lfirst $lst;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel [list Lvarpop1 $argsName];
    }
    #######












|












|



|







344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        lindex $item 0
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        lindex $lst 0;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel 1 [list Lvarpop1 $argsName];
    }
    #######





958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [Lfirst $indexLst]] [Lrest $indexLst];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [Lrest $indexLst] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}







|














|





|







958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [lrange $indexLst 1 end] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [Lrest $indexLst] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}
# Returns the first element of a list
proc ::tcl::Lfirst {list} {
    lindex $list 0
}
# Returns the rest of the list minus first element
proc ::tcl::Lrest {list} {
    lrange $list 1 end
}
# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [Lfirst $list];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;
    set lg [llength $list];
    foreach vname $args {
        if {$i>=$lg} break
        uplevel [list set $vname [lindex $list $i]];
        incr i;
    }
    return $lg;
}

# Misc utilities








|




|











<
<
<
<
<
<
<
<










|










|







1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036








1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [lrange $indexLst 1 end] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}








# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [lindex $list 0];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;
    set lg [llength $list];
    foreach vname $args {
        if {$i>=$lg} break
        uplevel 1 [list ::set $vname [lindex $list $i]];
        incr i;
    }
    return $lg;
}

# Misc utilities

Changes to library/opt/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex -direct" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded opt 0.4.1 [list source [file join $dir optparse.tcl]]










|
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex -direct" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded opt 0.4.2 [list source [file join $dir optparse.tcl]]
Changes to library/opt0.4/optparse.tcl.
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
26
27
28
# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2 1999/04/16 00:47:18 stanton Exp $

package provide opt 0.4.1

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr Lfirst Lrest \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {











|









|







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
26
27
28
# optparse.tcl --
#
#       (private) Option parsing package
#       Primarily used internally by the safe:: code.
#
#	WARNING: This code will go away in a future release
#	of Tcl.  It is NOT supported and you should not rely
#	on it.  If your code does rely on this package you
#	may directly incorporate this code into your application.
#
# RCS: @(#) $Id: optparse.tcl,v 1.2.12.1 2000/08/07 21:32:11 hobbs Exp $

package provide opt 0.4.1

namespace eval ::tcl {

    # Exported APIs
    namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \
             OptProc OptProcArgGiven OptParse \
	     Lempty Lget \
             Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \
             SetMax SetMin


#################  Example of use / 'user documentation'  ###################

    proc OptCreateTestProc {} {

105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [Lfirst $program] >= 2
# while
#   llength [Lfirst $singleStep] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"







|

|







105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#    programCounter :== {"P" integer+ }
#
#    singleStep     :== { instruction parameters* }
#
#    instruction    :== single element list
#
# (the difference between singleStep and program is that \
#   llength [lindex $program 0] >= 2
# while
#   llength [lindex $singleStep 0] == 1
# )
#
# And for this application:
#
#    singleStep     :== { instruction varname {hasBeenSet currentValue} type 
#                         typeArgs help }
#    instruction    :== "flags" | "value"
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [Lfirst $res];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of







|







170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

    foreach item $desc {
	if {$state == "args"} {
	    # more items after 'args'...
	    return -code error "'args' special argument must be the last one";
	}
        set res [OptNormalizeOne $item];
        set state [lindex $res 0];
        if {$inflags} {
            if {$state == "flags"} {
		# add to 'subprogram'
                lappend flagsprg $res;
            } else {
                # put in the flags
                # structure for flag programs items is a list of
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel namespace current];
    if {   ([string match $name "::*"]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }







|







249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# (and thus unique to that code)
# and add a first line to the code to call the OptKeyParse proc
# Stores the list of variables that have been actually given by the user
# (the other will be sets to their default value)
# into local variable named "Args".
proc ::tcl::OptProc {name desc body} {
    set namespace [uplevel namespace current];
    if {   ([string match "::*" $name]) 
        || ([string compare $namespace "::"]==0)} {
        # absolute name or global namespace, name is the key
        set key $name;
    } else {
        # we are relative to some non top level namespace:
        set key "${namespace}::${name}";
    }
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	Lfirst $lst;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[Lfirst $item]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [Lfirst $lst] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {







|







|













|







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
}

    #######
    # Programs/Descriptions manipulation

    # Return the instruction word/list of a given step/(sub)program
    proc OptInstr {lst} {
	lindex $lst 0;
    }
    # Is a (sub) program or a plain instruction ?
    proc OptIsPrg {lst} {
	expr {[llength [OptInstr $lst]]>=2}
    }
    # Is this instruction a program counter or a real instr
    proc OptIsCounter {item} {
	expr {[lindex $item 0]=="P"}
    }
    # Current program counter (2nd word of first word)
    proc OptGetPrgCounter {lst} {
	Lget $lst {0 1}
    }
    # Current program counter (2nd word of first word)
    proc OptSetPrgCounter {lstName newValue} {
	upvar $lstName lst;
	set lst [lreplace $lst 0 0 [concat "P" $newValue]];
    }
    # returns a list of currently selected items.
    proc OptSelection {lst} {
	set res {};
	foreach idx [lrange [lindex $lst 0] 1 end] {
	    lappend res [Lget $lst $idx];
	}
	return $res;
    }

    # Advance to next description
    proc OptNextDesc {descName} {
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        Lfirst $item
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        Lfirst $lst;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel [list Lvarpop1 $argsName];
    }
    #######








|












|







344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
	lappend adress 2
	Lvarset descriptions $adress [list 1 $value];
	#                                  ^hasBeenSet flag
    }

    # empty state means done/paste the end of the program
    proc OptState {item} {
        lindex $item 0
    }
    
    # current state
    proc OptCurState {descriptions} {
        OptState [OptCurDesc $descriptions];
    }

    #######
    # Arguments manipulation

    # Returns the argument that has to be processed now
    proc OptCurrentArg {lst} {
        lindex $lst 0;
    }
    # Advance to next argument
    proc OptNextArg {argsName} {
        uplevel [list Lvarpop1 $argsName];
    }
    #######

958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [Lfirst $indexLst]] [Lrest $indexLst];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [Lrest $indexLst] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}







|














|





|







958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
}

# Gets the value of one leaf of a lists tree
proc ::tcl::Lget {list indexLst} {
    if {[llength $indexLst] <= 1} {
        return [lindex $list $indexLst];
    }
    Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end];
}
# Sets the value of one leaf of a lists tree
# (we use the version that does not create the elements because
#  it would be even slower... needs to be written in C !)
# (nb: there is a non trivial recursive problem with indexes 0,
#  which appear because there is no difference between a list
#  of 1 element and 1 element alone : [list "a"] == "a" while 
#  it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1
#  and [listp "a b"] maybe 0. listp does not exist either...)
proc ::tcl::Lvarset {listName indexLst newValue} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarset1nc list $indexLst $newValue;
    } else {
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList (not really usefull now,
	# could be with optimizing compiler)
#        Lvarset1 list $idx {};
        # recursively replace in targetList
        Lvarset targetList [lrange $indexLst 1 end] $newValue;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Set one cell to a value, eventually create all the needed elements
# (on level-1 of lists)
variable emptyList {}
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [Lfirst $indexLst];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [Lrest $indexLst] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}
# Returns the first element of a list
proc ::tcl::Lfirst {list} {
    lindex $list 0
}
# Returns the rest of the list minus first element
proc ::tcl::Lrest {list} {
    lrange $list 1 end
}
# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [Lfirst $list];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;







|




|











<
<
<
<
<
<
<
<










|







1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036








1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
# Increments the value of one leaf of a lists tree
# (which must exists)
proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} {
    upvar $listName list;
    if {[llength $indexLst] <= 1} {
        Lvarincr1 list $indexLst $howMuch;
    } else {
        set idx [lindex $indexLst 0];
        set targetList [lindex $list $idx];
        # reduce refcount on targetList
        Lvarset1nc list $idx {};
        # recursively replace in targetList
        Lvarincr targetList [lrange $indexLst 1 end] $howMuch;
        # put updated sub list back in the tree
        Lvarset1nc list $idx $targetList;
    }
}
# Increments the value of one cell of a list
proc ::tcl::Lvarincr1 {listName index {howMuch 1}} {
    upvar $listName list;
    set newValue [expr {[lindex $list $index]+$howMuch}];
    set list [lreplace $list $index $index $newValue];
    return $newValue;
}








# Removes the first element of a list
# and returns the new list value
proc ::tcl::Lvarpop1 {listName} {
    upvar $listName list;
    set list [lrange $list 1 end];
}
# Same but returns the removed element
# (Like the tclX version)
proc ::tcl::Lvarpop {listName} {
    upvar $listName list;
    set el [lindex $list 0];
    set list [lrange $list 1 end];
    return $el;
}
# Assign list elements to variables and return the length of the list
proc ::tcl::Lassign {list args} {
    # faster than direct blown foreach (which does not byte compile)
    set i 0;
Changes to library/package.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
# package.tcl --
#
# utility procs formerly in init.tcl which can be loaded on demand
# for package management.
#
# RCS: @(#) $Id: package.tcl,v 1.14 2000/04/23 03:36:51 jingham Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1998 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#





|







1
2
3
4
5
6
7
8
9
10
11
12
13
# package.tcl --
#
# utility procs formerly in init.tcl which can be loaded on demand
# for package management.
#
# RCS: @(#) $Id: package.tcl,v 1.14.2.1 2001/04/03 22:54:38 hobbs Exp $
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1998 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
29
30
31
32
33
34
35
36
37
38
39
40
41




42















43
44
45
46
47
48
49
#		Defaults to [info sharedlibextension]
#
# Results:
#  Returns 1 if the extension matches, 0 otherwise

proc pkg_compareExtension { fileName {ext {}} } {
    global tcl_platform
    if {[string length $ext] == 0} {
	set ext [info sharedlibextension]
    }
    if {[string equal $tcl_platform(platform) "windows"]} {
	return [string equal -nocase [file extension $fileName] $ext]
    } else {




	return [string equal [file extension $fileName] $ext]















    }
}

# pkg_mkIndex --
# This procedure creates a package index in a given directory.  The
# package index consists of a "pkgIndex.tcl" file whose contents are
# a Tcl script that sets up package information with "package require"







<
|
<

|

>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







29
30
31
32
33
34
35

36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#		Defaults to [info sharedlibextension]
#
# Results:
#  Returns 1 if the extension matches, 0 otherwise

proc pkg_compareExtension { fileName {ext {}} } {
    global tcl_platform

    if {![string length $ext]} {set ext [info sharedlibextension]}

    if {[string equal $tcl_platform(platform) "windows"]} {
        return [string equal -nocase [file extension $fileName] $ext]
    } else {
        # Some unices add trailing numbers after the .so, so
        # we could have something like '.so.1.2'.
        set root $fileName
        while {1} {
            set currExt [file extension $root]
            if {[string equal $currExt $ext]} {
                return 1
            } 

	    # The current extension does not match; if it is not a numeric
	    # value, quit, as we are only looking to ignore version number
	    # extensions.  Otherwise we might return 1 in this case:
	    #		pkg_compareExtension foo.so.bar .so
	    # which should not match.

	    if { ![string is integer -strict [string range $currExt 1 end]] } {
		return 0
	    }
            set root [file rootname $root]
	}
    }
}

# pkg_mkIndex --
# This procedure creates a package index in a given directory.  The
# package index consists of a "pkgIndex.tcl" file whose contents are
# a Tcl script that sets up package information with "package require"
144
145
146
147
148
149
150










151
152
153
154



155
156
157
158
159
160
161

	cd $oldDir
	set c [interp create]

	# Load into the child any packages currently loaded in the parent
	# interpreter that match the -load pattern.











	foreach pkg [info loaded] {
	    if {! [string match $loadPat [lindex $pkg 1]]} {
		continue
	    }



	    if {[catch {
		load [lindex $pkg 0] [lindex $pkg 1] $c
	    } err]} {
		if {$doVerbose} {
		    tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err"
		}
	    } elseif {$doVerbose} {







>
>
>
>
>
>
>
>
>
>




>
>
>







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

	cd $oldDir
	set c [interp create]

	# Load into the child any packages currently loaded in the parent
	# interpreter that match the -load pattern.

	if {[string length $loadPat]} {
	    if {$doVerbose} {
		tclLog "currently loaded packages: '[info loaded]'"
		tclLog "trying to load all packages matching $loadPat"
	    }
	    if {![llength [info loaded]]} {
		tclLog "warning: no packages are currently loaded, nothing"
		tclLog "can possibly match '$loadPat'"
	    }
	}
	foreach pkg [info loaded] {
	    if {! [string match $loadPat [lindex $pkg 1]]} {
		continue
	    }
	    if {$doVerbose} {
		tclLog "package [lindex $pkg 1] matches '$loadPat'"
	    }
	    if {[catch {
		load [lindex $pkg 0] [lindex $pkg 1] $c
	    } err]} {
		if {$doVerbose} {
		    tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err"
		}
	    } elseif {$doVerbose} {
324
325
326
327
328
329
330




331
332
333




334
335
336
337
338
339
340
	    }
	} msg] == 1} {
	    set what [$c eval set ::tcl::debug]
	    if {$doVerbose} {
		tclLog "warning: error while $what $file: $msg"
	    }
	} else {




	    set type [$c eval set ::tcl::type]
	    set cmds [lsort [$c eval array names ::tcl::newCmds]]
	    set pkgs [$c eval set ::tcl::newPkgs]




	    if {[llength $pkgs] > 1} {
		tclLog "warning: \"$file\" provides more than one package ($pkgs)"
	    }
	    foreach pkg $pkgs {
		# cmds is empty/not used in the direct case
		lappend files($pkg) [list $file $type $cmds]
	    }







>
>
>
>



>
>
>
>







354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
	    }
	} msg] == 1} {
	    set what [$c eval set ::tcl::debug]
	    if {$doVerbose} {
		tclLog "warning: error while $what $file: $msg"
	    }
	} else {
	    set what [$c eval set ::tcl::debug]
	    if {$doVerbose} {
		tclLog "successful $what of $file"
	    }
	    set type [$c eval set ::tcl::type]
	    set cmds [lsort [$c eval array names ::tcl::newCmds]]
	    set pkgs [$c eval set ::tcl::newPkgs]
	    if {$doVerbose} {
		tclLog "commands provided were $cmds"
		tclLog "packages provided were $pkgs"
	    }
	    if {[llength $pkgs] > 1} {
		tclLog "warning: \"$file\" provides more than one package ($pkgs)"
	    }
	    foreach pkg $pkgs {
		# cmds is empty/not used in the direct case
		lappend files($pkg) [list $file $type $cmds]
	    }
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430

# tclMacPkgSearch --
# The procedure is used on the Macintosh to search a given directory for files
# with a TEXT resource named "pkgIndex".  If it exists it is sourced in to the
# interpreter to setup the package database.

proc tclMacPkgSearch {dir} {
    foreach x [glob -nocomplain [file join $dir *.shlb]] {
	if {[file isfile $x]} {
	    set res [resource open $x]
	    foreach y [resource list TEXT $res] {
		if {[string equal $y "pkgIndex"]} {source -rsrc pkgIndex}
	    }
	    catch {resource close $res}
	}







|







454
455
456
457
458
459
460
461
462
463
464
465
466
467
468

# tclMacPkgSearch --
# The procedure is used on the Macintosh to search a given directory for files
# with a TEXT resource named "pkgIndex".  If it exists it is sourced in to the
# interpreter to setup the package database.

proc tclMacPkgSearch {dir} {
    foreach x [glob -directory $dir -nocomplain *.shlb] {
	if {[file isfile $x]} {
	    set res [resource open $x]
	    foreach y [resource list TEXT $res] {
		if {[string equal $y "pkgIndex"]} {source -rsrc pkgIndex}
	    }
	    catch {resource close $res}
	}
456
457
458
459
460
461
462

463
464
465
466
467
468
469
470
    set old_path [set use_path $auto_path]
    while {[llength $use_path]} {
	set dir [lindex $use_path end]
	# we can't use glob in safe interps, so enclose the following
	# in a catch statement, where we get the pkgIndex files out
	# of the subdirectories
	catch {

	    foreach file [glob -nocomplain [file join $dir * pkgIndex.tcl]] {
		set dir [file dirname $file]
		if {[file readable $file] && ![info exists procdDirs($dir)]} {
		    if {[catch {source $file} msg]} {
			tclLog "error reading package index file $file: $msg"
		    } else {
			set procdDirs($dir) 1
		    }







>
|







494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
    set old_path [set use_path $auto_path]
    while {[llength $use_path]} {
	set dir [lindex $use_path end]
	# we can't use glob in safe interps, so enclose the following
	# in a catch statement, where we get the pkgIndex files out
	# of the subdirectories
	catch {
	    foreach file [glob -directory $dir -join -nocomplain \
		    * pkgIndex.tcl] {
		set dir [file dirname $file]
		if {[file readable $file] && ![info exists procdDirs($dir)]} {
		    if {[catch {source $file} msg]} {
			tclLog "error reading package index file $file: $msg"
		    } else {
			set procdDirs($dir) 1
		    }
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
	if {(![interp issafe]) && \
		[string equal $tcl_platform(platform) "macintosh"]} {
	    set dir [lindex $use_path end]
	    if {![info exists procdDirs($dir)]} {
		tclMacPkgSearch $dir
		set procdDirs($dir) 1
	    }
	    foreach x [glob -nocomplain [file join $dir *]] {
		if {[file isdirectory $x] && ![info exists procdDirs($x)]} {
		    set dir $x
		    tclMacPkgSearch $dir
		    set procdDirs($dir) 1
		}
	    }
	}







|







527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
	if {(![interp issafe]) && \
		[string equal $tcl_platform(platform) "macintosh"]} {
	    set dir [lindex $use_path end]
	    if {![info exists procdDirs($dir)]} {
		tclMacPkgSearch $dir
		set procdDirs($dir) 1
	    }
	    foreach x [glob -directory $dir -nocomplain *] {
		if {[file isdirectory $x] && ![info exists procdDirs($x)]} {
		    set dir $x
		    tclMacPkgSearch $dir
		    set procdDirs($dir) 1
		}
	    }
	}
Changes to library/safe.tcl.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# See the safe.n man page for details.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: safe.tcl,v 1.6 1999/08/19 02:59:40 hobbs Exp $

#
# The implementation is based on namespaces. These naming conventions
# are followed:
# Private procs starts with uppercase.
# Public  procs are exported and starts with lowercase
#







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# See the safe.n man page for details.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: safe.tcl,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $

#
# The implementation is based on namespaces. These naming conventions
# are followed:
# Private procs starts with uppercase.
# Public  procs are exported and starts with lowercase
#
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
	foreach dir $pathList {
	    if {[file isdirectory $dir]} {
		# check that we don't have it yet as a children
		# of a previous dir
		if {[lsearch -exact $res $dir]<0} {
		    lappend res $dir
		}
		foreach sub [glob -nocomplain -- [file join $dir *]] {
		    if {([file isdirectory $sub]) \
			    && ([lsearch -exact $res $sub]<0) } {
			# new sub dir, add it !
	                lappend res $sub
	            }
		}
	    }







|







492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
	foreach dir $pathList {
	    if {[file isdirectory $dir]} {
		# check that we don't have it yet as a children
		# of a previous dir
		if {[lsearch -exact $res $dir]<0} {
		    lappend res $dir
		}
		foreach sub [glob -directory $dir -nocomplain *] {
		    if {([file isdirectory $sub]) \
			    && ([lsearch -exact $res $sub]<0) } {
			# new sub dir, add it !
	                lappend res $sub
	            }
		}
	    }
Changes to mac/MW_TclAppleScriptHeader.pch.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclAppleScriptHeader.pch,v 1.4 1999/05/11 07:11:46 jingham Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */

#if __POWERPC__
#pragma precompile_target "MW_TclAppleScriptHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclAppleScriptHeaderCFM68K"
#else
#pragma precompile_target "MW_TclAppleScriptHeader68K"
#endif

#include "tclMacCommonPch.h"

/* #define TCL_REGISTER_LIBRARY 1 */
#define USE_TCL_STUBS

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#pragma export off








|




















<

<
<
<
<
<
<
<
<
<
<
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

36










 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclAppleScriptHeader.pch,v 1.4.12.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */

#if __POWERPC__
#pragma precompile_target "MW_TclAppleScriptHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclAppleScriptHeaderCFM68K"
#else
#pragma precompile_target "MW_TclAppleScriptHeader68K"
#endif

#include "tclMacCommonPch.h"


#define USE_TCL_STUBS










Added mac/MW_TclBuildLibHeader.h.














>
>
>
>
>
>
>
1
2
3
4
5
6
7
#if __POWERPC__
#include "MW_TclBuildLibHeaderPPC"
#elif __CFM68K__
#include "MW_TclBuildLibHeaderCFM68K"
#else
#include "MW_TclBuildLibHeader68K"
#endif
Added mac/MW_TclBuildLibHeader.pch.






































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
/*
 * MW_TclBuildLibHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclBuildLibHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclBuildLibHeaderCFM68K"
#else
#pragma precompile_target "MW_TclBuildLibHeader68K"
#endif

#define BUILD_tcl 1

#include "MW_TclHeaderCommon.h"
Changes to mac/MW_TclHeader.pch.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclHeader.pch,v 1.7 1999/05/11 07:11:48 jingham Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclHeaderCFM68K"
#else
#pragma precompile_target "MW_TclHeader68K"
#endif

#include "tclMacCommonPch.h"

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#include "tcl.h"
#include "tclMac.h"
#include "tclInt.h"
#include "MoreFiles.h"
#include "MoreFilesExtras.h"

#pragma export reset








|

















<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32









33







 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclHeader.pch,v 1.7.12.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclHeaderCFM68K"
#else
#pragma precompile_target "MW_TclHeader68K"
#endif










#include "MW_TclHeaderCommon.h"







Added mac/MW_TclHeaderCommon.h.












































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * MW_TclHeaderCommon.h --
 *
 * 	Common includes for precompiled headers
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

#pragma once

#include "tclMacCommonPch.h"

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.
 */

#include "tcl.h"

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif
#include "tclMac.h"
#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLIMPORT

#include "tclInt.h"


#if PRAGMA_IMPORT
#pragma import on
#endif

#include <MoreFiles.h>
#include <MoreFilesExtras.h>
#include <FSpCompat.h>
#include <FileCopy.h>
#include <FullPath.h>
#include <IterateDirectory.h>
#include <MoreDesktopMgr.h>
#include <DirectoryCopy.h>
#include <Search.h>

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif
Added mac/MW_TclStaticHeader.h.














>
>
>
>
>
>
>
1
2
3
4
5
6
7
#if __POWERPC__
#include "MW_TclStaticHeaderPPC"
#elif __CFM68K__
#include "MW_TclStaticHeaderCFM68K"
#else
#include "MW_TclStaticHeader68K"
#endif
Added mac/MW_TclStaticHeader.pch.






































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
/*
 * MW_TclStaticHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id$
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclStaticHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclStaticHeaderCFM68K"
#else
#pragma precompile_target "MW_TclStaticHeader68K"
#endif

#define STATIC_BUILD 1

#include "MW_TclHeaderCommon.h"
Changes to mac/MW_TclTestHeader.pch.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * MW_TclHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclTestHeader.pch,v 1.1 2000/02/10 08:39:11 jingham Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclTestHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclTestHeaderCFM68K"
#else
#pragma precompile_target "MW_TclTestHeader68K"
#endif

#define TCL_DEBUG 1

/*#define TCL_THREADS 1*/

#include "tclMacCommonPch.h"

/*
 * Place any includes below that will are needed by the majority of the
 * and is OK to be in any file in the system.  The pragma's are used
 * to control what functions are exported in the Tcl shared library.
 */

#pragma export on
#include "tcl.h"
#include "tclMac.h"
#include "tclInt.h"
#include "MoreFiles.h"
#include "MoreFilesExtras.h"

#pragma export reset


|












|

















|

|

<
|
<
<
<
<
<

<
|
<
<
<
<

<
|
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
26
27
28
29
30
31
32
33
34
35
36

37





38

39




40

41
/*
 * MW_TclTestHeader.pch --
 *
 *  This file is the source for a pre-compilied header that gets used
 *  for all files in the Tcl projects.  This make compilies go a bit
 *  faster.  This file is only intended to be used in the MetroWerks
 *  CodeWarrior environment.  It essentially acts as a place to set 
 *  compiler flags.  See MetroWerks documention for more details.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: MW_TclTestHeader.pch,v 1.1.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

/*
 * To use the compilied header you need to set the "Prefix file" in
 * the "C/C++ Language" preference panel to point to the created
 * compilied header.  The name of the header depends on the
 * architecture we are compiling for (see the code below).  For
 * example, for a 68k app the prefix file should be: MW_TclHeader68K.
 */
#if __POWERPC__
#pragma precompile_target "MW_TclTestHeaderPPC"
#elif __CFM68K__
#pragma precompile_target "MW_TclTestHeaderCFM68K"
#else
#pragma precompile_target "MW_TclTestHeader68K"
#endif

#define BUILD_tcl 1

#define STATIC_BUILD 1


#define TCL_DEBUG 1







#define TCL_THREADS 1






#include "MW_TclHeaderCommon.h"
Changes to mac/README.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Tcl 8.3 for Macintosh

by Ray Johnson
Scriptics Corporation
rjohnson@scriptics.com
with major help from
Jim Ingham
Cygnus Solutions
jingham@cygnus.com

RCS: @(#) $Id: README,v 1.12 2000/04/26 17:31:20 hobbs Exp $

1. Introduction
---------------

This is the README file for the Macintosh version of the Tcl
scripting language.  The home page for the Macintosh releases is
	http://dev.scriptics.com/software/mac/


<
<
<
<
<
<
<
<
|







1
2








3
4
5
6
7
8
9
10
Tcl 8.3 for Macintosh









RCS: @(#) $Id: README,v 1.12.2.1 2001/04/03 22:08:32 hobbs Exp $

1. Introduction
---------------

This is the README file for the Macintosh version of the Tcl
scripting language.  The home page for the Macintosh releases is
	http://dev.scriptics.com/software/mac/
71
72
73
74
75
76
77
78
current release notes please check this page:

	http://dev.scriptics.com/doc/howto/compile.html#mac

If you have comments or Bug reports send them to:
Jim Ingham
jingham@cygnus.com








<
63
64
65
66
67
68
69

current release notes please check this page:

	http://dev.scriptics.com/doc/howto/compile.html#mac

If you have comments or Bug reports send them to:
Jim Ingham
jingham@cygnus.com

Changes to mac/tclMac.h.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 * tclMac.h --
 *
 *	Declarations of Macintosh specific public variables and procedures.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMac.h,v 1.4 1999/03/10 05:52:51 stanton Exp $
 */

#ifndef _TCLMAC
#define _TCLMAC

#ifndef _TCL
#   include "tcl.h"
#endif
#include <Types.h>
#include <Files.h>
#include <Events.h>

/*
 * "export" is a MetroWerks specific pragma.  It flags the linker that  
 * any symbols that are defined when this pragma is on will be exported 
 * to shared libraries that link with this library.
 */
 
#pragma export on

typedef int (*Tcl_MacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr));

#include "tclPlatDecls.h"

#pragma export reset

#endif /* _TCLMAC */










|












<
<
<
<
<
<
<
<




<
<

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
26
27


28
/*
 * tclMac.h --
 *
 *	Declarations of Macintosh specific public variables and procedures.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMac.h,v 1.4.14.1 2001/04/04 21:22:18 hobbs Exp $
 */

#ifndef _TCLMAC
#define _TCLMAC

#ifndef _TCL
#   include "tcl.h"
#endif
#include <Types.h>
#include <Files.h>
#include <Events.h>









typedef int (*Tcl_MacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr));

#include "tclPlatDecls.h"



#endif /* _TCLMAC */
Changes to mac/tclMacAlloc.c.
10
11
12
13
14
15
16
17
18
19
20
21
22

23
24
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51









52
53
54
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69
70
71
72
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * Portions contributed by Chris Kingsley, Jack Jansen and Ray Johnson
 *.
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAlloc.c,v 1.4 1999/05/11 07:11:51 jingham Exp $
 */

#include "tclInt.h"
#include "tclMacInt.h"
#include <Memory.h>

#include <stdlib.h>
#include <string.h>


/*
 * Flags that are used by ConfigureMemory to define how the allocator
 * should work.  They can be or'd together.
 */
#define MEMORY_ALL_SYS 1	/* All memory should come from the system
heap. */


/*
 * Amount of space to leave in the application heap for the Toolbox to work.
 */

#define TOOLBOX_SPACE (32 * 1024)

static int memoryFlags = 0;
static Handle toolGuardHandle = NULL;
				/* This handle must be around so that we don't
				 * have NewGWorld failures. This handle is
				 * purgeable. Before we allocate any blocks,
				 * we see if this handle is still around.
				 * If it is not, then we try to get it again.
				 * If we can get it, we lock it and try
				 * to do the normal allocation, unlocking on
				 * the way out. If we can't, we go to the
				 * system heap directly. */











/*
 * The following typedef and variable are used to keep track of memory
 * blocks that are allocated directly from the System Heap.  These chunks
 * of memory must always be freed - even if we crash.
 */

typedef struct listEl {
    Handle		memoryHandle;
    struct listEl *	next;

} ListEl;

ListEl * systemMemory = NULL;
ListEl * appMemory = NULL;

/*
 * Prototypes for functions used only in this file.
 */

static pascal void	CleanUpExitProc _ANSI_ARGS_((void));
void 			ConfigureMemory _ANSI_ARGS_((int flags));







|





>










>





|













>
>
>
>
>
>
>
>
>










>


|
|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * Portions contributed by Chris Kingsley, Jack Jansen and Ray Johnson
 *.
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAlloc.c,v 1.4.12.1 2001/05/17 13:30:02 das Exp $
 */

#include "tclInt.h"
#include "tclMacInt.h"
#include <Memory.h>
#include <Gestalt.h>
#include <stdlib.h>
#include <string.h>


/*
 * Flags that are used by ConfigureMemory to define how the allocator
 * should work.  They can be or'd together.
 */
#define MEMORY_ALL_SYS 1	/* All memory should come from the system
heap. */
#define MEMORY_DONT_USE_TEMPMEM 2	/* Don't use temporary memory but system memory. */

/*
 * Amount of space to leave in the application heap for the Toolbox to work.
 */

#define TOOLBOX_SPACE (512 * 1024)

static int memoryFlags = 0;
static Handle toolGuardHandle = NULL;
				/* This handle must be around so that we don't
				 * have NewGWorld failures. This handle is
				 * purgeable. Before we allocate any blocks,
				 * we see if this handle is still around.
				 * If it is not, then we try to get it again.
				 * If we can get it, we lock it and try
				 * to do the normal allocation, unlocking on
				 * the way out. If we can't, we go to the
				 * system heap directly. */

static int tclUseMemTracking = 0; /* Are we tracking memory allocations?
								   * On recent versions of the MacOS this
								   * is no longer necessary, as we can use
								   * temporary memory which is freed by the
								   * OS after a quit or crash. */
								   
static size_t tclExtraHdlSize = 0; /* Size of extra memory allocated at the start
									* of each block when using memory tracking
									* ( == 0 otherwise) */

/*
 * The following typedef and variable are used to keep track of memory
 * blocks that are allocated directly from the System Heap.  These chunks
 * of memory must always be freed - even if we crash.
 */

typedef struct listEl {
    Handle		memoryHandle;
    struct listEl *	next;
    struct listEl *	prec;
} ListEl;

static ListEl * systemMemory = NULL;
static ListEl * appMemory = NULL;

/*
 * Prototypes for functions used only in this file.
 */

static pascal void	CleanUpExitProc _ANSI_ARGS_((void));
void 			ConfigureMemory _ANSI_ARGS_((int flags));
95
96
97
98
99
100
101

102

103



104
105







106

107
108


109
110
111
112
113
114
115
TclpSysRealloc(
    VOID *oldPtr,		/* Original block */
    unsigned int size)		/* New size of block. */
{
    Handle hand;
    void *newPtr;
    int maxsize;



    hand = * (Handle *) ((Ptr) oldPtr - sizeof(Handle));



    maxsize = GetHandleSize(hand) - sizeof(Handle);
    if (maxsize < size) {







	newPtr = TclpSysAlloc(size, 1);

	memcpy(newPtr, oldPtr, maxsize);
	TclpSysFree(oldPtr);


    } else {
	newPtr = oldPtr;
    }
    return newPtr;
}

/*







>

>
|
>
>
>


>
>
>
>
>
>
>

>
|

>
>







107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
TclpSysRealloc(
    VOID *oldPtr,		/* Original block */
    unsigned int size)		/* New size of block. */
{
    Handle hand;
    void *newPtr;
    int maxsize;
    OSErr err;

	if (tclUseMemTracking) {
    hand = ((ListEl *) ((Ptr) oldPtr - tclExtraHdlSize))->memoryHandle;
    } else {
    hand = RecoverHandle((Ptr) oldPtr);
	}
    maxsize = GetHandleSize(hand) - sizeof(Handle);
    if (maxsize < size) {
    HUnlock(hand);
    SetHandleSize(hand,size + tclExtraHdlSize);
    err = MemError();
    HLock(hand);
    if(err==noErr){
    	newPtr=(*hand + tclExtraHdlSize);
    } else {
	newPtr = TclpSysAlloc(size, 1);
	if(newPtr!=NULL) {
	memmove(newPtr, oldPtr, maxsize);
	TclpSysFree(oldPtr);
	}
	}
    } else {
	newPtr = oldPtr;
    }
    return newPtr;
}

/*
132
133
134
135
136
137
138

























139
140
141
142
143
144
145
VOID *
TclpSysAlloc(
    long size,		/* Size of block to allocate. */
    int isBin)		/* Is this a bin allocation? */
{
    Handle hand = NULL;
    ListEl * newMemoryRecord;


























    if (!(memoryFlags & MEMORY_ALL_SYS)) {

    	/*
    	 * If the guard handle has been purged, throw it away and try
    	 * to allocate it again.
    	 */







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
VOID *
TclpSysAlloc(
    long size,		/* Size of block to allocate. */
    int isBin)		/* Is this a bin allocation? */
{
    Handle hand = NULL;
    ListEl * newMemoryRecord;
	int isSysMem = 0;
	static int initialized=0;
	
	if (!initialized) {
	long response = 0;
	OSErr err = noErr;
	int useTempMem = 0;
	
	/* Check if we can use temporary memory */
	initialized=1;
	err = Gestalt(gestaltOSAttr, &response);
	if (err == noErr) {
    	useTempMem = response & (1 << gestaltRealTempMemory);
	}
	tclUseMemTracking = !useTempMem || (memoryFlags & MEMORY_DONT_USE_TEMPMEM);
	if(tclUseMemTracking) {
	    tclExtraHdlSize = sizeof(ListEl);
	    /*
	     * We are allocating memory directly from the system
	     * heap. We need to install an exit handle 
	     * to ensure the memory is cleaned up.
	     */
	    TclMacInstallExitToShellPatch(CleanUpExitProc);
	}
	}

    if (!(memoryFlags & MEMORY_ALL_SYS)) {

    	/*
    	 * If the guard handle has been purged, throw it away and try
    	 * to allocate it again.
    	 */
153
154
155
156
157
158
159

160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188









189
190


191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215



216







217





218
219
220
221
222
223
224
225
    	 * If we have never allocated the guard handle, or it was purged
    	 * and thrown away, then try to allocate it again.
    	 */

    	if (toolGuardHandle == NULL) {
    	    toolGuardHandle = NewHandle(TOOLBOX_SPACE);
    	    if (toolGuardHandle != NULL) {

    	    	HPurge(toolGuardHandle);
    	    }
    	}

	/*
	 * If we got the handle, lock it and do our allocation.
	 */

    	if (toolGuardHandle != NULL) {
    	    HLock(toolGuardHandle);
	    hand = NewHandle(size + sizeof(Handle));
	    HUnlock(toolGuardHandle);
	}
    }
    if (hand != NULL) {
	newMemoryRecord = (ListEl *) NewPtr(sizeof(ListEl));
	if (newMemoryRecord == NULL) {
	    DisposeHandle(hand);
	    return NULL;
	}
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->next = appMemory;
	appMemory = newMemoryRecord;
    } else {
	/*
	 * Ran out of memory in application space.  Lets try to get
	 * more memory from system.  Otherwise, we return NULL to
	 * denote failure.
	 */









	isBin = 0;
	hand = NewHandleSys(size + sizeof(Handle));


	if (hand == NULL) {
	    return NULL;
	}
	if (systemMemory == NULL) {
	    /*
	     * This is the first time we've attempted to allocate memory
	     * directly from the system heap.  We need to now install the
	     * exit handle to ensure the memory is cleaned up.
	     */
	    TclMacInstallExitToShellPatch(CleanUpExitProc);
	}
	newMemoryRecord = (ListEl *) NewPtrSys(sizeof(ListEl));
	if (newMemoryRecord == NULL) {
	    DisposeHandle(hand);
	    return NULL;
	}
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->next = systemMemory;
	systemMemory = newMemoryRecord;
    }
    if (isBin) {
	HLockHi(hand);
    } else {
	HLock(hand);
    }



    (** (Handle **) hand) = hand;













    return (*hand + sizeof(Handle));
}

/*
 *----------------------------------------------------------------------
 *
 * TclpSysFree --
 *







>










|



<
<
|
<
<
<
<
<
<
<





>
>
>
>
>
>
>
>
>

|
>
>



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





>
>
>
|
>
>
>
>
>
>
>
|
>
>
>
>
>
|







205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226


227







228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248

















249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
    	 * If we have never allocated the guard handle, or it was purged
    	 * and thrown away, then try to allocate it again.
    	 */

    	if (toolGuardHandle == NULL) {
    	    toolGuardHandle = NewHandle(TOOLBOX_SPACE);
    	    if (toolGuardHandle != NULL) {
    	    	HLock(toolGuardHandle);
    	    	HPurge(toolGuardHandle);
    	    }
    	}

	/*
	 * If we got the handle, lock it and do our allocation.
	 */

    	if (toolGuardHandle != NULL) {
    	    HLock(toolGuardHandle);
	    hand = NewHandle(size + tclExtraHdlSize);
	    HUnlock(toolGuardHandle);
	}
    }


    if (hand == NULL) {







	/*
	 * Ran out of memory in application space.  Lets try to get
	 * more memory from system.  Otherwise, we return NULL to
	 * denote failure.
	 */
	if(!tclUseMemTracking) {
		/* Use Temporary Memory instead of System Heap when available */
		OSErr err;
		isBin = 1; /* always HLockHi TempMemHandles */
		hand = TempNewHandle(size + tclExtraHdlSize,&err);
		if(err!=noErr) { hand=NULL; }
	} else {
	/* Use system heap when tracking memory */
	isSysMem=1;
	isBin = 0;
	hand = NewHandleSys(size + tclExtraHdlSize);
	}
	}
	if (hand == NULL) {
	    return NULL;
	}

















    if (isBin) {
	HLockHi(hand);
    } else {
	HLock(hand);
    }
	if(tclUseMemTracking) {
	/* Only need to do this when tracking memory */
	newMemoryRecord = (ListEl *) *hand;
	newMemoryRecord->memoryHandle = hand;
	newMemoryRecord->prec = NULL;
	if(isSysMem) {
	newMemoryRecord->next = systemMemory;
	systemMemory = newMemoryRecord;
	} else {
	newMemoryRecord->next = appMemory;
	appMemory = newMemoryRecord;
	}
	if(newMemoryRecord->next!=NULL) {
	newMemoryRecord->next->prec=newMemoryRecord;
	}
	}
	
    return (*hand + tclExtraHdlSize);
}

/*
 *----------------------------------------------------------------------
 *
 * TclpSysFree --
 *
234
235
236
237
238
239
240
241


242




243








244

245
246
247

248
249
250
251
252
253
254
 *----------------------------------------------------------------------
 */

void
TclpSysFree(
    void * ptr)		/* Free this system memory. */
{
    Handle hand;


    OSErr err;













    hand = * (Handle *) ((Ptr) ptr - sizeof(Handle));

    DisposeHandle(hand);
    *hand = NULL;
    err = MemError();

}

/*
 *----------------------------------------------------------------------
 *
 * CleanUpExitProc --
 *







|
>
>
|
>
>
>
>
|
>
>
>
>
>
>
>
>
|
>
|
<
<
>







287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313


314
315
316
317
318
319
320
321
 *----------------------------------------------------------------------
 */

void
TclpSysFree(
    void * ptr)		/* Free this system memory. */
{
	if(tclUseMemTracking) {
    /* Only need to do this when tracking memory */
    ListEl *memRecord;

    memRecord = (ListEl *) ((Ptr) ptr - tclExtraHdlSize);
    /* Remove current record from linked list */
    if(memRecord->next!=NULL) {
    	memRecord->next->prec=memRecord->prec;
    }
    if(memRecord->prec!=NULL) {
    	memRecord->prec->next=memRecord->next;
    }
    if(memRecord==appMemory) {
    	appMemory=memRecord->next;
    } else if(memRecord==systemMemory) {
    	systemMemory=memRecord->next;
    }
    DisposeHandle(memRecord->memoryHandle);
	} else {
    DisposeHandle(RecoverHandle((Ptr) ptr));


	}
}

/*
 *----------------------------------------------------------------------
 *
 * CleanUpExitProc --
 *
267
268
269
270
271
272
273


274
275
276
277
278
279
280
281
282
283
284
285
286
287
 */

static pascal void
CleanUpExitProc()
{
    ListEl * memRecord;



    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;
        if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
        }
	DisposePtr((void *) memRecord);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * FreeAllMemory --







>
>



<
|
|
<







334
335
336
337
338
339
340
341
342
343
344
345

346
347

348
349
350
351
352
353
354
 */

static pascal void
CleanUpExitProc()
{
    ListEl * memRecord;

    if(tclUseMemTracking) {
    /* Only need to do this when tracking memory */
    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;

	DisposeHandle(memRecord->memoryHandle);
    }

    }
}

/*
 *----------------------------------------------------------------------
 *
 * FreeAllMemory --
300
301
302
303
304
305
306


307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
 */

void
FreeAllMemory()
{
    ListEl * memRecord;



    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;
	if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
        }
	DisposePtr((void *) memRecord);
    }
    while (appMemory != NULL) {
	memRecord = appMemory;
	appMemory = memRecord->next;
	if (*(memRecord->memoryHandle) != NULL) {
            DisposeHandle(memRecord->memoryHandle);
        }
	DisposePtr((void *) memRecord);
    }
}

/*
 *----------------------------------------------------------------------
 *
 * ConfigureMemory --







>
>



<
|
<
<




<
|
|
<







367
368
369
370
371
372
373
374
375
376
377
378

379


380
381
382
383

384
385

386
387
388
389
390
391
392
 */

void
FreeAllMemory()
{
    ListEl * memRecord;

	if(tclUseMemTracking) {
	/* Only need to do this when tracking memory */
    while (systemMemory != NULL) {
	memRecord = systemMemory;
	systemMemory = memRecord->next;

	DisposeHandle(memRecord->memoryHandle);


    }
    while (appMemory != NULL) {
	memRecord = appMemory;
	appMemory = memRecord->next;

	DisposeHandle(memRecord->memoryHandle);
	}

    }
}

/*
 *----------------------------------------------------------------------
 *
 * ConfigureMemory --
Changes to mac/tclMacAppInit.c.
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
26
27
28
29
30
31
32
/* 
 * tclMacAppInit.c --
 *
 *	Provides a version of the Tcl_AppInit procedure for the example shell.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAppInit.c,v 1.5 1999/04/16 00:47:19 stanton Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"

#if defined(THINK_C)
#   include <console.h>
#elif defined(__MWERKS__)
#   include <SIOUX.h>
short InstallConsole _ANSI_ARGS_((short fd));
#endif

#ifdef TCL_TEST
extern int		Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));
extern int		TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp));











|












|







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
26
27
28
29
30
31
32
/* 
 * tclMacAppInit.c --
 *
 *	Provides a version of the Tcl_AppInit procedure for the example shell.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacAppInit.c,v 1.5.12.1 2001/04/04 21:22:18 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"

#if defined(THINK_C)
#   include <console.h>
#elif defined(__MWERKS__)
#   include <SIOUX.h>
EXTERN short InstallConsole _ANSI_ARGS_((short fd));
#endif

#ifdef TCL_TEST
extern int		Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));
extern int		TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp));
extern int		Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp));
Changes to mac/tclMacApplication.r.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacApplication.r --
 *
 *	This file creates resources for use Tcl Shell application.
 *	It should be viewed as an example of how to create a new
 *	Tcl application using the shared Tcl libraries.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacApplication.r,v 1.3 1999/08/16 00:09:09 jingham Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacApplication.r --
 *
 *	This file creates resources for use Tcl Shell application.
 *	It should be viewed as an example of how to create a new
 *	Tcl application using the shared Tcl libraries.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacApplication.r,v 1.3.2.1 2001/04/04 21:22:18 hobbs Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc"
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Shell " TCL_PATCH_LEVEL " © 1996-1997 Sun Microsystems, 1998-1999 Scriptics Inc"
};

#define TCL_APP_CREATOR 'Tcl '

type TCL_APP_CREATOR as 'STR ';
resource TCL_APP_CREATOR (0, purgeable) {
	"Tcl Shell " TCL_PATCH_LEVEL " © 1996-1999"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.







|






|






|







38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2000 Ajuba Solutions"
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2000"
};

#define TCL_APP_CREATOR 'Tcl '

type TCL_APP_CREATOR as 'STR ';
resource TCL_APP_CREATOR (0, purgeable) {
	"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2000"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.
Changes to mac/tclMacChan.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMacChan.c
 *
 *	Channel drivers for Macintosh channels for the
 *	console fds.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacChan.c,v 1.6 1999/04/16 00:47:19 stanton Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <Aliases.h>
#include <Errors.h>











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMacChan.c
 *
 *	Channel drivers for Macintosh channels for the
 *	console fds.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacChan.c,v 1.6.12.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <Aliases.h>
#include <Errors.h>
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType consoleChannelType = {
    "file",			/* Type name. */
    StdIOBlockMode,		/* Set blocking/nonblocking mode.*/
    StdIOClose,			/* Close proc. */
    StdIOInput,			/* Input proc. */
    StdIOOutput,		/* Output proc. */
    StdIOSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    CommonWatch,		/* Initialize notifier. */
    CommonGetHandle		/* Get OS handles out of channel. */
};

/*
 * This variable describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    FileBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    FileClose,			/* Close proc. */
    FileInput,			/* Input proc. */
    FileOutput,			/* Output proc. */
    FileSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */







|
















|







132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType consoleChannelType = {
    "file",			/* Type name. */
    (Tcl_ChannelTypeVersion)StdIOBlockMode,		/* Set blocking/nonblocking mode.*/
    StdIOClose,			/* Close proc. */
    StdIOInput,			/* Input proc. */
    StdIOOutput,		/* Output proc. */
    StdIOSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    CommonWatch,		/* Initialize notifier. */
    CommonGetHandle		/* Get OS handles out of channel. */
};

/*
 * This variable describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    (Tcl_ChannelTypeVersion)FileBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    FileClose,			/* Close proc. */
    FileInput,			/* Input proc. */
    FileOutput,			/* Output proc. */
    FileSeek,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
Changes to mac/tclMacCommonPch.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclMacCommonPch.h --
 *
 * 	Macintosh Tcl must be compiled with certain compiler options to
 *	ensure that it will work correctly. The following pragmas are
 *	used to ensure that those options are set correctly. An error
 * 	will occur at compile time if they are not set correctly.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacCommonPch.h,v 1.2 1998/11/11 07:46:04 jingham Exp $
 */

#if !__option(enumsalwaysint)
#error Tcl requires the Metrowerks setting "Enums always ints".
#endif















|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclMacCommonPch.h --
 *
 * 	Macintosh Tcl must be compiled with certain compiler options to
 *	ensure that it will work correctly. The following pragmas are
 *	used to ensure that those options are set correctly. An error
 * 	will occur at compile time if they are not set correctly.
 *
 * Copyright (c) 1998 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacCommonPch.h,v 1.2.22.1 2001/04/04 21:22:19 hobbs Exp $
 */

#if !__option(enumsalwaysint)
#error Tcl requires the Metrowerks setting "Enums always ints".
#endif


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

85
86
87
88
* The define is used most everywhere to tell Tcl (or any Tcl
* extensions) that we are compiling for the Macintosh platform.
*/


#define MAC_TCL


/*
* The following defines control the behavior of the Macintosh
* Universial Headers.
*/


#define SystemSevenOrLater 1
#define STRICT_CONTROLS 1
#define STRICT_WINDOWS 1


/*
* Define the following symbol if you want
* comprehensive debugging turned on.
*/


/* #define TCL_DEBUG */


#ifdef TCL_DEBUG
# define TCL_MEM_DEBUG
# define TCL_TEST
#endif



/*
* For a while, we will continue to use the old routine names, so that
* people with older versions of CodeWarrior will still be able to compile
* the source (albeit they will have to update the project files themselves).
*
* At some point, we will convert over to the new routine names.

*/


#define OLDROUTINENAMES 1







<
<
<
<
<
<
<
<
<
<
<
















<

<
<
<
<
<
>


|
<
44
45
46
47
48
49
50











51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

67





68
69
70
71

* The define is used most everywhere to tell Tcl (or any Tcl
* extensions) that we are compiling for the Macintosh platform.
*/


#define MAC_TCL













/*
* Define the following symbol if you want
* comprehensive debugging turned on.
*/


/* #define TCL_DEBUG */


#ifdef TCL_DEBUG
# define TCL_MEM_DEBUG
# define TCL_TEST
#endif



/*





* for Metrowerks Pro 6 MSL
*/

#include <UseDLLPrefix.h>

Changes to mac/tclMacFCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMacFCmd.c --
 *
 * Implements the Macintosh specific portions of the file manipulation
 * subcommands of the "file" command.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacFCmd.c,v 1.7 1999/10/15 04:47:03 jingham Exp $
 */

#include "tclInt.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include "tclPort.h"
#include <FSpCompat.h>











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclMacFCmd.c --
 *
 * Implements the Macintosh specific portions of the file manipulation
 * subcommands of the "file" command.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacFCmd.c,v 1.7.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include "tclPort.h"
#include <FSpCompat.h>
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
    }
    if (err == noErr) {
        FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
        	tmpName, &tmpDirSpec);
        err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
    }
    if (err == noErr) {
	err = FSpDirectoryCopy(&srcFileSpec, &tmpDirSpec, NULL, 0, true,
	    	CopyErrHandler);
    }
    
    /* 
     * Even if the Copy failed, Rename/Move whatever did get copied to the
     * appropriate final destination, if possible.  
     */







|







744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
    }
    if (err == noErr) {
        FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
        	tmpName, &tmpDirSpec);
        err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
    }
    if (err == noErr) {
	err = FSpDirectoryCopy(&srcFileSpec, &tmpDirSpec, NULL, NULL, 0, true,
	    	CopyErrHandler);
    }
    
    /* 
     * Even if the Copy failed, Rename/Move whatever did get copied to the
     * appropriate final destination, if possible.  
     */
Changes to mac/tclMacInt.h.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48





49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69
70
71
72
73
74
/*
 * tclMacInt.h --
 *
 *	Declarations of Macintosh specific shared variables and procedures.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacInt.h,v 1.6 1999/08/16 00:09:18 jingham Exp $
 */

#ifndef _TCLMACINT
#define _TCLMACINT

#ifndef _TCL
#   include "tcl.h"
#endif
#ifndef _TCLMAC
#   include "tclMac.h"
#endif

#include <Events.h>
#include <Files.h>

#pragma export on

/*
 * Defines to control stack behavior.
 *
 * The Tcl8.2 regexp code is highly recursive for patterns with many
 * subexpressions.  So we have to increase the stack space to accomodate.
 * 512 K is good enough for ordinary work, but you need 768 to pass the Tcl
 * regexp testsuite.
 *
 * For the PPC, you need to set the stack space in the Project file.
 *
 */

#ifdef TCL_TEST
#	define TCL_MAC_68K_STACK_GROWTH (768*1024)
#else
#	define TCL_MAC_68K_STACK_GROWTH (512*1024)
#endif

#define TCL_MAC_STACK_THRESHOLD 16384






/*
 * This flag is passed to TclMacRegisterResourceFork
 * by a file (usually a library) whose resource fork
 * should not be closed by the resource command.
 */
 
#define TCL_RESOURCE_DONT_CLOSE  2

/*
 * Typedefs used by Macintosh parts of Tcl.
 */

/*
 * Prototypes of Mac only internal functions.
 */

EXTERN char *	TclMacGetFontEncoding _ANSI_ARGS_((int fontId));
EXTERN int	TclMacHaveThreads(void);

#include "tclPort.h"

#include "tclPlatDecls.h"
#include "tclIntPlatDecls.h"
    
#pragma export reset

#endif /* _TCLMACINT */










|





|
|

|
|





<
<




















>
>
>
>
>



















|
>
|


<
<

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
26


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75


76
/*
 * tclMacInt.h --
 *
 *	Declarations of Macintosh specific shared variables and procedures.
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacInt.h,v 1.6.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#ifndef _TCLMACINT
#define _TCLMACINT

#ifndef _TCLINT
#include "tclInt.h"
#endif
#ifndef _TCLPORT
#include "tclPort.h"
#endif

#include <Events.h>
#include <Files.h>



/*
 * Defines to control stack behavior.
 *
 * The Tcl8.2 regexp code is highly recursive for patterns with many
 * subexpressions.  So we have to increase the stack space to accomodate.
 * 512 K is good enough for ordinary work, but you need 768 to pass the Tcl
 * regexp testsuite.
 *
 * For the PPC, you need to set the stack space in the Project file.
 *
 */

#ifdef TCL_TEST
#	define TCL_MAC_68K_STACK_GROWTH (768*1024)
#else
#	define TCL_MAC_68K_STACK_GROWTH (512*1024)
#endif

#define TCL_MAC_STACK_THRESHOLD 16384

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
 * This flag is passed to TclMacRegisterResourceFork
 * by a file (usually a library) whose resource fork
 * should not be closed by the resource command.
 */
 
#define TCL_RESOURCE_DONT_CLOSE  2

/*
 * Typedefs used by Macintosh parts of Tcl.
 */

/*
 * Prototypes of Mac only internal functions.
 */

EXTERN char *	TclMacGetFontEncoding _ANSI_ARGS_((int fontId));
EXTERN int	TclMacHaveThreads(void);

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT

#include "tclIntPlatDecls.h"
    


#endif /* _TCLMACINT */
Changes to mac/tclMacLibrary.c.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27









28
29
30
31
32
33
34
 *	file.
 *
 * Copyright (c) 1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.c,v 1.4 2000/02/10 09:59:10 jingham Exp $
 */

/*
 * Here is another place that we are using the old routine names...
 */

#include <CodeFragments.h>
#include <Errors.h>
#include <Resources.h>
#include <Strings.h>
#include "tclMacInt.h"










/*
 * These function are not currently defined in any header file.  The
 * only place they should be used is in the Initialization and
 * Termination entry points for a code fragment.  The prototypes
 * are included here to avoid compile errors.
 */







|











>
>
>
>
>
>
>
>
>







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 *	file.
 *
 * Copyright (c) 1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.c,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

/*
 * Here is another place that we are using the old routine names...
 */

#include <CodeFragments.h>
#include <Errors.h>
#include <Resources.h>
#include <Strings.h>
#include "tclMacInt.h"

#if defined(TCL_REGISTER_LIBRARY) && defined(USE_TCL_STUBS)
#error "Can't use TCL_REGISTER_LIBRARY and USE_TCL_STUBS at the same time!"
/*
 * Can't register a library with Tcl when using stubs in the current
 * implementation, since Tcl_InitStubs hasn't been called yet
 *  when OpenLibraryResource is executing. 
 */
#endif

/*
 * These function are not currently defined in any header file.  The
 * only place they should be used is in the Initialization and
 * Termination entry points for a code fragment.  The prototypes
 * are included here to avoid compile errors.
 */
Changes to mac/tclMacLibrary.r.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacLibrary.r --
 *
 *	This file creates resources used by the Tcl shared library.
 *	Many thanks go to "Jay Lieske, Jr." <lieske@princeton.edu> who
 *	wrote the initial version of this file.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.r,v 1.4 1999/08/16 00:09:22 jingham Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacLibrary.r --
 *
 *	This file creates resources used by the Tcl shared library.
 *	Many thanks go to "Jay Lieske, Jr." <lieske@princeton.edu> who
 *	wrote the initial version of this file.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacLibrary.r,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc."
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Library " TCL_PATCH_LEVEL " © 1996-1997 Sun Microsystems, 1998-1999 Scriptics Inc."
};

/*
 * Currently the creator for all Tcl/Tk libraries and extensions
 * should be 'TclL'.  This will allow those extension and libraries
 * to use the common icon for Tcl extensions.  However, this signature
 * still needs to be approved by the signature police at Apple and may







|






|







38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2000 Ajuba Solutions"
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Tcl Library " TCL_PATCH_LEVEL " © 1993-2000"
};

/*
 * Currently the creator for all Tcl/Tk libraries and extensions
 * should be 'TclL'.  This will allow those extension and libraries
 * to use the common icon for Tcl extensions.  However, this signature
 * still needs to be approved by the signature police at Apple and may
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable) 
{
	'shlb', 0, ""
};

type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
	"Tcl Library " TCL_PATCH_LEVEL " © 1996-1999"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.







|







92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable) 
{
	'shlb', 0, ""
};

type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
	"Tcl Library " TCL_PATCH_LEVEL " © 1993-2000"
};

/*
 * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
 * to affect the text the Finder displays in the "kind" column and
 * file info dialog.  This information will be applied to all files
 * with the listed creator and type.
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"Tcl Library\n\n"
	"This is the core library needed to run Tool Command Language programs. "
	"To work properly, it should be placed in the ÔTool Command Languag folder "
	"within the Extensions folder."
};

/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use







|







121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"Tcl Library\n\n"
	"This is the core library needed to run Tool Command Language programs. "
	"To work properly, it should be placed in the ŒTool Command Languag folder "
	"within the Extensions folder."
};

/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use
Deleted mac/tclMacMSLPrefix.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * tclMacMSLPrefix.h --
 *
 *  A wrapper for the MSL ansi_prefix.mac.h file.  This just turns export on
 *  after including the MSL prefix file, so we can export symbols from the MSL
 *  and through the Tcl shared libraries
 *  
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacMSLPrefix.h,v 1.2 1998/09/14 18:40:05 stanton Exp $
 */

#include <ansi_prefix.mac.h>
/*
 * "export" is a MetroWerks specific pragma.  It flags the linker that  
 * any symbols that are defined when this pragma is on will be exported 
 * to shared libraries that link with this library.
 */
 
#pragma export on
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































Changes to mac/tclMacMath.h.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *	are passed around and used, they will crash hard on the 68K.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacMath.h,v 1.2 1998/09/14 18:40:05 stanton Exp $
 */

#ifndef _TCLMACMATH
#define _TCLMACMATH

#include <math.h>








|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *	are passed around and used, they will crash hard on the 68K.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacMath.h,v 1.2.18.1 2001/04/04 21:22:19 hobbs Exp $
 */

#ifndef _TCLMACMATH
#define _TCLMACMATH

#include <math.h>

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#   ifdef floor
#	undef floor
#	define floor floord
#   endif
#endif
#endif

#if (defined(THINK_C) || defined(__MWERKS__))
#pragma export on
double		hypotd(double x, double y);
#define hypot hypotd
#pragma export reset
#endif

#endif /* _TCLMACMATH */







|







131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#   ifdef floor
#	undef floor
#	define floor floord
#   endif
#endif
#endif

#if (defined(THINK_C))
#pragma export on
double		hypotd(double x, double y);
#define hypot hypotd
#pragma export reset
#endif

#endif /* _TCLMACMATH */
Changes to mac/tclMacNotify.c.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *	event proc will have to arbitrate which events go to which threads.
 *
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacNotify.c,v 1.6 1999/08/10 04:21:40 jingham Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include <signal.h>







|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *	event proc will have to arbitrate which events go to which threads.
 *
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacNotify.c,v 1.6.10.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMac.h"
#include "tclMacInt.h"
#include <signal.h>
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
    Rect mouseRect;

    /*
     * Check for mouse moved events.  These events aren't placed on the
     * system event queue unless we call WaitNextEvent.
     */

    GetGlobalMouse(&currentMouse);
    if ((notifier.eventProcPtr != NULL) &&
	    !EqualPt(currentMouse, notifier.lastMousePosition)) {
	notifier.lastMousePosition = currentMouse;
	theEvent.what = nullEvent;
	if ((*notifier.eventProcPtr)(&theEvent) == true) {
	    eventFound = 1;
	}







|







262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
    Rect mouseRect;

    /*
     * Check for mouse moved events.  These events aren't placed on the
     * system event queue unless we call WaitNextEvent.
     */

    GetGlobalMouseTcl(&currentMouse);
    if ((notifier.eventProcPtr != NULL) &&
	    !EqualPt(currentMouse, notifier.lastMousePosition)) {
	notifier.lastMousePosition = currentMouse;
	theEvent.what = nullEvent;
	if ((*notifier.eventProcPtr)(&theEvent) == true) {
	    eventFound = 1;
	}
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
    }
    
    /*
     * Process events from the OS event queue.
     */

    while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
	GetGlobalMouse(&currentMouse);
	SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		currentMouse.h + 1, currentMouse.v + 1);
	RectRgn(notifier.utilityRgn, &mouseRect);
	
	WaitNextEvent(everyEvent, &theEvent, 5, notifier.utilityRgn);
	needsUpdate = 0;
	if ((notifier.eventProcPtr != NULL)







|







292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
    }
    
    /*
     * Process events from the OS event queue.
     */

    while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
	GetGlobalMouseTcl(&currentMouse);
	SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		currentMouse.h + 1, currentMouse.v + 1);
	RectRgn(notifier.utilityRgn, &mouseRect);
	
	WaitNextEvent(everyEvent, &theEvent, 5, notifier.utilityRgn);
	needsUpdate = 0;
	if ((notifier.eventProcPtr != NULL)
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
	if (!found) {
	    /*
	     * Set up mouse region so we will wake if the mouse is moved.
	     * We do this by defining the smallest possible region around
	     * the current mouse position.
	     */

	    GetGlobalMouse(&currentMouse);
	    SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		    currentMouse.h + 1, currentMouse.v + 1);
	    RectRgn(notifier.utilityRgn, &mouseRect);
	
	    WaitNextEvent(everyEvent, &macEvent, sleepTime,
		    notifier.utilityRgn);








|







477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
	if (!found) {
	    /*
	     * Set up mouse region so we will wake if the mouse is moved.
	     * We do this by defining the smallest possible region around
	     * the current mouse position.
	     */

	    GetGlobalMouseTcl(&currentMouse);
	    SetRect(&mouseRect, currentMouse.h, currentMouse.v,
		    currentMouse.h + 1, currentMouse.v + 1);
	    RectRgn(notifier.utilityRgn, &mouseRect);
	
	    WaitNextEvent(everyEvent, &macEvent, sleepTime,
		    notifier.utilityRgn);

Changes to mac/tclMacOSA.c.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1996 Lucent Technologies and Jim Ingham
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "License Terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.c,v 1.6 1999/12/21 23:58:13 hobbs Exp $
 */

#define MAC_TCL

#include <Aliases.h>
#include <string.h>
#include <AppleEvents.h>







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1996 Lucent Technologies and Jim Ingham
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "License Terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.c,v 1.6.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#define MAC_TCL

#include <Aliases.h>
#include <string.h>
#include <AppleEvents.h>
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
	if ((err != noErr) && (err != fnfErr)) {
	    Tcl_AppendResult(interp,
		    "Error getting a location for the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
		
	FSpCreateResFileCompat(&fileSpec,
		'WiSH', 'osas', smSystemScript);	
	myErr = ResError();
	
	if ((myErr != noErr) && (myErr != dupFNErr)) {
	    sprintf(idStr, "%d", myErr);
	    Tcl_AppendResult(interp, "Error #", idStr,
		    " creating new resource file ", fileName, (char *) NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
		
	fileRef = FSpOpenResFileCompat(&fileSpec, fsRdWrPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
	UseResFile(fileRef);







|











|







2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
	if ((err != noErr) && (err != fnfErr)) {
	    Tcl_AppendResult(interp,
		    "Error getting a location for the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
		
	FSpCreateResFileCompatTcl(&fileSpec,
		'WiSH', 'osas', smSystemScript);	
	myErr = ResError();
	
	if ((myErr != noErr) && (myErr != dupFNErr)) {
	    sprintf(idStr, "%d", myErr);
	    Tcl_AppendResult(interp, "Error #", idStr,
		    " creating new resource file ", fileName, (char *) NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
		
	fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdWrPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    result = TCL_ERROR;
	    goto rezEvalCleanUp;
	}
	UseResFile(fileRef);
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
	Tcl_DStringFree(&buffer);
	if (err != noErr) {
	    Tcl_AppendResult(interp, "Error finding the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
			
	fileRef = FSpOpenResFileCompat(&fileSpec, fsRdPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
	UseResFile(fileRef);
    } else {







|







2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
	Tcl_DStringFree(&buffer);
	if (err != noErr) {
	    Tcl_AppendResult(interp, "Error finding the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
			
	fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdPerm);
	if (fileRef == -1) {
	    Tcl_AppendResult(interp, "Error reading the file: \"", 
		    fileName, "\".", NULL);
	    return TCL_ERROR;
	}
	UseResFile(fileRef);
    } else {
Deleted mac/tclMacOSA.exp.
1
Tclapplescript_Init
<


Changes to mac/tclMacOSA.r.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
 * tkMacOSA.r --
 *
 *	This file creates resources used by the AppleScript package.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.r,v 1.3 1999/08/16 00:09:26 jingham Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
 * the version string for Tcl.
 */

#define SCRIPT_MAJOR_VERSION 1		/* Major number */
#define SCRIPT_MINOR_VERSION  0		/* Minor number */
#define SCRIPT_RELEASE_SERIAL  2	/* Really minor number! */
#define RELEASE_LEVEL alpha		/* alpha, beta, or final */
#define SCRIPT_VERSION "1.0"
#define SCRIPT_PATCH_LEVEL "1.0a2"
#define FINAL 0				/* Change to 1 if final version. */

#if FINAL
#   define MINOR_VERSION (SCRIPT_MINOR_VERSION * 16) + SCRIPT_RELEASE_SERIAL
#else
#   define MINOR_VERSION SCRIPT_MINOR_VERSION * 16
#endif

#define RELEASE_CODE 0x00

resource 'vers' (1) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	SCRIPT_PATCH_LEVEL ", by Jim Ingham © Cygnus Solutions"
};

resource 'vers' (2) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-1999"
};

/*
 * The -16397 string will be displayed by Finder when a user
 * tries to open the shared library. The string should
 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"TclAppleScript Library\n\n"
	"This library provides the ability to run AppleScript "
	" commands from Tcl/Tk programs.  To work properly, it "
	"should be placed in the ÔTool Command Languag folder "
	"within the Extensions folder."
};


/* 
 * We now load the Tk library into the resource fork of the library.
 */

data 'TEXT' (4000,"pkgIndex",purgeable, preload) {
	"# Tcl package index file, version 1.0\n"
	"package ifneeded Tclapplescript 1.0 [list tclPkgSetup $dir Tclapplescript 1.0 {{Tclapplescript" 
	".shlb load AppleScript}}]\n"
};










|











|
|
|
|
|
|













|






|













|










|


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
 * tkMacOSA.r --
 *
 *	This file creates resources used by the AppleScript package.
 *
 * Copyright (c) 1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacOSA.r,v 1.3.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
 * the version string for Tcl.
 */

#define SCRIPT_MAJOR_VERSION 1		/* Major number */
#define SCRIPT_MINOR_VERSION  1		/* Minor number */
#define SCRIPT_RELEASE_SERIAL  0	/* Really minor number! */
#define RELEASE_LEVEL final		/* alpha, beta, or final */
#define SCRIPT_VERSION "1.1"
#define SCRIPT_PATCH_LEVEL "1.1.0"
#define FINAL 1				/* Change to 1 if final version. */

#if FINAL
#   define MINOR_VERSION (SCRIPT_MINOR_VERSION * 16) + SCRIPT_RELEASE_SERIAL
#else
#   define MINOR_VERSION SCRIPT_MINOR_VERSION * 16
#endif

#define RELEASE_CODE 0x00

resource 'vers' (1) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	SCRIPT_PATCH_LEVEL ", by Jim Ingham © Cygnus Solutions" "\n" "© 2000 Ajuba Solutions"
};

resource 'vers' (2) {
	SCRIPT_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	SCRIPT_PATCH_LEVEL,
	"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-2000"
};

/*
 * The -16397 string will be displayed by Finder when a user
 * tries to open the shared library. The string should
 * give the user a little detail about the library's capabilities
 * and enough information to install the library in the correct location.  
 * A similar string should be placed in all shared libraries.
 */
resource 'STR ' (-16397, purgeable) {
	"TclAppleScript Library\n\n"
	"This library provides the ability to run AppleScript "
	" commands from Tcl/Tk programs.  To work properly, it "
	"should be placed in the ŒTool Command Languag folder "
	"within the Extensions folder."
};


/* 
 * We now load the Tk library into the resource fork of the library.
 */

data 'TEXT' (4000,"pkgIndex",purgeable, preload) {
	"# Tcl package index file, version 1.0\n"
	"package ifneeded Tclapplescript 1.1 [list tclPkgSetup $dir Tclapplescript 1.1 {{Tclapplescript" 
	".shlb load AppleScript}}]\n"
};
Changes to mac/tclMacPanic.c.
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
26
/* 
 * tclMacPanic.c --
 *
 *	Source code for the "panic" library procedure used in "Simple Shell";
 *	other Mac applications will probably override this with a more robust
 *	application-specific panic procedure.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPanic.c,v 1.2 1998/09/14 18:40:05 stanton Exp $
 */


#include <Events.h>
#include <Controls.h>

#include <Windows.h>
#include <TextEdit.h>
#include <Fonts.h>
#include <Dialogs.h>
#include <Icons.h>
#include <Sound.h>
#include <stdarg.h>













|





>







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
26
27
/* 
 * tclMacPanic.c --
 *
 *	Source code for the "panic" library procedure used in "Simple Shell";
 *	other Mac applications will probably override this with a more robust
 *	application-specific panic procedure.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPanic.c,v 1.2.18.1 2001/04/04 21:22:19 hobbs Exp $
 */


#include <Events.h>
#include <Controls.h>
#include <ControlDefinitions.h>
#include <Windows.h>
#include <TextEdit.h>
#include <Fonts.h>
#include <Dialogs.h>
#include <Icons.h>
#include <Sound.h>
#include <stdarg.h>
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
		    	SysBeep(1);
		    } else {
		    	SetPortWindowPort(macWinPtr);
		    	GlobalToLocal(&event.where);
		    	part = FindControl(event.where, macWinPtr,
				&okButtonHandle);
    	
			if ((inButton == part) && 
				(TrackControl(okButtonHandle,
					event.where, NULL))) {
			    done = true;
			}
		    }
		    break;
		case keyDown:







|







148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
		    	SysBeep(1);
		    } else {
		    	SetPortWindowPort(macWinPtr);
		    	GlobalToLocal(&event.where);
		    	part = FindControl(event.where, macWinPtr,
				&okButtonHandle);
    	
			if ((kControlButtonPart == part) && 
				(TrackControl(okButtonHandle,
					event.where, NULL))) {
			    done = true;
			}
		    }
		    break;
		case keyDown:
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
		    SetPortWindowPort(macWinPtr);
		    TextFont(systemFont);
		    
		    BeginUpdate(macWinPtr);
		    if (stopIconHandle != NULL) {
			PlotIcon(&iconRect, stopIconHandle);
		    }
		    TextBox(msg, strlen(msg), &textRect, teFlushDefault);
		    DrawControls(macWinPtr);
		    EndUpdate(macWinPtr);
	    }
	}
    }

    CloseWindow(macWinPtr);







|







172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
		    SetPortWindowPort(macWinPtr);
		    TextFont(systemFont);
		    
		    BeginUpdate(macWinPtr);
		    if (stopIconHandle != NULL) {
			PlotIcon(&iconRect, stopIconHandle);
		    }
		    TETextBox(msg, strlen(msg), &textRect, teFlushDefault);
		    DrawControls(macWinPtr);
		    EndUpdate(macWinPtr);
	    }
	}
    }

    CloseWindow(macWinPtr);
Changes to mac/tclMacPort.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * tclMacPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between the Mac and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPort.h,v 1.10 1999/12/08 03:50:04 hobbs Exp $
 */


#ifndef _MACPORT
#define _MACPORT

#ifndef _TCLINT












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * tclMacPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between the Mac and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacPort.h,v 1.10.2.1 2001/04/04 21:22:19 hobbs Exp $
 */


#ifndef _MACPORT
#define _MACPORT

#ifndef _TCLINT
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#   include <utime.h>

/*
 * The following definitions are usually found if fcntl.h.
 * However, MetroWerks has screwed that file up a couple of times
 * and all we need are the defines.
 */

#   define O_RDWR	  	0x0	/* open the file in read/write mode */
#   define O_RDONLY  		0x1	/* open the file in read only mode */
#   define O_WRONLY  		0x2	/* open the file in write only mode */
#   define O_APPEND  		0x0100	/* open the file in append mode */
#   define O_CREAT	  	0x0200	/* create the file if it doesn't exist */
#   define O_EXCL	  	0x0400	/* if the file exists don't create it again */
#   define O_TRUNC	  	0x0800	/* truncate the file after opening it */

/*
 * MetroWerks stat.h file is rather weak.  The defines
 * after the include are needed to fill in the missing
 * defines.
 */

#   include <stat.h>







|







|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#   include <utime.h>

/*
 * The following definitions are usually found if fcntl.h.
 * However, MetroWerks has screwed that file up a couple of times
 * and all we need are the defines.
 */
#ifndef	_FCNTL
#   define O_RDWR	  	0x0	/* open the file in read/write mode */
#   define O_RDONLY  		0x1	/* open the file in read only mode */
#   define O_WRONLY  		0x2	/* open the file in write only mode */
#   define O_APPEND  		0x0100	/* open the file in append mode */
#   define O_CREAT	  	0x0200	/* create the file if it doesn't exist */
#   define O_EXCL	  	0x0400	/* if the file exists don't create it again */
#   define O_TRUNC	  	0x0800	/* truncate the file after opening it */
#endif
/*
 * MetroWerks stat.h file is rather weak.  The defines
 * after the include are needed to fill in the missing
 * defines.
 */

#   include <stat.h>
94
95
96
97
98
99
100

101
102
103
104
105
106
107
108
109
110
111

112
113
114
115
116
117
118
#   	define S_IXGRP		00001	/* execute permission: group */
#   	define S_IRWXO		00007	/* read, write, execute: other */
#   	define S_IROTH		00004	/* read permission: other */
#   	define S_IWOTH		00002	/* write permission: other */
#   	define S_IXOTH		00001	/* execute permission: other */
#   endif


#   define isatty(arg) 		1

/* 
 * Defines used by access function.  This function is provided
 * by Mac Tcl as the function TclpAccess.
 */
 
#   define F_OK			0	/* test for existence of file */
#   define X_OK			0x01	/* test for execute or search permission */
#   define W_OK			0x02	/* test for write permission */
#   define R_OK			0x04	/* test for read permission */


#endif	/* __MWERKS__ */

/*
 * Many signals are not supported on the Mac and are thus not defined in
 * <signal.h>.  They are defined here so that Tcl will compile with less
 * modification.







>











>







94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#   	define S_IXGRP		00001	/* execute permission: group */
#   	define S_IRWXO		00007	/* read, write, execute: other */
#   	define S_IROTH		00004	/* read permission: other */
#   	define S_IWOTH		00002	/* write permission: other */
#   	define S_IXOTH		00001	/* execute permission: other */
#   endif

#if __MSL__ < 0x6000
#   define isatty(arg) 		1

/* 
 * Defines used by access function.  This function is provided
 * by Mac Tcl as the function TclpAccess.
 */
 
#   define F_OK			0	/* test for existence of file */
#   define X_OK			0x01	/* test for execute or search permission */
#   define W_OK			0x02	/* test for write permission */
#   define R_OK			0x04	/* test for read permission */
#endif

#endif	/* __MWERKS__ */

/*
 * Many signals are not supported on the Mac and are thus not defined in
 * <signal.h>.  They are defined here so that Tcl will compile with less
 * modification.
143
144
145
146
147
148
149





150
151
152
153
154
155
156
#define WIFEXITED(stat) 	(1)
#define WIFSTOPSIG(stat) 	(1)
#define WIFTERMSIG(stat) 	(1)
#define WIFEXITSTATUS(stat) 	(1)
#define WEXITSTATUS(stat) 	(1)
#define WTERMSIG(status) 	(1)
#define WSTOPSIG(status) 	(1)






/*
 * Make sure that MAXPATHLEN is defined.
 */

#ifndef MAXPATHLEN
#   ifdef PATH_MAX







>
>
>
>
>







145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#define WIFEXITED(stat) 	(1)
#define WIFSTOPSIG(stat) 	(1)
#define WIFTERMSIG(stat) 	(1)
#define WIFEXITSTATUS(stat) 	(1)
#define WEXITSTATUS(stat) 	(1)
#define WTERMSIG(status) 	(1)
#define WSTOPSIG(status) 	(1)

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif

/*
 * Make sure that MAXPATHLEN is defined.
 */

#ifndef MAXPATHLEN
#   ifdef PATH_MAX
281
282
283
284
285
286
287
288
289
290
291
292



293
typedef int TclpMutex;
#define	TclpMutexInit(a)
#define	TclpMutexLock(a)
#define	TclpMutexUnlock(a)
#endif /* TCL_THREADS */

typedef pascal void (*ExitToShellProcPtr)(void);
#include "tclMac.h"
#include "tclMacInt.h"
/* #include "tclPlatDecls.h"
   #include "tclIntPlatDecls.h" */




#endif /* _MACPORT */







|
|
<
|

>
>
>

288
289
290
291
292
293
294
295
296

297
298
299
300
301
302
typedef int TclpMutex;
#define	TclpMutexInit(a)
#define	TclpMutexLock(a)
#define	TclpMutexUnlock(a)
#endif /* TCL_THREADS */

typedef pascal void (*ExitToShellProcPtr)(void);

#include "tclMac.h" // contains #include "tclPlatDecls.h"

#include "tclIntPlatDecls.h"

# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT

#endif /* _MACPORT */
Changes to mac/tclMacProjects.sea.hqx.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112


113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157


158
159
160
161
162
163
164
165
166
167
168
169


170
171
172
173
174
175
176
177
178
179
180

181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224


225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246


247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269

270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291


292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314

315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336


337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359

360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381

382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403


404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425


426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448

449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470


471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493

494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515


516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538

539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560


561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583

584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605


606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628

629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650


651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673

674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695


696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718

719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740

741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762


763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784


785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807

808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829


830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852

853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874


875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897

898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920











921






922
923





924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008





1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031

1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052


1053
1054

1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076


1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098

1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120


1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142


1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165

1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187


1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210

1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232


1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255

1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277


1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300

1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322


1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345

1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367


1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390

1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412


1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435

1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457

1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479


1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501


1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524

1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546


1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569

1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591


1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614

1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636

1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658


1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680


1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703

1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725


1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748

1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770


1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793

1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815

1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837


1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859


1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882

1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904


1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927

1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949


1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972

1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994


1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017

2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039


2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062

2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084


2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107

2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129


2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152

2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174

2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196


2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218


2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241

2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263


2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286

2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308


2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331

2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353


2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375


2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397


2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420

2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442


2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465

2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487


2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510

2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532

2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554


2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576


2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599

2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621


2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644

2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666


2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689

2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711


2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734

2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756


2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779

2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795


2796



2797
2798
2799
2800
2801
2802

2803
2804
2805
2806
2807

2808
2809
2810
2811
2812



2813
2814
2815

2816
2817
2818
2819
2820
2821
2822


2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833

2834
2835
2836
2837
2838





2839
2840
2841
2842
2843
2844
2845
2846




2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862



2863
2864
2865

2866







2867
2868

2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898

2899
2900
2901
2902
2903



2904
2905
2906
2907
2908





2909
2910
2911
2912
2913
2914

2915
2916


2917
2918
2919
2920
2921
2922



2923
2924
2925


2926



2927
2928
2929
2930
2931
2932
2933
2934
2935


2936

2937
2938
2939
2940
2941
2942
2943
2944
2945
(This file must be converted with BinHex 4.0)
:"h4ME#jcC@%!39"36'&eFh3J!*!$UFJ!!AiC1AC6G(9QCNPd)#KM+6%j16FY-6N

j1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbiX)'KdG(!k,bphN!-ZB@aKC'4TER0jFbj
MEfd[8h4eCQC*G#m0#KS!"4!!!+R)!*!$FJ!"!*!$FSj4$D@P8Q9cCA*fC@5PT3#

PN!3"!!!c!%#d(A&cY-HdK!#3$3-"C3#3!mN!#PS8!!#Sr`!&G'0X!!#4V!"p!"!
"f3(!!q$rN!3$"rrirr$$3!!!J!#3"k@3"!%!!%!!!,5K[,#dal4p!*!$FJ!!(`#
3"()!%$&`!!(IL!!!(G-!N!32!%*239p8Bfa6D'9XE(-Zci!!!*Hm68e3FN0A588
"!*!2J!#3"d,"e+(92U!T@-GR[pQ)D4N"!E`GDf!YSX,#m4G4!EiQITp3)KPT0%H
pm)+Aj!6+&jhVJA"R3l-mrA84h-+P`2rGA3*P&NEJ'N"$CKFN#JhQ2'YNhclN-hc
Rc'&RLkSTPJJj9LE05Hm!SM3R(BPj-(BUe@0PJ9eGrpqbkL`STMcK4QGqpk0,HQD
-k+DFK%5Gj!aG2TfSA0YaL([!F2MV`A%B-k5mP1aP[9-#V31iE"9ebe!3E*!!K,8
2k,YB%jrr,R99GBfm6%BD*9C#P+fFPGrf0bNqh%-!j(fTpX[@AHCR!HlaC"fJ$rY
TAcFE,a9ZCIU1V35f!RiqD*dk2N)LK#DZK(dS@-mc2b!k(YP54-)BG9NTjd3KKcD
p2FXr$r6XM"K5,P8AAXRU5T1r@cd%ieJ06bHaj4$m6RR&2K$(NpIPqqbLC$ZiYTB
82amS&&H1Y,6Z#)LLqa[`B&mML8SfKSpFVh08GI1Arp$#NpH#%I9k!ZrNS1'J,-X
RR!XkSAVmQ1G*LA9Xb"Y#YScYHfF%"8i0ji8ad"!`L["[L4cGAGIeDfbf`[q3!0K
`0j!!D3"[XcTY08L#DVG*E`NeT+-j-,`aRhqV($LiZcQNE5TK3CbYPNjJR*`PGrH
K1Ujee25i5Q1VjI+p&9Qp"lXM5Q1Y`3q#,#P@Hb*+YeYJ1l9N5c6T-)PIB+4,8`@
DD+flMpEG&)93AS@#p[Z@8FGkpkij15JlpSS%Z0DQ@"1cUI#FeU-&b12aPm2$F6*
5pUCSGME'*Gj*,m)1b&d`"#33f5ZATdml1IBj&%'AbA+V@"`I!K+Tfm*Tc+a%!9k
Y0%e+fS))CMZNN6F!jh`'2idk+aL3!'Kj!!S)cb6qS&TpHqHc'HXcEC&#&1FPi-5
"LekVkNF%h,,L)B(h0`Tkr9XARqjl"p58(NJ3()h`EViHGIi$e8Q'18LXclRVi*F
12,-!ITU6EiX(Mf81Z'80T)C44e-Bk#frX*GZZ,&c(je`'%D1b0+B+0cA$L%fUQm

)L'jV4ZVi,#bh4SHpq%$9#IQ3!"Iea,imB'"6`YacX',r&m"$`rHKG&'26b"6*Z*
jrfU%95I@"TD1"VHMXKrc51#8!ae(208a!E9h&D+Yhdj@YM4jUQk&kemGG-M9i5q
Yd4VApaVaM)#fMV2'lZ@bl@Kj''4j#f#XKXR56QS4Z3lk0FH@YKi$#$'q[GaiRQR
r[,mm)l+8,k5(V&q84[CCNN0Zlepc#`p)2#bkk[%8imkMICp"Aj!!Q3(RA4@Re(j
%*Q(*&'EZjM0c2"m16Hq2,8&K"2&5V&aN*#*(N!"`SrPK-IakirFQf'B-M@-aX1-
kUpXGEAi@FlE8(k5S"3IaSm1j*!IAkTi3N@M4@-`5,a8Ml0UcY`iZPbreqLY2P6H
Z)dHjSV@Y`8"DEMRYmckLi1TeIJiGlRGKSaLPcEdc*)[Sh[efC3h*)$h,k55Y8`H
3!!KP)I,eb'Qqi2Df[aFC,'SQAjPib3Ala@*hlLK35cbDD0a,6GGCk-cLDi[VG4(
(KchdSjc@1TNLGY1GD%$2K"NNpEZ1Lc46B&AJ(QQbD*f8lR-C,D03Irm%aH1eC"5
CLM-IPN(F8SFhIKb5$Q-XjKfb3YkcLh9hEbL%m[YrYY&0BQXk$9N*GfcQbfG4'+h
Q381VK%k*$!jZ[QEHL22P-FqVe$3!iDq0d5&QebUiG@XQ-9H&4dBRZVX&Nc6%DPq
kR""%REJJ`SML`QNL!Cei9E`"*Ae8H5H!YljA(%lpF+dVReV[1TApefMDXURr06[
PITeTB2qQZ-#-G`J3HG8b4(XQ(jBalM4K#AJTqL!,`#f5i`K!5Vef)#aqD&iZTRS
I%Lh@NrGrE@[d['!m0k80AqD*KP-kC0[jqr&I[!prJHbGX+*@G8a8%8$V'bVY@-m
eJh0)90*ak54S3E8m6(eRCU1EhSLSjSr@dF)G6XqilPrpBmZhd'BTFG3HJ0Z'+cN
+caa@MMf)IM@3!!!U!h(V`P&$qeh#P-*@(`L`Q"$UXI2cTfejh,[`qF'qlAfQR("
T8jHqNeSR2E)CDHQ$N3ZYTa68NXYSlkD&kM$p*c`!'SFHXf[F"DpF`-G*f#S(DPB
QfL*i%,EFbh8MP0mG`pk)2)V",mSlKp2lUEQ4H*5@*Dc9XQfLqcFqSik40!)DM5`
q#Q2Z5('ZT)R-fRA-iL"N5"($Kce3E*1H"m-c`1DU%VUPi2%mj6m53DBb`08X!!+
eE1ETDiVH,,F8XPUi,fZ+KDbV[hq4#%'JK3@"0k*''GEmT-XGX*!!(riZ9R@G864
qH*bd64[9`"TAA4@9#X@-3rbK5Td@i)C+-arQ)hHJLe!3@r`qJG&V)XM9dP@XGhK
V@1YjiP@)Ger#4VqKlmY(CEQ6BNJ*6*`')Ebc*f[8hU8[iMQV6&TjSdBeUJSEkPe


VEPQQH[b-QH@4A)SAT(M)B`%V$1,A"UU(P!q@(iM9dD#dimpkh,DpEAG0qcbTN!"
KHD)mdD$ld$86afR[!J0e0Qm&*8b%!dd%e3"T*QQAc1m0Rr$(#%XDSU3lbl`IB'd
r1XqSUNZI9e'j3p63TXR`#N6!G4*CHA)&5'1&d4852r+p1CQD(jr3"rbU`jkp6#M
LraP$Yrk-&,36P($P@(#&LJ24TF4534lM(Jr#"ddFSY-A,J)SbmRhD0TXeeHmr)X
)Ya4GD5+Kq6$mS6`0ikqXT6I8j2I9*K6qS#b0-@R`"L$3X0I-qmb)9pQU1R))dpV
@0LMbK9IBb$`am3*IdDX`qjQ"pLA`YmH(hMXmMFP1lKGGG53h%[laIjJfA+Zd)TR
S2K'GVfYCHk`lAapUFji'T#DbLQZLh`'K"6LAT)Fl3Ph*RcUD#JT$d2@8K'$3+%&
!A"05,Z)qrrmd1QlM)h5&dhp8UhAbMkEE&lbCHLR(`kSPJUe`!#rHf"0PlS2!Tmf
hZL9+')[iQ%%"RGPPJY(rK$+MDq*@5dY#$%5Gr%kj5E*Q4)U0h-e+&!#hP,G$rf)
KNa%Y#iBMR3Am#E#H5TH%"#U0&dXh2f1#p,BYmM&lCa[)%KdaLq#1a5RGhrQPXa"
5mLbrF2mDDmVeq5RF@Ra(HS"FA!51bXYkTl9@1bXlVZZaK'VlTl5Y`ePra*J+-%H
@"QlHP3Sj5$XG0'Gb2$MAd2'25k)r1rAr)d4d9ZN(GMRVh(@9Y80cZSVLHIVIX,q
mi0eR'PC&+!QK"qSUr&ke`#Ikkc'rV!e6k#eY+dqYdYeaR(@-jXlpBhb*32dFMPX
PAMc''f#"*@IQE4B'f4Jd9i,lI*`f4M8cEN["XG#Q`)Vm#EF92*R4Lb`$6$-DSr*
[UB6T-4m`mdNRQB$pFYP`+M[#r4G6)LCHI6!MDl-YEZU*eZQ!h5XF$m6YpA-i2Re
[Q`*rT)3VlSUJRXeGPr-&9eDI-+qTm"%(9+DYG8B+U$r8`iZ%Ppidi6-TBC1pAmh
pNqD082SfKeE1[kkG4Zb6Y-dihHX6`$iUU%h1*+N0#,6%P'"1cI[M0pD'fhZ!cZ#
'A,mbVL8qbNIm2Zd)4!HS51i4P0eF2!NcV"YmS6dDFLqm(bh@fYT,@'5(!2d,"J0
K6X&0mP1RNamU5I0Q43hKaMQq+q"SZPLdKj823&c@%-m&8Dei$J9Vq%V#"01&3%A
rkK'-AUMSrh(qbFG99Qi[J!FZ`Npi43DH[`Q@f,fQRee5l6e"IqhqV9T$CUHr1V!
$SpH!M`+#+Y2h#-qb9k6r-6fV!@ma(MV&lU3-PZf[(*H4YTf2b%lJp&p8q(b0%*-



H+K0IE$9$!`Ze9VTCVHhCc"!0ZMJq6V1`0Q,jj25bX(NUECF1%Gp'2,X%I"`JK1$
6l1SC@N)@5K)#)6PM,M(5P0q5S$),2(hhRapTE(lX`qKBL'SIMrI#JE*QEQSUqID
KDXa02Jq!K)p8G#H&ZkqdK5aQ'hYHTqG6-q6XGRX+!5QM-I5"qrZRk%!G&qkebcf
&-rSRcMC)$UX()"NDi&SVTN5*4$R!$#c'i)J-%mN-4Td&CVUYJrhRDP5rDHamm4I
YTYiK(H`U$ceX)p8)5c&CM8-bfMVl-'j(B`8`3DpA08-S!Ck``HcVDrN"EQ&ER8B
,4JA,2I&bFqEI[fE%E%B-p&qUH)&Z"JTJ!cl[DFHL$cEUP@4[28K23N%DUa'4SJf
pcq!NkC*0lXD2VPHlb6aRKIb)@r89h2l*G+r#1MppQ,qMjaXEpM"d8F15*Iq+V0%
-`6cpc%Ze[J'X&,KJZHf@N!""TAP%pq0UGKY)f&T"V%HrE,M#,kH$K,Jk5)%R,re
4KA3-a5K)V6PJak*%56#EBFNr)XDrp[#`dG3'4fImalPP,p4-XLUV%ke-iFQI@@B
+C4bG-KT$"5@6S&Gp!*Idqa2&&UB,pPX*4&[VH1pP3"@h*PJ3#AGr5Pb&Nh3!*+%
#p100)P98!B1FY,jG#ELbTba`X56'hD#!)r0q"99epkK#kV11)188HS-q[[Pf0-r
EEcP1X9Xm*A'6beXh#C,Bch(d"QK9BC'4e'D@ZECK,JVU(iDQ@@2kN99fK#Z,P(6
c#A)k1ffp@F1RR$,(!TC"E,6`4qM$%l8m,l9&ZVMHpRie6ULhKZ504NkT)b[mXNN
%EEGVF%39#kkHKKJU0a-+&%,+jp*53q+99&pS0%JUDFV,i&6N[6)$EK'eH'Ch#`j
5R4lj3pB@b8'(UGfBr3163[)'Z#rUbK&(*9`-`UJZSU9I*Y%4$JM,elfZT%2GZ,r
cBA"pr*2(U!d#2%YB@SmLb,fG"1elYU#SHa)Q3XZMb2m['233mIhkKEp,d3mR3&@
3!)5PNQZaqcXbQb5I8K+Ea&l+Rb[)D[h(L`hNIXl+HT5#'6+q&6jLq-D6EG"NpL[
HFM6GL)6bR+IKA!',UCHk'SBMR!`#d1Ck3dr)l[al!Ar$lqUP`rG1X#2UYT@bK[2
IHS,P1)k5li@J#IU$RNe`qPr0dShA2`EICXCX*LaEi-CNXqXBl(jN6S*qK`*C`lA
41M@[K)efH!mr5+HE@@BSqDVMc'IM@V-0KrNiB,35Y5G@2,EVYp!hLHlZm*l"RAI
P5iF0[I@Nfk5JGBTF,J[TSGfGZA1FD8dXLJ(9R2JUaS5pY@f29p`G%#I1Pr%GTik
j8k%a5M!6Pk&G62(9G8`&f4ND!85F11Na!A[5Y%f&afA%jNCEiIqHJZ8KCfD6B!Z
-S!@+RQfC1D+THFZ6NqG@T4kLpQli#R61*VmVmR(#AY(#(QRiVabA6$Z$PrUCAq6
Hb@1"@"CaRBqm1ZG8DHF5CqHB3Gm++3NV9&4XQ"$A2&r,1ECU,VI[P4dBB)EUh@K
A[&)06m'EI)imXYPr@5pXd%-`1((b*i3d1X6PJm!jDqPia*DQDZSHP+$0@Icf!bI
F3rSp$I6-YNHE04EVKG-m,2@EK-lrGa)X3*5P)CFl5&RjrBkVDZ4Z40l[clm"pY'
I5SPJdr$X,FK!LfLS9iGaER&$TVjFEVUS`"p0Ujp[TVL+CASq3PYLeV4Hpe[)Bkd
#DD-L[Xc+Za8@Abdd4)&S`Tbr4LYj#@KK!'$FAPfjbpLC+TG&D[[D,$e$CPV8iKh
H&1cZ3UG8C$hh`1fQZr0kD$GEQ@fV(RV8$kUNA690Z$Y8Uq6G@L'UaC!!hVJV3U@
kp+1Y*a+jCGl2JUqrFLZY`+'V(Eq%"'A'Dh0*VcG5,Hrb'*fDrFSAZ@[5CXM1m4i
b(2IiK"4*&iMV@3p4"cNaQ#[GI@,ZPrcUi!YVm8mGVE1eXGq**fqQcq@5PEZmreE
)YpcjhiYVHpmL#EIVCcI--UVEJ(TEQDSFQARq-Ra+2*hM*VXlde[A"&Vm'ph8!6G
c&rR+C5&'F6"VbQq9iA%KS'%0I$`,%q*c*5R`kF'P1$T81GjqCbR[ZCHY&a1%pUb
rcKd+J5KqVdB28GUmLU5lQ3f)[C!!5C68k[TE9Bq!m3VpD*&6AiFq[,$f!*ZIR8D
FT@LQqi#QBl4#6@0hcG4,#UGJeM[2prG*d1$A-R'B6m&D--abPfr9,+rpbdV''Kh
R(8+R@hM4GSVV8KFXQeI,G+ReH*'d8NE"`CA$rlB,&r1AQ+CEH%+pLarE$1EH-bC
[-lN55d3NU[c#!(m%cTNiBKDJQVRCZ5XV#`#aRjFicE!HGcLc4FU`fA9C#dK0c@f
kh%flCGXcDb*p5PKBJb(IX&Z@JGa'K35ldSVr%#$r`6aDiaR+5230LiIX2-(C$Fq
j!C4kVrLLi,pHa6!5qr1&l"!%0B(@kJcf*SGRZcREc'!UB0J1Ec,Kb")89I&(ajN
55Bq'VBYK+J[94JX(HY8M%4RaEi[5354QQ$rQbQ6G"D'&p#[m-lbT9L&'N!!hT)q
l-ID0RG5K,fNGJ)$A**)PGUB`PC0XJ!U6#qb2P,%C9$UJ[6ei)cZf82Vk19G9fl#
fZH[c9SNl!l0Jc-2PCBqaMpAcPG`HBG&GGlS&fjIbpYAbR#bCkJNkIk,86pIab9L
eAmZQGU#T6-+!(S`55j3TUlb4FDSbl&*HLeL["r,,9FT"1JCSG94+Q+`8dH6JjZ&
*"@61,Q5MDl)3UUSd#Fr2cHj@`HG'[b@c95d2!#Q@Mk-ib%DLUh!r!YS"6IJL20#
r@0@U8)q"-SL1Jq1q9FL**C(mAFf1GTdj5HLhqNUVh,+kddDR%R3pANKSZ"9C+a5
iErNp3N1QN!"XV,Va(c*)I+Qc"BdHki[de,pKmAR#hp,%&bq13(RNSLEZr%258,2


T(4d8UU@[PVK'*"CqkGBQVlZ&Z@AHrT!!MTV8HkG+A%ZCkccaQbk)P6ZpM$EXi0I
l"5*LDi9EG(iRf(U6MSqp6U2Z%QNLD6cBK'$&$[-Z83Zk$"kl4rdqe`Q(*A1l@aa
II!G$@IiF#a+c2Z"I8DL+QJb#+IZ((iHG4VlKipm,i[b0YMj#[M6DLQT)9"aNaBj
11[,D)e,C$2h0AZHSM6MZGFXPbGhH"13Z`mE)J@k"9*UMY"p@i[1QG@0@M3aeG$h
46r#12LT`+-IMJm8Sh2,IILF`J+h)CfF,ZKR)BbmBmc-abU2bUDfER5MD9j!!&YF
jE@!VFTfrj6mChl"AfQBVR$aJE0)3#I`')!m,aLE%P&kE$GDe49mBZN3HJ`F,bK0
dlYTUMCr@i!P9P!jlY-,qED69e3CP""V42DAL!Mb1q[@,RKN*-!XlU"3ZBV8iBb3
Q4mq0YTUZ!ldDJB!,A"'i,$da@j)d9ha56KY+mf4H)qX2-pYK538'%Z,HL2YKl#Q
!`RAhHGk,1cGpr3YDmG)d0DAQH&+Kb6-CTM(N(IJ8q'EF!m-r1Sr`N9FXC1Ih'Ip
d+mATYZ9eZ(Q3!*p2%c6Ma&FCV+aX&F)lE*1p#FNE'qR%rTM5ZU8[fPG&I*FTa15
UZ$I"L(N8,p,HRXRm(L9K2&S`,0&Jm)Z"+JK6ULKblaYmCcq%FrY6hAm!$Hb@4`4
BpU05UJr`lZ-$pAh3VPjfHYq*XUB5b[%UZDR9#2%([T8JfUc,rlh`U,8Gk22IFRC
Hd8cmd%K*JA,+0`'Z-hk8)443$l`P(r,Vc0N$90mLrr3E(ShP*EqEI+mX`h&X"pE
bid1rJ3R95Td%9!U[RfS#&A6Qb8-S3G5S`qZ8&C!!)),UiXFm`apqDjN9rM`EA82
iJdih$J33S5crQ$BNY-('3)$HGD5c8d"V*Hp@'f&0r5IHqr!49ILQ3FClrIap*Zk
3!"LYVCLa4dm`iE6N$ABmZ#`ALdHQpkkB14k$`L,[NAaK#i"IjPdFCDh'pP$rT,)
1@6PG!5TrScr#N!$'83,jEYL-kabUYIYai#bhA!F6`+5B,)P-$jr'(P8iCC[ZB(U
#VjLJc`bFSTRTH`@F2Kk1,@T*6,jBNTT28Q5C9G,J54@-E#9PIlGN$MZ+5KY200)
Ib%SZ8(RXJ38[lNBV%qCD&j1H%#f$*dc95dqJXXVISRS85pTX)k$0,P49fFqeY&S
eX&+Gf)HBYfb8@31F9H5k@KheFrEEEX+,1BFi&)PVh3rBmYV6Nb+'&0(iI%X`QHp
pGY`YVU3K##VYVkZV11ZAXiLHN!#8d"5RjX"BVPfL&N6G0%TN$rQ9#EEN%HBqGD4
*#JGk&DJl+JHJecIYd8QdRq%#Y$hr8&l&Q*rjL1k3!26P+f``b+2a03-aFd5b,3&
aYEHXrKm4HRGhkZTSH2d)(dZBH6!HY90AQGV$bQE+'m6!T4`bS6[r0GVG*I8El3C

-*2VACNPb8$UlJ(!G0"arkf94[,AX-8@&bjbrj$,,-Lp9%SikMI&bL5*RI004"4c
8AVfFmfqUDUL4m%&f3%X!3`T%f1j'")&lFrTYJK",JXHNJ@Q(Y&T`L*()#&r-Mr,
,P+,KS@(rYUB+Tr!JE@&rAGI'!$D%5HI[b20drJ*de`ZYl0XR-!)(UJqk)j&P@G,
B"([GEJqKmfF$BQ2#)E'Q"TQbM9&MH&'R[&rMC#18(&i$h)N#YQ589r(&$jMDYVa
Y@8AB4f61fk+c@2+`(dZdj-iNcc%ZH1[Z@cifGKfZLJNcC4GpUh*e[-GV3F(k&9D
$NdVcLem-R''#jFV9d#Ci4N(5#MDbeFLK%!G@C16P8i3A+JPG'Gf1Lq1plQRLaKc
f8A[fjM"KkH-H,1La[lZZFb'V5lK9#9FEX2PX-+Z5D0#[(cM08i"jXr0fF2eQ3a$
Q#(2k8)6IAhh**[hPlC'2G0YD+P@l0&9HI,(MQd"c!#k)j4!ifdE*[(@&9h"KrZ0
UHJ5"$)3fi@5Jfd!41`*1rRCkQ$G-6l8rPiX+cG(pDP96%Q9IT(L4+1T(%mqND#c
J%Vr+$DacXMim"UJ5,Kp$(Z*V'0@@G#S)b8fPL#,DD5XdqM1iTL40RhDIMVYGfUl
DNXSYA#"fkI1A6#BFJZb-%I)D2eA()U9DQ6YK1c"`r'Xrq3erN!#d'8XB'HCad%[
jdBjNYR+EjG!8@[LbcV[5Y*kQd3iGcH[qR5a#N!$!X2QVY)5T'e2p,3Vkl#GcIkV
clhT)r*kZcQ"4[LkD`2qeCa8cSK%YIcL6jBE(Rm`qKIV4EC8b#Jp9H"i,RjEdZ-E
+$0+01PA2L6-Hck2cL4DCD2ehmZGDb#GI([4cQC`E"5XX8bjX`prQk)YS+ka@paT
CL!c#hrb0$af'0%DpP`'YH,qcb'p`LRd5A0i-BfKkK5p2B4[#(,DR-!f6dSeejHJ
HmS)#64ENXXQqfI4FmVNUYhU!8bL6ah&'Qhcc*DbII[+ji6ZQe,3[kd&&4$H00jA
aZJM-ff-Mr!0iAGekE#)*"epF(&Cii6TZ-kDZ*!YbApmSYV9BU)08fNDd`,%Q0Z*
D+3c%1q0ff9Y,5&PC3S$b1#@j*chXb&@*G[brB1jbpE68GEE4#Ml#*3ZCaJ)lRh"
DlD04hAqS1dfLY19e#S6pRQr0qIE,*!)#+JZ`ff4RjV)$4"TeH`j-(1%,kYdk,!@
ILX5S#p1[`bHi8U-6E$a5i@JXV-DZMD1D[c9UI-k+"P"5FUhFQU53!)`E8L)Y!rE
Sik5T4BQf2T6l%ac8`&+YZL)XmbX1bN-+N!"e+S%km%pBM-)FQZPkbkjBVRbkLCj
Y+(idXd+BYbE5QKUm1[[M6m")XmmQX(,@22TpE%cD1Nc'+9*EjAq$&+qZPREJG$A


a4emGRqQ29VNqaX!bCT@9EUPCH!NJ!N@*3b2fCIMFZ$XFa95YjThQ"3NjRZ,!fT,
ep)%-DfSl#M6d"6LF"QQkYJaCa38NB0%ipCabYBr,-1LfrN$PT#H@+Jlih@kGXP+
cVB0@`9e02"rq,l9"`1jRaJV6+9jpdlFFbkX!'*40Afr5TVS*!FD!LiK%Q`3&3ZJ
#`9r1dN)JhpF'F$$E$"NS#3D89@fbR5M2Ip8mVr3-SlYe*V'4PD&RAC&a$4IA)U+
B5H"YjiGr6@4T95--CkVd'-S+HPa`P$h1fYi(f#ZL8#3QE$E[T6EUk9k6fk6K`Sr
3l`eG1"JR"IE%#EbYhr6*c8KfC492L0',)b)Z6U#rS(e9@CIf@1MVGZ3c"#,)Qrl
5&-63@ih9f"@M(U@r@)IF`BdX$iaPk&+-CeDL4H-)L62T,fIhMVC,Z4f'VakpJib
'4EqkZE#kMkaTYC)ZM)rSfdI88ZB-pkH3!#+@IeC,$*),2La-lTdVpFm`pi14%34
iYQ+4c5idRU1VVABG6U"4Jkpbh'QY+`cl"RB)C-(a-5!qBkii$Kb&TbTM)k@C3d`
l%6RMe@[R[%RX4iID,ceFErkARL+rKT*e)N*,G`%UXFj[ErHP'$+Zi+@3"!%!!$d
!!,5KS6qdal4d!*!$b3!!0EX!N!0b!!hP13!!qB`!!"CD!*!%$`"0B@08Bf`J690
-,Xq!!!#A[%e08(*$9dP&!3#3$i!!N!G#`G85SALlVSheFKi[2H,GN!$TYB6+EZH


KB2IdYYS#)!ai'fB6hBT%(!2UY2HIX%FI&0A4p[KU9$*AL#4$i`0J12CBP*VaF"m
5,[)@LXma''!95*BV1k$iH$G!XSaN[IAq#c,V-!&61BM5CqcDp9,UKj,rhli@SB2
F-EBJVSD+f"mi(ckFmc3%d1)YS'"'3&*03rLVFHCa"1GSM0Z--,l$)pC"Q*&Sj,R
J3H)JkS3r)YTfU-+JF8&RchX,P+'))E,c!@Zb2MMFrY#3!*[*4UVAEmN2C%QNT$"
`J`95i5J3!eprCV(je,aEj[R2ce(0"ERd2RFVI9qYJ1C**Qhi$CX8H(CLGb#Frf!
lpqm3)NPPE*dd@,B"beYhUmh+K)+`D[reEYA[U(+N-GQEcDiq[##rP&G!DmZ"c1A
C,NH'1Q$%&BFU(mr)aI"jrkAGq!5H5G6MRckP94TPA'*KLY-h)8mE1R-#`@5PN6M
hZTEj[kHcaGk&c#C#JmFi5Q!chmVqjdH6,BKd%q[eZ-+SU4+fR8mUK5Q!)`XR@!p
8DIiT9PJ*JNP5PBkV$qcbTG4A4H1jP0(6f425N4jQ8c&'brrbR10'%-2-HpC(1FD
6!UM)RdM0Y#2eRlb+d6B2ah+i%Y[JCILYfihkcVF8"8mENJ"GL-9@Z2VNeU$"R`*
Q91GjKZ55"I+l0SlPP,N,+R9*(FqZpDXVDYV4a3a+&4V$I94j"482qcZ,'B+@aB`

Ui5a5MSpS`bTIB[[L*PfL19Z3!#JV@LArZJUJEAhcBGG'CIrS)%q6S68RDP0*BJQ
[-"k0cLaMqp@*cq%D6qmk`"Za%b5PR+AKNQ4U!X9dFPNhX&2C)*DJj6de4Y"e#*S
U"4SRXc*dj,caGC@,Ylm46&`0[!lM&kG)YCQ#c4kr`jZD@#8e,*13!+'k+&FbdDa
2,SH"j$3J)aefY3de0B*'Gerk!mC@M6dF)l!M3QAepEBNk9KMeJBIZJp)GF-D0Gq
NXG22[ml2SKR2M)D-Db&mk),1&@4hS*D8"DZUZ9DCej9@V!eLCr(lLUVpHXB'kQ3
K243--c*C%a#C!&XalC(GqAdCjG,*b8`l-(YBII*Fp-!UPP%lKeA)dAIDTGdajGc
#-F"DJ6,$8!912S*KQ9k$B58jJ[8TA-C[9R+G4+mXdTUPBN*@,SErRTId%Ekr'kq
b2`ZpeVHj3h@&lMA+mHGje-m@eCCmlFml6",6SeGrMHV!P*Q5"e#E*QU0V'iq06+
p%)J+QJjF6C%,83NZ"![J'%F)5qE8(Rj(Ek"`j*@8$eY#86%T[LQqHj@(KVeEl55
hDbP$KS"669Z[J9*DJ#JNHkTYlGh,62$!'qVE%PadD)[+AHrPjUDp%,5@B1G'l%K
%jKU2`fjFK+hl+0FiXPl!,A2DD('M8PJmAMi)ama9pc&NDBI69lZZT#aQ911i@YD
el1Ze!`X85lZAQk`pZARjRmjdZYCJ`PFN`F[J,kIf&fMqhQ"D6Ril`q5YlRdT(kH
lj#k+l@"dBrGQQrGjGIkI1hHD#acM%&FaJhcdZPX%K1m"FiGj5`(R)f-V+6F%Prk
L'+TN#!CFQ!Fk@"-9miaK5r03M+2dc#XP%hQ'2j[J2MINI!Y15%9kfAXajAa"!q[
qCZ%i4ahb@FRe4X#0R@Vj&*hQ2&AJSf,A-,3VV34CR"#SACbXAcLYeLcN)3(4b$M
9eS[C5ECA'$-pc[b,aQ5J(XD2MZLiVSk4'+YpQ[@DLqTmqUmhD3VaXR3e0Yc98NT
MJb0M`51ZHE#SlQ[SA1A+KHCIX"Z!&Nr-G09IJ*3kjI`iq0A$BY'IhiNSA''J%IL
lP9@96ck*(3A$8(MQ0kr4)Dc%N!$GQZh8r@ULaMK+3CPXr[fL"(,8HQ6CAqBNmA,
2%lUm2acV5TpDSMq!b06X8%DJZed8f&MHmKNR!KCYJarfFC0Ic091KfJAb(#r6("
+G&C+C!BlESZK[!2p)3`jpl08(H!Qie*&mDebU+TLbh1Y&QH9lG%+q#jD,[6KK#0
*TpY@bY1Ih)hq(,e!dk1bMKTH%ecI4QmCeLSR'G`b`c3Z,EHm'P@9#XCr09Lfa3q
4D36)p$[1N!"k2'L(MVL-1*Sma-X"2'C+"K#&Y@1dPQACY'!a+6#M4T+`6pCMUcG

"qN1$&+(KVaX3[8ca8D("-0$ll!PeZRdk!EY9J(c0rklG0!D3!"8qY[3BQ"BQKk!
elcE0aAjMN3cQk!RMM[NC[!rqDi#LRkfaH%,N*a`D[bE&ERA@me0Y0+TacIp(jAK
4I8(a"%ZjD`&M3TSJ[lmJ'h"QF9a'CdqF'AmMf-e#%"@M-p!`!rE%IRI-48c!,l"
,9ZJ3XK0B3$lRhilVJ(C'9IaJ[&ae*@)9Xc%D@bhE2X+['9DM*QFZ3$mG4fFLb!C
[d%mKa[&Nf"qd8$F)MbD5V8m6'!h2&"T(Y-[HAAi$Adji6$`f[p@)HR0A2"Re[&c
EXHHG0LIS8$qGl5H%4JeQiVTH)-+-p&jjCfX5l$5mlj54AY`l5!L@Qih5$Yrl'Pk
Q9k%U-LDdK6AeklC+Af"d3'Q-&C*"r9H`khb8kq5i1G6'6a"ifQJTAd64Sh`XHIH
AVd3FX@'[dp4!VjkfXIQaX@,9M-l0U%hN5EE84Z1D!k[93*Yfq-mrTBX'PA5A-kj
I&!4`M0Zp6HC$D3K,3UELb!iSf)'&P24#`FJ%VR2qekYB(hUkD4QZ"M%hqj-l83q
S%%e`Zp94i[Ue9%269K`")j1SYEd8S([El)*'9m)JD3kY-$[Qj0*JH"0eVV+,h!Q
U@!,M$(Y&9'DG-pcYZTKZb!iT&)9Vh'!(9MK`5!hV"K%&MMPBaL9'C1"&E8hqmje
HC#P!#%Y0MBc5A"Uef%I(#c2Bhj6m$rDCl$L)L1f1QBf+0a8-YkA%GEX3l23rDV8
MY[h60ZZ-pkYATLBREfYLImlkJ@!N9$GdI15X`#BY#dk5pU2c3ATjQRGRrH%N#-9
8VR90$R@JbPPL`H!8-aCeEHaSNJZThIl&Y-Ec[iXNGfEbXHiN!RTBf!K-NckC8qK
UI'3+qZY4c5[4CF)hjZE@6N9[L!4(p[`$SXkb(dA)2rl[H%PVV26#(a99Eb`Mq%1
*LcBkc2'5%'3V,(`UlYA'I[%YQmb-5SL2d)15icBp29dQT5EDJjeAB(H3!$mU9'(
,DF0a[UPCPmf[4,5#@Ma9'N1D86#d(+DLAJ!Ged"NJ9#+pXP#+rV"!VX[E[BFNF*
BpCrY6r8b4fSD4fCchZD%-C'202hPP1jpEDMNbp(-(F*SA8E9hCHlbNb'iiEMN!"
SY!rfAm1FaLhHJbPF$K)f1pV[eLC!m9apKMV)XNr"1+je(5*c@a4&5YX21ED#'U`
LX'DYkN)diqFLi%d5`@ND(KiaLPBN6qehf&+MBihDl01`AS0BK'9"B%jl33eE$hY
`LVd9Shi%bV'G%f,dF8PI)(5Y9$H!(UG(h9`T$@Ade`K#MRlf2KRCYN6`L)&MJ4E
mSI1GVHU$YT2A5'iSMVA5l9BN8RC-3UE&%RdjlmXl#IVJ36)'&14hFf*k(002X3S


FRAamS(H!aa#iaBLD!0#P0F'$1ELb*feE*@qm6(2ILeHa58I3Ia"CU'3)lhmXjEe
0Bq8kMfAQ`+Q(KZ5jA2kmAZ10i2iF%mA0Vc(8$bbSeha6&CVf,IhN[Zd@`m9Kdqd
FP)pilSqN9i"dbEG*KREZ)f["8D#mQ8#XYS$HeqBZSM,LS[GY,hqJV3(Qrh9dE@Z
)ALmd1[4[FI"()Ye2Z&hDB@XXp+SeQT3pAS33H4E"iCXlD0&T++Mf,eRhC[$0RS4
Rp6jM*'0Th)NpYCR@hB(FNTKXHK$L&`jS-QI'*m`Ur5efp*P!Yb!Lk1k#bk(ZdjQ
)U36!DA()GRfI3h[G-p$f,,CER4Np`qiEqYBr@d6ENXQJ(*q6)f"L+aU5E#K@f(@
kaRp0d)51PeH5DB-lAGDkGq[6MK6m-J'-I%5E@jY'6EUa&[[LSXAG'PR,#i8eYX6
j06PRE2dTi3PQj(@GkRpTV[RVGHS`mU&+l)Z+-KKaEXH84m1K2)VI&-Zhfkh@m3E
FfLcip*i1hm9CBY6qQSfT%jiLLEdBAV5E[YXNCM+)h`K&m0jDFX1'4@J@pkZ$E)"
q@BU+Ni6)L+03P4GH"!H+!$hCjr)'X1*!a@M`5"KaHcAe+G1)(NdGB9NX[QSfi#6
L4AmT6H'pR(RA6Vkpd9A#-P$iL@c4"[RN-(CQ&8i!c!BTdf#+)Da5k+8(@aNGm'X
IX*qrFaGpZmrm"I5pe`2JE6Sh[A4MDP+Z3k@6l,aZd)F@5e`r1lBDf&f#G3EV+Ba
XiJKI@TZCL35X$ciC)JP*VA,$I%$ckm&$Ap28HX(&`VQYFkF)T6ASL+p9fX("#5N
eVI@,VfS2q1A'XqFlAqDd8MCGCT6H0T@MMU!pcBJq+'-Q2K6&kTVcbf!DMZqfhmd
4'85i'L'TTXNdhQC(Uk[3G3Ffb(&#[XNM!'$G3SYpTf$*`"Qp(ehj'i11Sh-'C@I
Dbjr#LE,fZ$&+A5U(iV5rq$KJb`Bqr@3"r0Jk5)qUVpccDE0B+l!CVSNe'#UcI!D
S$0R*&dm"J`@!R$$ANlZBbYecPB*B$pHj3L[Y&K8-[VrSjp+B-@9)lk1mPIM@%C!
!R`&&h"MN`IZ9EDB&aVK(B6Ke#C5YXq*8,M49[DM$P([hI0-4dXqjHfdC$45Hmei
&@eMV$9&+6qY93d0+dSTY8F)%G5jk(X96X1r*Q482V`!HY&@4IS2LhM,LkKUhGT0
6Ulf@-Yj4"k!4qcepB*!!IAdM2k8ZXq@&ef@,Vmb+AYm0PbKGBF%51Y#*PFUYP%#
[r@IR5eTbX9b83i&j$RLNE1DQ$p(5H3!Z`k*'hqbD0SAQ0@!MDkRG5b9ZM6b`HA`
ri-qDkNm&qrZEi#m41aLSlkC9f@hQUBC+%**fZIB62KbXNqK',8Xda'lAhdeA,Rq


RdYV[J2M5FJim`IVS8&a(d3U)q%[YVecd$Xc,##P0a@CjI-p`QTBIYlaT5TN[%rS
mT2Hq--FfPf&V-P[0)D4"5+U2@U9,'C!!"NZe`I'(+ri6eVjAFYih@@-S,U0[9q@
Hr4dr3ba3h'aj`AZFCabAQdiFI[TlqAS8&QL"+(50p!$F`D2&QpCTp-XJ(D5`Naj
*#Q&bVX`r&-pfJp@Yc%[Sq-,(HYLm8*5'EjM[NJbHRBN$BAhYGk2EUQqqldBTMV)
!rI`N,M&bG@"mRRdP@bViI+KSrXBShZ$H6NEZb"[H-+bBiL@c-D"DDJ#*cSZRa,`
@Ik#83cHiqr`I-p$!"X"@YJ0+DMm*H1Fa[QVDXAZMif4,[kEc0MKKmm`CXZ%3qmp
MIX[cX+pFiB!(Zkm[E0VerEU9JEi@2DKGI*5U@*NG(jA[[4cHKpe5Gq%"*3a%YFY
-jjHdeQ,!5,l'KmHR)be-Lm,@q*!!JepD$LHk,R@AciA1L)C$(h!cb43IYJ[2U+Y
fJCM"2NF4HY8hT4ZVbHF$RCq-k3KCjY3+DVp@GSqM`BQrCJ618ABfTSZCF")(q2Z
fQPfV6)3GmY@VHP0,!!2Lf88@mMH'CK''2f1bGGKNQ-"dXCdc@KN&6d8ibDMU*b'
IC(@E(EKS[Y+HXbM&2AAY&L6PEJf%F$"J-R-PI@Vc+BhL3@G1-aXSN9(6c*B$%dF
[(!69Y&2EX-Dh-+6V%X9013Re-P5dc)I#(Np,Ga,l*Ghk")Uph`(,1jd8e694I9m
1j$$"9hDerIZ41i&k0%r2UPbae2@PhIi[Th5-0ABcD21Nf'J68G5hk9(c+,h*G[c
pYF5[4cd)D[MNHk$XTq!9cLCDpi*id1Dq22Lc4Hi$h#qPP#!$Y#,&$DS4!A#h63(
*P(mPQeI&S!eBYMbN#Kc)`-8YZVq%-qR$!+`+Hf@3!"$Zb1fH%KmD(cEpFZfkHGP
-`$d1[i+a9(,Y0*!!!D**lIY`QmD`Fdeh*+Pep&P+$)*b%ErH[MGGcQaCkp(!!aA
8)DQ+S!2Z$aj*c6[D%"D3!-K5&D6S$M&X5,@B0Ip(L8)@J,!$EZH-4IP`UrD5c%0
9hA)5fVN9Yb33"f$TPV483jGM%SfLG`i"-A)Q@LmM$``,T@h!C0r2$Gba)3q[9fk
3!&kU0Br-fMSISK+T&id&J(-R)j,fECe#%iQDGhf&qQZmha2,h8Gf4qXq8X8)`p,
"0BU,04rP*$!DeMH"ZEkkK$$88YT5$&P0e%,ZlBj,ZQIR'E!&qC!!QK1TQF5K#Sp
Q(HYCLj2@NAE#(MF8'f924E6e8jE"(@QEZaUq$pIFijq[D##k'Mp"0I$mTc+m6C,
*PGB`!L@0!8q([Fhc8!-%q[RIFHeFZSf@&242@I2q)#Udh2R'IVmm8B3D&1BDLf+
)FT5I'+Dcj(mmejQ*`QfPiNlSMLThdFJ!UjkL"@)MjI@#m12USZEFEU'HdKJXe(-

c@1G*ZBT4J-cP&,XiLLE!9*SABVeH``$PI99KU$Mc(50#@Z#(fKD`j&NAj(pFjB6
pBj1aE!rf#mYDMAX,ha4@`3T(b9@3!183De68j9M@[`p@%UE-Bi"0D2h0j+*HbIY
'(2L%J9F%cTGcb&PkheT#NM+9Hh&6C9+Q3*jbAShH@U(kU8ic-DU9Fi4+e9"3KpZ
lf(R!PLBKHC!!5aK,FqZ(L1l,q3--ce2bCkpMSfFS3rYTQPcrc2J0I9LiHf"CHe1
-6KF"'AC#NJlpiDA+I(qHZVP!(34eR'QIKjNU&f!dRe#q%,$b4fb"haq,"1i2Ed-
Q"0NJBEMYbU@!+Ur&L0'&!"Qjac,$@I4aG(jUk3U+JCYm0Jp11Z#h#IHm$)T+0Xb
-C@m5`9Z&("dQI)F,[BRPX#KJV5l`4@i-F-([jX9XR`RlcK-DhQBL,D09+c83%(Y
Bbr+9(&5e6Xh*H[KI)+Q9X6(9M@Kjc!mIPDKd*('aKm*)cq)m%3KY3mi4`1jacHc
25EA9CJfEM8FFEmIaH423T+LX)3bdPYR6Cp!9ac0S'DR0QN@VC8)qk!SS#+DpVT'
FiZkVd-pK@2NRNjaXKf63C`@c[X6Fe)H&B5b`iB+N*ph8#rSSqA5iTMM3BpcBImp
C#bDEV-Za@*XK,dlAFj!!TXe,Db*NYlQRaS544#`a8l(e6FZ!$95SbCp1kG'Ce96
VZjSLZiHa%*S5rT'k%ULIBE6S(AHZS5+mJ(DTiGFbA%K$1q%%`ZVaFe40!SI"M5Y
"HGU(S(AY`U)&U6XfJchUb!HEJEkQ5UYK85pRRU$3`&bEP@DUD03)LNaj!Rq@f(@
IX$c0i$he#M#Nf(+#rX[9JD@bK*I*-G#pf(&&5f'rMD@29*0L5`Sc2ELrKTpP'T!
!0FBRXl4rUY&TN`'3!*pl3HjR&@hBHB'*ZTQ8U0Ek1VJU4JS'`lKj8hYIc,*fH-Y
IIC[,2%Dd9hM(h[8AAZk(6lFa9b%kR%1CMU(kX5P3h(L@B33miTYB9a#X2'G*`hV
Z5rbb,Gh@d9@P@Y@XVL6f"6!femcT5fmYpr2qlGbH[%B$8X,mfC%"JM,*6XV4eF#
,pNSRkiH@T4(K$4STQM"6PZi0V)!D*k*@BYDaALFd1`FCP01LUkFGlDJACYVBfMC
KfdUkmbHP"68Vc(G1dqNb'U`8b')kk)UI"Rbr1lR'd2mTa*+!eB*$M,((ab*R6I,
hIENAm8i`r!#PN!3"!!""!!#dSDNkY-HdE!!!(`#3!dj(!*!$FJ!4[0d!!@3N!!!
B*`#3"!m!9'0XBA"`E'9cBh*TF(3Zci!!!*Hm68e3FN0A588"!*!2J!#3"d,"e*[
NQ5PPB(k"b!MVQ3Um6kV5IVS@9jdaTUYQBIBJ9jD'%2H3!'1(cUbG-d3198EqHdH


"Y&"%+@Ye[BDJSH01*!'D9,5KK"dLDYe+cfkNj24GLGRILEbR9qCAa(C#"m"j4Jp
R8bA,%$8I2(CE8Idk"+3-rLX(B')(if+Dhm&VY8AQ%GK[4A[hCE`U6h--hdG(b9[
RL(Hk%CFGY2K@dKhDDmD6V[#X#8)%%pH)&D%6"4MY@TAh2,S,9`T"Ef*8@2+`0-L
'YpTY[VVd,*D6T"I)*be"$efIb9m92Uk*E'mJ8c1PG32REY,-p2T%p,14U+UfS,H
UU'AI+F83'QqZiHN!&[icIE1Ai1ZAD)q91ce*0%!6QYHhS[hYr&Me6qA944RpXac
%P"PJ-KYD+$ESM*EMlU28H5Gf6k6rr+"9((G62AU)Z9+UrJ!RXU)$QdB$S-de6HS
(T1,*@ccJU@,ejq)Zm4(!ENa842hfHAC+2&h-DVSBT`m9U%dJmIchAH9AQSGeJ$%
1qZS,+hH3!0-$((JLDPHJNPq[ST1[iXlUBQ!eS)eXfRB@C$2H"pK&,3e9G-cjaUR
A6SbY4QcG22`e2am*9##l"4UVU5iTJ2YckHYDPc(0%TMNf5DMak1VfN0Q'N"L*UH
N(Ce0-6me95J!,&-Y+XEQCS$PH[bk&IC%3&)q@hlc8CS0H$'rM'Xqc9IHrbB`0iP
I%b5&#`5dTiJm56MXMG6'a%R+f'%$hGh0iQdfYS!cfKILrP5H'6HhmE$9NFq%aYU
bTTQfFD[2SN%4Q!U5beN,@IfGU'A+%1BaXpf)5@T408Rj`dr1kKN54CJl1bNe,DU
VC6!$*'ece*($8MC#pRcr#@@r"hJX)`NC3m!Hee(p4c"Q'Hjlhq"hY2Z"'Hl$5Md
@kG9U$K,f)*FC$Q3F#IY!)IeG,l!Q,,UqUkc*U-1,l5a@M1-p9[62Gd9I+!59Z1B
AVlp%4-)Vp'(Xb---"rkV&NX+GpYp*#d%3)RM9qa(#EZYFq-kiTTXdA[9PV*qQQ1
Ud,1r+$2*G)QR3hfJ2c![ih'bVF2!EC!!M*l5,mR&&XAdF%G1ATeeYSjH8[S$(Q1
pILG[,RahqL%8rdj$E%PlA1XqK1%$Nh!(h-q2r!"[4H`A0lhBL84`K0'i+U`+BEI
ThkI),TNB8I-rV!a*V#(M,h4j"-efc`3K$REe0ch8*dP3*mc@kV84pFKMr'JS+MH
2Q5-*"G#iG#1AG2,9Ib1q,J$"A%!S#NFp`1T#"Jk(*'0F%@qPFAj$iUl6&Y#K")a
Y6IY-j&)k09ChAf*crUHRQL*IqbB2UXMbfpk6IUpU!+HjlUX#,-(la'`!FEN&8Rr
UUaGfb69YRhq6%-mM#G@8#Vd+pF6,`C-LrqLbfM&@GiUeNK#**)K[qQI9Yd%bA,,
f%cX!H3[rbJL,A$JGEZ4"S!(#b*qJ+hYTTj`lVj`4JXhDdj0Zl"&3V*-4d8MaJYd
`G&6ZcelfT84Aq2@1R@$@ZBU5(1&ecQ8j+q+)),HKldD*jBGcfJS8aEH1BaE(MFB

BXHBXM)d-TFN)%UYkHDdkR[j"@PTFI1VbH5*CYVeTd9,hG`#Q`q1((1-mUEE5XJ&
f8ri$kmB,kYBLY(C[U`RbM4(#Y-[qeFh#[[8Vf"'dpX2a1PTSFDhp[IhSJdDI[bY
R0eId+$@C[-&C9#!+"dC6JbL()M`"mCairBS,Mj+Mp$SeL43#LpYqENCPT*G)bUc
iVUhS*S8e)8LAA5I&5SUf[iTV'bpdi35Hf)i0ME!j$rK8m$Jl0r9mh[4DrYb[BDF
e+fic2bVJ#*1TXBQXj(i@0G![-%[aBEZiEjMPGj@eDPCdEalb[*k2`TB$l4S`0SQ
P1S39[VQQ)Zkc-Y"H"UpDKG!TD8dhA06E1kChFV0UcV8Jq*j@45bPe$P0eB@9Hcj
81dM&$mXLjeJ,kQeP+14Ji1L`fkC5%GZ!FC%@Icf@i)AK(Rb!a9Ehp@%"XK-kc(X
L'5$9pH&SfkI#dVVZ(8Qb"5dVMbMDJG(1H(#j$V+Q(J)E3ViQ['(,c&qe'QmQpP4
91%iH!UYAF#[&lY$U"Z%NJPrQSpLK2+&Q+L9c$QcNPmScR2h98Xk(50pHmSV4dIl
CNHPkL-FZ&BXmG@I8'4#iEkIj!qb5cZaDlLc)QcbrjLHKMedPm+hqBNf!8pf&([A
PX'YHRB%8[#`G1i83&ITF$YP3a14(GF0ZB*F%#6Ya&$pV+r`Jj`,dLU66,$*dVac
0Td%l%*q0YeJ+Kd'`Hh*jjZQQU,G2RK%DAHM[Y(h!YRaeiVb'$Kh6K"#JTl4ar2B
8aU3fe**0+Ip"2N,*da-@C+dfj@598XHf!*j9+Ld`KEEZh""b1K3L@h`bl#FKq)R
(CZfhY)AleH!Vk5Pd$h3XE3)Ca8HDiFQlmE*)UG6IlB%iK#lcrZjelh(U)LQPYAD
`,FL!rpI8%CaHj%Ec$PqEJh$cBZXPmMZ-@E8#ZE*qEJT!!pKQILQ4NlaKJGF'Gc&
-#CarG52li)CIjmBSMjLq03*9C4,8[kNR6"G35UYN8hL42jadU%m3%mCm'maD[T@
*NkfiIe4A4f#lE5afLpZCf1H8DVq0KGm"m58d`ClCV&H#3Y`B-GIB9i-(,EQ`L9m
%8[F#-4TGb#`288q1!H!8AR0J+YiTjdpL)5"+Kq6&r%[[pLq@r@2k6!apk6BQpFD
*,(a-9ed2cS1S1*rVRd[PlhG1"%SadSCGM84&kChh%3NSrP234i-RIUfS!R1CK%!
FYN`LBMUUDrYIAC65C9,q+%3PY,%-pCTP3[UND@5jl4fCJ'''A(pIJaMTaLK2VZ+
T-+I#ld-3bk4GTQil4C(8S(BQ&J&22,VHme-Kk*e+%kAMRE!VJ@hRBP4Fd'hLr+G
q$2j`3#ZrIfhS93R+cSPbKTI-"#e*NLG0fj5lh`C!iJr!AKmAjpY`K2D+53KlI8Q


2NQC62kqCXcFG!3am0!NNUY90H&m1qfXQa+)@'b,mNBpa28edf81U[)cJU@,!Q62
($0fm+3G8JSD9+aYj0Icf%k,e#lFiYDVM@8U%0m$&#r*JarJU0-Q(2["f$i49-5R
He@)&HfRXbqZLrYi#q6i%RhELmIpR#RpmVNLhVPA+EcPIjJ1-(p$qRJ2cl@Qe6&p
j095T5mV@ADB!'qd9Gb'If#D[9#BMll)[PD-rA324+eYNaV'GD[UIAJHRY(bk6Jm
b-Q1amcLep4XiI'D`GP26PXJZ1T9i(6f!RKN$hJ*D"1KL&2ALkXAMmaR),$k"Q2f
"E`a,8fK'b')9HAe4*-#'$#UAXSDjkNMMdqV+MM0kqf9(cQ#cZK#[[G,T"0M2IX`
P#l4XMJX'`rRdlX-2V`D-2KA-%"@"(5qG'8,k4DB[JqIQKDbU'i#4GLLZDKdIP+b
IMaMEGPPUU#4"6[GbVlIIH6%b`e16Kj,a5GP,hMp9@pdm*r!'6Xme*&XiJEAR"Bq
jc4Ui9mYUVAP3Rji#'$B52A@SEDD,jAMGrT91&C4-`Kp#IAY*(8LLbl5!3)e14cf
Y!I%DMR$)Q,H,Pi`RCr%HhC43`d19KfRhqeIh!!a"8TD0iGe2(c-b%FlDFlZUCrS
(DKXikM4Pm%SmLk58ch-$G*kU(-P-m!Iaf6GEhd5bf#3#2cj#&rI(&9,adJN+Yqf
8P)`HSh$[NlTTJ$C,r-+qY4*MC('QYeG6(6&(@,@l%-M29"P(beF0R)XjS#TYUhc
ZZp#)m-e@X)Z9k6#R")L)'lm0@c(jY)16,5'$e#3lRjI#N`%GA1AGr0DMf"-))m@
'h,2(RJ2f"eIHV!)JCk,+VXQrak&9*H)5S98kaTcjXSRPE-4e`pR6446FJY*irIL
)YhLcGP(JGeV2i,B[YeD2,bql[U*UVELf#RIPX[X*b6I(laEQL1#cHq&f`*fhK9I
Fi-N-Lp"ZaIJTL&1)j6iKlbZJFUfb8ikA)Q-'FflQCGJT66p-2j`!N!$*RdE#K%,
4SXVVEfcUJM8fa3fBHaeCj@)#+6@Gi03*`#p6#M""26`eI-mLaN,S8lYpB$YY[*Y
YeY-Vi*Qj@4r,FL2eN`4`[VFF(d6lX4hqUmL-fN6&[!p#G)D)RUbX"f'r$pPLVLe
8i`l5SE)A'lfM,)Q[)0G+#r#8H#Y[BEJh$&!+9*U(8*R*i%9)E+N8rb5@J`66)Sr
0V,U$XJaF2Eh90aKBmPY'M-)C*(UF[[e'6LP5PJMkJhq(e"b$j0)&rlch@"rNJ(U
$q8lGU!%,aI4NMG2)'+CLlKT-VX63k6+`+I`dpUrE80@L(Z0r2C%5r!XTqmV"!eH
dd+,-!kB-Jl'HJ!'$%J,B$!j2i04RYbEa2MKP4%"TH4lR,cV5ZFb2HmGl!-IPI*c
+4d6kN!$&P+XkCeiMMD!M+mIK)@mRZC[F&`9%5RSGHLYS'b3KVjQeb(R205!)R1`

prcp)2U)Z)CHaIilL#+bX(NLDf#kX#,&6#dX&0IHTAM"X6@e@4VXTJH"TIa&@kV+
E2@kRcH2,fN%0!3l9N!"X%RPrT*CI*fe-NLR@r4"cIk9"-,qPme,bHNC,XRVEB&5
-ehG0J+rI92X(V2Qk6ZD+NI59Eh(L*`-ETcl03[hQDiF@[AbYJ9lhm6p'mQ)m%82
Q%RJ*[D5BUZ4Y'Dakc&HRmMb3!-,1Q,aL6rp"h00,%-r!5%BU'ET-NAIT206NR5G
fb8Y5Q5eQRaq$Rh#TH!C$GjEe!HB3jfZZee0dX%f@56aNpCi-l(P2XCp"mkQ3!*'
1%C4)%[F3Fph9@%P`Mal5lGrCU"16F$(3)LJ!Q+bH1@kC0**A[IZIp!Zb)Brj$cd
D&#bdepmjQNViC@(J9RdGb"Jd+Sb,IR&CK&V%B+ijfTfa-ZV*Uj,aaRNm3"@iU'Z
aCrQRlhFBjf-81C8R'1fJiGHN&N,EI266)UaQQ)qYZi"DQ&Mec``DjL$6m"j"Le+
(hV&iL,$Zf!3dr4DiQ54NrG*2[%11R4X3,8+FNh4e*-cFI(RK+$#lj90B@640#Tm
J`dm+EQK%TP(ca*CD!R"[[p0I')1RA"lCMQT!C%UJRY,eSa!NZp$!S1+Ekql@c!B
!HfaQA`UM*ZjiUj96DIB&D`lm0"@M4qp4@`+'rbI2f`3Dp!EB"KmmD#&Kc9FkrP5
Z2K&(-[V$)ll![q!rKD%Q%H*pZICBrLTe'CJQ)ZPF$0lkr%PF4Zc%NU+9ETj0*qH
4le,*HQBXPNDii'M&1)0)qh!hJJ"0GPa2rFh5CZqS(l3!j4GeJUqfG4a3@h,f9TS
C*R`F9U"&p&0*Sh68G,56pIjA[aXKPM6q1rUVpL`,S@k!$[`kD#3Im1@V+@9MF9K
+!C,@&&QEdX,mhep--PaRZA31$K[P2q`LEk*B#Kl6QdYMfYK531iiaCT!,'cIR3#
C4+'dJa[F4CSacKI5QG&8Dl8aHPr8h8Sr-4Q)E%!102R4X8f!mm8Jf#U5mY6&6")
M[%rfHiccSLk1pTG%NSl9`TL80Pbh'aUa*id"%!q8!R9-@pUj00I`CG,"Cbm5-r1
4QJ,29pV6*hkSDU#M5UaT8Yba!G[@GBZppRQ9PePPHUK%rkZEfJUrLQGEX"B,H10
Cc8MVpKT&l--aH#6R"Q#3!!,CZrS#@D[rQP2FrmaV8@cccAjh3jpm'c0`,meXfcM
JeRI*q,I&)km64(jYN[SBbIqcJqU9aLNF1%h2I(3L4kT,Nk8Y2X5Lh,8rk*d!PbM
*i#[MZ9!%#6VYCq*P8G[M!B"rBU!hqY[hfd)8hl9)!fAc#aYkS-Y-ZT86l-BTm%9
hK!ld6,AB1CP[A)4*%83RL)6pF4Ch0Q)#&,LV6DIcQji-a,R,F,Hajar'fp%82eE

H51-dQCETH'(aJl8M-LHLSX-2lHHS-+J(Im+i0iX`TC[+3Rp)lZ2b[b"NNQFD9)8
53aLiA1jGXT!!BddLX#+GR3i"T*@$!2Z9jF"6#+r5V-FD[1ii+Ic`Cb3YM8bcECC
6+bY"%[Sc`9aG&4SIBh)Kki#[jX#TI6M0q[XQdi'-&@Y0Zqi$&@1@qDbPjc#(C!E
*RmF+I""!2Qq&LA#A'0,LEQfCL-)fK+TR5K`UN5b*Vr0m8%aTXqXN(m5pTj4'fra
V)PR`epJHMaqaT!5FFUTrkEX(b`kAmDj+6P3JTH`C6p6,JqMUQR3"P&aZSC-pB)R
%L)LV$Aj,riCVJd6UdJ!$SmVH1cQGBDDLc'(ZNFpU@b2PXE-K[@9N%RVE@BDKKp8
jA"L[,QS')eDC*@$",J3C'q)S-RI%j`@CKekRN9XCj(ZSJi5dVKM-20#D3fShS5Z
c4(rd0lZ,6aHIM%f$HX'+FeGfj6FRG6&&QBl$YeDrV4ZFrpHBANXA-ZHD1$4PdH@
8H38*RG%i@i3Ver)Tr4XV!Q'J!,9qVqe!!h1C9-fa6'#JL!6XRJpTB@pc+Nkc!Qd
QIbrVcbqlfFjRQ`#2p`6rSf(0YRB(29@a(e3jH`pS[a"5+blaH!k3!+JrRRCamFB
BC(U1VaAa+4dP&LLl+4-!2K!1-!rmd3*qR`i%L+EYQ$bccmjEJf9*K[9MFX&E9K[
18UicamTB,8k!F,$AG+4#GRTH&+fLTMbQ[$akjB'KQ90!4+cSDE8TCTJ,G"dQjeP
Fdh[**dre54q%fi2*@A*[k@RQCapGpMc0P+6$caTc[S)2dhMRpm)"PfLR*Xc2EF&
9m#lecBLNi'b+U#&0c"`!SV59TD*'))9dC,cP)dq`#irkN!"m9Z8eeP,PHER*Uq4
Y-22V33Q99"dN"CpcB,0&KI'VZ&h[C05-!reF'QJ$+l[4MYaFa1[U[Ji,L)'rZBM
L(Xb`BX8`I&9YhI8hZC8Qp(@SD+MqEQUSUCpcETVP4IE[DRaE$+13!(&G#83kM0G
c"R'%R0AT!lGRADL+V-BrV*r(ipiHFJY1(KmN61aQ`Yi3bdi6FrEakmfP$8hDd4m
Y64"bZ$(R19%Tcc)YKE-V)UP)PFiC81"ZFC6TLKlp#C[MXSG+SFMAV1Z'%8630EQ
*U9Mh5GDc2!04b,NB&V1V)0LkF'0E9aEZDl0k$EUm!PJN1S#KN!$L-X`U04TVe2M
'R'020"!eq0Fe6rh6XdMB$!L#$PDE5U4(CGq[Amjm6k9JQHfV"&*1U5iR261,8PX
HLjQejH%I8j!!F[(h5(V(Aad6e4AfA#GGNr*0XDM(-XUPZlR+[,a%`@3hR4#[6,@
"hJSRpMb$4H+Ap)&cl$$DL[UGU$p3@6@-9BEZ(A@U4Ni"(kYLH'a(V@Y$%TEjI8P


HXGfRQ)FL0T3(-12)@C,$(rbd1BF'b13F1hEV)Sk!(l)BpLGJkT[S'%iDN3CVLa0
3jpM8SMQH$T8r+i$ec,K8d``(q"D9'YT!Le*EUJDMrf2)K8d#%raE%iL[Ra90AZa
c9Fi*YDIZ@c3XhM)VQA3[9bbaDjS9*JQLiJ2iTTrmcMDT8[TkG&!)!bHr[fTePi*
P3KdJL%b$12m(+F0h$cU@Hi&khQAi#+Q#UBd#9d5X38jPC#CL%iIT8MJc,%LihdP
B"lXC#5SM+Qc+BQa&K)jpcGBY+!66,KbhmeD1aQ[&dTbTbD4Ub3T([MD20KmL`K'
-AP[bFjm6$`YIP`G-3aQRiCk8N!!ce0"D30#,aZCMcIY$IE2K$QPXXI1*r$#Dlmm
dVrK`@JpAq%0'29RKlG3D&bIfI$AVK0Rb"0G5DV[a"krQm)3Nl2V+mV()m",T"j!
!j8DY$pN4P2S8I4ZZAh6I8TU'dZ@N#*-DrFIXEI&k'2[""!%5'0qe%J6B9FV13cG
8Rdf0-ii#Um,$FU54l+mCp2$24Y&MmqhDRIXNlFUb[(I#B$Qh+*'PBfQXli,qCSm
M`!TJ99F1ck15eLf@QI(E0eN+A#ZG!BFBhBbr"AKPfY'YA"GEFkJJ[54FUB&`jP$
hC$Pil!SArkF@-QM1P[fJ!Me)Q"DmZFNqfTFSDECk(GA)3CKD5'm0KY(AY)HJmmU
P5G$rFD`Z`S'-U1q5qZm-$F,fkNQRRZ9a$"lFSaTKikR86hQdd#N[F5B3Ba&26GG
%j6cLjGK*)a)T0$Yd130a4qXTI`BrI`5ifqk`!hLQfhZMM4Trq%$l"921q00QH9V
2&VH6L3,4Si)XZ2jlrcINL2b9d@@maDJ(1GE$lmR*)kpQf2Y'UQUpfdPa`VGZKk#
RiQF[Z$+Tf+XZ"PMKrclZQqX0c%r*#2YPcN5b+clJEi[C9MZb`#ES,0mL&*rU#*I
V#6KM-AUVHE%SLj)qJ#2CM3"9"!VCa&DCaLU*$Z9i54XT99Q5&Y3*'X@PT$@iZI)
9Qd)!TC!%!3!!2`!!Y+'MYV6(Y'%!!$@l!!##NJ#3!h)!$e(4!!0UM`!!-qJ!N!3
2!&4ME%aTBR*KFQPPFbl2J!!!Pla069"b3eG*43%!N!q!!*!(3X(8i[Ll,+1JY&J
'afJB[4rBRPmle+j!mC!!&r@qkkE0`!2"AS94-8UC`0DdB5ZPDZ#,Zr4V%6$1%f!
RTHLph1C(aL-T3q*h8JC83H+M`C9c'q"i)Zki56+3!$S%drKB"ZDFG0NU39(fX-e
1YU1L@+U[-0C*%'8hQSNPc[85M&*cqY4'HbZiQ4P,E9mYFq1Cfre-b1QYr2SHE5P
KDQ-rM&Q-ULC"$VSYBqd),N0rQ)``+QXK'(VU"S(NRr!`!J0d-)S6bbcY1R52Nm4


[qLN5%CL9M`P)!'KA3KU%(#lKfcQlE)`m2V8p'%k'BGVd-3r3#00IbMpUE"d"L+d
3"kJM+VK+YdY"fD5RLZpFTaZEqU%QHj8JDmAXh-8mUkrQZH$ki#'+X*83LjDQr3h
5DI6KDMhlF6d1LJm6'4dj'M`k&J'aC#rh5"kl@hdKE`3XIE)-DR`M'dfDCE-51i[
"NmVKR8@j4PS@e6FLSChHUrKIhIqq%Vp2[(aT2m`RcTGBGfrb8&4F$c[+BeM3p$M
(!pM@apV-XR29RV*,i56!*S9RS"i4l@mj1j3qTZV#0B)[Q1E&)`,"CA"V3-I@XXb
H1LJCbIkp3Cl5PIGlArjRMRa-5h9NLeUGG@@ANBXqcNBZ3Y0VNElLa(AYLp*26(&
bMciBqFJH(&E,&FljjB3!BFqMekDIf"X9XBYE1+h56ehj&YP*25+iMpF$b!piVRc
%b[0hh8GPN6cCbCXIp61bRD4kF1LKLri-`*EfUpd6T,(%rI"(PD8,rJTS2d'3!*-
dHRpAaZIpCi3@RHP5TpbU,UCK!!+Z-($"5TK6Ur5IMJLAiRcmGJjV@(jP@mab"'d
%qLm`@B6UckMl2+mN6EZMpijUL65k#*3F6903bDUJU`YHa4PM4JX-i2h--e)q1R(
,6T-&V[fRka&B6I9AVHS-%mm(&QNCGXN6-ibIK")-8X6I1l6fK`M@Ldpldr5+'T9
2R0a%5pCAP5-YG*KrVq5#,ZQ'YJ'ZB'"!mXCBN!!L*+aKqREM$Ik+Llj3TPG9BZE
dABqi(1k"mRp28!R64XlVT"H%0R)9KqT!5MR9b`VYfla"5pmHpQ)--VkXfMEeLKX
5*cT*DNX!&KpXek-k4"ALVK,"9eikJT2Ne!V)+Yq-eF*[SX[0BSf"+GYCDYK5H&B
cTiJp)0cpf$"jPf`!MTq@Fd`+*p&80EMX4h2JX&C#m*IkADa0(8)MX5"eqDl+J)"
Mq*(JG4kJM1r+0+l"qJHCS)-"SN31PK088Dc*!4K'kPQBJ9@%fQ-l0'l*'@jr,dC
6Ei669Lh#P`PdY'jH#qb'X%q!@dqN`)41)Mk8'Zfk-DJjhFhJUe(9!ccR(b3l!5#
[jfp#SGrU0*YF(`if9aUfTHe&LjA4)6ihU#-5CX"b[5HeUQike0&Hr56i"Hj%%&E
l!YK431Q"3ZhE,E)Rb-Up-(Nr*m&CJVZ9D9&F3"C#keR0f8IEkT5Z**fQP@F4VN*
%Ymaq*1PNElGPp#THq[f`JiD[+C3X"m11)`*XifMaQG5YplEjPUHMplY[JJ9)f9X
K4"U,Mjdp2i),heaZ(3IeDGfZhk"p)#YIX*YBf(`kRF!GVemc`DCViZ+l9EfFLZj
KNfMSZZqXRcjYDGrcDSSqM2G'YP6RXRfc'N2H#&&h,m$-!ekq9ZGVaA!"a)`@ad@
+4N6FX4jUaIfGYRr6jB+Kr8if"N%FEZb"FmUEI(3e8C@@-&"pLYi1XX1@k6-idDm

*bYEN$J#QED6[B#VR8efZC(8T21Pk9hlY$9c+UlbfU2-Fc`d43QeD%m!CrL9QblD
F@U25%T%H!(cHhEaLa`3b!HkX$I-II2-Ze-QeXrYG[&q8jff3!%`+"p6i8j!!Y)!
ae4H,B#R"(LjiKL%6"KX-P`1Q3c0&QQ6"M4B`#02PqAZ'PR*j"KCGlDQXcX*pfm2
5!25rKDB+d,,N"GDGRj4R`"K6EBRrRaj+aR("q$%pZRr65j6D8Hcid&l+iTNj"AR
l!DR#'V+ejc!S'J#rF!!'Ar%p2p%ljY0j%HJFR%5N53J#hF+(Smh)KKD9L6VCq&5
[8eA%%'5k0E,9#UR3c(jMD6Bpr9m2*18jeAkclNa(d)DRF"+d)dmRS)lV,#)$8HY
%9L0[b5-"rPrrSkk+ER,LUNT91M6LP!*[35#XVKJN'Np[5l)+[!dGXK4$Z5UrL90
'9Y$YjUP@mT%Gafjf,0hQA$8H!p5%$Q%)cbRip"JdJc1TCq"K+aGD8M5SUV**D+!
BG#-"ERZ'[,r+A%Z1RP$f$bSPRj["HE+&Fj[#r`Iq@P*90pKc+kqf$ICh2A),c6d
Za16Zl'c"Kc&ec@#LSbrh"Hb(82l+"G6(a,S[BJ0%091iYB8X8ND*Mje,@$GfC$Z
*ZA"'KAlRh@cIPd6BTPamUYFS(bE(lBU1TpATeGfp"AZla&IIF9AXVUYpKVjRdXD
+`PGdFl2@ISA8rkLReqY*E"66mY,fr6V6YR&!)cCj1baGK5Ni65dP!#N%jkbDk'X
cP8H0l05Sq-k!9KEFUB&+Ee6K3!"+#&Bc5QD0L1Q'U%r@MB8"A[GBcV029pAA09e
CPRp15Gi8q`%-,Kc%3YXT4$k5M,&PG#j0$XBSYBC#II&rHGTbRUPM54fA,4p("3i
UpiQ-[N5$pX!E@9J)8!k2LED2%Q@U2JC'E`V9"XkAdY31Y3lqeRd(5`!`#KiqAKT
iXXi+ESFrEif%BRG3J2SI4V$J3fBMH''ke5q$KDhEC+Y(9Tp$)Q(Fb1f`f)"604"
k!MDNh28k,,N`)*eEGCc-(Gl-I%RBY+T3Gc,KTJe[Iq9+YY4L$%UcFHh!`A9fPYb
[BJNA4T9hdY8$XIQY4M6"Qf9Vl"qq6P4I[kCCAb9lV6$FCZ$fN!#i$%UHK$#K&9M
F-DqbQrZ0L,,hp%HVf5B1``ffI%PG0)NPk44,G6VNe5TqA#YJHGhm9H!J-cH3!*&
I-3Qkf))Ve,YXFpDC-53Xr*0i3dL8AJHQB!mP&ASFQ9[hTc`j2)4C$m0G#bhUHTZ
*M)lMk*EEG6[UN@LCm'+A%,`3p&B8TdiJc)3l3@1@SmdEGq++1"T@SlFlN56Q*8@
1`60,lF,BEV+BFXlM'c3Yejf4Z`p-!rG+a*68,f%`'N`q65mmR[A[j!49B+ESP")


2rGJMM*0Aa"5ehPR8m5+@)ZmBUhdRI*8&pj1hU6)+0%NVP2K#JDV'Pa!eZM))f4,
PD0"R+8hJMHM6$'$5@N16KALdIZ2"INGSpTk)ZL8ZTJ`hh50@8$2LK1$2aC@ePdp
M99Qm!*pB[ZC9pSa,Tbq90BRPd2(Zb)h!#RXKBqBcm90-kXk2Npd[4B501A%KAeV
$CT0-P)R0Yk#`$$)Q8f4rSU,l'B*,l"G(Ec'K#01#)U'!kk0k'!V-i'RZjNek&L5
P*,K4+YYFCdjX5*mQ&,,8VR'&L,%ppe*lYRP4pkA1b,'!SZ3UQd"S+8@Jl!iUqR4
qBX-`#EAKj9lCY6409%!3mXUM,*',4'1ad*Eb&-BEdPZReBFU4qZ'I4Baq0Y2caB
AYEGHkRQ1JV-4C$i8ZR6dp1('pXdC5M8&hCeHUhAamFKk2rSZj)IfhDV`DKGb'1j
"PF0qF[2cPJ@UE1YI@Y%hkS&&#$&#kR)@fhYDV!URT"P988"TpMr@S[3pAQ+1*$0
kR1UCpkcR`FK5'%k@#T91"m+Dmq0("UmYhk&f$ZkV8`H,3T[YEGPGZ3JDMZ3%`#j
5pQ1-9BNS'Af*1Z83"3'l')`41TUb@-0&h#T@De!jrb52QAiMT9,!i*Q#0G@%99-
%,5'Al$AT&[a8KEH)abq[Nbk6r-M**JPjUKXTA`XYe(Z%2jTVNkG95U3Z-5ACM'E
aV"j)SZMrpZRip)H63Y-@G@89frDM3qG5B$,QEETh9T[SZmV"d+mee[BYS9KTi)J
[@`qM!2eqJZZ9)I5LN4@L3EiXrUZ)k[T'3lIJ1Nj1%@X5[@Z$diEiR)V@4QA(jMN
R+AY1h03Ca0[F`hEpFj4'r#G4M6aB3Bdp'8&I"&[RK)X&R3J90CG-4C!!2`C66pG
U'+j1+$B0(j%1jeQflN`Bp2F8GL880i'H4#jR!lSGF38miV``l)'56Mc4-k*`2%%
a3&DV$Ib0&Z$9QmN6Y)*$`qMQc8[FipGpL[ENE8Beh#NFC3(iCmEfB*iC8UP2IE!
(LYc5aP-9pd+F`QS!j3'hdJS"0"A%S33%Nfa1QS0BKk(hip(Z4rdNkUqY9ddehA&
X'q@20"lJVBK"0M`Cik1%*)MVFC0'6A6GVL6E!ZRr3c)T[pe#*-BqZi+F"F`#Q&@
$qD&4e2)YfBH"kCBrXZ0JUef2Fi8p5P8(4E8T0-C#d[#eC(1EANVjk1cLFmU,GfY
RrY*K'"jT@1(a6L2SiUrRl8DPHJ*cJ*GdSpiAj)2N5U[-,9)X@5"IfZF)!!Xe15A
"U0j(F8SG5Z(a-I6Tf3!j4H6MIi02LALcY@G[JII1%'1Xl@#rqqK!3JFcJR[R0*D
I,EdH[F-0VY6$Ja!L)brY2`U66e-6f#RFDrlU-I8X9(#94&EeGfD#V&UpTqIM9#3
RZQpr#3Xa,LK(L#C`9b(FFLX1P@b59'IH+FJKQY%fVZ8*95I-[ZGiir4L`4#YA'@

0rN#%"LJ2B[T6+LT9i"!c%iqfrPh9+%M9-83)beV#CF(RN!!CrqBqTchRcHNmCTf
f"@Qi-5m+0V#Nl+C4[0ZZ9-dXCeE$"SjqZ)`Y`5AcE!Z(1ElUKKrfVbB+b`'K,3h
NUSMfT[*KYI'h[8#4Xq`1[Cc*48R"@l+jkqj2E!B4H+bIT`)9aX5eFX(kNjK4F2H
TGd5rb+ikf"SA#j66V2pa8iFP-fQ&!B[FkLHd#G)Z)GU-Jh#NNefMj1"SbFUVMe!
aCcQjL1kkKEAS,qmAc$hBr-[R#GQ&[KQ$McIG6Q8#q9h)#GV(@a2'fTN0"2UrRUK
(Ya8YhVX4",YQRqh[RX$FZY#6[4Y0`5QYMj2*T,3C9Q0E@8MPG2,EhCd5MXSe%`!
&%"D$CTqCY'hla0Z,1*!!GQS#fEiNbR)IVMjCla-GD(A)k*e-pVc6Pcr#d&9Ldc@
E-#6m[k9UP@LB`%he'R*IGe#qc1YaBAa)R(Aeb@bbZ#lm&"FF&lC0)0-c$+fG4e[
R2Gl**+L"q+*JmQe1G[LGkNCp9RNee2*RT8*X!b`@2%B(92!Q3)PE$)A+Lk,r9Gr
NSdBlQi8mCGVJ%S`pIP0iC,2S'4@AV6EqmNZeZe1eSiK`Br-3*+!'&-pc%fb+eQ'
(!$NP5MSb@E6i-J#K$kESC-)kdI,HFblkf$UNLrf6f3(0Z4k0cq(1r&G$c5B%iKU
Y$r&6%H%KrA#eE&Fimam%$G[KM,HAaA0a5C4i(9h0UiYii+F9iUTfCH+5aHTMT5j
*!b`fiTQJ*,jDSP+2GZE5FcfXTaK$)HfZi0Jq2!Ml1f$f*C3'F+-GQ+pS#EpbLI#
&44h"RSqD+D')@pIAf'jrbUVTbK&M#@bGb8qE5A-EU`9'"LmT-Zl4XRaF+`G"eYi
c&Vd`[k#hYGdXA[,3S"fh&J)5Jj&6$F35MpMDTX`2'Y-F6DF*cac'!b5#dhi$q+'
MC'H")GF4ARiLF2DcmmQ59D-j!hSd3T-b!,P0%ALefe,1G4em&6!GhX"lr1[-LdQ
SB2p4-fmFeY(M5c-Gq##FrVApBB2mr0L,+MY%L2KhFj9)aYLjC0jjL$d0Qll,*#C
pkQ*U&FKhp#rq&9APbI#TR+hRRN%2QBZqKrkfp,T$ddEChm-6ha(KE$hhKcMCK9d
FdDdqJCjHrfhb(6V(+[39DVR(UNKLBqh6rAVS@1B@J5&L``cYKZU+,ApikCq0('"
+X4%0@fY-fJdG[349AEh`+aqd`6D9FE8e#Ee)EVdaC@LB)mHNR[!Z#hFcUKSX(@B
b%%"p[24Y@rK1ZIkXTK)`*$NJV$,(h0,H,U'+e#ck%bfN9mrHB+)j`bQ'LKL8QP&
IBY0*NGal-J6338l)6M*#-&-8"d8X#*P,E"@5I[!(0!EarU4Q'eR'F50@I4V0AA"


IT!h2XQfH,ePZ"LE8#I2ZFFIafhUckr+JA052NGReZ(21QPLkVLN9ArM@+G-0i`&
kUfAG"'m@!XHm"5UFN!!R(3)HL*YqhMEcEh&00-G4B[rqGq6Xj`h@4mU[6(j28"k
YeBRl-@&[2"GjZ(1YG3UUm6KY'29F+(9TJ#eb4AF6l&+d5)`ES[)h62hS[!"PX-#
BHF8rZkIHe5ce@SJ%65bra3&5impQ'$DG3S(1N!$JRdBKN38iMTEcdBaV[ANG#8A
8$(&c6K"&Mbic6")3)PadNLiP*CpPC'I(6LX++%"[4")mc0B023,[&AcX2%INm'V
QfhpB%ZdI5&&"(KShjRd058$fl9Sc$#'hD",d,%%Sb*6K)ccJR1"'e$-[b`CFG$B
8CC(f*#eq6a,**BMIIE%MXDBl1P%lDAC9PGak$[0J[P'CS!ekZF*941H'RT8r'jM
peI@"a!+88XC9Kl0IRH)(MRYb!mQEH2HMB-0I+2F1f!cXDE8$%m[Nf,T6(&V)G'-
Y)5pja!$r9`-(G#E*,ja8%cYJKE$!fI3)dfX`dHJ!mXM`eh5fV1YPB)a@JFY4P@C
DU"j@Q4@[T,2EbeZXaZap"JCLKG"M4Cc%91Fd$8NiMcAQ9"14crM+%NUD(N@N+!6
KiC!!6*9U2hGLba+,c@9r&RcP4-6p`8-HmMr!@P+preLe4J!D6Y&58CIbNXHb!$0
iTJ10"q*HX6Bed25K'B&CN9KmV[A$,jIC9LXEE6&Y)5BqMPcpIVMC1Bp8Z#SNLi1
$"AM[("EV(r0eKU-*L[AQ2X3bU&DD)8'f&3!0ADN),k[q'0d`1r8N+&@-[@HYS[[
qD-5d!X'd0XC-ff(@@,0I4LZLp+rQQBG+ZNf$mRQ(rK[5)@-R0%PiPV&@JHHBL&m
0d5a,V[62J#,cfJQL&[IAV#TkTUVQFNafqCam0l@"hk+HrQE95dQ!5l50Ar4F`09
VEV,kP$[jA"%`PP0$VXIc%CPVVQEqqa(iqU#C@Gl$kV"K@h0rPY3T8lf2SB(P'4*
&[C-''F3YRUGU-#PJQhUap3p)IYAT[Z`d,p1bc(TaMS9cZjH94YTPh+b8m&D!%1a
e4#B6fQAIrcL+Z(N9%pd!cY3AmhYY4F(qpf6Ql9mr6R4*Zlm`EE`5B#[-Mff@J[K
L3QqH!A-IYmi$8,qLE-2d4QLdM'6&c!XKKZIj!DFD*hqYhpE$9MmMffCD-QkcbZi
ZUl'[68V8a*jG9C`5mje,)X,[E&A!EMLq@cCN-)L'mIR'AJ[8"Zla+i0%Hh8I$ZQ
qJN9@3`[$@$,N-9-!kAUB*H8KNL-i"a'!Ai',LZHiCSV'hXJAR-"9k!`,P%[Eh[0
#)k1)lhDG2hC`C@ieb)LK9Y'M2phUS1ErIbQq0e*J#I5`aD)BK8+[UEGXA2Ij(EA
SY3,QcM6JXkDl`Dk$[e0hF,)-%pXfM3TQ)&N!#Jp%%GC4(ibmE%)qXEVp1p#ASdm

H6Bj[E%i*#2-UJeN"q--)'K3UaZa-(M(SfJHd45`I+LiP3!%H40b5H'Uqa,!iN!!
Ta%-Xep250*Y2HUMmLLY8#IJHP2`*,'CYaH8YU8dP[MTcGK01MJU&FKQqLrIDh2T
'AfI19jbRJRd0H)p-K`+Fp56Mer%5`&CRfe[GA22E9GTj4U1MijYHNlU%%hIr3CT
#3BK$d$4+Y0-QI&fb#KX3Rq(YdGr@p%QI0bF2(mETr0jUi4`m-3rm*cFaG5''i1A
YG5i,VkrG4BKAK+80Ur1r4)&3LZS-6lCQC#D[D(2ih"I([Zq%h-QA(PkdVc0Liq9
k3@Se,Jc1Pj,NEE"VU`&YY$Hj4c''I'2S`I`304ZL3Dc82P2!6EdEI@[Fe+h)4hQ
LIXM#r!PE#clf6FZqaId5N!$``TjKp+F,fZFH)&[IER2bZe*R"SG+N!$bcd)$mQ2
rmpC@mk("PFILDGf1PQ#+KF,,MBA%#F0p*1eNip1aHeFf9%C8f0VJ0H*GI1`N)m(
R#P#Q%5aI@'d"rcGS%6F*SHl,8dl$bGl,FM4[UF,PN!$e*3%bbEbJ5j@(Z-mjqDL
TcV[lqe#54QaXfY((eDY+*F,"FM)ZN!"fIpYh+k0a[NM[l"8TbjAC6qk,)iC$hb4
hA,6%U"dVkNlPqPaf2T'TVh#%c)c&X'm13N-h#$UEAja(Q$,ET&NmVar*lbbMA!(
[F`KC)jGZMYq"L`!r[`NZI#kMJ&`,[1f1Q!!2jcIPKNdh+l2d0&ki0l&-FGPHImH
elmSFMV39d9[#'9YlhU(HqYeeYdI*R&eR@cLQG[1l"9L'@Y%MkSU[5a-T%q`T9mM
YCZ1l'p'qT318Y`[LH5ddakK@q*lU[B34cQfG66rI"q95Xp`BmQ-Ef&8XY,1ZaF4
Y3K[,Hc"5-[d0Zbc3bZeFllSRZLee8lC83lIlJ+hH!cdXBf6bAc4"f5FJYfeRL%1
#r3ikdB"DfX(!UBH!Jc3H9(`B,hlaA'YQjADS[Ne$+1N6p[*babfdG(a0HqRcUH2
4963FV!G299J(cZ*)kcUmb3fmBPGCA"*iKm3lU@b,MEj(K6lhrM3lNQ5kKZ$aIi$
Jq4(fL&3!)NZ@A#PN%[U4A)23p1)EaKfm2#Mdqp+BD50K%X"m6NB'$9'YV&!&!@c
+TfhRkCd8C!1KHF8Y+NdP6TX4!QKBeeB0Ne$F1'TdJS68#LfRC4iK@$d1%ZGm13#
S+eEd2kQZ[`EQ`p[$3$RF@[&k,66LaIUHGBbkeir)'!LTl!CmcYY[`fmA#j[4hFj
4,AkLXam([IBpk,1[@Q5m$4Ad[V@PDm'&P*8"0%[1jJ#VMfEaPjJCFphM1S1'`!X
,[IJCV9DQiiqpa+rd0TRYAjDm!VA"mZ&9Vr4QbDGVYj4"iPA!BQGAR@A)MI')dfA


f5A3JU1025cdA-k0c8"5p!4Ycr-MSGa++Kq0RY%'NaVk'r$TlM6S!K%1@RN+RBlC
FqD@)kNTNjHfCmbG*`#D!V9$Yc%k3!"8N"4EGUj0blNUAi*Zb[D1Pb&#d!K4rRHT
`m)N+3#)Y0Nm1BBmM!39U+NlpXbCHJ6GQcca(FTImYDhIfaYPrqp,%AF#!1""Jc0
X&+FiMNiKKC(4BG`pC+&KXT!!#m$@F$2GLh!fM*2+#-mTB''A5!PM,2E,l(BRecE
#+NaNRZ@kfT&rYAe#e$DQEFLH(I'Y6,4N%kRSM+rN[GRZP4#AfY(4$$aIY&81dPe
+ZKGh4Dp'PR"2)km4&jS*hBjm3A5a@pD`Pa&rA(Zp$hXTq%`Bk2-0eRG&i+Z6&$M
cTI,GekJC0A64%4jC0-Q6TCFmAa2V8#&@rXm(YL)Jd%85k1`15F'$LR,HhUK(lRl
)[l5i*hZPEdML(G%k,H0'!`&),F5I0[Aa3+6Uj%IT!XQ$0q)MA2pUR*33ENJVQri
Q9RI`5`d[P#hHCPPELKaFZPjr(%$L,R',pPENcTCf3P8D56LF9SYHHDMk!pRq$(T
)NhU6lLIB48Dm$I)4dP8",!#Y2kcQd2cFBkc%G2DGh6X$GmfJ!DN1*SQ0*+5e,#H
jANYC@RFZ%EqQ2!)j%Q)qJMB-!D$I)Q9,4Lp99r$T95S*r0*HI,lJTaPThB5*DjX
Q*fpAkALGC0IT5F'D('-)RMG5S5X'aPB%EVa'JV!!&DE#!3TbB0TZU,YaiJjZULL
T`fJfV(YUb+2$8hqA'pZ9cl5-ICdM&"GeGi*`C*NTUB"T3HU(j"XINdHmq3LTC&p
d"b!"2p8GJE+2Uh*V1V@F&c0RNVIb,(@XbhIX@$M",kf#,mYIRND%a@V#er0b@I2
`$iV+QZ!8M8R$aJV5b@-QMf1qTEr02&1#rfGH-Zr+p6eJ0ScH2Y6FEGr%PHV8-cX
MaHHPIE@NjrCQKZU5$!*2bL$'02M$ieS#@-1HP%0I6RP!m09iT3+*+SpVXDr5C0d
UIK55#(p!Ti1H[Me%'-(2)P"Dl,k1`Tr28#3X$R@0Ihr5(8S3E+aAdM2)#Zl1mA!
-YZ$Q8'UEaR$Vr@''Y3aT&S+CpDJ4[Y[mRFZ6bk*Qd&**f%-j0q8T6@95G(A&54e
Jl,3DY+A,eJJaRf$1kZ9H0ffNi$Q+#)1DXShfA4R$I1qZ)[r8j4BHAXdM0d$$j*b
5EMZShcfL#,'hP9TiZrTr4%R#0c#S6D+,6RM'NBpeXS"SBZ'6mE8DleSS,1m94Vi
B[+0F6dc,5F6Ammb1DJ$mVi*i(cR-Uc86ajbc40IMKp(r+r@8h(IrTTm#Y9Jme!D
mimbL$kT,Fl1j0S)rP3Gr1&mMU@1V(c+bVEr(E993*)brMd+MQ!68R!VJPlML2[h
XB)aK$N0K3hjVYq0GC)D8%K&Y1kbGZim$i28q6DkUG'kGN!!Qr%Z+`&$q%5((!Cm

2[!X9I1I2*MilY1P6GTR,Nf0rSd*Zl`SLQ&K'cDh,Ydia!EVLZ["p8KZ$FT,(RGI
A9!i2arpLe1D%NJEpVCJ2`*N!I3cd$&8"8*Cb(f+%E(GjR"#***5J[Q&U!%Z,@mR
kU&eM'8-ij8Q3!0dlV9#baDbf&bS"kSPC2LID+,$UHeV[jDU8V!!e%cI@5Erje)i
34kp4NBE5![#GZK%EqN'ARpTI2hIfQPa6NXe0V6h-CI6*Y*(1C,qi2hjG&DD+YNE
SP"P%9XJYrR%P2jR)#FjkVrq4+UH3!,d(4[[Pc$J`VN-QX+kjAm)L2rYHAq*HmfH
IL5IAl[UchSYA9X@5SrH#1B$HZA,*YTm6[4i!chP4P[FbG"dr`[ZMBl8RJa%,lXe
3jiXak64r,P#UCJZe88EMbH!K5bQ@E-MP!(3f3)M4X5e)lJdqYS)"fA#KleZ#+B"
41TZRb`"CcDjE)#PDdeLZMBqa4PrREI%S48DM1ZQ,-aM'SbMCak"MNIMAPq+ZeZ"
*L40S$,(bEQ52$#R4QSleQeJD3&G+6KIrKKLZrNci1T!!+M+YiqTHc8Bame[0(3)
'e,"cpDae-[5Pj*)*%CR!3qN&'*8,J[kTQ9kj9GGkb0a[JdFp()MZ650JSN%h3ac
YS&(K,BKM$QSH4FFJY+m$Q"D'C[k(TeLrmUUm$5*c"b)YLQ*3*2JZ3p6)X`jGelM
Z'`q8aDUbGG*QSRRhCi8p"m5IV*5rDPlK,Emc`TTJN!$69PD%cRXA%3qL@P#E4`%
@d[FPJ(LXj8Var-Cc`FahmIp"rRD,R'f#I&I+rP@PL*!!ELcEc%Sa2kIP!!!MQQm
4@HpU*V**$6h630I-ArB`m5%8fX(SlQ)KDA@bUXQ3!0&J39LDb6d*Ak(BdB"3J#h
`0f,b-%XppMJ3Mi-`bm"9B!"LEhFaHir`rTK5a0e)c9Ul93XcC`$CLElkMe"K62B
&MPGf[SSC)PI5,5LjMa58b5+C%G3##S1E+L$3&d4Qk$kJVcT![T[Gb1Pe[DSaNlK
QJh8p-I!bG0MpUb!+XBSRAVS(j#SUSqL(j4RC(E&j*B8U+i'Y*FL&pZKJHq0Zbf-
2j-h@5FJ8[E,mK0qY9S5Y&b1#-jpm`V'&V1K!@9)DUc$Z%DG5Xpre6%hKZ,9@GUr
T9@iM@Xf0V4ZThIZFRA4MVB*M5(H"S)1iXcJm%CXAE(T[hiJlLKbbCXIM!C!!&"`
&FbK8*59qNR&%V3EXEANirdBK02rcREr'(e@c+A1@AT*LU'!@@AUG3(Ji1(JH2Fp
'1CpZK"[X8CR1d@&8!m6S&jmP`AL-H!4`fdLNYcY#PM&lf9D8`,RmIrcF4T,92XH
R0B$rNBQL'NDmRY#mfPkDLc9hll8HP4M1XAZ[L1mDc$L*LbjJfDr(1k"$9PF5H4V


4*+p33pE(e3bTUK(TTc0&d$"'58K'*AD4(fU"UbI%P#IcXf6mmpplQZI1p$CAl1$
FeEI&p,[d9r[V$&YJN!"c[BR@MSf86VjJjSL%p1B2kHk9(,jC4YE`X(H2NC5"0C(
3cJ8XDqhm4UmUjpZdJ%9@&Rff2dhT--)N6aE*p+rYhpPJ3*9P+hFB[c&NYEEhrIK
+!2R[LTmc'KphXQH#KIK[e)b'4P0G&EV6Q*lh(j86Bk#j#(aac(EA)%S*V4mm2r1
I!0m5G#VJSa"Aq*+baC*HqT!!+3iT$Y6UAMfc&@'@D33+"X8kq(BqH+8afcrN4KE
68[#aKaG(PqMHpiddePhD1)lp[hf*[Cr#9DP!`p)`,&G#,TTbKerFFTQ))ANAY'p
pLR-H(rSKZS!1JiYF4'kG`b0CaK&i)4D6I$[34!%eZc&mF!Jj(A,*HBRRBHZS[jQ
*k"0UT"(KP+SN#9Y+r(@E"$#U2m,('Ec(9"PD9dQb,m`k4FM4+akqb*Zq3M1dP+!
!TYe+Kf9Fh-&$U[fDNb9$ii3q%pc@L4Y0kS([ZQ3dGc!Gp3'TU&#K!jP5mh%DKb4
rFJ1Ej%!UKMNBb56RamXJjRJHSHK0LDHM"6dK$V!Q&(F'-hN8TLP-4`mfcq-[ij9
H%L@G)39*r&qL0@Z&Y*NXN!!MUI5CE-mFFFPUFYj0qe6hPfT!Mm%4ZfD-[Pe`C"V
i#PQKX2I$FJ'H04"rSC5'@DiAG0032[r2Y2IRhdFAFMCCYkd!86cH*MMMH!'rM%M
rF(NqS0SjkHG-QX$f-a*a10X+[))aKTCSRJXBEX)%b&)Uhf5IhV#2k"EHM)URbr%
($GZM%5U,B*2UETY@%ZIEkpTf(rV3"-QA(M"0p#2(6H4M#Ke)maGajc,U,RrcbQr
`R+li[HEm5cf,*r)'Vk8BQf,3'PhfrHc3UC[UHR8H-B6miP-F-TTF1A)0rh&,GK0
%f!3c(H(-$1i$1'ZZaP2%2CBUldr@e0-afD-[13[5Bk@3!+mQ%V)L1Xb(16r$ddJ
'UVIiPCqh*&Ak)b3l,C`r(S&lBC)QrQ!!S-`ppB-c[FiA4S0XaKGM5hqT1)V'IX1
6d-3Fe[abXTE-Sj+m1fJk**1G9J-bZ-"M&hN)bMjF9fDqN@-5$h@e6FE3!mACXRr
ie5ZcE$l''@[Zj"LPqHd*FB8LBjbiJNNDN5Ye5T!!aQ9f9D55`TU"fRFGG!Gfj9c
I-d)A1f)qQ`jp2X$US4-UML1(BX-`8(-a)Y66m*-j#002M)UUDN&CYE(2Y8fBSbK
lMYURSR#e93#J)+P48-jj6$UTiSLYI4%[3XPjb9B#XYFSNdiZTN6!!++)GDHKM#h
0bViKlp8"H$PKf"%$U-[dMhrb4eY&l'TN,!r%QTh`qFLTCcIMZ#)Ih(8p%ASYqMQ
6`fAeF`6+EDbR-D8!qSDDUQU8[p,")MH![38q(ZTkKj-PKJ$jV)#'*)*1i!h4Fqf

#lEARaV12&PD,cS$Fq+4!!JB,'DDQ+H4FBGH'4MQ`'-NQ#)a&I"a'21&%ie9J5-S
+%[MahQ($!pZ'rek@%6IY1@dLia4DS4mII+Fmf1pGkfpDJJiGHGi3iZD5fXK@fm3
6!paD8*mIA"TqVIJ5([-pBB+TUqhq2UhX3(qdCC&&HjfN,C6f62(fb!eJV2Ya8(@
ADf(P"rUkH#*20M,AIb8L2r*p*afXE%Sl-DU&rP5NrGJ+cAf0`0I-R@)PVEc3cT&
h-V*c"bf[M"@ENJ`h2rXr!"M!l4JEHM)K'9[r(%XS+%li2NFdG[@V@p$bM"TS1b"
"Hq4[mbUdC*HK#!Rfc3&Z1G)*iM6q4Tfa4`kIBDe%lciQZ-V&#TbQC,M1BBC)C,-
k1KL4e5jLN!$61LA%*DqjL#1r+bAa*lN[JkeQ5V&1%c-%XiGI4'd*ILIae0#Yh8Z
phq)m%-!HEQS6eQR4`i-Y,P6dd)M4Ji$X(r-3N!$PMh#P6D3El,pFASLCT&DQ00H
YMII"T"-R1FD@Y@pT6@UYT"Bpq&GC-YH(T`Dm$UB'Cr,-ZjLXV3,R0)%EZHT+m3c
IiRK*1#&TT%VkJN$FJpVUP%BfQLEP+M(UekFEU4cTDZk-R#ChT3[4,,6"RLMe(J)
5p*bAmeVKjVZMTJ@[-f4CAcdaJmI)r54pDHZ10D0!F&d(VMPG[M0j3J$4k@))Y@`
k1K&$kN4#QAT-kVY2`-D41e6@FG-4J-hrTQR'44B'p+mhYeBrLSPDQFcYE1bf1T'
a,l,632j9&%"MY5rQkhcZ*DA6FIaA!AcerL@12bK9'EE`9PIe*Thc84!lUI$hKeJ
@b8!Fr6`(L+EpT50`kblFJP!S1HkbeIlc5)i`DjJLLGJr*CAiFmCMk9C!%PMc-Z'
,*("j&XNC4DIFrA(!!UpG,FPa''!%iM3LreS!F[fp)Ue"CMqYJYL&)2Sr(HCa+r$
m'05QYA0EEP@Gela[jKPfAm3(QH6iqKp2Rq)@V-4mIT(fT$QRCf-ciMdE#44)!re
SD[[1IXeD,(,T)H0$(GMi#36PmG9k@5J($Gje(UrBUfD![bf6LS[I*`XYe95bFj*
bF@!d9T!!&@+G,f`RFaS#QbleLE!k(5Xe&-m9$2f)2RC@%HIGHKBQjeF%PI4V1%(
TPiHG+VX8#l'lij1h`@0`AHllQ'jE*6)P&ib"14b+YL4jP)(R@C@5Dp%MQhM1FXA
fXN1)hbF3#A4j[BZ6r,3PA,Q`(f9GRQKMG)jh*!@qSH3+0p&9S!L"&kD2'a(@&AC
8VP-X$RGjZe@8'Dp[HEb9BCU5iY8p48K&XK14r4H3!,qKjIdTYNCF6jS!h5iN2Nj
[ej!!hU"6[HGU[r`@b8ca9("Z,ikB!*Ld!GE4%U1&RP,dUB'lbPGdS1d-S)Lq9eE


@qS1LH&mpkPU&#,E2[ZSNT%@hCNUTCH42[HBGI$jFK&"2D"@X(f`183C!8kL*LX$
,JM(#l"6dhhKVlhh3)(X"%Bc01%)#[FrSD4@-cip!r06`H%[2V5Rm1pmmhr,aF'j
)difVa8(V0%hPR*!!#,D!5i-Z86q%L1D$-3Ja1d8ZS2bj'()!q8NcmHP%[@RhaTP
Y[UQJNBDF6,QiP&`XU"$c8H23-,G#aME4BYL`,VjSQ#T)(U%*6,)XYG(SU#,$T[2
2`bMjMPX5f,KfbD[NB3j-KLYF+"j00iYiqGGG%IdYb#9M5V358c(5XKi!T%%EG36
Q"ANh2miSGYa)U2bJX'0D8MRP'Ej&#`hP3CSZ`j%Y2D$1dLpLA3#8NQ`p*R(fUTi
RdPD3!%#13ZNU'H5QlDA`lBqQ`#j5[DqG!G,N'MeDGI!G*2q1I,0YP*m8b)CI*!k
H-9J#kN9[rmYBKKre)JDC!E-Caelr%QP&DU2C5k,L-h+dQDJAdqjZ+Ya@Dq&9YU$
#A[+&+15kkr-Q+6h22bSlYG@[&@1c`,`M,pX")PbVQr#@T2h$)Ld+pXUmZ8#+X&5
%DFPqdlURHAAqqZ+iT-9d8$!JlFD"V`G1K2R1%HCYQ+,b&G6r4a3!0H3FG(MLUDF
(HiT0hN%adBAZ6b-QJk85KSQHYH2LHmrC'1iDjVkGJmhKG+f9ERQ[2`+,c51QX9-
"LK!XC"%Ra$4+RZKIN!!IA9i%m2"SNkp[Q%mQ*2BJKV(C'Tk4[f#d65fKX,CLNI8
Sm40cFN%GM28DPG'Ydd*eGM[r6[DeTPNeF-&TB'`D%D1V[XGd`9a(TH+!S%Vj-X&
ri-lkZ%+Xcf,J[qbTKp9C'C0#%b9%DhGD)9b&DZX2Q"59I&Xa"X@VCDiXZEFU!,2
Zl9#0PZ1b!cRRBDr@Vb`T@S*VRq*K80mYf[IEGeLHVLLD!)%b+4BRk!TeB5EZ*8#
FNC!!5DdHYQNZHa+ABP2[-q0mF44D@f9aH2Np+%Bp8!E9H'U,6r+4P#%[0Qh33+4
'G*a``"'Y0$-X1R4LJbq2[HQTkj,f(rlcCNfY0A@m!3Y65hCkX1JK3iS-Vq@ad3Z
&AbU&pa2l-C2a8pFZk-qKF5HKN!"lpLQL&09TPT1I#GDCe&l$bG[jHa-QhPYfdRq
Tc)UX3VUYqF$cpL3DdeV@T*8EVZJB#*Y4Skjf%!DTQ1RZqi+q+VbH+9VE)`cf)@J
$a`Ca295a+$4Ve#@XQl$D"0L4bF,PQVI2(m4Y(X0l92LH@,'*i2@1Y1Z2XAH6&IU
Nki)+5K%%#`@p`'@J@pJSI[r!92@`H"iNa&T&h+ecT,dBD&dRNSHrR&&REJ1A8f#
e$S+rFGMH9+[ed@eckCaN-NC!I4lfhENA'f!Lbm"[,#h+,[cD4YVUDb'KA%T3q$"
lNlhF`'STEidFAq8f4rTBhQ2Y01HjjVV4fm`0HKfD%18qp[C'L&RcHqIF1J3H9[m

f2rXl,CBRHK8T*2k2NSB4m#$k2SCKINSq1B*`reEYYpdb$93p-$Vc$rdNB&I8VA"
%[0[T)#pYhYZRJGA*qKM&80@29YJTVeYK#L1S$@MZM&H&*5j1QF9RM!(!@d4kKi`
*#iUYNV)@9-Jj8##ULUHb[r'kG2fA)@ieKk24Ar&LF'jpfL`ZB-Brq1U5iq1bKDT
IpiJBCEc@$NaQ@f2D'"#b+-8i(FmZ[CFa!$!HVI#,mQSam,ImZZ**2S%@5cj2XXN
+9-9F`A!l3M(Bj&f53kcKIk@CMpPf#FGX`dc'1DNJDC(Re+rV@#b8UJL(3cY(Q96
%aARcT1Q[+6`$Q%RFqD*A+i3R!DF"6JdJRHjHR&@((&hIh@UDS-dBdc3B&I&Mjj5
A,'Vd-MZcVbJX-VUIFkBPfH#U1acKb-XlC%kC2(@4VFL%(UA6RA,N*9"L@!qSl3@
$b`2E13RIP4Er5*,"!"A@*j3D$(G(LEJe&rjP5''H+I1rh$HD44`Bd'A9"hh"4L9
JQ!2[NQp!Jh,NiVbGPJF[q41MbRQC2$Y9GAJ*PQ#ld1INkcR@d(6r`L8$M,4Aq4d
*C(HcB'@KlZABX'ibhl[c5#CR[A0F&B$2HlXSj(%''B&L4Yr%#pd"#l))Y)9D`Kc
1YACrC`0*KU901-9Ib#B'KhAhbXNll+#9M@K&kdS9U+B*K3)Q`+6AVX[kKV)jUd&
ffP"KQMM+-a`MjE@F,*JN`r0VZ1D5D2-%4K@TmFbVd3pTj9Nq1ZLH@8JaJ!@a4%8
jP[q3!%j)bTMLLCeQi8UR@!HpCaiYCR5LmT3YTV[48G1j+FXZf@0X0de9&Yam!Cj
ED(ES%j6pCPc,Jr4@4('rUi3Y8lpA8R+X31'b"`'q!0liH2N6N!"Q3l"Q&ICkq"(
!fMH[B4'KZVE"U!pG2X9hiB`A6)!Nd(Z-FQa4eUZY"NGjr)hB'4b4[m&c--3jJLN
&"&(#fabR-9k8QNcTi"&GpfVY2kbU4mAm(8!FEMGdN!#0R-iE@S``NJm`c*(beKD
&CkdjGY&V(5K,MQ-$J5Y``'3+TEEaAHk6*k*FVh$kj[`D"XiNJ9,)(p)&2-emq0T
Iad8f"%MG"ZL'`GU"ahD064f,-`f9b`N6B6*bI1#"%RXKVGl'V@94GrC*M*-JKdQ
&EEY(jAFPifB8iQEZ5T`9aYHL'Y%+q$`'q2-#-Qk'DEXA4Hm[r*8H6P$VYPG3*+Z
&-fFeX-jDTpVM2jH&c0GVhS@Yi[Dlik[V3B&ep@BIU5JErTMB4`!J8J6k,I!kqcQ
FV2JlP$1iJ,6BGT+41S2"S!hLaC!!,c)GGdI*+P(H-Zr2FMQcJ"VdK-ck45"@V[l
d5Q@`"Lek6(#c6JV&KM&E9G93-cDhA[4E0APMTU$m%@NiFG("mSZq[T1F[jeUbq%


q`%Jh02Ca3QQNSiSHEMffJ"bM!89*GASkp'lPh6Ic`Um6J1cch9VlG@D&0,T+QdR
#AYc&Q+#-5+49hEB5IZAmJ9flLqlDKB`MPqVZPir4TG`P2N#eSTF)0qCUmIfeL2U
q2%dSkQ"(!dIP@IJJlidb8h!(%)edHb9N-ZjA!dqJN!",'RhN"&G"PM'8q5*Z,HN
eFiCLIQ2rR!ded#5V@eqUD96f1UGRV*RREZ`A!X#PN!3"!!!m!!#dSF5TY-Hd@!!
!6NF!!+QB!*!$FJ!-ljF!!V*0!!!QTJ#3"!m!9'0X8fKPE'ac,Xq!!!#(`de08(*
$9dP&!3$rN!3!N!U!!*!(3X(8e6'MS9UQ,qMq(Ic5F[,,iVKcE9IiKE054!XmHpr
rE-T+GQ438MaVIL$%'i9qM)JeQMh80fq54mPjdPN'Al[3X@c6ISZ8"rDEQ#aD-5p
GF"Er!GXThhkkG@`E93j41J4'aCYQ0e*j'P+a%)9*rZTIVj[rC[GKpU1R&3AB&PL
N9([LfI4M0mIYhpIc*TTJYdbcJHfkaeaD`ASBfGCEH(+0'XD*m5#+TlKU@#XJ3h,
hhCRS@FpBj,8*TG@dk3Z"hd*rNfF#dh6mDVhK@h,c%N`1KrYK3h1ELE1(c2[ICYT
XHj2AeR-*QFVI02!H(SiZ%6i`IL)c+S20#p+9f2Mq&lmSfl5q(Z@TD8qm%RNC)DY
Rc,4%&rlZ1&$1#hp8$U-f"3e9)#!1e'J"R1[P'@L!Jd(T3M`KGCC&,QCKGN&@L'`
IdHL14cHVqaE$%fed)3'KL6$I4SEST09i-%pp1G1BNB6!+,hCe8!p#r2,5V'(3FJ
BLD4dRZQh)ca'[fP-!!4Bpb8elpFME,G&Gk9G#9$NPhBUl,Ze!['(CV$URSc-f`X
UGRHc9dS5lNMXHJYfDbba+Gq3!,)5pa6(!"J4HJ#S0ZLArd0!DSXLRE!rC1B@+&J
1fD1!Z1B'-[AKNp%cRdj*KTN)6eY3SR)"5`Z'%&bfTZGIXaK,0&JRILLZ*dA%Lm-
kZJcEjEHQc!S6'PB&VZ'IRV9V8EB%ZXk6S&RMJ&DU4GB29I$N&Y`AKi0(icd"+E0
C"SjpL*r45XYL0Q&4Re5J*$BQ&UcDD[3hGV`qLJ&qVbQfZqM-(ijD%J#AHMTDhM*
1YK9'`4ehY&r4a&+Y2FS(3bX94JKIh'hjlXZ*j*2N,l!8#!&2PMribX#E4DZTP[-
+26*(rB[-ER4`$m&LAAMD2RHF1c5bcbCZCkV#LJaC3`8rJ`'Ed8X0EC06C&Ibedk
&h$K"Fe2AA'mEa9j,rXhqkBe&Xi+F0YLC!aJGBil8d$X-fZX&9Qikek%jpK1hR9F
XSZmJNF&Pa9M0l6-,'2@*Rpl#q6SC#lG+"MEkQ#+[Sk@$i84I6FGR%5i1kl5Z,jZ
eaa91ErjSdY&CV$im%*!!hKR(me`pCUlRTdiNrda-+DfBNJKHFFBSc5[A"%Zj8VJ

8``&qfL`X[q#"d"j&26TbmB0E'*e0-rJ,,18E#a[Eple3%'3'$BV1h'pqD48aCc9
Ka6P'X4IHdFe'lId!48LjpKN4*m#B(L4))d0p`J&K5K)IJU(T+#a#KZBm6i"q4-a
4,Q3A2B2&DE19&(P9&NKAP-5p23c+BK"`R2+[HmV",LIrK'hk,bU@qLDPXCZ(TZS
LX0`RJ*JUEC(&dX$SllY'kh-3H-JCjK#)2`Jb$$6pUNIF3AL3!*jC$S90&r5(jdH
AJMk%PF(Fid-a4eAX`ALQa-L1#Vq5@8BGM0#TGqVYQEG&K+NTEeq-!0Yi6j-m6qe
1H4K[Ja!UJ$CIrM'(EHmD%'aDqB@DGlhkEPCiJ-"-6h"eSaIJSN"!9p&Q6,McaGp
hdY[-GHG15T4L%r08Tmm#*c6!*1`!9rJeh&j`hN0MPp%2TJiG8UqCp8@NYCSSa"d
8HqGZj(H$9%deTYD51i2fVBmm+b(D`YBPRA`SicGif'JjShC@RHI60D!`eITp8@*
k'a(0rJ9J,G4bAeJSV$dUrT0EJ(ZS3@jpr9MR$qp'US42QVB1SiC"Cd'0'&aC3rB
jjX-CI9SD+GB)ij!!G6!Sd+JD+$d+5hUlZ"f`GMJ[C)&jSQhbTZDZm@$`-2lj3f4
`8iDVmeT!pM`XdIe-`5+a26fl[ZK[`c-ljlPV`TQ69@LGB`Kila%)YCbHQCH4L,2
SiQr')P*J%3a`bRV9+ek,Yek-8M`(cplreH#PQkVT[Fk&dkLCp"`Ek&$2AFS04[6
B4!PMh&TQq0RBAc'a8NPI!l@pmI!eVpE'Gff"Xa&$BX#l,%hp85YIek$6j[)V+N4
pmbK%qj-QeH!`pJ2ii6*jQqeaD"@4F#"H)@&N+-aLp5fRb)HXKKc"E,C,*54QY)6
(5P)S[*SBX'h#mU,2e51qN!$)Fd5M-c!h*VMK(rF%Kh55S1Gr3$"Ze@Q'HGZEEL-
kKi4'%L-4LZdqQlp-bf8,L1HQIYrpA"EI0mYP20fEVmZEKP4dkr"rL39Ra([#,4`
0NE3`$##CkcHFr1Zl%3QM,2%j0Q,'XRS[lTRhIpUc638`N['`Yl@RQ&#GMF*GRl,
C4h#BXC91A5ejS(DK-bJldf$9kqj2TRjb2GG&KcA,@#&+DdDD!fKR"`BiaGCL9jk
[maHKjk*VJBdK85i3'5!0Td4kU&#J$ppETeRmN3LiiBY1m`@DpAPYZYimYbm%IU'
8@F*j1'6QTECe,-3jGH`#l-d*,9"a$GU"`4`C)af9Q!UM@1D&BNAa8#2jqJC#dd@
h!p6p*,edVp"!*8Bmk2Y$bQRLTIdZ12jm@jT4eGM5[ML(6eUP0"YbLZcRFk`e@A0
PFbGAb4ZM3!h&rUDZXa$[BeUAk32)TeCCSq1j$5(f6(,J'rNE!h[mTaiTcb(lfI@

YDq(3RJi`",[+HBP10#K-80)dmIlP"jrrLX4[B!h&QA4&V`J)62[Q)*SjBerhcEf
kB'8)#*r18`fI@L&b`*d6)d'FNikqQlcR5jpb`B*l3dQZl(+,LBLVB*`[Pd`&E@%
h8*d-*k5$RalaHQfeeF'MAeQKAHA%A#q9RH`J,P0S38CQ0f`6SQ19Ef1qi!e3e5C
"1r,CTP0l%RZiZHUY-B4ZLpaFGk3f29dmb`03l$)HNFU3!*@ThZX&TbB2D'1iL&2
,UV+LfPYD0''1CG6b#5bq3&`HIU"I5q@%53*%e@e(m09&YLlT3JDa+T6Rq%ZXIk,
5D$UDTP*2daYTMfbSBdr%f[E4i9m*[18R@0KpAcNpaDH54`EL*DNFZ4m[BBjF(i#
`3ddrETd9X&4&%q`+rirJhQ![(HH0IcT!l`$U&cFMED"4[M9Jc'-ar9l%FbYQAii
lkeNL!!1*'`kVj,`4+EfAVfkprNSXN@6#ja6R+MCF@26HU$ceRQ"C2&HFprVHI@%
EbHfE(EpcV2PL4"D&MrXi#pc'iXZ$ifr0pXRADkpZIVA'G)@HN!$K&6@2NM-@`Sd
"pNAI15*D*+kTD651iLQ6T0bj@1H`JUPU88"DTbGP*Nfp*'&&[T*RSH-kT9[D9El
'ISA@A01Ph6-c4-3!X3jDrAN69ClYrKGc6ACL1R'811@+3i5pqMHQBGa-I#ZpQZQ
-6j4qDViYI#Ui#aq)-LSiEeL1L[$!,e"'S9%`6Tc3JIZ8ML3$DUkaRV'0rG5DTh3
K@i%KKd9$RH#rh,h)cbmAI+BN1'@mbm2AACXk911m$,BlU9#U#R*F!!IEj[i3AS%
2TP3-dZ"r%[lhDGYCp52!q0'ejPkRF-N[T0-ZPPZ95--YFTQ#BNAeli2fD`Y8,H5
GKTVJl"M5Y!pS-5U$-Nj'A*8NK3iQ46TlMb#0p,hJq!ZC`$"b%`bA9#KD"mS-ek"
GYKf[f**jb184L%!,-52j)2(EH)(m3L@3!(Hh*cb2*J$j&#Jii-IHp,MjpDX1B4$
Km%EGe-fcb8fRdCp2hYbPM'0cIlT28MY!40jMqa!f'-ZRV9EX8(#!4T)41r5Hqk0
XUdrkFTq8p2&J9B%P$fSV8CM$%q,MS6d*r60Y0`qLECfmkhS8AZYPP`HZ[8I!Xf0
UBP,cJ6-C%Bkr@Y)'@(mi-QZkFV(L"%84cFPe1fkcceA%X-6a[8b$%UleZfSh0Pa
IPiS"CIm*r8)+%FmbpUTUihp"qRNQhiKQ3h,!#CkqYC&LCZ,RfKhA5&dCrr+I6!V
D&CU6`Yd4*`k1@[SiJa,dXCErfIS`h&FpT$56ad,C$-B`b53,p)[6hMkR@bA3&dB
cYh(Y)pXpp!h%`k*j"JBi%@[0`j0`d-9Tfa@N2$rD05&U9h-V,k0ZklQ"l&SiY+Q


d*miS,K(PUI*#E!M9b6c$NP@U'Bl!QYii$MK-#A%@HBdm6ekG!bB$qf&$E3,9@c8
,"-4fMiY%@9"'pST%QT!!8jl*@dX)JEKLf&Fp+*51)&J-RXr*3)`A2a0`qHqJM!p
DJ%IeQ"03[bqj%[LD6m-G!2kq0b",5r)*Ch`Fk![iCG0j"5YLYZ,J,i9"V(G&c!I
K"KdUc%+2l+-Am0flZ59$`S+Y`[hahNfEI+JPE&2`$BER'ViBT'%,edHlehk,Be-
[9#2G1pc%RfQeNK##FHT*$56,G@`UK@ISPF`"fZ3q[JLUpTSqUIT@AD%NVJHe!9S
bS'cjaZ@5)`+ZkM5e%Q"jMIRZb0`$kX"!T34F!1EdfI$RiBlD!(4$YG%RRP!AdaG
L,T!!L$UD0RGr2h*c-C0Vb@04mIhQ![,!@)bi8EQB!&5L-Cr`2d+6*DpVb3iLZ[B
0IFfkM8P%ka6@TE6PJ88!FTGV9Ni!Q$CV(VBlCRB$1('TbEpHA)mF@8dBI3V%YYp
NURD[AH)8G'T+CJ4bF"(f,G6P*b[cbr8&+pdH`S`C#KPSaK"RhG24(DE[3c+$Gk0
JhbjmY82QGSMU#Hlbd%r-'V9"6h214BZb-$4ffdqd(G9@e#kF@!CQQ"[0T)rE38K
`*bAD@e[B9MFkfiHY)TVj4JPrC`p`11FZFQ%U)kMP[2B8N8XjJJ,)cj95!lkAdGZ
-#DplA'Y"Vajq%A)Pcp!%ZS,D!kF$A5eX%r'Q&Jaq%m4E2GG0Y@*K`dQVNI"1kX9
EiFHR9CJd*T@0QrpJ1T(BEZ2EdGBQD+qA$b2UPQ[KaZU&Ih$VqUpUTb!qK&Iq[J'
VKQ*Tf39NM6`VpIC2@U#)`#"4UdV2Zd,0-PH-e45'"4(9(0S4@L)SY9GQ%2UrcHJ
Z%Rm&rD)@h'h+1h$'QQl1SbT1T(Z3!%bGeedr0G,ac5r9TiaFrbHXXRUV5h1XR0E
JU)iJ66#,EPM8!1bf[`3@'TY-4V[U,&SlD'1m8mlSaA5kh89kTIUcAC(#lLH[D8#
lZ!5)3'6S&,HjG3$'*(hHiK"0H)6erb["$JY1V@aI5Zl'*h0TJET1'S1'['ijL9h
FQ2eHXaLhK1GcqlcIb!#8*KijeKS1FDHHRbGc&QMNY3&ZN!$4P6IijGUaQA#$#I)
ehb*`UlX!,d@"Z(381`hKCD[Im6p@-qi)iNmZ(lmr'G`Li'%Be#l26%hQ[XY0a)S
1qccm2QSDXf`1RY*-I%@Aj(BB`"Bf+I5@I"k4"%PJa8c5&-p&),G!JHFI5k-Ce3k
Q$N4X*1Ze$l38(2kEQh')m&3HB2LmMNa`5U&cC+2brRS1kJd+`M0DFRAQi)jJ2q-
l4`dR$$J'G,3JLRk3!*,ir9-5Ym-RMcLIVeZamH2"H8)AD8IrL$3"rK@`V%9Ck1k


pbQV+hGlQ!iIj4EC@LeLMQh+6)N2jl86Ad3,&ddU%a#ejrXRhJ44-j)HEpY!YF46
VB$ZU3fXQ5rq#[0MRT%PBA*d`FGj911G)*#KjXkc9cXP%#5RrM8B0f`NdYpU2k8F
erK[r#%KCEY(F`pS(Z2dH`iIBG*h,aU6cR5a,T3I`cKI8E)N-"D+&9N"i-MkCHP+
aQ0"(A'5il3R"he(KLGGRB8Q(fR!PF)N9d8PRrQI)jr"`K+5HYBpNkr`NU8"NNP%
*V(NQZ'TC-&mNiC,29h*QhFD&5dLYTkHqCBmD$p"bqi$MT#3ejmiSjmlB&qJTrj3
Pk013!"D[hrL*+,R2JI0NR4H0`fT`cJ"D-pieRq$4R1%PYcEJE8[e'I2,Ndl@$M'
i&FCC1YK&Jk3eX4+hE+Y*V&q&+jZ@NVZiKK*@QkB!64$1q1[&er6ZHI'5XY-f)dD
3!,Km*+lUAd#jMPblFZ@ebK-cV8D'!"'1dI&6M),A#2d"(5Y8'%I)S'Z'Aid0RcT
XZHYP8bchLe,lAN*MEJGeZA,+NGrakB*4b*@$bp2Q[0"re3YGIMj)(S5GK"1UAl`
BjFET,eH3!&%8CCF-jFLk9IUSP)#L$bZCFbHNk2R(Q)J8N!!K01TEDak9ZH5p"D9
e(V+XApPYA#%IqqbS9#02KkLeirm+1`hL0AfKAlakHQ#'m8GL)NJ9"+%Yj5dMN!#
Y,B"6P[%LL#Lh%U'emr4h,!V""*Jc[9q6I$aHQI@Z#5#U#cB(ZZ"pbeUe)E$fGdi
Hq#+r#8BI"Tam9$ZbYH&09`8KUI-lCNfBpmakB,@iD23,Ul8@ER*2J#MkQM9BChK
1HBXEAdAFR,EkfdYq+[QQ[1b@pN3NecG#cE"lF-%%B-*!5-TSASqE!fmDG!3F*N`
i#C56MS$(p!4X-,-[G@2cBpqAQXdR&8iZ8)5#&LXfba"YMYM-q+bEI&1pVQQe0,H
-%HTUC0V*BdbCR9848'P$6"el$+GC[I(K9!YVIm-$-$69X&@#krJPKc%EHVQI[!-
6TN$*4@QV#M'KZEmJG$pfHIidGF#d2-#NX,"2Vj!!D(Chb(B%kLL2a$T"aDejQ9p
km`Qc3birp[MUeU"ed"Vmj9jfSq&-!#,*5d`8jEb)D-,U56@R,X$#)m!B8`991GI
C-khpIhrLYSSKl3J-EHB+0YiRHR"33d)5(#!'X#+eE(,'&C99QahDL`)d%Z3iQEU
T'82[j,fa2a1'0ijQp1Er2089qc+jpl[Gkq,4jb+rK8G94Ya-iPZN"K1Z`U8H,*U
mJcDlQ3GH`dZpTIrAYK,ic`'69q"M'4m1Ff3@0l[a!r!1NF[Fl0!#QkVhd(%Xp2#
@12YkAp%5ALV*MmaJe0!ZFmFZSrII+`p#U%pRMdQ(Me5(p+E01rA'#5mU6paTAPI
#K2$R'f%kZKLa1mXA-2`CXSi'p5a@"K$Q)D-1MqBcZLCRkSdRpb4+0#jB3eB4V,k

hVP++0iB)SMBjNLaKkTb"[[(V5$`dQ353!&4@aA(*9i+YbNI`1q)a$E9TTQcpX,"
BC((5+[Xp)ZNUa5,T)08!TD1rhZ,ch49+[R0)*qR%fK`mQdACh$fRRF0YcHN[&`S
i(3GPT(B@![*C9YVadD2BhM4FBR!k5j4)QTEBPi1-rR,NQS%1"bJ2kj2Ad(q3!!6
m0T@3!'[k%-eG1dDQZ)ef8Ur[HLA*dlFkJi(4E#1SkAcTj-(m,RBJbi(bLkaS-QD
SY$a,c5M#K@DTp#SPkSB0C6SZf2Ph&[q%R%E40f0TT1QrV5)2a1l+L$$M%*QIq%c
YkERiUJq'%AL,X'(FJh%MCkm(e3$PD1FNE+fDUf$qTfZVU&Tb#)((Af#EeLIK8P$
eX9Hem%r))%SM40r&mJ*)*UQ1@q`TkFq2HlH0l-l@R&+,!j,dP5THrqq6-m)(2a*
B2%cAiY9&R5SDZ[fhma&(A#i$'De6MH3NG1qAbjTc(ZV6%`%RQ''de1-5[d[NQDe
&1k3"V1eFH[@U8X#'BTYAY(*CbeG,5XhMjBJ1!rQ19%V*Nr0hI+$G@'j4UIbk+Q#
I!Q,h2eMFR59'L+K,#`fNfjq0+[#r!Em1r5)[B*&H`*SR3(ZD#D)IP4r@ECJaaBD
C((3IN!$BI(4TD1MMKX#q3!`Q5ZpKDH,G(,mmUXI)B-*jHPHJ9+qE[TaKKPEZT"[
)aSi51)`F4a$C910Q8&`[#NK)T"XiNDMehG3E'hi(SM%Y(@(lVDM[ZmKM)50iUqB
Rec[UAZUUEaD9$APaY!GNf@X9iJVU&lFDNj[P[*[5)'j$drDc#&)HSRVr9T@Rb)*
D@qFrXXbP5NV3R"-jb*BTa%5GTAjh`TFFJ#kZF'!lIUN!XqHY%,0T2UZjmf&Ne')
JSKHeLBhapVXja)p6'8QakcRMA5h[BiA-pUN,66J0a-@CYc9dr1'CrZTKIDSkB`N
l1b1CRYi"5e,2(3h+8l$FaiSTcF6D$4TRCSY`rUHcY(pb'@dBAEPiR%9S`H3Y%i'
'+QlR%1d0PS![Sh,eGADD5jmr5"Gf402rVhQb4[pYDBQYkKGdf,9p$42h"ETLTFC
-Q)9j6hIBZd8N0r9PFl)U(09Nj24(18-`HNR2@5!"dEUbNRZ&$h`a66Rm'dKA+iK
AMD`aQjYDa1J8!QJTrE)58RAI,+eq(kf--U2S(ZH&Rb@iif8J96(33[Ij#6CZSNh
$e'A,*@9lIFeq!rCaV)ED31Ul-J2hP+&CHjNk(IkF+)Al5ffjL+%R[[m5mC!!NCP
$#l+,LbV9Q+HfJ5T%+HN8iL&5M6i#1+9&l'#@A-6)il6!Ib+pH8q,8Sil35-+5-0
V8$RDQa`5r!GLqU-9fDU-D"ZX)0QPqFmA4m3C"$c-hhcmqBf(TV"3EBcP#HPHdVp


6#5R+6l@hi4mcM-3mUm)RH6@I@B6J()F-ef$Hi0KEpX&-k$4*kFN&,fYc`8RiSY!
8Fd1Q5&@MMA'9Pe10UK6*4LkFV%(RJIj"d%kp+S996-ZQ!S1FmbTF'X[A"1GJ,EX
UlbV'2a`NIZ@F*G9Iq2R(SYG)R9KGdLJk(`[fmda`&,#b!26'B8I*l*`*#F%*VDL
R9%*c65"p,1$XR`hq'V4[6I*m$4%@fI#B$Ui2f1N8%HE94D!'JQ1Ma!F)``R@K`6
N$Q0JEJKPF6ml+60r!hTF%[`!S+Ah0B[jqL4qI+",h,69B'fPiab8'ha-kBL2-Y*
-6BLJ$(L!ce$IiRh)p[SVr[TrG"jVhAp*E)C`,k1JI*!!Z`LC$[p6mVj9jl9S9a`
NRLc!&%m%QbRbp$M9-CMbX"RjcGqZ$3%`-11(IfST#i)YCV!(Z@&+%A'YBT@&dR*
EMK6$@lk@aYUH-KT2Q@NTj1Y!"S+a0IDJ,c(ec2BG5XIPTf0#J5R#`*('DJGVJM%
mY*L83PG-eV%cZ!FPLjbA2SE%-[Y8%-HN3-&iHqbM(q8jGH'a+D3M02mcLCPE%qc
9MLDhmpc#a`kY9TU)&Sh$60*m-flV&#2TT1*YVPV1ZkLQZE'Dpm4)*b!pT-EC+GM
Pb$#20IPqE1LaI),66S8Bc0)TjG"m9YAD,98ZBcMfa5RBY+X)`crZjHhYDT[+NeY
!V1bdCUF#%*L%R`mqD3b'DVbN9'aQlLf@YhiJq1HqUMCN"S*X4K4*kdjdFj!!3Rr
ARbcqG)P3TQ+EG4)95NqXAC!!"LE1!3i#3hiDfG"am@Fk,1qaV%(4%mG2dma%dNQ
eA*F9TlV-Hq[I`dELGc-(DBdYSF@HFV5k8KRq!M,4&!9Gjb`eB10F[ZipUIaK2p+
eCCJPH[eCi-%ZKSR`Q@1XPp8,%*`*dQM8@c6-Bh3,"Dc)arN0N3PY*aFB#UK3`UV
9[$@F#N&iX`1l2NP&0B0D*0IKH)kPHq&rTH,)+Dh6UFF(-4pbjSK"N!#*XqVr5mI
@b0RlaLa%AFh0N!"FeQr+MEh!Z%b6blDMq9UrAacc1"lq(LpZIaA$bZdLhcl+qek
C1QUd'*'$PC&@e4HAST'R@X8rb$[J`!e`A@qjm5K%*('eSDB8@a**)35hH%ihJX`
Ucf)E0ATH4,&(hV%6"LB24"*XqRe$@Rj!U3h*P(Xmch%*jZZCqJ(cRXZ5VJRZc9)
E1ZI-"S&qEi2)elrVXI9*FN$K`3$lhNl!Tl'8#fYJCNpI0SMPPh6FPU2+9ZYbT"M
SVPATih0c6%,#3'f[&9a`&Vpd'83bQ*A[`Lb[Pr*hM4`JccCPcB9p#iTh`+C#kC)
ej'K8AJc9q0Ki)TmX8b#DAQYJPUcd5f)kMj!!3U%-1&4T4mhCDDrD**1A`!5(YSP
(D+F1YBAmZ%`*2Z-iIYD43iqCiY@0b[J!YDF&TCFK!LENqhQI&lJ6mIUSLH!3[%#

Sf9fS8A(ldNXT-aB`DM2V5D,1CP6BMZTrfhTqVP,k!R1Z0cMQdQ&ZCK,Bp3-CL,A
+`3J''6e"a[!qim+B0ihcQ0ID60QH,P"+33JiDGIXTih@-kppSYEpSYKB$#pYk9f
0-0CVe1IXpHei)!6H%UPkYH-2A(SrFH&UU4@1(&qZ(9[MRqBBc&e4lLGLjAQGV(p
eeIXEXr'eRj6GVb8c*p$3(9r[+Lk2P40T5VYR!Q'&(ApEc+m*GSlf1qFVK*MH02D
S+`9q,&P!HJB"e(@L+B0f[+4De1Uq4,-5`M#-0Q-HE0G&Kl5VaHE5K%&-`3D%TIZ
*G-GR5M26e(X-NE#[AiSY5b"0B0X$S+5XGC2R!*FYMT84[-Nda%5ckc1C3!YC$0e
PJDP(13k#lY&[Q1QrSA[&6)[MQ8CK&Ye0USA"FR(Xjk)6lh0,$+9p!h8dNiUAkiZ
dN!!T@D0eVQA5AY%Q@rBQ2S3,,VJLHBblYf%Y@!21KrkX'r1`pq+[)aC0j%&XkGK
DllRTf%Xh[41&4d#bX[NIpIJjKiUR*Z8'")5db,ajKC6+Q8kpB1U4C*R%rYi25kR
ilfQCY`,ecYlRU"5k41a6YRDj(MT5p9If&8NdAa!r-lKVUhd*j`Y#hf"mA51qqKF
`ir8[[-V%"KXe(mR8j2[&C'!8eU%aUVief*p+lrM4VHji$GE6L(P'F#YF3$P-adF
H-kpNHc,[(qP)[iqS@ZB!"kdVqMMVlm85fEbEmcL%VF0*Jhj(dk415IPb9ip@[2+
pRia-ke-i3kbR6'E9QrBZbCKSq+B)iEhP3"k&*J5TT3T2`-qTKm&%+PSlCR5Q2MV
3+IPQ4P,HM!++PA+1#YBUK0!%q4Jf4rH-NZ9L'C+jhi"YKLQACk2k)"ri4lZ(adj
[)@SGM8E)kF%Pl$dX*96IN!"RU+ZS5Z62bFU@6FPr3c!$+hc[&%rBZI(NKd4clXL
0@lT9h`LJ`r)b3k8[2hQk1+%#*4d1QL@CMe0MGT!!09kjSiTPFq1rC+cI&8lGfE"
8-Y1d'4Y,00KGTF%X$UFdBlR#EJja`YZX3mUhJ9KjV5E6P!Ic9CR",j!!Z88ZkIA
63AHVEVHfU3d8`%RH1LS+1@9`h&'+dq5,R`M!qqMj8l[fSIBmXm4!3j-2S9%f*J8
Dam0(-B@A-&VbG4)M[SUc%dMLMAG4-K(,aqrGqiHM*hbDQN)B+,DBfplPVRp*L4!
d,rkm3UQ[VdB`XDdS`pMrHN0j$"0V1N[cEhH%A[Eijdp08iiTpI3(SMIAmc!k0`p
0fkKk0bM4B4FQ2K(0Tb%*hNS,4!r4Ck%ZCX#!1INi)lE6NEfl-C!!b[NEhFYqK[9
TV)kj1l,GQdVeM1LBapB@iNe+)FqVHJAep%pTGDJri+eVq$j3K!5Cl2C`brI,*pX


2"D4$#e1SaPfLcF*VY))(r"@Fq%Fd[M4fCk@TEbCU&RK*PAAeR6h$e+TQ'm`brFN
[LHLj)L9AGpTh)Yeq"PRP@2,C&TEYT+6k8A99,aZEN!#h'PEJ4SXlYamaB4Ui@a(
VhZ)rB%!&2q9l'-b(*BJbJ'T8N!#,r,qC"PlF@3%e$CKGCi&K2ie1ih43@3,ThXr
[!3dqr#BbPQ#9LLZr)#K,cZJ@!$YH+k3XG`P"G``r&6QQ`pKLSiE'2FQ55i-`K"A
M5fMmPC`TC15T6DI8`S(-AXQ["Pd#!D'@Z'BFS+5K5c-@"QFQeYrAT&YaFC[#2dR
Hk0iAkYNKGdYKS!AeY[SF%3q4ApFK6KMf6@bhrMA5qNaG`!J&6IKpCLU(blQ2(,a
#6EkID[iEeFqh(pB#Y1VGT!c+raUfH3f81@XEZJ**`Y0KD5,Nf@XA(e3)3(!TiPj
!A8S3ES$af,H$',`4CZqXF*-)I#iRUB+h%ha-I@HGMNcUBX#mh3D*plk@LHJP,I6
lXD+3!*ppE!9"&djYc#&aDkdf3[E2i%bTk)A0RBH,1,@[V*Y[q@GiTl!`i'Xh+lX
U`X*%jY*L"2[[L3"18aV5rpVSSqCi9LZF1Q@aH-Mq#9A"c49+Fef29jTmidV&XUE
Q'6$9Q"D'PB4'G@,8N!"QFJKKN!!@(38(*6@R-)lGQE'ZdXrL0j,#!Z-eRcrBGHF
eZf`a``RjTYlP[J652C''R'YS&833G5'RjBUM4EQ8i6hQLQfA)jVND$j4r`c3GSh
P0kTjQY'QMD85L0e)eNP[[fPmma"GZ)f9++dReXCEl!QZ+$IlA"@4Er8eZjeKRSi
'iRecRYFp-X@Xq2EG6B-ar(%Q$Q5"8*1!8mA,fP6T&GGFJ@#3!&!M*p&`2@D-`X4
&EDY(p4+9*9fjljQ`&#j33NkDha)210&'#ZLf&@U4B5LaBia0$'QGUjr$D1C[&9%
JaceLAI2)*E"Sr!"#$l![@QY[fhlq0YA10m0R'aZVMdBLLGLp&X"2CXe%CpBIl(S
mID$Y+a(k&2NL5-Ql0D!'A0cXC&mZXFmjkYGHD6,QmJJ61k!m%!I3UDTViTNk#Sb
U10lb,0R-D@BTXQ`fkGV--BiAMKL*A4&ME(lSNjG5L$4`r!AHY6S9+#q22B!A2MG
eN!#p`@53!(S`$Y5(cH$%0S`B$mpX9Rd)G[qmp*4+K@ZTb#%9'aICGU!I*qk0dX5
mTqA'DXAVdF8m"p#ZFTQ*@6C+l9kS8)"AF11F[R)$&kUb45,Ge(HJ(BV14jha$DR
2lZ)0XNl1m&Q,,(e4ah8(VhZJI8YM@QE'lNTCZm-5ID%d6fZmmjpH3N3ZBC+$`0e
4reG%J`aDBre&8r2$P8FrT!9'C9+#--*iM06DYQTH1ZfkiR@2Ca!49MfjD&pMU)p
--JB#j"-SPaI80P#pT,1DNDAI$Lc$Ve4mNXk#PSE#YXPYiZ"'NFipV%2JfRM)T@2

YGaC0X8QcD&B50%E(iRE+k1-E6aeNd#)(168#pdp(@$p@kjXm!-hY3JG(iE44%jb
TY6$i$"NaIMJ`MmPGIk,8(p&I(M,FpDR6@+lPl$H-J+e(21@e"#6q*PR+Z@q`)ZU
I*Qr[FdKTR3D-VkR,Iql8PL-'c!S[#jkD6-Ib`3Mb%8cjCQPB'5J*qDb,fHD#391
6q1Z4D@jrkGMZX,IKLj0T14$1,ETQ9()$X@YbN!#1XC15$`Y[krI(eLXeiIp%pD&
jDG"DlHY43lQeUA&2NPb1fKmH3!D&$dVbP'd4U&JD4iKDr)kqT9"pf0N!iPXp)ph
B)rL"$j+Z1bRIqVNZe9i(iD+@TB4HX84dU[RASAL5[Aqb!@1rQp'e-mk5e`+4[pp
84TV6HSqq4DQ@4%LQZHre5m&c9DMd1*B90eIcSjT9-SUCZ(+*6&-VqLCef`eTq0S
00,9alS%&V#2HU0Zf3%VEfCd)NFf*"-hHFrIXaec&,GPN&2,"BK$(505UJ16MbPm
5h1pCK)16AeQqFTRq6TQ6bZ2B8'Pl'Sf+!mqGr1mhe45m9+LMjNF"U1c-[2j842L
r%U*21Sa,HMEihri0jR3PcS5kS'B*9!"NH8`Q$UlKa4,$)eCDF[8#I$U#+8kB1Er
44+UBpFiqV&d,FP48B4rMhJ#PN!3"!!!`!%!!N!U#NJ#3"h)!!#k8rj!%!*!+HmX
!!!%!!!&jh!!"H0`!!!3p!*$cI!!"!*!&D3"M!(d!R`3#6dX!N!Fp!'!!miKF9'K
PFQ8JDA-JEQpd)'9ZEh9RD#"bEfpY)'pZ)0*H-0-JG'mJBfpZG'PZG@8J9@j6G(9
QCQPZCbiJ)%&Z)'&NC'PdD@pZB@`JAM%JBRPdCA-JBA*P)'jPC@4PC#i!N!05!!%
!N!9Y!'B!J3#L"!*25`#3"33!5!"R!31)-P0[FR*j,#"LGA3JB5"NDA0V)(*PE'&
dC@3JCA*bEh)J+&i`+5"SBA-JEf0MGA*bC@3Z!*!$6!!#!*!&-3"R!%8!V33%8A9
TG!#3"3S!8!!F!4#)'P9Z8h4eCQCTEQFJGf&c)(0eBf0PFh0QG@`K!*!&#!!1!#J
!,U!#!!%!N!0p384$8J-!!(i08`U6K!'ME3$X#h)$Y,)b+b[M@dhH@qpUpkCZ*YH
!-3"!!`#3!lUe$)!!#@NUrZ!"94)XqdV)@`lMjA1kK9'1XMr2MrqZ)$NhV"Vi%FU
'0AQ'BU0RDr#XAMm&lZ`,`,#T"L)i6&Fq[H[,VD-C!m8F@8XE1!X!N!0D!!%!N!9
G!(!!F3#X"!*25`#3"dS!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfj
XH5"LC5"`CA*QEh*YC@3JEfiJ5%C6)(C[E(9YCA-Z!*!$EJ!"!*!&D!"k!(`!YJ3
#6dX!N!G)!&i"*BK18fpYC5"TG'9YFb"hCA*P)(0VDA"`C@3JBQ9MBA9cC5"dD'9











j)'&bC5"ZEh3JFh9`F'pbG'9N)'*j)(4SDA-JFf9XCLePH(4bB@0dEh)Z!*!$@J!






"!*!&A3"`!(%!V!3#6dX!N!G+!&8"%iJk9'KP)'CTE'8JdPi`db"YBANJBQ8JC'&
YB@GPC#iJ)&"XC@&cC5"eFf8JDA3JGfPdD#"MBA9dD@pZ,J#3!bJ!!3#3"F`!MJ$





J!0)%#%0[ER4TER9P!*!&"!!%!--"BX!#!qJ!N!28384$8J-!!4)08`UE*!!lLSL
+&Fm@d(1X4'`3p5`rIcrXejfrjql1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y1)2Q
3!"m"9#5BqM@mKDIGaGRG6G,)HT+pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk53El
SG,A`G'S9QL)q"HC1abaeLk9cJ@A[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9c)KI
FIJai(r!m3+*2iaUXL26-$cGj+&$EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`cTre6
rb@d!N!3k!!%!N!93!&N!C!#6"!*25`#3"3-!4!")!1L)'94SDA-JBA*MD'PfC5"
TFb"NB@eKCf9N,L!!N!4)!!%!N!9(!&S!@`#8"!*25`#3"3)!43!a!1L)*eP[G5"
SBACP)'9ZG'9bC@3JB@iJD@jMEh*bC@0d)("KFh0hEh*N,J#3"!`!+!!S!,B"(!3
"998!N!--!#!!#!#L!4`!JP99!*!$$!"L!*)!m!'B!)9993#3!``!+!!S!(8"2!#
(998!N!--!%B!TJ#k!GB!KP99!*!$$!!J!!J!SJ%F!)"993#3!``!+!!S!+i"6J#
e998!N!-1!#J!+!$#!D3!L&99+!S!N!--!#J!+!#8!4)#!&99!*!$$!!S!#J!M3%
A!J&993#3!aS&!)!!N!-$05i`$e0dG@CQ5A3J8d9")$8Z-!#3!``,9@j6G(9QCL"
KFcS!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3N#a"
CUkBQ*lFpLicJGZI)5EFc8r+CIhHrlpZ+2"[Ic,He3*,9cZc*j%RB[MZ6%C,P9Z5
*V-M[(j%rNjr*[0R@GK&*&K1b0bh*)LK!iJIr6PQ'N94%1+J,1hML*hBK,0+!l9$
&S4Cf%PiIcijT$+G2[eNUFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR'*!P
,+@RBhU3A&C159eN[%2cJbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FNFrFA
JLaU$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUmG+cH
9Fc#*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"GBJ&RSpE(k4UNSE)5VZ#(4a%4T(NC
4T5D'+#Hca)G5#DG%eC'a54-U)Z$aJ`C3q')!Y4*YQG#!*634DR+,6CR$@+QN(kF
-V(@SLpVJf!+P0U0c9&M$',E[r55!`Li$a$PLQ,KZKIc2X5Gal+,YACH#6FZ"UHV
$eS-Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,F%r*FlYZBmf)r3FhBZqB8*mKFDkB
mH&M*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NBKdc[
fS@lc&8+41k84G`VH8bAIPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi*$'i
YhrbA$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIrBQ',
QaYKL5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''TAaj9
1(AL#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"Si!i4
'pV`UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0
'IDaq[E"flB1d$rZ$9epp#4ZUUbq"F")bcdZiN!#&AS+9c([M)*1*kmMQF"*$DeK
5eBS,0G(8$DlUGG,@)I*P,r@PJf6iV!k3!+U,`iQMEf'*D&FHY3@1%H!C2CVf%Lk
!`1`-EZQV3EfDc)k)alY-h[lIZ!qhTr,*MDZ6TKGp,[+bNp-`jPQCpEJ64GUkaD!
DXF'80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS,DAF
-pIPCbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMDNfrH
5e-ha@AMdST,jr-qAljL($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+H`Fl
,5pZHa$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!-B!$3
!!!%F!@J!!3%!!3#3"32S!*!$P!#3!c`!"33JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9
YFb"bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j6G(9QCQPZCcS!N!-k384$8J-!!'S
08`28kJD[er@b"3!X[(9ef5d!N!2`eUkkbhrK!`15,GMbI`'+QqmlTQ0ea1KZmTL
e$!!!#-*"4%05!`!2J!jG#k`5*(CYCpqGIhLhX@ahRMGQBYMCR-G-PQM[8aXM+$T
[4l%R@JehNa3*TD-X)kfLDJZV5Tp[``K[RC!!lER"++2CdY%'ULV3kRe$V432k"M
Y!L@Y5+XZMFQ@d*6hP3B%l(eihqpZpYNLUCT@eIX$$Ij!)b0JBM-L4#&%0Hl9p+F
Ea)r9peLe3(dD1m-cUEmJTNI22emfpX%chrkrLXhTX3#1T0H(,mLU#Ub-SIi1V$r
ATi"k(6EqLD"rqSK63-,!Dd"UNF"d"JTe3&bP4!2-EdKf'3D*&BJDK+N1i45NHCU
q`IDZM0k4f4m'G[@2[Ih`h5l5j3k1$`4@V[jbZ%DN(0MYq9raa&(HBZTdm2RPHAQ
1XJD(EFLEbk*ijaf262LVa'*DY['r,[pE`&Cpr&ZfL5bUMq9Y,V[Fc$ZJP-r"FbS
AF@JTUdh0+19`pYLM1ecZECDaj5#rS#kd"'2KJ(qY9pP8)qTV%D86m-ZIf!p#2eA
c4VjbShi'lB9U!iC43VK4E[TSV`lc2YUTC$DLDXM4,#Z`pPH5fCZSRi@*$TAEHQ`
XG2r+Y6A5mMIZR6iiXM99)ZCG5j`hP6[1fbhcMEcC2K5jkeh-LIRP)pe2TA*(lhG
pG%'&2*)#lf*@G9qj!rlmR1#acl$T[2,RT66IYec1VcqH#kp[m+aSl$+c@#pX24l
46aT(r`8DYMk4l*hTrN@r8-fSE`5RVNZZAH)k)Dj6G,f2VY85kRV5K2SkH+hf-f)
RDi,B%8d51`deXC2f%l%6[LZ,(E0GTGd,Y)[URrMTd3a6%eAi4aiMp[,J1`@#f*-
kNmf8PGlcc2RfV$qfh3iTDD2bdXGYJYL'$L)MYN+&iXrd9Q0UeL&+bl11KeQ(J-0
QZB3S"cGmpCBJ0RpQa)CAI'LiPK@ph#bZbES[3L3qfa-1qJP'0EJT[JMY%mV6I4'
[NLDLkr-bA)PXeeZViCDC4@48J[6VB(43%H*9i%3P"&XlkT*-PBI*DF"54V@#qq$
&T'9(+*S3VPrI20+ljHUe9IhhaXF')NdVY(1V0KqEG$i!bA%,a`YY*GBdMB,9KhH
Yr)fmJ-AMcD@LRY6DSB$,[-Mm%k3R6jLC%I+XBQQIlei"kHB$*SA'ph+DC&TQ&d0
R3))#`X!Z)5#@6PKp0fd1RSmB0*R2D8-QRhNaj!)T)N+cABL)TGh$[L*K5lHlCAl
&j%4Z1PUBUqEQ,cHNfP`J5@&fFJh63QN@p@IKd*@L*m'`6k+UJULmJH-R8+p"MEM
Xi#ZHbV)NU2$K)Pj3"!Tm*pF#Gjpb&53Q`f`lF$!'RQhJ&*e+3f#*5La9IhcpTCH
QYqhlH["9ppYRVamE12+(DhSq9Dc9Piqjj4li(B5FTULJM[KmRXA3*Ii"Ehmj044
D$-eDQ(`UAN2JA0QRR+#UkK#`rc,B-kQ*kF93`K)k3i9XBR9q32CP9DAS$&0!d8M
+eU#JI966E1$XUUT9E2[`2AED@H!+I1SH6Vdk14ZbH8)ZUQpVZrL@Q5+*XTf84I@
8)I)#Z*QT2@cF#H0kl@(1h8I&A&Ap6aSHV-2J'03)bG,#QV$XRQa$G3ULM"rTY&&
G'X+i&IY#T(h,*5k@+,C"`#5#+L8K)bSYPAaPrH9$'RH*N`(D,4Hjel@4DldEarB
9LU'Vh2+b0h98@pKjlY1E2eRTP8d2(%*hRXHM0eZb+Cmh4GUC%!G#DI2@radS9q!
cRX(QHC%UTT3X-H@F6+53!*I-2A$BA"'64c*+15Mei@6*mZVFNRqK+5ahl&RD5[j
EmUc3dh,"Xl,jJZ+c1`L"SN*5[+E@JT,#NdD1$TU3!+A"'#4Li08SH&-qq325'G%
drDK'rI5Vk8,3%4,&D(5U'`Bh@Be0`IZpR3l#I4!kRdTQAU$lTKR%F51M+TN2#@5
LVGEpfVKrX2I%qZHZq%&4eC2*C+c91UjG(aalpf(KqcqE5LD$00R8HR'mIM#mZqh
K,jr60b"@+LRUSZU,VGViS2Xr2DA"KmjdUS1Q1LTlkje0Al[F-6$P6fGZd'T6[GC
qVGICfc-3r12h"b(h2@86NT,Eq0TV[FkpE6dl"`DFX)N1*5P4%i"+V%Ie`2iU)3%
,4(q(8CLd1fBep2Rh'&8[MBjDMCMb2XURErdmfFAk4RqP*l[Q@fr4cN%[90Q@Z)i
DSrSC8%JVaZC`E1R+0jeR-ACdVYT*ArX1`'D&Z%j!Jd#c%`)SLJ[MjDmI1S0((e1
J")AX3UTMeqeGHrSXJrB[A3jqGFkj020kf3NN#Z-)!Y2eD06"rmKLlV5BqP,mJpZ
M`Y,-EmVSIiYZU[HR-AYmp%#Nf2*6epbQ[[-*aqP4rp*#XCNj$%X)A,&Pb6@RDf8
f`2#)rdf`aa)1[YKLGZ9-fVp"G8D&BZ'@JYAlSjZ5'jY+G,5@lGV6R4[@$Jd%qER
fjqm2X,U)fC9[AkB1KBp&fj!!((2$Q!CMdSE$hf)kJpYI%6eTK'Hi3*!!IrXLe`*
pd9'S95jIkb&f-R(8B#a+B#EeT"%IV%ViC#HhDD9ZUEl4(FlN"-UpmJ6XTA-Nr-L
2m3P*68aTjJ3(i12pGeNq2hmT-VJMre&lBE6aUTl'Jl2FEJRM#8N@*%e9m1&i1mA
,1I2Xm1iK$c(E'BT6$l)*VQ`66Qk6b!&TCdc"ZALFYIBeUPXQlAcm1df%cF54&LF
*5BYRic*R"Y`KCq0"`1P@"!e`8aAHRV!f8hafZ1bq2AXVRBP`h!pE%64`4kRL$Sk
l5h&ErJFlmZ2EQKBD&Eb2IUE5dq"U##3kU*YFmfE$66@C0LP9)VGFDGa4!0E3!&&
AGDC0iM!LZa@EXd`#')4Y25DN,D*F0d`d6NXC"JRAEfj)2,j9Bc-0BY!NPbIDJj'
4)libH6KHC-Qd4a8GCN4cl*AaVeZ+bQ3ZlM0RQL1MG0)D$#d0Y#I6'P9d+Y-BR%K
R'k1+rS+8BBX`+8SPZ)0GHc*YB6Im@fGm5iSKZY*MDVfcXXS-RdIN81k9+`#3""8





!9!"N!)X"KJ!"!3#3"`4,!*!%'!!m!%!!X!'B!!%"!*!(!3F!N!B")N&%3e)$!!1
+$9-+Qb3!IiC&X0dj141`a3jG5dj2(GX"&32EXIVB$&EecMiSU&KpE-&ZV1V'`$p
MIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'14[HZ8aVX",2c+"6FaH)b3VE8Z5$*F`Z
3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2-5eVUQP++(3Xq(j[6I`6`H[ijkXV6kQV
rRepZakZIr82rqj'@*3+i-fUMJQe@`8JQ[%@VE)a9Y9jE2Q+EYiAYB49ph"I'dPT
-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd2ZK"S@S!R"-J!R!"-[ISY!2lU#3-4I`$
`SR,K!K!FJS!"JQ*J,6L,N8'-h`a#j")kiZTMNXbp+(%I60pdq8A%+fc,'!#3!hG
"4%05!`!!J!e6#eXJ!`1QB-1UDV-`X!%LBQ!h5l(E@C@J)',$(ZVC`*K9-3YM+VV
hTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D
4"4f4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#3!d`!!J#3"3J!0!!D!4Z)'e"XC@&cC5"
TER0PFR3JC'PcDb"H-#"hDA4S1J#3"JX!#`!V!#ZJ!J4,!*!&(3!d!#d"')J#AM%
!N!-k!!%!N!8f!)F!5J$""!*25`#3"3)!43![!6q)'9i`)'&`F'9KFR-JG'mJBQ8
JC'&YB@GPC#j,!*!$UN&%3e)$!!#f$9X,8c!$Gh-YCJEX'G2+9FBh011qY99@aMp
[6qr9HVIZ2IrL'aS!!2!0!!$S0Jd!!!Zb,4Z"TIJ(GQIlqH@Y,A269XhI@GL6%@d
lV3-R+QGCfFQZmRMAGd5&i&,%Ii)B&,j%$*hc3NQSKJ%P3S!ZU!lHe3A!Ni8FS"L
dp)0C(qm)NQG"[L$ILXeK[1,pDj-&TB85+iUjFYcRZF,59(MPm@%"!*!$$!!S!#J
!I`&`"+p993!!!3!!!3#3!`+!!!!%3!!!#5!!!"13!!!!*mJ!!%%%!!#"!J!"!!%
!!JI!J!32i%!)''!J%"[m%#3DP!K-'[3NRc)%-N`ek2NN05Jb%$Ii*!J`i!J%(q!
3!J$$r!%$mJ3!J!)N!%##C!!JJL3!%qBN!!R+*!!%NJ3!!L2m!!&!!*!$J!!!!3#
3!`1!!!!(`!!!$q!!!"r`!!!rq!!!Ir`!!2rq!!(rr`!$rrq!"rrr`!rrrq!Irrr
`2rrrq(rrrrcrN!2qIrq3!crrrriIrrrm$rrrq!Irrr!$rrrm!Irrr!$rrr`!Irr
m!$rrr!!Irr`!$r[m!!Icr!!$ir`!!F!!N!1!!*!$!3!Irr`!%!!'!"!!"3!3!!5
!%!!%3"!!"#!3!!I`%!!!%"!!H"!3!rr3%"rrN!!3rrm3%2rrd"(rrj!!&2rrd"Z

lZl!4N!-3"%4%3!lZlZ!6rrr3&rrrN!!Arrr3&rrJ8"2rjP!4rqP3%rrL8"(rj&!
3rqp3%2mJ8"!!2p!3!!!3(rrrm"rrr!!Irri!(rrr!"rrri!Irrr!(rrri"rrrr!
Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!
Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!
Irrr`!!!"!"rrr!!3!!B!%!!&!"!!")!3!!4!%!!%)"!!"r!3!!!3%!"i%"!$rp!
3(rq3!"$rra!3rrr3%IrrN!!8rrr3'lZlX"'3!a!%4%4!$ZlZS"2rrp!Arrq3!"I
rrp!Arq"3%rrZ8"(ri9!6rqC3%IrK8"$rlP!3rb"3%!!rd"!!!"!Irrr`(rrm!"r
rrJ!Irrm!(rrrJ"rrrm!IrrrJ(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"r
rrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"r
rrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!!!!%!(rrm!"!!"J!3!!8!%!!%J"!
!"%!3!!3J%!!(m"!!!"!3!(J3%!2rd"!Irj!!%2rr%"$rrp!4rrq3!"6rrp!EZlZ
`%C!$%!4%4%!1lZlJ%rrrd"Irrj!!&rrrd"Iri&!6rq"3%IrZ8"2rk9!4rqP3%2r
T8"$r)&!3!$r3%!!!%"rrrr!Irr`!(rrq!"rrr`!Irrq!(rrr`"rrrq!Irrr`(rr
rm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr
rm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr
rm!!!!3!!!3#3!`+!!!!%3!!!#5!!!"13!!!!*mJ!!%%%!!#"!J!"!!%!!JI!J!3
2i%!)''!J%"[m%#3DP!K-'[3NRc)%-N`ek2NN05Jb%$Ii*!J`i!J%(q!3!J$!)!%
$m%!!J!#!!%#"!!!JJJ!!%q3!!!R)!!!%N!!!!!)J!!!"3!#3!i!!!!%!N!-$J!!
!"m!!!!rJ!!!Im!!!2rJ!!(rm!!$rrJ!"rrm!!rrrJ!Irrm!2rrrJ(rrrm$rrrrK
rrrrmrj!$rRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!
!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3"!G"8&"-!*!'"e0PCc)!!3#3"!G6C@F


c!!*r!*!$"e0PCdi!!rm!N!-(39"36!#3"KaKGA0d!*!$!8P$6L-!N!@%4P*&4J#
3"B3!N!-d399c-J#3!`&*3diM!!-!N!1!!!%!J3!#!))!!`#$4P*&4J!$!*!$J!!

"!)%!!J##!!-!J`#3!b!IU5!a16N`,6Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#
3"cd&%i!!N!-&05ia,M-`05ia,M-J3fp`HA*TCfKd)+NJ-6Nj-#dj15`J3@aKC'4
TEL"6HA0dC@ec,#"*EQ-Z!!!mp%&%3e)$!([3%&804MB5!$%clP2rGhjIKQ'-daM
6DD6N'Q-D3c)c)TZ6T4'553M$Q#EM*#,k8+k+-dK*Q)h)b@+aH3-%M)JDN!"R8fT
T("!5&*T55fNHfaHSZUM,ad0U@C5kP,,mr9%U2)S83`LC[qqlGfEZK%$4YpFkkja
pIJ-EV+FJ5T!!"%%3"%'L'P"GTCqYqq$9Q0%C"Vkr!U![a6BfGk$4@63@TX3rMrT
3#cR,I['[PIf$#d4pjhFb"AAmT,+IVl*aN!#Z[X0'EE(FmkjLXqi8B!ka`[CUClr
hf@fRZMEAr"R'cSkDbUl0U,38MF9V3Q5Skepp-&*0br+BI$$hMXhkaIhKe"d`@AE
pDe4kUX(A9l4P@YBfDpFRU(k,UQ@ScUEU+[imf"mU((HB2`rfTaZT1KY'BIHi`mA
ICa@FArD9-#$@Z)EZqRdi&!Q$&ELcl15VN@R&hiFGD5f-c#mAc4EdaaRi$dUUpiR
6Q+33peckDHXr#!Nr)IbNUrB*jAIrZId1ke9I'ZBU3lJde#RqZHQ2&CfZcVh$fN2
824)ZTFT"aiLel(GPfPTbPA!+KeXGR4ehD2)"CaJQ1r(N0@r64cU#FEkd"893Rqe
B1q+l9IL,0m!NUBQ81#dD4H6%p+CHVjGqrYMd4mkDk9ere$Zf`Lh#cjEbkGcPQ%l
GjE&Zah6jU2kKlf#IH,,S*ijF5kj)9`T[3(Rl4!NC$Clff$mSUGNR,*Gqh[S"*[m
"*[q"50IpGEI3XP[qi*4SkTEjNP1b'UaP0aLdqNXAq#Kp'JPEI(ppc,TiK$k9aUj
ArI@akB[2+[X!AMbLkEVmHP&afA@j-&mjGD+NVTA0TP@R21pk8P`BiM9iKVSfkmj
Z913U&kK8XDP82TclDrf$Jir(h9a2+Zi-a+i)m4rpSMiCiL*"89Yh$4Q1bUj2A*K
NdSaU'3SD8pRhhbR+5rL`%#LDkeGHBDGc$QarZmTkKI1qCY1@iUFK0JQS9j5A@"q
F0HZpAiS!Q#+J$(@Y#kH8NB-`K4HhPEpU'djp%dY8h-R*+YQ1Bc04"!+a*ijU-ed
$9eD%cFT)e`lPRDj(P@1+66&e[3IM[mR(K`UmjfZXebd4Q&$1[FUaQMrrISN``rJ
FUM&TPNI1&@1"[bm5)GYV(frf,R8K3A&4b9-0f'bqHNRCpfGNZ!DNSA#Sb-X6`d3
B,#p%N8i+8c"CYM+Uj$8,$2R#AlPRe'CpHc(C4-`RAY8F$#$L#iXLkGZk,keSLa"


[aCH'bG8"3*d+@Z)mp4+VMVPrK3J"Lk[,h'lQK)bJ@89*HJX(Pjc-1EL3!,M""&V
60NIAh3Il[&i2LL)8&%88YjdXUDVXZPY**HrKB,Fqk"1l3m8EDS5@bTB%'lSYa8p
A#@[NNih9NVAc`l)E1Uf45+4XipUcmNF'!+T,Jr&,8L4LM542(dHfccS5pKXf(J8
DAjSV5NJqG*3q@L29dTiREcKlR5(rkUIQYUZ1d-Fr`I4$X3eFKVf@A)2V`PjRlSA
LIZpSei9+-bV6i4CiDh-0I!M"E*dr0lpKEkMiZ[b'IAMY#Z3h*-eVeaD[,EF#iHc
LkiVRH,ec0T1+e-Z&PC)2V02Rc6')`5dQd6A8pD@emURRmJVcFM`)DUqALcf+@ST
m46HMk14rj0QkMRFG9rUqM$kp'm8m[8qYVQQfPL8l10S2qbX-iC!!CQ*@,pUX@3$
'RCTIGUQBK$GYm+5h96ieB,`CVclMfZ,9Mh-aT58b$3HE8I!ik@4*9"U%#Yr9GLX
8H100Ga4k[f2FZ&mSIFNA&5@fU@X%"ST3'Bb$iG"qkBj1BaNG+GbaCla(rSf2[,K
l4c,SL+3k-UeipI$D@mpY&mCPp-UlpCcADh`Z8QPFFHXjB6(Q&kqHX4P,cV0QKJ3
U+h&K!!90P@0Ri'GTF8((89pVC,Aad+'9S5BZeXXeh$TLM!#"P8dXq&PVV63f&KH
FLJkG'mb&H"XLDlc2iUF,%Id5ld3FkH+IJhfqdU+r*eb6XqM[1,CXU0*idVX'RF[
i*hj-GrQBlX,%B8UJB0G-lZIiH6pqp(hmI"JrfU#lTU+rIef@+pU&EmMSi!)DJi(
9(aE5HbA"8d0!hE$0DXb10QdE-GS`p3&A1YNbZ-$B'28C03LihEA'HhIBb8`!8S!
QDkB)hAPr'S@c9i`3i,"F1%@--F2$4903j,#-ILj'KUJf&EhLSH*1N5VkQSXP43U
"0k2VeKS$Ii$Um(8F3Ble`5F&&r-J'f,K!Xd"&2GB2fN`-'#aPU%)bQrG10S!!e+
1#iDlF-I4leSheB@12STMQkCFcMjAMd)miErKXPE0RaTMRmlSRd+lc0D0fHF#%MY
6,Ya`a[FS)hB,U+SjeV*'NAh1a$&!k2T(XG9(%pl-2RI#cKd6$$2Ip*heQE')N!"
eihc$`i2#r2!4%I,CV@9Vcc`m)[a)iP[L%aQ@#eLK('@A()C!6!#G+!K8A!$cVUj
(Uafq@kaPefr$iMkDB2"YidAdEF1@(cjVB*4ZX@[SU3(VaS'KTrS`r3X0KZac9M-
[**UDDr$jV@93%SGak(VVaZZ(RMS%0"FQ''+,29l,#ehlTZ,!`Xaia4DkaMY-RAj
DfURbE-9aX&kdm1+3!09N-S(H,KFAZh%4BIX++*!!3mD0iETk"aH2La5-C%-rH+1

e8D310JS8Jm08MB*B$X4PEb[(UUeDAA@,IM604j91P$'QX%A3iD,rR`p$$(A+fr'
L9bTijD*66ppJYU0mFT%am`'N$AKDS-M299aJjK5![1Ub*mhA!%DA9eQjbJXT1Z0
V25ji-eqkZR8m&mkS,Vaj%4F1U#jFl[Q#GbNRK,`A9FPK+49N&hU(LelKPkI2fq[
Yc5X#H%k,G0j2j8lK&-kmI&3N)HAp9-mJ,H9#@6CA)j0N34&1%l)#,GALDd2B'68
Y0b3940@PA(!8E[rH3K&+8N)pD'BMZhHrV83l%8d[0i6p86X1Ci0)+L3AeeD,2Hq
L1-I2Rj0(29F1Q[9Pp[*5LejKGP"XPRTBiVmEKRP!1(fe-YVH3&3k@D*4dE%P%#`
N,MK&0Vh8qQ-P(EBK+NQpBk!SjC*fHT[$1'mE)QVM6#9P-bJMffc'ZlFKSf"FV&@
hZN8(a0@15T-R"D'9+T8[e#,l9#r+NB&F24a!N!!lA8-6`mNDS!jm)+0eDU8!-AI
MCai11@dPR(N`rUjEi#%)1#Mi'"p(P1C2&"`lQA5*LM"jm5"$DRVS#Df&e-iV(J[
3fQc6HA05dTH!C8f*bkF9,La(-8)+PdYaaBiXmHSj*ii,CY$NJ(2)k0VM40!i282
'NjaGPTc("B4hkEd5#021a83hIZKV9ENRQ+9mD45&U3VP@kR)RcFk,f9+YqBDVGZ
1'%rHfJRJ[@$L6J$[3`5ZYa1i&U)V[[(*4QcXm41a`(+Ai@3*-QKRj3kae&SjF5F
jUqGS+)DbF`H@F*`@&1pS`J)T#2*G2#eRf1$)25mi!k)qGU2SGUf0#@bXC5M)F4c
dmrAc+,)X,m(&L#r$@JC`1D`5C(b#Q3*#j1@DD,N4f49CY&KlI,&$aMCpSfCpid4
AZkpe3-K,jJAlc-%%$UI&p6+T@BSMH4DFX@RPDZ2*j+@#5Q0f-N$U3S3rG0fST4J
jN!!kI+dHmd%lYYr*!CKFSNEUiH!h23$f3I(h-K!fJCR%8F89IF#S"6(L&INSQ-h
*"j@hZajpS%)S!(Y)9U8cP9D3!%99hBJ&L#%Cb32RSPmm[9F-!&N0)kXq&Yp84dB
!Y`N**J"b-3DX9m,Api$m[)km82`QMT`AV+2'm6S3aBb0E4%MK$P0aFC861DQK-f
4[`4apjhU,,l2Sc1Y0mSU!AHrp1AHSr(ZVp#GeVX(iYfjk$E,h5mQ8,M4EGHl%bJ
#k2EVh3N8)34VE5+"J&3Y[IpHfBc!d4LUVdl,JR'c&pN,*L"4M0TaFE"60*'LXKX
CK32V&h)%V8kmLUYc83i+jjdY$S24I9j!8H[!M`,6BYAJS[8,JGSGE8+dZ`[U8LN
V4XHC[IfqY#C#@BTlrHd-9TdL#8)&G"dG"$TF)J3`c"f+&(VVk1VfS+X@U)aZVaR


QT&fk%QR%PA%8#D1JbP[MDleYC$e8%a#ThXY(G-4')&`'8q!R30S@rBY4`bCPk'#
`jIDQj1[VGj!!#8e-Um'9-8cQ*S-CT%`TVi04H`8l46pe&AS*C-'B'J8j@eqN1$H
E5H4`*(3E%j!!Q63Kq6l32k&)c!3L19BDQSQ-%@3mhQCNA['UYPQHCqB3TQ4leGZ
fkBLFS)`meV`R0ArkI%2pS0C8rlCYM+mahMeQ[U&Um"`E@eEb"PQ1)eQq,-Ad@22
"SbB6-EA*G49JUd(TV,B098"KG([Rl"IA!l&@lHZX0r&Khbk62rp(`TaX)A+h1BV
jXHEEpTK-hRl0lqKFIQ6I2"HZKGfm"5m28qL2*jJ!ZkbDU%6(6&E+f5%80CM$(CE
$BQ4[Nqm`EiCTMUQahBF-KdNi$MZb9Zd9jRdJ!b%Ke!&*Fp&B'+*08#P0-"f(pSQ
FcHJHNd#rJ3[14G%%)K!&ZUllI1le1@TPb,[1Nli0E1Pp##q,Yaq'IC1h&i'pVLZ
AQ$P,CfD66#MPN4855q3[V@5J5#ebaTAbIKKB,rNLDhT"YT!!+@P4Df&[q8&chT2
l*DfF`3IF0!GRPG@$"IDH`!m8PYkM4AQ@0Db-pCBRUe'mmfE[L8S6+NrdRYMRY"6
DXp"4LJUZ&2U*j0%-4FMPk(b2N!!bqb`If6I*N5Z6BUiFfAFQJZJE!(9Sl!c2d0L
PeXcY6PiZ4r3`&ii8&lbV*++DmT)`*59l3f6ef&iqp$!bD#*b*l*S)KHUj0$BAXr
3#l8i,P`MP,8aAC1L1lD0M1hYkA05f'[d,K1MLp4,Ed'jH)q8)4"GKK9@82(Cja,
[)10damM%-+XE*f-,FEVXB--aljA`G5Le)pE+&983pHfqeZL18DYA9'e$apMKSC&
HFq)3Uf*!@j!!ieC2,5R-EkJ3&IDD%AA"(,2pKQl(SVIL`m3GH)@-$eNUK63a&#j
&PXZR#A0je,YY"%YB2FF`1,cGf3P&!1"VB,Z6!CLeF)1C9%X$-QQAf-A"HST%qi5
CZNd8ADkH)r4Z1hHRPXVG`m2l4AfDPfMC#3Mb&BQ`"KqB2Ej#4H1$F$5JL&k6q!#
5m,KVK)k$PMpBKS4j)XJm[Xc#dSBQlRc(`1S+'bJk&rAqIe&cPa[*eGal&++XCjC
$`Y[P%VD5C!Zkh(UA`PeKm`G!`-QhSYbK(1`,5A,fJ!mK5i$0X)@lpqLHeY''4NR
H,[q#V@5IqBiX@ZK4I@)MYK)9'U&R-KbG#ia,C'"TG)-JRdA5JQY0-!MFMTmYZ0T
&kNplNXc6%m-!h[1hiI0B'!53!-4`Q*FaZ+Mh++YMYq*5c'63Dm+28cBCr#HrT6+
5Dp`,9%hKGM+A31ahMFK)S4L+8'E8Q`pffT[0#cf5'DdJ3R!L)[Ad&6pGQ59h!(5


P3"$TU(E1@p2VV,LDAHK,pcS"cP*+a8')IhK,1E&BIEdiS%8jk,56L+EbeUl*+9M
,9`cCK8,d1ZHKf'6pFqKqIbjA055)%DH`i!9cB*-Hh$Y2P""M!LP)ipcVfcMCM)K
NLXbKp#(''#iNTX)hA,@)&YBX"p$jmRSPhBC+YTZhm`KC5609a`)P-Jd'U5GB&'B
!VUA(%k+3!!TG4j)DLaE*qAD!M5fX@P0b6L9VJMi8c0l$hHV%)rN)e'cK3l'J4"*
l2cL*55N@$5Am*4iNNZ&Cf-4jC&([9bHR)qXNa)HZ)f&rC'MD0)dB!JS)JTNA1@f
DV351U3ELQ`rac6G85j-*X%1p6&e%C4beD11E@(h`a1kD%$baX%PR2j[([Akjajf
cZBFY9M+MHY)m+D"@3&$1fDD@@""9#`SNj!"TbR`SF!+6'CkE!%TSN!$3k'YPi!*
`Sa!#fEMhCR("PU8`lR(@,e0&I%Z+BP5UVT2mC9I$*NZGm+B[*ee4%eaRS#j8D6%
MHViH,h[b+$jRK2D'B9k+(kj0ASUDqA"lRI32PM31Pq*P6r,R$1QV*)T[TNh8&`&
6kCE5Nb@b+#J`*XT%dP!++6ZUY)+G3NU*4h3p3BAAPZ+eVXc3bcqUmI@*YV&C09C
8S#lqF(2BbF9Q81khGl8GK,%%PrI"L!ffVV&Ur[3Y9p"q"Ujcm8M&513%$0QpZeD
*%"S)VARNR$F(qKYRMlH()biB13U94eKe$p&@[NHiS4+F+c9EUq#%4%Jl(AQ*VS4
`f"NfSGZ-EMmUD4(#4l0P3)3N6f(+15"j(#1hM)J-3PCU'K$Q+c9Krbf-e'6*21J
0[IbCl'jh$S3ZSEML(hB"X1FVlr`%KE5$M`b+P'XJ01T(JCB"D32Qm+3&"S9N#JZ
rpjDG)N1mqdKQb#P+ACRT'C@jf,S8erXLBCL@Hj@5Kc06*d3JDM*UbDU(Gi+1Vpf
BNHbiFkIi5[MZ2(I%FHTYF6SUiE2rNCf`,jC#`0H88c8JmMkdDQ%Y&bNb8c!iP3[
fZ0UeQSVfS&)*#ibfE1"VeUT48(IFelI`Ba"[@PBdK2fZKR#,0U1cAbLrAi[L5Mj
Q)%)%*a-Kf&iYAS[M$Qh4rNrh[)KS@k[miXZGU1aimAqrZ"q9jZLHI5!D%+16dDG
"EL!Qr6ml&+iXqG&R1e#41VlB[IG(U%3U+rQ!Y'22&j9FDGk,'PH%rJGf1PZ$3)k
D,5q*Tp'SV-Ab8QJr9&UcBd6c1`FX2cc*aI-D$$%$dPHS(Z#SP`-0MJ["D*Bmi3%
pf)iU*8X",ZrkLqq[EUYPT$83EVH-(!b%RAJ0K%[403!L$+'9BPZBZM8BC*LCJ8V
)39ei@XlF9*%SRdp2bj+MUXqENhjF%CUI#"+jk(fGc!kL[FED%JL,R2NV4(,'U*m
S80pc9K!lqc2-GY0fC(5)3GU$'-6%$!+P+!2(Df9QV'cRU9PqBF'1B3YHk8TcaBL

m`"a0[6$1G#N$NZRcCM5HHKA*Y$h[9D89akiA)VKS@PC``@MR["Y%!!hk-N6(``K
XdGjP4Q#RLVqT1BD#Z1[iiX89BL24@P"J#6%k!pB4japF(M6M+mA,(cC2l01FAAf
D4AE(pH&+A`V6D39EaB#$[+!lSA#,PSFjFp`HU4FGq,NMNJGQlqM5,#2HGFP3Pf#
Qh*8R!PKSLdiBNiSKS%N%ZL4j%XUaFM#X%"p[e%+fMI%Y6%*jQ$2H!6C`hrQaU)V
X&)hBaZf5NZDZN!!@kNScF[jFN`IL*JL$0VN1+-S)4BS@bH+k%8G,qFM*9qP!2Ke
SS301H4*Gb)CKLp0GPQ4Tja)3pba#SPSM,&h[hXD0eQ6dTBP!8@p!#,Chfd5HU!8
6r5jrSN3+)F@1a!0A2K43(A,hF+J8$-"('dNdlUjF1E(AF',(33E'+#ifSBKJ%3"
!#3X8c06U0U$Kb!L#fkQCR8Z%"-$F(h%5)jJ9@p'I`!cQQQB!G"-A+4)L#a#CLri
E1Th-+MA0LF!A3PF*lf15PD)Z&RlNZdTVZ)B,1Ad"N!$CQm,Y+dBq!m&)a@$Bl`a
F9kE0F$SG)ehZ''#L5GhX551Mj[6HMBcDcFDQieb3!'&"-i2&e'`&'8BI"bkC)@,
EbaH(1+Yh0fAe&XHcHMFEE`aQ-cTF5aR$GZm%('caINjAhd#@H0*[q2U[L-5N#pG
VSaeXD1#YXB4RDHY!I'XR-He&)c1QTSC+AKL8!(%E%`&1B"-U6"'INc!))5%"2%c
@%p'NM"33*KNBiUhbD0)6q4*pHKH0*4J8G-$)&Y!hDJN53"-YfNQE@,a[d)6pX3P
$e*r6-Y[Mbj3EhYAHaTFQd+A2DG2%mVEh*1bTA"KmR4FL29biq6BqY*J$1aSbDR(
!8C*J+*VXBK,E3a3Ja&c4$(fb6Kq6f(16*fjH)8pq5Bq6[jf0!$!mTQ$)+i8"Y#A
@C0!biKH9aaQ82j8P0e6,kj!!QiceRj8EUS8$8+AY-,pGDH9#$6)FL5BdAGTmcU[
qa)dXN@(,1pkDY1!$0A2SIqKi+mLS6*C1llr$-$hp2EP"hb)QkN4"`Xdi[*X1,iS
9MmL&6pi32Rh&ahN$(*f*$La%ZG,eRJH0q(M$SNrkB2SYqZAa9XXD,[Eb$LHEk!V
3kFdT*JkdDU@a6LaRe3#@N``GK`(biIY6QXr28j&9@99NF$X6!9(6%lQjM$0)@(9
"`VT$&YDF!lU`,,*!mZj!jU%X*Tl)Af6Kp)j4#fI169KkTrGhbCEi`@PX,1KG`8*
,AJX@eSBZA%lf*+cemr!T1b'X$@[3JF+,SPp-A6`EcJ5,CmkNB2()$BKL,!XJkH(
LVhi$#!e-XZ,2S*hC6bD*Fecir,YK0#h6@RjSSND!+Cp8-BJ#L5e4+FLSR'LS9h'


pdrU4ic)Dk8TlqFVeq`A)VYa9&ErlT(`kLK[Ch0Y!"J!UJ&+@#6mU6DLJb&qc1$U
McVQ'j8FUel(bIeTPj#q0&jKPLX!Y4mhD!FXM`Uf)C,B[a-@mA!`mfZ#id(3"*V&
Uj@f3!0rQ9Qfr-Iq%Yd&dS*6CBKGII'V"kpTRIM2D#G5Mm)+0`hba6PTKf(Fc&Q#
UL,JLKH-S-a50EIj"LEAb"4K8+Nk9IeTFF-YL4#6qb1SAGQT()F+K&hD#!!f"h(4
@D8ffb&fbbHl'BDK,6VN,"biTVAb0M!#lb[mhNGI&MImZI%)4Q(liVa'P0HEFmT!
!dXV'3*!!ep(KIL-hM03,Z*`3500qqAUpI-9$KC2pLi'QMaZ%ZQU6TG9VqTG8VHQ
r(91%`8Za`1a9Ld0'2Ja69KF&5(D-!HN6IkM5LiFXe3"'95KUKS(4&6p@ZH)S(eZ
ISarcUBj96ACXVRiXP6MQ6-HDA-U-K1CG*Xii4)APl%(m*5f@#e6K"V1A,'I,Mj`
SjmiGqelmJMT6VV0*[qX#'Va+XB+$50M6PpbhGiHFN!$ZFVQ1[92'6IT0ELDC1E#
a6-S9D-C+"AkM6R@qCadmF#6V9(&Z9NPflK'(6(c$5,lBqp+,1K,re*!![+8M'F`
q09Majm(L`F1-4NE%#3NUPeQ[f2@+RbSljB3@&4J#)k9r+Y8r&HXG0LjHCi-bJR5
RF)!CLSH1bBJ(PiM4b&C94qh+EcN6ka[&NBQHV8*ddhbUde&42ZJS&k)Md,RRdbp
fIkTmZDm`q9,ik6eIl!BpY[,&LpI,#mhaC'$+9"$Z2iiQZHEckl43j$!Ak3'PaBe
SKj@Z0`PPLBdZ[Fa4%dJqqQ[QlQS$#A!r)RZ)brZqV',FKQbcGaR-ES8iHS`,5!i
CQ$L&%FVSaKb!b(*c6cNUE%FkjB9-pf3!E@N3@L1KAFAER@a'iF3N8URb#2@B'1T
$VFP[G'A'b*8l!9j&#-&PpLil8&D$iS("k!S3b4rBD%!@ilbNqCKd1+FGNkf@Tmi
*&LLI`-rdU#A[[N1Y"mS-EZm6)(k8`U(cdQf(4BZESYqlHaPd[TC9mKkBjP6f%6f
`8D#I3FTKE2Nk`B[cC(2Rhi3MqU3F6,6`rTLi[4D`eRr0cA"Q*0hR*,l#l#%I1ZL
A$q8XBF(9#8G@9-Ur(*lTZXaAIR1B)cNa5em5)VRT&Cf$a6%Z&R+#)[BTjFRacd'
pb,bi`$N`G%a@AH6T)#%i1"&dPK4RR6SX6`Z63S'Da%$Ga1,UR3KaAI,dX@hGd`H
LrL3Mp9LXHd(!)PKN@Me-cL$)i3LZZ'$4$J4,Hb4mN!!,BHJB2L`X,TM4HkJ9iV4
Nhqmdm"*JTPVl-ZpZ3bP4d!5mie#J4`[J*UlR"59#ELlH!Y1-MC-KJQDGkdhkF-Q
9qr9'C,LDA,N(0VPJ8Uqf[22M6p*R3pf2[F-Afp'JeTP#"VP-3VF*Y$QPI#b5&6Z

i-ZXE1KLCj[0[l!84cfiQV9a[FVGb)fIAQe"mhSpN4H`i@0CLPe'&I45`,BNVQ2)
iA&[Fd5Th-[&F*iL5PGrk4J(4*UHGXkhBF!",F)Ch8G#$@#fRPJ2G,C++M&)RiQ"
NEh5d%TT&)%!%'KN&6D!'#HCflcJN'$60B6(Kd(-!%f#qQVR-I0FNTchTGi1iF[d
hQ)+6f+0&4P`kbGe+SRf6#dUq#l2Cd'%HjX)jV,-*9-i'X-RK)m9(()2ChEP&$V!
CB*K!6"%i,eb0`LB,2pPh@i9haY#2@'8K"@J'9*99lPB3*fEEQQX`a%--L2f"$@$
f5+2`bd[jJl`8CrEp!8--Y%eK3!5SF5VVJmN@)5Ll!-$SLjTl"SbMF6hh50EJHpR
PI,&im-qih0jdUR$hThX+2pfYf-$DRqljY2$,6emNK%j@J`d9)"$&6dTcFY%TQMY
BEQ-6AdSc4`S6+[iBfa((RmY,XLUiSPS3-fc5&&h(i!r')*%!Jdpd@Spd[RfUZ1*
8VTcSd+`l,8l,30m8BAB[ABAVlj6Y#DhJbXEGdZIqGcCY#K%S%eSM(k%06Z[*(35
qlaSS1%fb%0%d5!lf6b(+&S#0XN65Ib+Va0&j*,%!HF*KQ6QJUT8@!&58kSXZM3h
lm)VM52D4`BUJLajZG'[L3$p34Y'MaE9A&)HCV+biD%)%$S,99RmX0[(X%L$)+V%
G+Bi4ech*M*2U`!*NjMP3jV+r`b"ECL+6%`A-bG$j2e,b3q4#"'XJA!0`+8Af`Bk
%Br1eXZUqp*kq9UKA[j568I4hq4$%RYqZH*23&6VYm3!eD9SN#f,m+KLGKk)-q3A
$p)b"9[9RU!6j2@frIVkqI9+p2CCVq8pCS[J24a#G0`Ul,m-miVdTl2q(%4$NbJ(
c"3)'`fSiYm3%c*&hj-MK8m9b`ZURi!$JATr2dAmXqXLCrTYMhJdF3FEBk3`Z(LR
1e40$$MHcSJ3CFHF-0pk#!8F-V(*([BSK+ZT(#'e!M[TbrJEdCpfYlj4aSc3A9"!
#P2)#N`3@eiJQ!VVF8!L&5$R$V,C(4YKSBLhc#+@96B*'0ah'KZpXG*hjHK1Z@3i
%!@)%hN5)CmS!XfJ!"42&43d*FH(c'5`-SRIBH*-mTIjBiV0L5FDAK-KP'LZ@Imq
XDifDmbr[NcrY`+G$L[d$!bCEcK&`64XYSXce&LfrCY9EHdedp$-Ye(L,dR6#i*'
*bIba+4`d&c9!46EcB$+kN!$F,+$Ha4$r-$B`Zp%S#B&f'Q!T"L#E%!86J#cRL%c
%%V-HJ5)6U,3q9H0ZV[p9*!a#A8@IEMYYd%50UhJ465LZcA5h@YlN55DE2%em%BE
@+PP99!cR"6B1a#*2E!aM69YLBqXJ5$RL!*Q9%PV!H4BGa%r+f@`+K((beVVLFaF


!FUdEE)X"Gije[A6*F,S9acU#PbF2fi-#Yd)hIlj%KqZSNI9XHCRUbH')3NFHl6j
*(8fpZp9MDI8lqHT@I6PZ@XUe1YiJj,BV(("[8X#"8$8Q$&d%Xa)LL#N`DKR)K-F
8!#bkFUHcE"@65$S-Ki5(Pf0L"6I"Z1aH0b8Q@SiUAZNXXAd!'q+TiX-Plj@VK-U
*UJP%4Xl)BH8++`c*HYGE$&b5LZ[bee`*H&Mj!T(@NTNe'2$Vk`XVk!-PJF0*4rf
4hrjH2e$3f-SLa#,pLF93F,IRla5K!icq8Sf9KqPCmI%hM*`M"FXZThAMUJZ%e(b
SchXBD$'FQ)b+6*4%@Kf-8ZjF1`C-X*48#K6e!)c-C8I1BNMFX6R4%H+1PBQ10(I
N*6V-h0'Jk'6GD2DfG25BYJYNY$,F4X%88!A6%qm9f`Blhcj5A1li)#E-*eQB6ME
+p#$-fQ"K2[Lb,XcD)'(QaS6jB''G,%a60f'DTLT-%`Zc)&LB@6)LbP4-,NUpXe(
F1mEMCc'#`E)5$*BiI"ZTkB%Y#69p60CJ46P5Ubk&1+")Xb!S#Sd`BidiEiN-YM5
Y'#R-M$PYJhh)"*bAd0'8IlM5!D2$L2-4$854[PB8iRcaU4#PU2`20(,dJkTF1@5
J)dHM8cRLDmdraY%3'KiHeXE*U,q@Sfp@ZFTL5H(P8aA)HKp"G&p5I'!`VU!MdNk
Ep+%f,!aN+!#VA9-S!#mK!Z"+1`8J329MkcJ!9j`jPSM8!`ab2*69BB-"J1`N'Ac
SLE`X`6i[bf$Zci-fYI"bBNa%3hiJSZ[PM%,0&3)D!Fm94#+p,-,J5%TIDSZqe"3
LV&k9UV%hNR90d0,XHX4ElMU@2%!Uf3J+dpTAMAc0fB3"lM)KJbpZT1LbRXfB[#9
rd*0A63XQMBqb3TGe'YIVlF4%5$)c$9U$RZ8SG@8&4lR**Ke`dT!!IA,Qh0dU#bE
18K$-2d%`ZP41(DP)k,3)S0R)f$-5*jT+PXF-M'M)FakUYb*r![!HpX3cK[DG!-V
S!TLp$eXeaE1m&MN!X&&L"e2'Rlq)4PmU$-ZEkF`!B&Y[B!2+Pp(#h6+Srp1(%"p
2Tim"Y+a@4Hr-Uk[rP@Y+%T'a34JNV4i(##`6-4-+-r2Uh"K+$+LDSUDm1QD,4X(
)jHb!XdaPk1M8$4daTT3c[S`+Q5-CPD`d*9"4"1-ISS`S+m5kJD-cEZ#)4Gi@AMM
`M%B%IQQb#0b05+RFBp)9XRiXZ63fNH+#"6NF85,UDS*!@e@,MdFaf$+fpL#&`6@
&Qefa1Z"eZeZeP*b!&KhJ+*14$F8cd,VD*kmlPZ%Sa9#B#'#ZHTbaE$qQiDHXHKe
RrM9Cp5K0'!AqC@f`83"Ua@6C2(f$&Qa36aZdH*``fr02U@UMP,LNEp5ZAC+cQGf
23De@q%!LHrRV8jhMc9hU'eZ`m@RDf1*aaTNPV@rQe&TNFjQm`EHLh"N60Fad2H3

CTiVibRJ32kY'$09MXYaN((%UMMK&JM+4JF5Z)bl9%DGD#I(5AZk-C3(!'RS13%F
@L!Xp3)Y-+&3bBUI`kiK2kd)2G$q'M-[YI##KXVl'3YFe9RfM*Qa844Xed8EU65b
L5YmNS(96$Z80[M1'2`DTTYheXS[EU'2U'mfH',c4Ur'**$6JH1Dl,4bJM8cBL%&
#5NGZd8TM'DZP(+Kk*ZVbU8l+3qN)R2(%j25S&`Qb!"e4NjkB9![XVq82#H$jbUR
1)0Kj88)i2A8Kc$%(#f%+E6*C2("aQc90IE2KTZ$0AL'"*q*L[8',$d0kF)1E8Xj
dFV(20D%P6ppLmBYrrXb%4ZUGMPS8f[M&fKhe)#B*XG+f[EV*i'T"i`X,0f-[Vbh
[[1E9GMQQ1fV,RbM[e2KJQJqDF[5$TA+$p`1e"rLSLBmHH1*!jr,$P@m`3&*UIAB
8h3bV#kFZqIT8#mX8qd(SBTV5J3badfiQ8Q%,[rlj-hceh4UL*[U`k*9+Tk8kD8$
+NXUPck5SG&iD)df3!2+NjG)RdRaTPV4)kJfP3S&3GHKS+"+bKEi*l3eG#c@(hJK
0$+d)PBAQKfD&&S9kdkRdkA4GHL#GP5j2*p1ldfI68p,'G(jk8hTYHR&kYMPNGTT
Vc%I0@HCbFp+mfhc@h'DHC(l1A'$HE*jRAQ+HB6IC1qcepZ0fUrf!IBGpMpeJIpR
qV(f0[F`qhhk2IBEIj'rherZ2qh2p"r`lrGImBrb6r2Rq6IkerXAqf4RqM+D-QJa
IaU'-l)b[-RCQl-qSc4LGdC@a)U-XBeh'[4N,-fDB3UC58iHTfV6,G-MN-Kd`IGE
8+hk-RpVbUjV)51VZCA*2k1kEj,Tdpc9bqh4h&,PZhAf$A%9hRb@h4AHI)YHXZeh
XqQISVT(F*ESlNGbCZMZ@h*Yep`9bhpIGDH6Qkfi4Z8EGc50hLZiZ)rH-lMj2EUE
ZVLChUqiq4qj*h9e$EV(ZrT,F%Ghp"EQlG2H(j&ETlJTbfhAhFh*0ZVZFAAZrl[k
!h0YeYi$FZhAhqq5ZeGhr)(H6lUiLph08&q2(`%)p`&dX!$k86`HQk#k*f(j'GdQ
SpNcG*6(DYkT3'3R9#If![1!B!rb+h$lp)`R)lYCG#J+lSU1UMD-Ue3q3!#$X3RF
TL-a,pH1[aDCJRU9[GBB1c0IG"R)rdBmhifF5(9qKSk2J-%p8SCY)"dDVZPkJ,S0
qKCM*[%Gh+5$-1e3ER+AM$PAA+1SD8A@p5PdXJ(pRi4%54AAJH6S3%`#aS6NQ!!V
X0!YJA8aikA[dkBiMGjlZVL4hXhlahmJYd&e+@1RRG*IB0ce*YB3*[)6d'&3ra-p
S1R"H*C4Q1V"AGH8-GAfPSk6%NXl@A@,#p#%9XibMiihk!8VBk8[k`NNJDDIZAL8


hT,[ra'jS0USIa4B@HNKhhb*hVQUEYhLEd)HUVLR8T8i!ce+A8GAe-qTU8h8e80G
j9GI2U@Z[[Uc[dGEIk!GqMCrTG#"E2d$#$ah5&dS"%r,Tabm`dp0a&X#r-2[(Q$T
N8@hjIHk5qP9G"G5e4,r'JAQ"ZZDTZSJGT8p8ejkLVPJ#S+9,%e8(+1LPdDSZ5M+
53G@96ef&q[61%K*0GkH6kp$G#q6QkZi6j"lAh@CbkhAh&A)lG2GPFLfkqbUl)NG
haj!!Zd9h+GKTDHa1)IF'A34M@ILm@"%$J-3biR2GR8$Z10hp+EN0Z[YcFM(FM[K
%"a6R82N[1SL*kJj(9cYdB6+J2k&rB-#6V6Z-DN4hH-ZMqJ9QK(Vp`mrJR0BGASK
6GcJD06Gpj,MUH-*RGZ6QCe@+aj1NbPcP"X-*JRbp)6Bhe`TadbFc0k4Z)39Q%bN
`lhiQc&YM#S`i$HU+m[6@G*GCNrqPPe2PU0Q&Lh9#SUYGG,893rc0M9pG,LB*Ul#
*G4KrG*di)(D,R@+-@#BQ`[e-E%)ML'ZSVK1&iS`i+6D,9A"'LhcUA#FDf[[%8ba
B9)bSR%9PV(B0ViRDEVc'DB9ij@Nlm5V52X2VHHdNAXpT"r$kK@E$kh20KGF2Y&b
mrN-lK0FUE3#[-QdAAKZe4V`fDG9ir9G0`@ZceS(A69S6AVeD+9l$QJQ[2fQJm(D
L5DEpT'V5XVThm$-4USqVHq1NY9$VRX18Qd%bhLEG+aUNQk4jdQaTXE4%@K5k*,T
#IUNrK)3PmN+AT$BSITC3LmJ2AB*V%'9L*83a9k`9Xk3'X83-Lbe3)8e5!1-R+9)
p$[QN%5L69ZQ%C*0@5Ph56NQ$8TP*#0l(BN&m,Ne!j3)R6P61SX*#j'6#3Ua&KF9
i'C8pU*a"C5XUEk,#BQa'j5Y8AZ2%LFTd9&L-6k!5338$*NVASr)++Lc'Pe'T3q9
99'T3DH2%LFSS9&T3'Be+#T@h8!QK-J@"fBr+2k'b&*8h8&Q)bUmjFD,5J-T-9$#
!U*L2bJ48EN,PTj`i8AN@P3*8ISE+#P3QSE)-P9qKBN4P'LSXJ$@SX!"qU624qcS
6r4XadAmK*VUCQ1KILBRQ%420*5CkM*MS)@+L"iQ*PK!6rBfBD#%adGq*L@iR*PT
!6,5)Q1KIL)Qq48bdP*MS,Q+Lf6%Q5JI3E18A6&,[l"2I33F6q#2L8V(@k(!T$ep
!cJ0KC2#"B"dKqhG#pYXBXY$03$CD4rB*1PC4!q2P-V,LJZrG)2B#b4Rmr!bNp&a
Ya1Y0`9DH"R*q6Um*p2STaMS8iPQ3!&lc"Cl1$*VJic6"166"ITVJ"TVJHPT8$Lh
+'er8!"C9T#rUrd*(25fU"Yd'[I[lk'LKEJZpr!"'D3C'8Rpl#jVf,%Ee$3c,M8R
mk3QD6!K0dG$8rRYQ+4-TlbdKIMdG!jqK+MAK0B9H$AKbL$$mR&i6-+kH-$`VJBc

%m$0k6C)`18-AJ)i`2#9ei'9%$NiBaSQEmFURVZq,'AJ9m1Y#VEJ(Y'e'0'`4c@F
&L$bEcd!dS[P9F4k[8@)2AK2)Q54JpQKqRNAp@M0rH+f,aIRD4)bD,Pjl33c3FYX
JT#kGH9r3QAHCcVbVGHE0ejPhKFkm2p5CGlR1[0mMjPe*c&Y!c2YMBYk2L(Nr*1E
p#6([@Q,HkiKjja2crTkBp`CLhYm4mrjR#YbC&,Mh8Z$qG`VF@45iLbP`raX&lMe
ki*j%i2a,dYBpD#aAK4MlEfJ)MBUa+acJbR-BF)3UCm00@J")YK$D2a,DZ`RYr6T
D2cd53X5'jC!!'qh63fCNi`%-"k++Klf`PP&68dYX##!d(2$ad#Ua62Vk-da!@U8
6MR#"d0"@%+mhh,B9K1c2SP'm8A%C-f48+1Dkfl)eNSXKkIc4G3aX"ZT%,KU14p"
`TdiFUMG3a9eY3-2k"JcNrLbDhS0FHrdC%)q0id'e3m+lM*UrVf$A,)K!r8aA50r
JR+A3ZLdRP0crl4&J+hH11GYY%ZXRl(+[0eShPPrB[IfaS[N'$&SIK$CXaX!!e@K
NHFCDaY'2G9[B[(qGe[*!iISe`PHrC[hbkMAV9l"J1G+AL9i(-A6ETBIN"l[)`d+
JF@J9GFqZDSCM)QG596-'6E,X`b!"22$Kip%6*BS,!kKJd#VUX*dSdA*8JpJNN!!
&AMm#qBVF&)-ECX3lTqJ,(ZPa`DjR[Q"jJp1p28b!N!$ra[Q235iM)d-AL&fNE`B
Ar2KQ)(6C5UU1"3m%JNdZbCp4P)$$1FYjUj-PqdcFI&6HU[XP1VJZK[5%#LN6@D1
jeU0L@6K3mkJBTdKY4F*ihk!`+UG!XRAT2UZB00N#kS$U3&8c[h#S#JrVDU,&V1i
hM(ma)1j86h*eIqEND'M3N!!1$$"La-qi'jR!DCRLiSAJmk3(H(![Jc"DYb**Vqj
9d'`K"b,03BF4Jr40`L"p(F8B'1DJQcVj82d$q)KTmB"1cU$!A!$fSBD#$!bk"i3
Xj%da)DrH)#j#b,'*$FYAD6+Q4"$fX%&@E)2qZDpMJlAbe@qr`FEHClS"Alf)$3b
a$AShAa36VZiYNkr4%$(Q"#Y5JPSFbeLikX#1+4IB)'Q1`+'1*J6[*-Fb-HNh0Uq
hBKQTp'8ie*'8PpemJKY8VicbSd`@UPLN9apbDL&q[$%@`5!A)!D0-3N$4K#G4p&
FiVIKV8cbLL5iPiDBUrca[83NZ(S1$j%hJ`K+9fmBd"Y1J,"Gf)iXq-4[VG```Kd
dr4-mD+4qG%4h'%@HlJ#pQ!Q'2-528p%(bfSG2c!3"`BAh03iAQ$J(Pc`8909-b0
AA$3X,VD5382rXa`X(19G4))Xk&dSSq)NK@eC!$QHSE)CFR%8Sij[d+"2K3mk+A&


9p`MB5`N)UMEA,!3#9dm1!'2*8"k`fHQ,2IDRQSN33+EI)e2XiL(NUqZ%F6Q1l+8
"jCP0DYlQS993Z)lAG@!CVSb5@@BGX8`,"T!!Zd*XdkB2,9'!S3f%b+HKB(MJQei
9#rA("K[dA!PLS2la-K#+YVf0e1bJmK-I&6h,$$5E'ZV)$(3l2mi2B0N*"NVU$(4
2%!2GVQ+Jf5S'![SFEVKr5*%IZUBD--a*$90BD&8rSL"Srk#%L+-jN!$6e!!)aFG
SSSqQm"!#Ger"0Ni@3`b9APL4bH4BFV',mNk0VHBP&,H-5Ja!'%ZXmH)C&ZF54Nf
$T@4KQ"CXU,#)fN#ZI9aZ`$#R8%q1`rbS#dbpcATY6M806UHH1KrP49e5dLUP,V%
TEcDV@N5pbhPS&5Z'-mVNJ9!QfdiNYKYq&YZYX&iEAYR6GX2'i1eL"6Db3116[")
db3jGb'KS%rP,X)L9G#*JQ2K,4h3PD1&e[qRdHR8NPaJ*JbKj+M+DGJB39aP!"#(
%mVPCP9b8U(#59%ekf*+Bp10jQ230eQZ2Ip,6T"pI`j2Z2T!!(5I91*!!5B0Jd53
r&Ld+FL*A)0PI,9Jj9&4+Fbc"-a#CXA9`!5P#!1hM5qa"&kkrL!XjFB!J"d36U8J
B*""$MS8JK[6#CSIKlme`5d&!b5"c)Y3&r`1GJJ&'LJC$#6$TCEK&ChSDHPJ88j1
m!R%p(KhM2E`)!reb![GES`0#"QbfNZ"%`B#3!*@'PVC%Ce3NR&L$03a$i0bMj&r
ie'adDk8BZ$C9XlePES8Kf9mcU*a5*D)V2*`@#AdRKSP*R5K*kX'B-c-4M$Q6$Lr
i#!qar-l,&)aAJS2a1jR%ZLlei'd*B$TCC()'3(lC9#16[8'4#6*1FQ3bfcDeb%5
&T)1'61D"6&CHY0*4-+03hVTE9&2!!kFP9$IeB)[B)(rbLFU+#8p4AVDhjZ)A)9V
',a`qF0I,mL+*X&'2#Y&SRKGSU3S5[Vji[lS6`fl[P,[LL3f6H0`3Hf#QkQ*lpm5
JQMa2[)`lr,p%XkEEFD&raSF*ChK6`TPG(0qmhQa1'I$"1jQ5JBNYA5j(r('KGe#
c[Dd8eFm+$J"@'Z5)IcLE&!4j5A-aC'PF*AJmKbke*)35'f$8X`fLhSELq`*TAEe
Jd&IGJQ&`c#HQcaZp[2E,iITd`fJkP!DK'4d8eG@T0jiATRZZFT5GL)L80,B)a)B
(e3[ADC!!'$a@f96RchE$2Q@TVm1!QhA#dR#CNf3qb-ChP$)3H32!)0[[!bKlil,
5mTlKQ[5Re9V([+X!$'Cp%d[aU"Sc(SjJU*G1P#brr19LJ"-,(LJ,SLRcC)C`0)G
D*Tcl,!bmLC@UE#AlT3qA#AjNY'8aJbB,9&CRF!6$MCS#"0LBk"4+5&l`!US&e&f
6(&NNYmV#R6'2-Mb9(qiN49*@+rUTUBkX9Lb9QcCpTq$`JJr2k'V&`L#JX95P9[5

Ve!T'RdYU49T@5JFAV0Z+KVFqM#N"3IkTk#SQC--d9Z+RN!!H$"%m1#XP3%bB"hk
#X%E)G@C[K@X#`5-Q@3'#9%5"J83#3f3!)-M-!3A-cH39)PF'KH%@([c*Np)&BLS
HGE*%9bH[k%RjlHj44R8hK9+aGHYB)cGQL@mH!aSemQEBIYF*2,BC5PhQj)"MkXV
Ve$G6-5J%F8hXKa95#m5R&bJHaB-QK826VmklkUKGHDEb(X8HBl9Z5[ANLchaIrG
L"aImT+"ljMJ1@"Ed0kZF0T9M8!'lHQk+P-KXhq5B#X)mPC1[FXT86KG&YYkHP)J
&-j!!QAGG[0+ai-0[Id%9dDJ"16SIDpE9VY"eC8'!@A@3!"5"Pi4re0m`Q*0*(r,
E(#ad9e[5j&Mpr!b&Ijc"(jh1)#9d3!rk%e"23[8fT9&FiL5UJ1bhZP%F$HrL`EJ
ff"`-++VjN!"L%cbXhQPfUQdBrVX'`iT[%kHY'cIK3GH)YPCfcjM&KKf1E4U3!"q
AcXT-Cm4jClB)9C@lYSV6b9)!93`Sa%0lEF#`EAUh#Bp1A-APXP#iMSC0!T%(L2r
mU0M&kHVbRTDJG!BhZ"jrTP%1&QD'$F2-$"[+9-jQPE05VD69Y!8EG[J4m[S@1jN
0VX`LF0f#L!l0U+jXiQK1#p4A82F9[IXj2$kF(k4TUGl+)#Sj+kiDmHH[iLl8b#Z
"RK5Nf%2SHej%UN'pL05eRKD4fM'e4D4De)[B[[EE,b)ZS)prZ*DEam80jM,K1e4
+iG)CqT*Z3QFPqAK#j63G$f,dMb(U8pd"M+eCTIcd'##a4Jf+65CQR%aK#JE@pkS
'0lE!1'M'MmRk)ed9`r93AN`SSG'83ELpUTN&1P5#a`Mc4&JGE0C9k!*T!QHUUDU
SKlXJ`2T0200G)"8R-Ye5*#'%M&e!IVe@c4Hf[k%1aZfCR$AM)ImHaf#@hRY4d4,
UHB``h"P2B$3S1%JKY9b249IqEk*PC$*iMf8$N!$%#q`jLFAi9b3@iap(&ijL5I9
NeN$QKBDjA+-H6,cRJ,qB3*5C3bCEeCGi8X8D6DUPR1k"dGV'Bf!G6d*AEmM-S3p
#XM#aTGHBf0+q,"("#RNJLVdBQ10YU"2q4bZ%531a2jNbU,%N(UCMjH6aJ%ZBUkB
RNNBX-aDem$#5!2aLmLcCYkb*,0Qh,)FAc0pM[ICJEdpCXJFI#Xk5G6G`6HEm)a1
NIF,rqa1NqBe%JV4(e!R5A[8r+d'Q#a1,-EHV&T2kAb9"TJhrTa0NZ[6r9)*FX$+
4)"HF3i+FBVefcpkH%Z3p"ej2JS`YJ*K#(Z6(@Hp3-!Lh-U@k4HQXkDcjq$jNP!8
'9&)F*""Z,$Bc-@"5l`39NqBS$L3$5KV-&)T$3AEf,`jKURKHQ"0#l%dQ&LcGK!A


le-b5q%meL2KJ1p`-Ci1TbSVrJ%8*S@PLFc3%ba[4)a-e4Fk3!-V#$Xd+5JK,+#&
82%"6UAT,U@"$SM*GUEJ6JH&i$Y1ck-DTJZ&#f6`F$aaZ91BFXN(mQBP*X--''aY
P5KkhUKPp-L20H*NY!BKLB1Maa%0[*K2!qSD,&i"dqTN+S$rRiJAJR8`!cf65r@2
q-B8Tck`!TV[a0jB!P)SUQeC6lkTb3*!!1L1[hdZLYF#&D,fX2$I99rcJjZ6FqM(
9YbLGGhB+Fi+"rpHF4'r6kjT%h2!PGXB0A`ALY0V`j@h[E[L5*a',(Z1'3fEVrPM
dq$JAqK3mISJcT0d,U984lN8XB2hmLer!KP4X!IfcUDL`H1S,!$+rapiS0qR'idM
VD)MBQY$mbiX[+0*McD[b6H*6Fa@'5Dk6&([E@4Ll&bZKZYE'9RA%9X8)3QX0b"a
rJiH2`V6dTpIJq%!'K(E-KJZ6(FE(lki4Yp4ceYXjUaNEAZ$,$aX#P"LCm!2%!BF
8jmH'khk*")L(eZ8-b!0laMjmN!$i0"+8)*A""E-@%XQ'(p8C24&Xp&M`$H+(@5I
TSR0``B0l,`C&G`6hha4(N!"jF3Kd3SI+*Cm6Nq2!R#j9!BRmXD#RMc,Ma$r"9*X
Sd)mf&MmGGIH`3(0mJE@[Fi&PXDfmE6dNCZIV)K#+)Efj"k62D'*hRie2E1)c#EL
l3h%%Rc`6"2rp6"c"[4H$!)aX8PE2Up8(Q@@((Z!B$5@%MZ,G)3*P-5&GC1#V%&5
0$i&q)0h6JI%*qGlEij1Fr6SQ18BebHEZN`36c(Zpc+fk2(0mLHCe6fiN0VNP9Dp
MFP08Nf[V2VQ$h31`BA`6p$Eh0-'$h31`i4mhb6p1L8qbr(9-mPR9*"Yk#-"Chci
4pca"A(kSTm[2C()c&mFR9rZk%r!Z(&k$`bML#(-4XSQ1`qKk83$b'3*"e3,D[fe
!Q%Q*j@,'lS!ALrpE0+KJPj0$RT,Lamm`+Gc&NbX#!!!d%%&%3e)$!'EP%&8,0#F
!BQZ6lq%XZ1++Zd5d+X%"84'*d%b4c-ijZmH`d6)e06-"!B9%3+j(mASQhl1l)#)
UQTQ3!cR@1%dj6Y2A1%eI!fCP69qC@D'TSC+Tik5CB`Di21qlZlKFMih0ehIrlZ[
phIrl[J%G9!B!!C!$!2%"%5%M)HB1R1q1L)Vkmi+(K@$c12,2*idE$&F,*m,&`#A
!jF"4Z%+i)EGf'H[6Fe-j6&i'0lC9+643$)Z502906FHhUi(b,eTGi'6kNpc)I`c
V*aR9,c9li'Mk[r)PrPRB9e+m@X5r$[ZE0%Rp@CXBD+#$j560(cL'6TI2m"r#jNJ
Me3!q-q`EU9QGUldF'%6Rb5@m9pJAdJ2UppV$JChd1lQE9K0i+reFp[&2``C*AR@
q9KTi0SSq)6r+(`ZE)&eA6r,aBFp)9pAIDFm'RUCMjBXm-Qb8K%5J24LiPEVP1+d

Lm#%D+erM6iH0NiV9@ViNE+Pd3rfMGL+`LLk8EpEU!fqLLq6Eq6r#&NJ0DUM@(VL
4hL*IjRH',CD@U@em9YKXDB-k3fX*&'Qfh&-,$mb)SKr,QIchBEfP2HTZrN(BVkA
YkSGDAQ!@l5kRm&I#AT*fURr9%J16D9rjIHhE`"hdRh)ZrdhBF#PIcH&p`[iMl9A
rS#d2A%0IPer6AJeF6hmPrj[rApJEdNVeH5deX)$qPlb2rbAX4HQ`QXCI#2ZlP+l
q@6XBQ%!(b#YiBGL9*k6(eHHdeB&Vk3@jKhBJF$pp6hk%[aXf3PURpYH1"(j#hj&
$q%GK`k4GkMBq01`Yk6EeEHf1`%0dL"bM039ZTUIN2r&cB4(52HVpr(MB-HP*pEb
f+R!6lC)Yh"-@,!RU8HhH`#dd@RCU5U#CZN4CG8PK9"*9&pSGQ[+qaR8qQ9rLcIa
"[Tj(D9&ke15S5e(083p'FB24APe8&kp0E"bY6jTm5ABf*Nd5T%-'39,K!JeE+'c
1C%%k85G)*Bf#C)F,JMX$0`P%,`)436'3!2a`54-YcNP*GSY6Sd8@CafGC((Ua&q
L)%iQhNLKJY#Uf5K"[N6mC1)RXVP*GN%bJV0@,BM9JM4C&b6G+%L'4PAlVhITD2(
$Sf[cd[25$ZGPL4qUcY@T"H,Zk-fTBQhQME2L0HI9ff%maD+FNL&QAFK0&PI[68r
0fjRH)'j1cUa[%22&9#QK3VbTCCqV2S-JGH8QTqp0VdGpGa0M&V%jpDE4452jk(Y
6mX6ND&%Z5%r06IjrJM393ZRkpDq+'M8+9*0&665+QZSdFN3+X@E*b%@0HG%SZic
N*eq#)aNeJ4TPd4LYF8)ebT*Q"(q##6jB!K%TPKZaJ2-`,!&%r%KXT*VCS8kK4MD
$+&1SCQ'UQ!5+#p`d'9USdH`d-SD8#BM)#@j@0C4KG3a6P%Sla"+#@@5dJ1Y4)d8
96MP9+*8pL,RAFNUNANk))TA*JK)(&#Hm6,f@S`b"HkNFl8!d8fTa-+"Ha8A)-K8
YNTFU4ah6[@B*T"L'3QE,`8b$9hCLA(%4&*PS--F`P@![+P4N0)Z(-B&ZQ4+4H)G
i4pN#b"DR68,mX"r"T,Ia8'LeD"#V,8j$04F0+L@JKJ@b4#JbrRFDH,9-JH9#"#+
Y0T0C!TQ)qE*BV8U'DYN$&JE1TMZV554MN!$--5J%PB)6-"6#5D8'-eR*VQSVFj@
Sf@,9kf!$&-bM(H*Cm4NA@)RSB4iXC5+D6D0-"+69#X-5$5kEC$JUX[QL4*c5a3i
)hkFN1%*(,X*a5Za)J8!P5c3CTbb(BE0`Y16m0,E,CNb3!)0Y$-Li,5Cl+NFc[Q"
a6Z)1$R`+ebCS8%lCd0PX$aQH)TI(0TP+$Ue1)YdT8E0+5b59AD*M-ah5f2KMYcA


FRMMCUC!!4)"MeVLU5)5L'JK&2Pm0HE$J`1#+3A%C#!S1#c@G6'Ul+bSEXEPUYX"
XVPQSSRJBHi8UCXR'MZK4R)aSdp1P12Jc2BU%fG&N&QJf4%*bJVG-0#Y+-&2$kPN
CI%pCTc,a'6Q'c5F!4(DL['#'-++SNKLTKi9FPCdL['1"dcL&!-8&H#3ae@Z*YLf
41JLDkL),*3Bm1(-@8@@m&+H+P+'U9'4H)@c0`3c(5LFU))1A5!0P(TX54Q%m*)B
+#+NiQ&TFC,k#P1N#+U&6*SG9*V0$QcR'3F&&MaT&AQhNKQVK13-R!6*rY9(%3L3
,!N(*MP8E&4G"*8N2D2)j0XbQ!V!k-89fBJU4%JXcdN)-id2iQ6(Gl#)mNC80j0#
1%8h--AcX9E#0(3(S$)9`)c`FiLK)P8CXVj'Y&I#jem0@&JmMQCe%$KGKLJ3V4i1
CPhY9"U5-J)4'VmSJS4Ij"!F"8+pkMA)%'H"'d)d!GdBfJCbi8@CRL!(&`c$N8f`
'F9i&cB*l2@aP3d,&3E!8Qm9Q'FNHQ$eX"Q%9604cJ&a-BHaYdmd3MFPNMV%*`Ud
)4d(QE#MD)5)U++BC-0k'U4!pU&cdPRUIp!`++-m8hUVde9U%R-bmK&4m2@MK,Bq
J[@C#8$)bGfa25ba)cYU8LmCCFPkDI,3Mp%PKpHCMFQCqDN(bGLZCJeaXeX*8"#[
)3JXlJ[9)a&P`1B,db*IblfpEBFP)cGL5Qj+DPlBj1D%JGA9U@Pl'6Qkk!2S(jLY
PN6$`!PLqMZ",XY$#NV"'q5SX'fiX0+6)p$EPk,Bq+p)5YkIPLHP6iF*Q$[6kT)&
9F&Xadbj,fjVNpqlS08@m*`Y51kE*jeSY-5[0+Q(P%3V@11+"rFP#'cJFkff)"m$
e%k4eVmM5(Fr$jIZHLid4FP,"*Fp%2YP&+)64121a5S0-GS@@B04YeYkXmdP[GTV
3Y$HVS#`8j1Y`p`[5DT4+Bh%dX8[JjX[5S9+I&!NZN3D#8%-Ab&*)!Y`KZ#cCFk!
f269,V)M*XqB#L2(Q"I2j9MN$mprX$Hh[)qJ$KcZYET+2VNf"K&PLRTMfAQ+DL"C
pfDZ*&F%%UID'I+jPmj-G(-@@'*1&Xj)-BSXD2!fX2f+X-r-cdUSDa26F0ANKU6I
iI9*c[R8#+!p*IUU3!%j92Xjqihh5MeMmL&,9rR9bm+i&,@bDCdp'9NL'Q#)PCTB
VYBd@RC+i26Fc"%FN*C+d59MqZ!AX$X&P#G)R2@925$[$l8SX5!e*h"f5PT'm2Bp
Tehl-![T+S"k(kbe)Zl,NSb(YeJ6dR(!i,cReBN&bHZlfC"6Q8K+6Yfq&NKpIehj
-dTiHj'SYU6-aXd8q,UHPjbARCPSr6iVT-BPTh1aBA%P-Bd`YZHN*'DQCq3a`r&+
MrG)!3Gb)6m1TfY2cI9)F8ZM6ih`d6YAL$'rPNKdAGf2[aEcNV(5a)$N[*b%[-c8

[+fA[IFa6jBNY+5KA[T@APTFeGE$dbhIPJk9ICTQeAaBLL#3,l5F$eJ0pdNqi`%r
Y@K`q$-@9qS,MLUHQpaM4HlI`jUImUF#ER`kEYCpH4A#",,5IKQ'p&[%(F+pVF8h
3MA`3&qll1'l&2rUia-S`TI90IVVCE!9!JkZeRq)BD"Q-qr`d%`(Z-aMhSDCJ"F`
,Ti#9`Hd-V'4Q``f'kq@l%KG$10lYl3D[QD+f8"XFBe2E`k`0cNF`$1i&,DjRDl@
aq1S@&qK3q`*6Qh84VKfZ&-k2FF$FZ$kqMq+'rk[UjZF5l@I4V2eFM4LlpI0T,5i
*Nl0pcm8YQBE+i1FXlHFdc%HYpr-DZ'JY&PaM)9UXehFq0UD5YJqdRer3BN8YY[D
i5DlPCD([ch2-V@$&c`ZKC3+#5,,3[XE'r2b96rSD'r0eZaDVbZGh,DJNfpFAYDr
[d@*cY&LbE6MDQa9k3+(M&2UQ3Yp4k%F+lD[3"S@qT0$r9@JlShk!iUY#r3VpMd)
r9UK6S38+AFU`(e(SES9qUp"SK4j8k$b&HKM((Xamc0Bj#[f,3Umc2&fKXdNER[S
B8l5h,!TebD5iE'CM33UGcpJ"HiG#,l%jYc25``TGMVD43XHMI-[iVQ%kCLKdN8+
lf-"4KIj*SEp@k#b&lP-SFQ`I9N+jQDd$fAeZ++3iHTP*A+23E+ET8i@Z9'L43Nm
Tp0q-86mQBTK#cbVdV`SYCU,N+r5-3JmVG+p#(e6S$`VpLC&1-Z'J0G1Ucmi@jjL
JQ2bH3Yp5k2F+2DE3Z3UGS0$I-jQkf0&IBc,pR3RN8fJmZkh#lSR0k+I3#`Up3k'
$Q8U95C!!TG$Rf3D-91J`KES9'U,31S9H9+M-6U5A3YpAk""fBHaP-c[hiHaZh46
D8k(2XH&&6&DFrMrBk3a8k"rC(CBb(4[BR3-8ZP'Kqa8k8k&$&IUC3YFVp"D&[Xk
8,@6rRf5Le,+M`@9fX4ac2c[@i`Spa(B,bUi`1D$l$pBXXTQGi&jfbFFBkT-+AD[
3rJae(c[p+RC`3"fNd,F9ZJULXqd*"bq@H`VB2Rh&N!"%aRSrfirI+A5C3NmS0%+
K[f)A!!ZA3NmVG+`5p6#RDU$B-ccE@lKL81Q!K2Q'Q+E"YF2cPrL((%SUlT-ccZL
ap'[[RK9D-Q*GVp22TikeGfhkXZ'9P!9"rBr-ZrM'bXKUTc+`VIHH@68AeRDlrN,
DK++)HlkZH[rEK51(ETY6mIUDZ,VS,EmXqf$hiXiH"lilqH,KmI((lrqU[Qrbc3(
$GXhFqYUV8@j0NX0D2XkBiE[bq+GRrhc`LBQR0[pmicHj5mHmIFIdDrrCqh4MX2$
MaJrcERRJh8HqH2Dr#Rihq[bUrlhpTChrH2QG6qEHpArr(U@lc'pZq(hQl&ZI@rh

jShp2Ifc5Z6rplF3rGrcac&ZhrI$3(jE(6MjkldqAIlhpcSIIfrrpeErXHqE5X5F
rZqQ[LBZD2`VjjX&IVIHH9h*66CZEjeS$Tmr@P&r$I4CYeMj$#q'cRQ5KIIB+eYm
LIKjZX"BlA*E#N`"TPjMAQKqpEJU$H#@!p0RiU94NJiaQEC!!hAGdN!$)Q%$TS02
D)(b%-`+1$QT`""93M"EZ)!9ZPcCS&kN)C'Ph1&`6h$S#j1$3-Sd0p!A($RC8+i-
ZD)1'D,&*CHX3e&b&NBBb,CBKL@NiU9@*@ANTI&YH@Z+6D9PjD@a0f'@EblCaSK1
R)-c(AF$mdaUbd$i0`,SIeX[J+V6)BUJPGHB3Z*ibmR4KTR(Ur-kAdIrT5Zh6,V2
fk4l%)q"kDT&0PAN'CaV,D@b8`fb1pZP#,6+QJm&j-,!9keJV$6MGLV4ZILeb`(Z
9LhXQTF&Z&l9Z@maDY`E%pm0Ydb)(Qeh6eSLG4Mc6`QHh&l9ZJ9VNN[,DF4FFClN
P)che2V4!ZlR,f94R)KRlh'r@2XI[HTqI*J[YFa8hAB`BTrlj%5ebR+fK1JUSFA#
M$'MT'Hj'XY8TLI[ZJf5IpjfkC)-Kf5!%S@5KIBjmphN2a"#TPedEjAG)*MSNUr9
jiJa-X"jl-Y*4BL"Yk6d&Zbq5FK1+6@6S'&Q%T+CPj+DQX`&aUfcEM5'f5HNX`8l
$0!La@qXee+ce`VRekJhA9h1M26F+%SmDlT2FN!$0$4P(!D5-3XSFKF,U+,6B4U&
40`S*f!fjh8Mc[BCUE[bB1JS*Ga35lLJNh&'iB5aDY@jFbihfQMXFMK$3!(1AqMb
a6DEAc,A*2'hAM-P06!r"4&)iqL,FE+0HF("+62rAYriLfDapF4K"Gl*!A3Xl!&E
l!PpH[X$&[[K5Fk[%eZ$R)$(9D5TViV6*DQ0YX,%fD&mXm%RI"F"Gepc&a0C3!-A
8)`4"FcFj8XP4NKNcN5V+,C*q9+fMKm$G10PPjPAmXVDKZK5r4paZf,c4)&bRlI"
UQi&UkpF(VmDRSSbpF[#U4"Dm[DiJ,ad4hjqAP@`,eq8AT+8cT#eTZ53iZMSMY5#
0K$lTHj4B[Zm,pb,FDh$)%0phJj[MZr,GarGN*"GNT1hP@r,fT*&)IQj94PTQ2TF
6dR*6q#T`[`IP3GPe6`%+Jm&b`AEm(LLr[4SAc0Zj"`RTbFc84",FRhLB8H5M5%f
fd#FP'H'`8dRiQT)8"0F'"fLG"(L@K'mT549`&VK0F!GmVZmq4T8P*C!!DLYTK1p
mdK#qQKI`C*l&-rKH*@)96qaBGDh$8"j2Gk`,pf19KH%TY12VH$k3!0)k+"&EX-U
e$Uq'6@8)M+)P)@-P[3#(G*+%Y*5%a*q%c`I6MEjMdc[j2F"+"Ri'CQ$k&QMDJpK


+L9R&SNbHVm6)H+UHD%T42+ZBXZKlf$AbE&%+N89'Y"dZRDFUKD[",3(5j2'Gi*V
(dj5Z*m%V&IHeVBrIMrL`#F*a#fcQ&!T1E$Ubk(5!cZRi*MCp0e`D(!T0dce`D'&
-afHckB!$dh("kGem`EK8"YqT1"-i1HmjITpR6J$,[fr[6%c1fjY3N!#FQATaRbf
90)KRYpU+84&Xe*U5jc3j8R*`5Q*Q"ViI9(KfCf6QNGTYMM@4$`ZjPp3Z5)AP-bE
)KeLUQj0UeZEJJmQFhLBdEFk,)#2$c(R0*mi4T$8VC@P0$P`Uh$UiBMLr,1f0K%2
bh,Y!pZc0R[T05KdhZAZj5L[*p31!c!rV61Ak)4pNY%0q!!cpS8Z3!2EfK2,qF%2
J)1"HI2[E#q(f%Z&+i2"02LI5"[C-90SJdPNVQ1aIRPK@*0jD*R`iQ'G+dqD9J)c
fd$`NYAR&H(6K$9R+k31(Vk)j)f34BZ9!V"b8jR-J@Ni$4"+R)P,T0)K8@NQNH4&
3r%SVN3*"aJR0!mbC&bT)qr$jBYmmZ#3iL,B2Tl82FZf$A2Z`QrZDC-qqLdcaZkQ
j1r0DEBYMjiCf5&3@4EC*-KFeip`$6)5jHl$'JFa&ShVZUi*d'#9m0fT'ph#Iacf
!F6`qK4(Kde%[Pk1))A#(&M64jhDcDCQ*0EkQc%AVC@iFY,`"$@MkZ3ZKC3KM9jK
FX,15X-j+pbQ$iY!d%j!!FZCDTQRQ,UcafAmQ%[M-0G#%e(!B"hJBUH%`$["`XH`
T#'@-Vh6`XdPYU`l,DV2GfD%+9F6-AMC9f9JM)Fj%df"QT#!9G*HP!Z6a!Z6a!UJ
Y#)FULqd+Q@McCKif56kfr*'Eh((,,JH1&A"mXm8"(ETh5(3hA-L-+GRX'c4+[SN
`S@RIi02F0qdJSDElCU$J+6!bjQpCHGTBQ6"Nich,k+k-+,G@20BRC3HC+XiZ"IN
lN!!"HV2A#Cl8IMBBQCQk0b(2HYIXI-GGEI51!mr1k@#GM5p)fIM+Q2f"i&RcKLe
6fV"0XS,T"2a-Nih28pQc"#QeLa#&i18ATkferaj+Kf,LET&pTaDR$#@+QE4!6)[
1bq)f6ZG-2fKEHEAk)&jZHkHmNS-06mT-&&0L-P,c@Z@j'DLDCL#McHLV4IP0-,X
)CU@8-!0IIQHJ46XM9)X5R4hT+Q4lAUTTbkjrENGE1L3AjH'-e-5dZfhjYA4)JrE
[,,4(CUh3SQTY'TkcDZM)Q)cq8AP+@Z0F-0AM''[CUYT8cF,[GV23D*h96iXU0EN
,#ZkYlT,ifpjP&JjU0K,&l&)YUYMN,N4$TEXNr[IZ-KXR0K[PipRGY5M(lbCA#-K
m#[E&`5q'm5-*#VF,0@UK*4eTB6B1-45T-K6hE,+KMqM3rK6Y'G%k4@8SlKXk&!i


jGSATIIrlHqFid9$Nme[Li8CU8BG-,r88ETiMQpb#GXdYD#$H8UK&K6Y0fJ*2AD+
k"HhU@r"Tr4Dh&T9[dr(Z&"e2EE*DM!ECBK5&&kGU83QYl[18*Dc&U0FA!qJ[RU9
&jE5kce1IY"DMq(%RLNCh(Y+L5"f"6%lU`Q'D'i"UCVEQR[mNQJ5DHmQ6D)*SlZa
ldGc4h%RhSYfPZ3H&S%'SZ3H(S+QUZ30$d*!!eYap-NrYcNK"aC5D9T!!Tm6X4K%
J"@83P%a5@@%Q6jE`+l,VNG8@2!K6bfmSdBqJ#)BABmM(YQ6NTK6J%dPDAN*L'Ri
DY),kSpD#2DU(h3kNUIqL@Jkkl#clqma5LlCdR9PELREr8K5hPqB,d[)FfE-m[mb
hK+98@hTFLaT36X8Md%NVY!&INJIrI0+!,jr8STE8d2NS`pp,EefKrG8amYG@)li
9@Pr(5&q6NIA6mSGRGqpr@RBeML$'X)QBLHZ)+HV(c&KL*[8NaYl%6$BaSiZ*m3B
b`j!!EQ8X4UV-p#)Q))ZC9'Ek-c1!'FDkfFL-KCP`CYL%jX(%L!CQ'TKC`3aM*$*
'iTI-K",6`TPjKCPaa,3aTQf-Y-(26!ic3iKC9N[-CAE9bdbJbr1)UAfH'$@"'*Q
TAlZ5Q54L9VFc`ijJ04YBc84CcF4GabDXBbVAX30ka-i-1ij(8TKKKrJ)%rd!%hT
r+62XZ2FciIE2*qB38hEEF'Ek--1B([%b`jKq`S6BaBjX&jXF`TL'P$$$KN2BPS3
`PAZ#Q2%``bEXBFSbf@&PXXYNXZ2)A%"-&Q1Aa5kFa86-BT1cf$&P-B(bQ%"jE*2
b,M,$@1aQ&pM0VVfE6G[1$QKl&c2GQ@&UYNF5Nmq%cQHLl'##lMM06$icl$)lf13
GE2)1PVf5Q5J*M(8#%b+"LC[!Q"i8L8PM@5fGX8jRLe55lD688ThEm4hV&EM"eES
@9+eACm&jUR@p1pcBDYf)JFCDZ%h9qX63DRe58V8H[k4DpjkZeNHUeAS3J[CaeAV
Y)EJ"F21UpDT5Z(biPGAk#8`mF35ZUeT[D))$iiC"F0P`8(!l[U2GAJ,A$RF4,J%
#'(@p1NRAkaTdr6,9`8$A'lTdrF'HZLlAkVVLdA8K80I[23fATHY0IPhIh!HZRkl
rLF-"FC-GcJ)h50GA'H$!i-RqF*'krVJ)PkVVGhKe2E`8$Nc#RiI$B-BEZVkR80H
c9X""84B)@9rUHPk-VZm'B[j+A8r%iL!'$f,5`3@kRPDXkqN3,"f6pZA$B@$046J
XZ0fSSrHrV[FckShj4VdZbDK26S!E!8F@5ibkS46Z#"b)%h1-HP'f8Cp8E04(Bj,
h$D0HBc6U$a6#$6$U$hpTe2fTF&L-D6,UCm$dc(bM(P3#Ci($K!!-"%"*!*!!QL&
!-`DD3@L'3[%L(!JL&)SHZ2j`8#3Z-1SY)K`3@X,KBZ$!S#A8U,G"J,CDZ"9`+q%

J40YBSll"$lF*$N*[J)!E`+aGKCYRe$GLdNCFE#-8E`6#4LKIaZ%1`AA"JF&P#()
C#*GI-HUeAMJ`Z2'm86m"a3f"4[ef-+U(!$IK8MH0-qUP8&B+`8Xak5`%28X##(-
GM"m&Jj-3iL3ZFa+(HK8#AqeTe)["j"S'Vd'`DphK"K[e#J2FD6J`Um#&+U#`)Y+
SE`@MV8$FQJ)(T9Y"9,&j-SJbQ-Z$M,U#`lB!)HL94VfdHk2q8%UMIPG@SrjJ!Pa
5SfiCdDJ,Ja[erH&`r4YelUr6HA'GAYd!&`2A"ql,1Pd[JHZ##i5,V0103$4ki(V
#$BGl!fi3A+mk[A&*R9k(`FP0GFJXF)2Vp%P$kR5l!@iPh20`B'aI!$Hr6KpYJ3Z
Ydbm"m6)QAZi1ekp1VcA#YF-"i3B8hNL"J`"9%+BU(`j+6hMKXZ$!X-&HTpHr8UF
r#i'Z3SKL%Hi3A#%FQ&rMF,MFY33i)&h,VY-V`,KL"4`Z@`(Q&H2Up)I!j#j-H"!
APa%S'$4$U4N##a")J%"EJZVdGCL`(m4$Z15Kr$Um#B(A-Ur'C!HGaNZ%q1412((
[Uh%ZSILGC'P[KGj6dl@%Cq0YHrCD2MNH2I+SKLVIjhQk$jf-Cl[aqIVT2TB)dGq
1&c6`4QkEI+Z&@QU'B1,eNAa$!kpYi+-lqCL4r%pq[V@'Ef"-&XZHrI1j(8`QbG*
D[i8aPPh,FcLL"6lAdm-*D5'TV!KT53Gq83Gq*66SrUUFfC!!CN$CS@J-cDk[iQ+
lH[j'!lmeL)pXi-e"[$eHGUhJ$eE*,S9Aa&ZNeK+1*A8KB6A2bUTE1IF`'B8%*%S
Lp6Z*jX[4Dj2Z6R2prkMQU(U9DDkSDUAjA"@[hm4[a22k(2iR4@Tpc1ATGZa+NZ`
"emN-Raj'GiSL)Sr2mda#TDdU+pPmq6`j#32HqVCT5Xk+,*rMHA!8r8(Fi$A0Bfd
N@lLU4j)H-f5f@jEfc`HPF`U&(XDMhY8PTK5P%SC5$SZ4riV&b(r&`N6(84a@+aC
P8-TS,81C#T14pd80VK)ae91mZd1ELX!QP(232L-)IBLAmFP&0JJ55VeEk-@DL0$
IBS3"SrE@`'M'5J+-BTE`+$ppJEq-6*[+ICZi2CllAZ9Y,2FX--NpN!$4E-XqM6l
A-`Q1M'a,#j(b+C)@mU@a[#4HMMk0GhEbSNk&+4Y1[B*8R8!L"R9k!(84hQ*@dm6
(a21D!$kTM@rXj$8bNID&'PFfG5KFEV4dj'"6SUmedY&``c,Z+q'0XJhJ)4'ci8N
ek*R#MM01MPQ1RPZ'GQe9["a9a!q9m1eHIUL0(kcKK`*iX*HBYjPjL4MY'PZXCZB
a4TV-c"PQEQ,'c)BrBHBBc!UqR#hq`Xc[QIQ'QEma%mE-&elq0Za5YKV&12QBf3K


6DTE)q4CCchGF$AS*r(mXLGT)dM-*k$$6`"[pLQ5Vhb8hZXcjDlLKaK4BM#50!G%
r%Zre-k@ANT45(RS`3HrNBVcUQMb5PbJ55`JeV&FI-%i66&p0a")q`d!pk#pL5d%
aDeILbmXfhYLJ@#Z!SkJ!`[&E,VUY8!0K`Kj`F$FTdAB-(#SlF-V!ehX-dQPHGj(
FL6ecp8lN!,kpIJY[kq600AbNR6pJjpi!BV"S0V$d1i'8NdR9&NGU,-kJ'kQaF+N
j"!apMXG-epA%c1'*4VSBVjHdTGR)Ti4jYek%qDNjk''%jPBGB)6N!"`(%a4A["@
+(,bS(,8$eSrNMI'+!`"((,aBGPVDk5R6D*Ujc#bD4LS%l'DmkED*(C[mhk*M9l2
pJ1mPI(*0"aMIJMfIkNJ`b3GSRYK9DI*Tam'58VB08!j0L16KrQAmXTdM5leXjlG
Hjr&qIQXppp[0MVBMF&M,`M%VdNTDdSTNUbTL#%2$GGiBS$Kd5@[4R$'fmdCl"bN
"i0cBCN)LdfD3!)CZPCAd)@(8AXT,krL0%Yj@a&mZiNJ+Yd*11j'ccFk[L[K8k+L
"G[ER0Q&YN8e'h(pSM@XHRmTf1qeSfNjpR0SKTEmMm8C1ipd-CHjQ+(-h`hfjflG
fapeX%EQESI,G+ZA*5PHV0&cQCZq"SbDfmBIY2-M1D`l`dDL55l#f&Ki)JN1eVIV
'Cb&#bTj#HSq3!-5!Zf%5b8fcbK,b8FR+a%(#@i8",pY04$Z+D5)Ib3#4icEE$CD
KiI@RHC[hY`F*Rq)jl)Xe)`!51U9NhSRMXR0l!$'GpR)if0,effL-KH-P2PIp[06
2ErKjQjqImI-52arYJ-"ii,**F3hR*UXZde@#k@UGkDVBG"9%1eD@+f,RGAC&1jm
83-`$YQ3j`HH+95Y*1)*)12*)HIJh@r((@r(M'(l'b,6lK0pjC&UPHCG))pAM(A&
fIX21f`1)UEI,adlcCVCA$`5`(5-(MUSPe-B$SD-XLA#qV6L%F%,(X%1&6l5Um1m
UZi&6Qa*"f[)SQCZ!Fjbb(rf5V8Iqp(!P'Se%hXDbR+1XYE[GFQjf3"!IEH#Sc%G
lcEB6`5G6!Q(Ae4bGa6--"dcJ`RR8Y+,Ib`dPTX!lb!E6bp+M3HF"8e5L9Ne#[pB
bY$r2X*cN$6Am,MX[Y[0(!iM"SX(,0h[jM4VHEQGR'd!-&MF-[)'eKN1YZAQ"06R
-Gj6VAIdFr'QX8(BRE3Q(Y+5RB*%181Lqd,I9h2p"bD5i*-Zr&SfK3ECI"V55MG&
&dDp'%kJbjFa*!iQA1i!Y#NFpD$KY5PGURP[#-cZETMA[Gm-Gl[3Ne2)Q!cIlq6X
Ph'cJ@i2iU4VbPHCD#MpYjcICH98!-9KFSm0j!Z`K[Yr1epVjUJ"LX,L'ccTfEVE
c*U)0Q@#JlF33IQdl"i4I@C0*E%rb+`%,Zj2I#&K)%PBI0RN33YZ8i4eX"R5`HIi

qXhN4N`G0da32TYMDQfJLhbG%dq&M')lb+Maq'Cp)Iq(a0NJpPSM"[R[i6U'YZ%K
D9X8IVC(lqhRlD3CiVPH#0lbGpM$EB)6e(0b16%9J"2Z+!YSFmXX+'jeT8m')RN`
,DcREI5-JBY5ZBVk+l!ih"a#c#Z#YP'cC0HaV!$&ElI+3!'+q9Z4RDhL$R65bfN4
LX$KVUkUqXkD"QGD-2FYD9IAPCG))l8JM8kQNb&`NK"r4H8jE9c1X,`q[2m4["*9
E96T+pe1T,%NUR'005*'fp2AM!S@QY+B(hfRBa8IAi&G&EZJ!J+5S2U@!)I*f"XP
XCD)B3QV9ASjQB&NN,93k"5i$&,Z-Y10VPh#+3%klDESXX8(1GP0BMFpLJ*`0P@M
"iD33eL(I8Aalb+JqDGUUf$qII'ZGCT!!$B#3!,'XQ*qaXmSRJ*JcGYR9cMHbSa!
$E0@Sp30IT4eLhdQYKe6%mY+LCE[,X+[k,GK0XKf`SGlN[M'VQhL,35P$DM)K[3Y
54K#G8ejMD)%9aSfeDKiRRbHE0T955h8EM`mLf@bb-TAGY0$@!*`4,l3%d0lP#9"
HDm6f9@kGD3dC4p9UkGX'pBFeAPlJ*@pT20$1ei[m3#PrUC-IL1FrH2Q"%QdL5#I
jic9mNjhIDqH+Ppp9`i[pr0%'4l@PX!%-2flR"kUdUe[jMY-%2KIBq4UE42emVVJ
QpZ'@r'4-S[G"kNQLC*mVdNqL0*!!DNN83Aj+*P%2mMXb4c)+`i@VFdJGK&8J[[T
9HpJ+hmF'NBM!QYI*$p-Xl'ePfC[mpX`!83r3mJRY@r+$pP2%d`1H8k$[8m[8rK3
bGGappe0iGm,60ih)ji%XqNXVIH`p@5-YNF@8ihJDR6ehiRKUa5bp,!UNN!!SV8A
IkCFh`GA#RGiX[Ac4A1Ej%fIP*bQ9(M0@"2"PRAb$Pcq!BNB3phD59K@k4d,cB%I
*'p!-)U`eTC!!m3(%Ca2TUKc"L"V2J'Pl@T0UbLPrI+A8A@1$KQf9`(!l+EQ4eka
S5N4j*a1ca0T2a5`&E-0ai#RHYAKZ1#!DEJpFmQBTi2$8MZ1+G6E['&+NCMriq0(
-6Z(Xpl&@+UYXFTD9j$b6a*32hQlh1*kkHEbI,$@MKhNchKM5l0mX0BY6%kHV03[
2$03r4VNRVH'cmdIb*LmIJrr!35H[m[)J2i(N*Chm35qr&QpQ1q)Srclq*IXS6hD
Y4eNbfeNV3R,(#Rj)"hf1G8A+(`%eRY#@FX5lZkjjP9&PVqS8fDm10AMLD4"Hqp5
E9-5#G"-HR+pY3f-#4liQCj9N'5&,0bTNUE%*lbZNUk3l6XY5[91@kVahX,--q"U
lfmQf4`VSLm8"fii(S"2rfPpXD5%)6&Hh#AJJ"bmL3LTQCL@-Y,Srb)0*Z!k[KaT


C,d[V,JJ!X34PA6BCH+4)!$JPK%G84[J@K"4'k-N)A`XNVB*`J,`'66U`6*!!$L$
0M8%2MIhe!KlB)B2lej("rHJ%-1C&$0`XN!$IAD3a3r%qP6CF$(PK$*icZb1ICTL
P1ei3R(Fm6bh5(Gd%kBjH'&["hLXMM8&hKQd[#UjYIB$RZBh6$,`Pk6D-MS(#fci
3R,F0TaBmrB1qcG*Y-`AT0YcERb9,4q)&k3MHh1-(Nb0i6md4&B[V@2`L1)mXJDC
2F)#Ii!$p!E,d5B+!"i@)d*rdC#D8L,i,r6VmH,29VNe3X5Z,M1`D`NE3mq,K#4K
CJ2HrK@aaKT5!B3J1rq([C'G)%eNG%U33l1,$!r#''1cB`reP9cLRQ@CAH"Dp#5D
*YTLP$-L3!!%C5M!hBjEJbQ"kp`5"K*hCNbC)Hh"kYk+9Z@HQi-SdBUU8U3K5TJ9
Nj*r-#%(+3Vq!'[6bcA*LiF%#Pml#D@D4dm`DM#LE42-&8SkHBCEbqL)F3'HETGh
)(EY*lN!AB)3HQQf@YYF*q&l%3M$IMPi"m@[a,5K*F1D65qDA#P)qY)mH+%Zj11&
FD"Z0$*MV`5)3#faZlJ3"Rp!)hfqaaD1Mm8%YLh$m&Ya'TmR5$VcdFJFbp1KG@13
,cKhG`AP()+MBG[YAXT3b6*!!8Y!A`Ikk,1dX%D5Gf'hl"eJi"Aaf**ah3TIp!Mj
#ML@FNm(0rUSX*9m3T'6dKE%MK5@UJT5)VCmd5rBN$U*iDj58'#Q3!+pSJ$S*$9#
CX%@3!"))5U$X5@!Sj2XBKJq+'$jB)H$E*)BKpF&N,2#fRdNa@23@R!FKXH[JmcK
0QUC)Ne,`iHqkJ)pr3)'SDEX&CeSq80*bb(QR!HT0!UFd*)e*RE+8IP+3!0*aK*2
`8VadG1dS3RHCG16[e#jbXp5"#2Z4R&CJ*)3#S"Ta,J@l"0)P3c,Li![3-B4dd6!
LEa8-&9`&h4PU+%M$3(),q%&A-J*D()BZp"L4M"$qm&U"p5!aiY32T`QZ`bbh(hk
$'A*[DGp&JIA6-D,kh(GBB2efM)""qhS)V"q2%HPYhiX#kpGMa%hfI5HipM&SNB2
+&jf1m%T)+3H!L24"dLGJF9JJAC*d*-JFE!ek+%NkYMIR"F'9m`DEL(iRT2Z8MZ5
d&m+5lP6kqeL!#qPHTC1Z9K#&G,I58BhYl5'ipM,iXcGEB"h#G0**$)Q)G"$68FQ
Y!4[5B8c(4Uc"P8N(-RdV&VMb'REP08ceFXLU!piZVa"Fbbmb%RX%9D%iUq@$9RQ
#KY-Sj*QA&`ZZ!#1"6mhY!TkkT(ILa@S!*L+"h6L3!2DqJUGp!'d"EMXfZ2Pq@GS
i6T!!PL&C0'2VPL8,RQ8*G%DY)Y8H%&beK849,4*Jl6c#UUT8a[XLR&A),9)9GV8
+ZrSbpV%+QIrP)l*diKl"H3+`4cUa$G%4%Rf,+)9%Da#Y*&'%i'TSSY[08N2hqbN

JadJSeJILPE,)H(jNRFEGJY5BM`9&pB%pUd[#I9b6ffQi@CS-X$Gj"!Z6"*H"!'h
*J,D$!GSIMT!!*31"B,YPD5*H3$B48RALNN@!4%9XhbIKT$Zh%'!J5+1KlS([m,B
ml18$b*Je513e1185l1-$KB,d!#UN@pYNem1NdT!!r+KHr(Dk!5&faTp+GXBrJ&i
f5f13!#V(B"0U8QAAQAb#I1B$`A9Q1*!!R@IQim*"0B)VU)5-"#N),B4,d"Z#*bL
8AXDV)ep'C4T!'1`LMp!#cp0XTaTUM'C&F$EMS4kT18'3!*U4XfUDm!"Y%Z%N9JK
1%@01m3Ma(Q#*U#(&IQad)F)&"#kd%,M3!Z5@Lb6D*EKDBJK+#cDdC3"$#F9)@lA
JE$15D*RJDPY"80V@)&a*0UN0p@EE@(,I$AibC32ChJf("1H'(")G&k30k(rP3pC
Z4hAP`rkeca&F'aNXf)KkG@-TUK"T)rCY@5eKXq`3'9U'lSR,!2KmVq'CAF*HZSc
VALEA[C`XZ#iRN!#kmI)VJR3C((fiI'dmmU#AjFCY#)q`N!"S4KUk!8jH5(!#fqK
&DlS"X0D,M(!l!*8A)+JHRC,UN8ZpU(0ZHN0`h6516#m0%X45[!a9+YdNZ-i5+#Z
G4H)kba,A@3KmPP5FVV0NrqRe,G*eT*j,!f6ASdb-4cm3T%Ia*Sa,Df6AXi'NCR`
@pG9*)pRGNlM#5EBA*jF)VU[XhPFhND'VJ%aA)H)P-#['14A2)fMA[)+VJNP3F4d
KZCbVJM9l+JB)8J8biL@8pLXBc(X)J$RH,6XI)NRTS8+XAT!!TBX!'[()pAFK0GQ
AbA6V&YG@eJMDLNE3eK%XI"dKJb4EF94&5#SUX)X!M@49F-NXimV(%E)8,`0D&!(
D+'Mm&+(YDdQjheP-8PeePH#UEL!ieG%)BmM0Ue%A9(q*qlRd%Y*Fd,X)@Ap0F1R
NC*ak*'3eGJSZSjmN#L2*VXCKJXIBLfE@++l'*B!XRMS2MF,[BT1h#*l*6A3fIVF
fe,-%(S8%rJ[#`55F#$Jl%3Pd)S$e4#6FL6LFSLT"+X,@6N5#,KSS1)[k38%4@Qj
&Bd(&m8`#%*id"1+ll!CQf0RDRaGFpMiXA)"`2JP()i'1YV!3&IGS$`'MSj&l,Z'
!*k+KFJNjEL)JdbAXi8481[L[rNN6d@,`!Uj-a(PkM`Y1Eb(dHpr(LlMalVmke!-
2I!9JJJ1Yfb5l1[d%LRELa$Vl)(3p[))CFJ68,e+b'Z0RCJ!a)jZBb5EQ6!ia39j
QKK2cXXT-%M%"#F3d'jMT5BaBc-`JBPVbL@RMc!`KCN-T-i1*D3pRCK`a'`Z*K-Y
UN9c$@8,&0Lq,)8Pi'4TlbeKMlc*Ji@A@@VU-r(Vj0!Z4+Lqc9(NC4hHCjH[DkSk

8#Q+YKiA[)hb&KGd3pQ*KR1#k3B#,G10qK#NXl)d`N!#&i`9A&31I9IFJC$QeDKK
#PTZVd()l`9,NL5d)XeL)&XB*YV8RENC9`d4Y3"2dGM4U'fm'2)!3pDqJTH1T(dG
Rip@C0k'LD84fZJi)H6fFC,6Vq-'a-9Q@RN@KjeNdU4Zafmpf#DjRKj08m#`NIMD
5Y101)N1H"0KTV*+PUkM9Vk*@Ed3lq#Ukp9i&@q0LfA9e#C'J1!$*A@3KkY9L"J@
,NH#+@B)V4KB[CX@EBVIJZXB++0G1)LaQ)3$+Y33@SQUj0Tb&U05ZX8UY!NQVJTe
I"Fk[JX([#ZaE"B2e&8L(&H`N+mB$Q+!kV%ELH3LCXaUYj,Y3m,S,Z9P$iHc"V`A
T3G,44!&3'#biP"L5rmdi!M1kQRA*NRNKBRcQ[3F!!9@Zj3KH##@l,)2)53MYCMc
5UQp0r@2NEr#[m)FIe%dfebXbmJQh1bjbIIr)"HcI12`ELhpZfcphh1I%Iep1Q!3
rh[-C-q-'%9)[+pdNI)cipHr(%E3&a#qDi(C2m(M')rkm)jcp(4Q,!hp(-![6(((
SP2K[(60q+5GmXb1mCF*LjdbRbGrkMZKjChDVNIHYdHf4ija-d3p1UljECVT0rL)
MalR(&ik,mlJM2*iPj&k4B4j2R-Fc`B%rS9[VpEc)b#mBhK-iCHJB(cQE'%,kaKB
aa%AcE#,-Mhc'iiiF(mQZ-6B@("CkaMQ3!"llplFH-2KGT)2`c!,2Z-J*(VH(X9[
U)8F8&rPTa!@h*a5m2-kEfEBmr9e-i8+bYK+@f1EB"2c'dh'bMkhr#jNhJE#C'4Q
jP0$rL09-XRZliAqAEHAM112j6h3`QNfL@kbXlR4%BqHkekal9E!H(c*JmlZakSl
jMbe8Gbj5(eQNEZZDU9VNYSr9$(RGq+RmUEqEfY"ifIMLX(2Rc`mpGfcS1F9bEUJ
U2mhqhJKqPrhVqm5)*ci-2RC8AA(ZpH!lKjqDX&$Gj3M#Jp8MFeAjT39[2l(JcVP
U&M-lJcmk&U'ZHZ,Qh`blF'T#le-Me,h(hMVfeq#22JJqrRT%K$ULQaV5$ArUVjJ
*A8TX0hNb#p5P%@j2Y(U1Q#(r*!ErjCIAPZmCpIrRhjT2RF[$iQCp[ri[khr00Z&
RCJ)(rYL4UGHr8@lmRilihbrmllp[GRrQARrFielrjhrAVpq2,,6qlalhUrpdcR$
hFUlIj[aEiC),'2fRfahQGRrMG[I$CR[(*'`HFBYUQIrBSYL&D[kaKEdA[4AEh@&
(G%hrqmaIcq`E21a8jErhi04Y9f)ArAABXI&MHhI*(kL@L2FM4KcYLMMDTHk)rA-
XqIYp4%6%1l%4lb`DXZLG#*2&aq0M4icr*r%M6VdAm9D%HQMSd+&rIq,prXHZU)r


rrNje&9bDZREZ5pKpE2NMC0pl4"`EVqjriZCr2R(crd9m116+fqHk6MdI%Ia@42#
aL)LhKJH2rBhD0#*BlE2qX2S(fej2YpN*cYGqTqBlKcYrie3h6H#f2iY+CCqm#Gd
(CTq,MSNTM)Nj&H%KiERcm#YH1YrMijk&ampr@(JPjXVj$h[fl(RqZF,H`mjI+H`
p*Ac[r(-alhed2SD!E$AC&8%B!`!!(,Y"4%05!`!`G3p9$@Be%4!KiZj#[lbmTSr
`90k&UP2MdMj&)AT+[lp%L''CdS'3!!Ci[(EE+N95THRShU+5b+L&$+IVpPM'T,5
&#VUlU,Dac1KdT9*&N9@jaKJ$afLLlfG@BVb!*Bbe$)Hj!f'-C+r-iPVA)hrr[jF
dDB8dRTRGfHm!&@C1-b-2)5)KN!33)H8Ejr2P,KFH2(1!39$K6*3C[Z2$i8QPS5P
3`dX#9Z6E0-NISXNP#bH[lDpql9G,PS)P9Kdj-cTh1+P-bJdeTVbV$%%(MS0cGM%
Q&Cp,$kl*dFI#f%FGUHV6jT,k$r#LARL1[GJ2VVP3LSpVXBr#f-FplLV!B`62-A"
1JS!L3B+Fl!$)AV9jH"`%bZc,p)9LE$d%5GL`@N`VljSUNZF2)IkA4V@4B+TYM3G
IQT@r+G[+PAH5r-"9p5T0rqPUGl2FA,jcrG9dPIXZ,XaaIj(b,!m'PY$rH8F#5ij
9mUX$eApFiBL-MK"-PcLB#G*4&#a3D*D2qjih"Gfqr)hqEMm+rZ+3!'l(p`albD'
Mhh1@[@bJiU[!pH2d+&'63D&9aaj++[!ilH[%`cJ6a124Tp9,[2ZU6j-MrKe#C,T
Ur)B$3Q+#+PG[,pY+"BV-HXF$J'p436XH51E-B-F$dpb8hpcL0Y+'HDj95*je$mN
Y2U[i'hU8KreKAH12qVA@U1KN%dC&'Am8VeV&fkh4lQErG[1Fd'5'6a`IJe#PaH0
#&(m[d@E'%LIXd$m-*48cM##@ea&"--m`C5PTBa!&fbJP(MB,N!!(!E5JilXLjkA
bBE!B+mac9VqTih1[HbKj(HKp*00("FR)HBXlA![YU0aKX&m,,5H!3ZfjpQ@c$+0
%8V(!!P#pX-er6q(Ll@h2Y9fUf0i)k&cV5$i`FQ1KDQDVeR2&jP2L34pNZfAQi&`
h-XJbN!!!V5&N+DP$rF2Bb'R!i[X'UPGCCK8#A0F4hKVXZ0mpC*icf`M!p4[*ENG
iebGFBkpC#Njk2q&'b2RFkm[YVETj&Q&!TlIfZIEPcBBJXLeMFTDK)lKheQc14XF
E&F!5Jh$)3(NSZ2JeGjmiMC!!S"8c"3!(lNLB`LHiYHH1Q&jhGVDZYP3",M@K8NX
"HPHL-!Q&CZ#*Q,T3LVS`fb$8'F*8499CGdc8cAfqSmPZbhNH)"I#D)*[8lIGeb-


qlqlEfY6GX[H)'B@56BDZfQP$[Ab1hDqC8E&bcZ%5cB*BTD2HjQ90ChD+9ZU4hNf
'-1F`'qUF-R5l``@BUh4P)$!@YFqA3b,TmaS)kNjfZjd`b'$(j`YE%-,4-e&(Y#D
8d4&J1-AT9Dd*)96`64$0h,dJ+X8FJp0#0!(dFNl%j4jZ,SD![4`5C)5#c-KclFQ
XBCKULN&BCQE+(ErrkGIB3&J5%MFrVe[4h@fQ0N3KE!j'*RbLFCSl`Q5'A`!bl`e
1DcX1!h52lQa1L#D%Tp2bQN-6UhUi'Dh[GFYB@&'b1pQdr#a(L*@C9*0-kV8[TfS
eQ-KF@8*cC+b'&))JBF''0TMrl$DN-%9LbM)@02N0JMN3PJM5KmDcIBP!4#%#%B9
Fph!+09cTFQAl&&YG5i'@Mb!$P299DH08rp9ie85S%i%'K"H4dC!!SI*iS"D"[QS
3$+r-Viri@Xh+lU(I1a"m+TYE(@U(!B**J)GjNDS*hKV,$1lKfRJPmPX)r4G6f&)
TM2jQS&E'N9GC-[D2#0&i&K)6%K,m-)k%IDdb6126mV#d2'j&-aU1VafSl4q"L,I
'+jqVl)%4-$-)qr%`IMTTB@C"3a1bJK`@q!-%j`&1Jm`XSqNAX#%HH!0AF)qMK'"
1(,Fi3U%m%PL#!m8X8BXH'+(Ke-@fAI!T4kHA1Rd9L8j-$Q@VS(id1r1T@PG3[aZ
"TjP2H9h"Tb8V(EJK4A("V#3k6U'Mj-hU@8RU1&(pBHN*C1Q6Z3r,c*PCb9fBF%3
5aKR1VQI#dMX(`8-$LDNNAq'UH'2"+4ldVhI,paiTM*b2A)X8VdD'B2J-2#)qp4U
AMr[T4I@TjiP`di[LJlJ)QQJN[5![Ve'B55p-*@K#kQ@[MPh@LFX8"-I5I#"fq#P
ff"K,N!"5+AL*S163b$P+'J3P%@4$P5["cqGZEhDeBXZIj*Vbj5elGK*BRDebNJH
9,ckbNp$fmNdcFfFVlmbHQ9ZT[2Gqir[fS@Z+KLSCG)5hfl0"aBCN+m@JI1@Gr*Q
j0k#Qm4B'pI4KN!#k[LQV+EDGKdh[#h!@`H-+9dNY'-P50KPN@lYmIFMd)KQFY$Q
@S5#C1f3+D5(m9VhU+JM062dl[V6PTG!c4%[2c2cPCY8d$aqECX,@58&1-+pPR`b
5FF5dfaNE'U@KjJ5S@KKAM"Xmlcr6B*JKR5!$NX(PJSCfRjQGD@L[+rK`Skmi8&e
rib3Qk`-(AkUIl[K[l0%jCZ3$FF*KaF3qSahV'kMq6SqFBaPYdGMNXV,p-QHCK)%
"K3KAANHeF[U'mL)R*qU958rpk-NVZ1BTei&*TIi'AH4BA#r+1ApDQ+QA,`Qf4V"
9!*KMkNj-84Id6SJ,TJBTK@`H&iAXK'RXY"pmUH&3`'&`li3q`F-&DqmQ[[NNZ$'
4G6+4eCQ`"NP-rDIA)ha04mY6&,i`KdF-cX6[h96KN`+NGlYLk"'[Q"kl)T5GX)c

i*6)fl8I'[p-ZA3H4$iShf+9e@0lde-'q9JVjP[83QI6VG($+dVr,+NU#F'e$K6D
Cb'dE@2CBQe"eQU1Up[N)kU5TeiTic`M-E*p+51Je!2)QchcUmh09pB,`--H@`X8
#$MMd!KkThpdrF[&X&PdC!jeEFI3DCIZZVAR$0qh%p+#B"0H4@FJkENrJF-(5I&)
b8&e+*'pVr!@*,35HS&Hk&Ji2(Q`NJ-,D05B)ZL3))SpFNiB4`bIcd4%iECh#BJ3
j+#dSm!5@C)k1N!"JNkU6cr*!I5"38+q3!-M9Gd(JTYI2e"q&U5)q5Jl9Ac4qF'T
&%)HTNiJf`',[bGcilZXMm59)"3'Pd1@L`S!fL1&L8XQ%Dri"6L#0@)DAK"N,VB&
64bFQ@lk"l2p6(l+,QaPNX@$,i)j!Pf&`29fdR[Yf)Y%+kUG4R&Yh`jkYQXePMdp
(0K+&NAZc9@)G#F*MFfCcbSUNK1%U&FA,&'Dd6ZNU-Ya*6d1lQ'D9h40E4#G-dCQ
L$Z#BY$KmpX#N6TL8J1pY,!0I9VTPP,,$`PM'[4'%J6&CV@$i%X6EJSH'@HQr@&k
#M(XMCGbi"Uj4YVGF'j%T4)VlNZ@S++GN%(IIR5SYXipY'N3H*UY06@T8H9Q1qQj
JLqM19*DFqBGA@0*[aXpM$PjcIlE+Ej)+E2)aJ21ESD*rLJSTikLP#P%d1kAb3S"
6#frD0e&ifje5H-+LpV46X89"YC++-Aamj@I-(EQT)3PR@E,E)aB*cXZfiSV,Epq
dba0(mq8*C0(6A+f$3dc*G%rES[I1l"H6E0"UD9""%3Bj+@1L3GeJ8blEC2[4i)Y
(r[c9RDf,[Liah"A@YpdYiVYrrXU[p4`5&EFcL3PcX+Fpj2RfI(2ad$8$H4'bRm%
h[`SC3pGDLD(8CYR,"CL&!SrANi-pKrT(4*!!D189-%[,A!&V(k"6cjYI1E6[fqj
`epP8aMC,c$X@*QU"p`2[GqINA2R'H1Ha5TKLTJ'K$e6bCB[c8TJ&FX[BM`VNq2j
,$H9qL2PhXSV0iU,KV@j`&2*@BEdQN4#q-6qUI$RGYkCC[Z)2&KVcMa-VU8l`VL!
)&pc82Me@+G!eFk$5%EYb)6Pp"!SD2JY80h`XAf%*21"`[[1Pa8(i$Q5b"MBA15J
G@qb@*K@0*V'T1FUc1@a`F5GeV-mU1MVK-L-T0NUKEKJCPFHA6#J*%J-h*i5ILGr
N1-%819lILi+pQ6,Sj[J,JXGTBh(&`F,4N8NBXU%HJU-MbbT--*(%Y0""JN'))A$
M"@4qdb-C%0ReCiSYT2emhP8BBI*J`mIp-!M)Ef[$C`9IT'FD2PEKqV61"@LScq*
lfK'bIY*3iG5Q(bdbY6hYq8mL@cPVBQ$)f0XaQ@[iq+qK!+kLQ,UN5e0D!GFE2SX


2hh$&$+0)8p"3pk"0l%8&aX@qi'bi`)SD(QUqPMU%&1feNjTZ+*lYe$dZPqqVI%f
r%Z%PQmbSY`A,UrQACS2V,86X#SSc)$ZPbNqV'qTPr25-&($eJca1aJ$jX@)C6K[
F&-ZJj%C*MN$9B"2+0P&8Z#rqpie&k[c$&TQX#56,a8`3(M0"''ETaD#FAjHff$-
LFP@,(lJJ(9JhGQ"G`fG"$cpipq4,alCdRTq1EkR[YdQqAL3IP#e%%QE(NV!,LC*
GD4)q[T)NM!dIPi66m56-CdQ)KhVA#9MTe-mL!EIN"m%QA2%jIX&[p(8IcRBTYQZ
4Rlre2l,Bl,PdM*9CHL1,65SffPCEMMD`PLhLVc$FHjDBlejHeh,41Ghe83ZpTPN
QHFY14IjEKiRe$V'T@[YdC&PMZEEJH%(!l2-fNk#&)(!KCA@G`9[M!PGa0i(VcH0
k-qY%8DAEihpAj'9e-%I0JfpEH2c`bkaRDh[&$R3pKUkEijRSNmLmPeEH%a'6f8#
)&IjaF4eB-)eHm+(5a`YcA#i`C3%pd+89E)ePR*Z*!!#B)-FkK)q*j'Bi%H[[S0U
HjhQmN!",dqiF#2IM1jUcRPiBE8rll8X'YLYX-T!!6C!!JpdXZkqS''iq5SXqiA,
jYI0Fl#AbHXQXE6iIqDGUHH,L-!R$X8f'#X)8*##RC`5AkILd%ERbHXL3!(9(#Qk
P!J8C$3ic4Z'kq9H46+1Y@B9IIQr0)FFkfe8K5jH(Y0qm[XeZ4Ilp6!V`VNa-Q*U
9i[kiMJ%a[C)VN`!(AreSPSTJ*+EhF2&d9U8#'K(%*q%'C(!LEUZE$I@KXhT!i!8
(3%VQ*lX)pPhRXVT3M6kqdDGmkp+UrBe)!M@0JrS,[-T3I89Q(il1SCF0-dXV[39
,+fRUbDX'&m[TFm-,q,b$5YENkmd'TT&JNNMm1iL%Dc1U(GJ68FL2(3i&Rh[pKHC
@E31!ZbR$93#00,cXEX29$Aelfk53!)(rCMB32r3#@aUbQ&qR!Nq&(+)-JNU#"2+
BFqI!1,IrGK@hTAUXdJUSY&p4j56`CjeV@L*1U,X`CR"21`k#5'@[T*+Pri#Mq9h
+PfDI4UkJ96SpqK!1ILTl8Jd1r#X`T@QZmb*%!Srb'Uq(ZIHehpGN%(#b[A[ma2c
B+kY)Q&JB)f1GfDKhJS*eHekrVkQ9*`k0*f3iF[ameeFiFVfCZRDcVRZTDiS+FJQ
(BGHQA#qI2dC(,i8IEU6$+pMKrrrE(Hi%+E*M5"4$l+fF`NClfPSh+9aTmNl33&3
k[VNM,qD!ZDIprlBBDUbVV@"&*Rb-b!*M1rreZe4`'&p"-e%U&T,DBe'#Be'3!fB
e0-@1KKUB)*C)BYA+YRXRU+UMQ,2mc(IG99E91##C!0Y159618b&I&eZP`UDd*DS
`prd*l6Y3X+5#A&ec`B&aQpXNE@l-[I#C1('cT[P(TXIX[b%ShlTq1!k%d&'#3Gb

+",!#rY,-IB"iZL#HE`%'@HBV"[ba$m8Y&B@5%*bc2f5GY62PA(#9iP(K+N-SX8b
a2@p('(09!'kEr`p-!Rif%k6VAQe19!V+&plMbBRVK`$Rm8J&B&d0aB0Rm,1UTSC
H8B!STCqDRd("aYZRq+1ZhcNZ100F[ra11[+Zh34FqFH(q'YFqJFSPAeXiJ`**B(
QDB+*H"+2,ZlKK)`qcLP@dd-1`U$LG1a1S&Bm6m!cZa6A9$(SM`U6MULY'5lS5qC
G"f$9,PjrN3SjRB#SAk-*df[f[i&$h-!$2"1"H9#!`P`@'dBMNHT9l5L`$8[(jXe
K5S6Bkpqb9c935bkaLXeVTmU,E-Hfmp#PcTf0bCahBX(CLhccfY5`aF%eA!ejj[f
+%Zfrp"2J6FCr(UE&cfB+iESfikH-PM$[GVBV,T!!'GfkL&"'"U&L(@$i4Dk(KN6
0ZEfl8@ldPjT$&YcC3aHj4S%h8fA1iA!CGH4X9hh$MQ2[f3%8r#'Nr[ceUrCN*29
&e+Cf3lPKAM8[*i*%9XcG12$Y`-p3E'%"V5[IJIdh)GR$D)i"G(h4YM1F2fCkGkh
PfU,j4)EN6lKqNI0Rc+%hYeQ''iQqqiMjk%i%C+aF'V")Er5"`qNZ-HX1EQf@`Ji
,PaVm6&(XdbM4@I"LD*FYEBM#G04lR&L5lZBjc8p[1FqY+c"%82kBDhi0j+F09cr
d"'V3qcm`TmPCR5b!B-&36lZlA64`-BDklFRZkiHSH!BfB"(R46eS"`-CkQF3B@+
5S1cq%9ra`rKBeR5R%kkXThpq"%BkI6`R2S33G5F,Bp[0lPdfA+U$Z!J2fV"JcFm
h2j0JB#K"j(PFTbBi!hpRrKiKHd&bfdq!DP5i*9-K84%8@5pNSe+BeCI&K1"qPMB
,mD'YeFL!bIe"HTNXTqlPr9bJ`bMZ[5BZSdfa6'!ec&qc-jFpbD9Xi#0ZS6*pa'H
MULLm(e9(j-q#P[GMN[iAiVk2q(%@1Y2&5ij1pR%U0R((i@3IcmFq[,%"FQ`Li#K
Q(rQa!jYL!p+aMp!S2BTSHGJLQM2XDEqNlfaNRBR&M*NQ$[e"$,9XKKZf-QNCc`J
+M)L(R4kAfFYPpL+c&jQp$,+A3IYB)%B5AQ,bb[PXFm,XcaF3c[c-R%J1rQJ0VQ$
"PZJ"AhSf'SEN"F8LE*,Fa2[HYI[d&`m42,QRrI0D`qbHf$Y%%&EjIML%9k(*N98
Sj(AGj3%H1a#P!h4**IIecUi%aHS5cC4$`XZ(AM`%TT%*Ae9bG#4f8#Yrq20Z2V[
R#%%3RbZmdZa1!#XN11k,%)m-!X`3'"6@Z-j%hUqS,@4'4pF#qp'`L3`[1BK#5DF
CIGNZ[9aCbddBYP@a2@$hGH,(+D4j9,%V0M'E"6KL'U*P1X8N30EC$lip0P5RiB+


6$65bAJa665G,V*5JYeYLYR8QP1kii&D9@)$R`!c(K*MJ4rm1+HR&KbMam`A*50`
9&q$SUB3!4aq(!!rJdFER406)dXJ+09qY99q,r#,k12[2SdimEL$JM)CEJ2H`G4!
"P3!PXaa+6NLL#9L"4eZPB3MI6[1JY%'iSNJ"epD9(!m2R"JGLBNb9aq1A`)9'P5
SF4@N)(1hkp42k!#Th,@#UfkM&jFL``j26m1p2KM5k,#fBkYG&'iH*l9`!cNhF++
lDA4%EMUk)PE"J'R&0MhZ5MH26BdY`iT2KH06[I'Tc[J8A!p5,XDfV8Hq2,+',Jr
iTPk2rlL)PTeLjXli`L1clXT3riZ$jf0,99H520CGE+-c4Cf8A2(06kr-F'B1L4%
H5ia1*)CcLP(#Gf%8LG$"*@GPLZmZ!J4Sm*S8J3Y2@G,`)bRTLBYG#@"#iIYVN88
FM8ejUG*B%+XIJTPBp%[HlkY!4JL(6VET#LJ`b"#-m,V(MQFIL34,&4$C$Lrc"0J
bbbT6#q*MJ9m%qB'f)lXNiT+"B`&M8%R*ac&!Q"V2GATE("4F84IB#lC43lSaTj2
h#G!Pi00k&Zlr)kj5G[JD6,@9ZB1[SBPNR@a("K`$MQR+kL(PB2$q(SCbTJa#!iP
c#&Y,*[6f(!4E-Vc+h3lMGf+EmpR38VaZ[S*JQ%4Qim15l9Bi0V!Z-C!!1UY@Z!f
kkZ8Y,%J@PEBJ(5-J%Fh(+D4)bPUa-5G6mRj##69+CSIU*22'J9r+e-!8'%0VH#R
!bM9S3f!0l"S,cM)#kSieMb"hLCKJl'6%H!@)kmqiX[`9X-%D(N2F3%2H#R-Lp#`
B0M!pb[p"BB3G@8jJD`@Z634`Yp-&a'aJFcXbD(3I)mG[ZABNQ!S3EJqBLAB%$RI
%'k,5rjP6I$CB366STB'heka(%#Z&h5Lk0eGJqSUe(!*LVAM4IFlZR'mB2kTSa!L
p%$mqV0&aN4STP",Sq"-)-CDMFFrbEVBmP,'A$r*q!11Im2lrbDhiFIdTRmLfFJF
[VrV#f%B2ISC%NjU)dl8)H+N`J@HFf'i324#rdRL(*&lqBCTN*Q1LiaCSm0LLR&-
@a9ej&PfJ*ikB1phBmNq)j(c#P5G18H,KJF4$GI6S!Nq65[pTFl#r[EqGQ%Pd+03
``l8GcF-&N8hXHJU[e!R"3P)(@DJN,#8e18l%%rU$-RjGq49DmA$P9bjU2[P0Q+@
%9fBZmZXmKdF2pq!abK8m4$k8@FH@jC!!R-9)2"J*FH*54N,L6S$S[-MB9!j5m`Q
4'ZPk#f3+bF6KD&@4r'IchYkFe158-9iJ$(V6"CIVedm([lF&j&K`P)@d9a[IYIF
d@T'&C,DL-kG0M4`C6F22"[%9J9T,lS(c10qE4!AFF!ZZDjeZji+Q!X1LLC[LX*X
q2K!,Ni2pKmc"AErNQU@i$I'1fbQhA(`eX)L1LGV@jQ3,A#2Ir[k@%L1p#H'mjU-

V&M5GJ@0C[hf"rFc`r9r4`2ZhN!$5Qdh*PJII0M@22@PRejHBdE'ARJII&S0`c`[
qk1frE$Pcbpf0BR56qCq`IA2Z--,qKLrNTNXrZ2pVHMcapp5&-"&F)9J$I`0Lm@T
mQ6iMYN$eHeZ53kEZ,j,TF+fIL95k!mP0bkXG1!&hACXTaeNqFXR1K#@('kQ4Y+r
ca81QNlD*JVhF8F9)d*S%#8Sihm3*Y,9MM"LXL8qQXc%#Q()dGQ%G%3`C#lfp&d5
fGLU4[5f-%GN$iiKXD5U4[5dNfphKZa2Mbp4T)a,VhDk`+T-JXEH&Zb5a+@3kPEM
KCa&Bi2QT%e4"8i+-"EDR"Nk-QhJQ2N&&DE1kBrmE%('Zi3%`B&,Tf%r%1XCXcdE
4ZbM`!l$FV35L))0$ASNU85%aa!aqHm0R['b(kjdUM[jPRrpa`9Rh$Aq[ITUri9q
&,,29M&i+5bb'ml65U,bccHlBZFhZMU$phK[q[9B,P%kciBp*$pRT1ddAHSq)5f@
RRc*9hA[)H`5+9rZBF`i-m(FTi*)"&c824%6hE8T2ZNUY5@64IA'f"KA&PP5`%HH
2[Q492)`X@"mii@dC(8'e@+Zm)QA%k@Xp)`Q3!)NjN!#q'KGG!Xl9ArH-`1RB&RH
85h85"JaQ!pbp)&A`BT2,aLDPL5qQ6$`mC@*rI)+bra4&@q-G##cBr"9`QKcVM14
,M"Ycc%a-*e1FFHJ3DiLG-Q"d["-[QNe'EBfA&[p66D,$%88c9rfHaAmc$h!9$@T
-@63MQJ3k$5clFHPpj'5S"P#FkKP*9%!kp#r8&CRL-'ca5#U3!0`Vr3%!P[Q$H&E
J6q%Nh8(m-4c6$DM$VePAV1$#PUG9FTN$Fa$1G-%N$jf'F`N9U(`DQ!%6T#"D5Hi
Q6JVNq2@E66pjErN%6b*$06%GCY1Dh(*d36BihQ'4*d!H-[Sq&VV)Je14`05lNd-
S1"E,hU0P@5IFjE5X8b`fKdEE*hlX@'hqm1Aj#+i1MD+`qQNdm5GQaLY1U)#SGXB
2KlE6iD`cIQ`--"eViJjR@D'3!"Flj65F51i`4jp4[+Lqdh,8A`acUjP*RX521E"
X9pPp14lY(m'!U*mFJ94r&Ujai65kCei"L&J"YYR-p-(TS%+j"jQS,LAHYL'3!1T
NBB3@+fMM(4LN4$CPZ"l5d*X`$kV#[qd1R1,&l*2pd4Imq4fCQ+jiPH"r'(MDFr+
e25r02ILRA'l&RPPEFrhrGZ(2ZC%rN[r0`Yd[cDh"U%GIr[T#hRX(&le8mfDJlD8
PEqCmbc"pE1!rEXcGQbZrF#[hbp`Va`pqrB[+JiGAVAeSpaphrmf1hrhZGprkai-
IIR$VUCamiErRVZpIm9pE1VlhJp`(&flq12ILKEr0[AlKCZjFfj([eGArG@l*Kff

($ZHkrh&&rC,F,3!!4)K"4%05!`"kK""9$@C&!4!a41j%[frl(-YBC-KL&l(kC5c
,-R8ZP&J,"Q5+M1&4MaTUL#GC1E"CSV*M10iH(QkkJ4#5F&*#1*4bZ-m0"[$pDq!
!6DQePQ-)T9b8`fd)*BE5e()&5LQKA*35,b,ZlrrhIGmfK35HqhPrer-#'kdR+4H
5)!J#)!J0,qlPhh3im1#(Nf3!%)T@RPa,N!"2Mm@YQIaR2a5p%BmS6D&A4I5D!"K
DH($K'k'Qd-IL(3(%Si+[[1lj)-%%#8`cGBdMIhS`ERfbCf*&3#6JD#3X0K&TTXe
L#S#!i9ji('![!VY4-&p,*)!Z$@2*[96N#f92UFdX6UahEc6TkRUj%SN65&ij)EB
$9"d!+F3PcK4ra9eLe#3&I`@aS#5iSR'@2&`[qYY1Z5f4,A%F%A*RmN6)Yc%LaHm
NiVrFB,+l*92BA3!b85m2c+RNJB1"q"dDeR6+@6c,NVd$RFhZ5Zib4CrUXClJVSj
jfh2&GKZQ-1e9TlfB6V"TVdh(&A`%E!AS5P)8!#b6H!!0NKJ3HHe62@(AkAU!GZG
YY`"J#4"F[pq@DNXe0#Pd1UJ`M1%%k"5ZY)VY*JpG#Q"0VU',VZe'9qHd%54d#1c
hd4"Al(9FN4IXEH1#9DS,4Nd9!6!Y4!#,H$'6DdHR6'V+RM,*23C'jMd#[q+#0%)
F%pI2!C3mjA[Bi"!#dijHkj4DdC2E%bN`4R+)fqC0U8diNiVMeN5$VF#`2$+#*Aq
U&k@f&%63BM6GDNeb36KX2i2$YV,$5[32%d#B[+&r-#A!2H8r&G[2M8hj%jXX+$@
j`hh+"&%%m*XI)!3pKqchYp&fm*2$q32k5*GX0$8kjAYJ@baZ)'(bpSp1f3Sd*ZE
f%&+BV$9Pa!8(R2Mrhb(BCJ9RV-)9Y5MH,k2PbHe"FkF0+""BeaJ)!'0Ni%h&"I$
Q'!I`pfjp(pII6,--Q2@D(L-JFC6!V[F10'Ph"e`Gc`*mlFEr-"rKFC42KVR0VA[
9(GQ%)+$&jjf)MJ)$2PXLL1T%&clr,Y+!c`*mGN5Lq26JXbF5J#2iCG6SFL13!$@
XrGN2!GKBK8ADE!TPfK&-0b0S4F@#1HmI$)6F-pIjC`%-0`!(@L8!i8-@*L3maN1
kL&6)K$h)I5AX`1[X`1C-1jCpFf,N&qZi&!PARH!P%@p&*IG%T*!!1a(91r`jmDM
*Shp"9bN!0Q8Q3RIFmMEB"LlK8F!pRk+S$f#5ZrY-paQ`13hD3@@2pTRrhNV!VV#
10`3j&I+jilj&P*SX)II$p4GqcaX5!GXjpH*&XVJ6)XbjUP3!dK*)!CG(hC@+ep6
3Ve1mrEh+pBjjL`T$[,[(*,dpS(M4@F)k5aES,%&R!HXX@+#c303*MK(Q8HBHNC'


J6VPVXS0)9lEaAD03GZ5KJ9m!2R%["%NH2NU3!$@$j,MaSSpR+Qi*Q@*"a10'*d8
pJK+!PiimkmF*9fM3iDKpNC`Kf'j`4-VF#G#0c9V6H#YpM!rb-3,S'aT*0!d!A$3
KfAaY*pdR`@EkBjjaPXMHB1$j&#cT998-,(,k*eN`i4-$D)J*i5U@+H6T,bUF*@a
0mNpQJ,AVd9lHcJ2G23#LrbR"r5%5H"6d2Md'L(FR26J)'f%)q8p"dTrkHaiB@%I
LP+DD,-ND6bqraq-Q$km%j)3VVSD086mA639iD%e42$idZI$i)Y+**Q1'*[)d$B3
[+5iR-3-E3`Uf0Z,amhX41jY#KX8QA66*VK(T%"X@Q5)")P5d2S*XSXTh(ba5hTa
(H)aB%q&J5qQQ133Xmq@S$A1-$FI380[,id4mZHdJBI$*@D&,4&GiBpBBL*%00-%
YE#+"#CGcc&bTZ$`EJCM,kD%A,)SL0(D+KJQKFCJeTX95m#V4kpZ2m2@+&ipQT35
2E8S"(Le+!alGbJK-+&c+2BM@C%a-91lLNDYdi*&3QMjp""c-46ckP%%m)XT%2!i
UBhLiP@Bd'P+'m3JT'MadbRSF9U`3NEbC4Gb*,"r!bj@+MEdqBKfcM4PHd`&JPPq
b$CmDBZarqpQT%iU96I66",dQ1&r-%+3,EHc#)@@pJ)KkE6-BK&"@H2(#6mFBSN&
P$&-k0Q($4+25pa&YD!K4S"A)Aaq0+4G`9'XJiDi-*%bdTBc!3GTN))dGLbA(S,6
!)d"RBm!##YEYMmB#kCM-$Q3lRE8TEim&FS3PJbMS-!dD&LkLh08liNI+8fa$LRb
)FK(6MbL2db'ePB'$EimT'@rhqE-`0-HIL8I-Rd4N2U2`FXa9QHk#r4bNk1rDjMX
fM'C2fHVB)JHbr'%%iK&Eq(-%3-I5U5XGZaEkQVQe(N,'TI8Rq,e&l[Q1,C%4)3[
raKB89EI3&$*aPr-@'Z`%djX23#J%6memAJ)'ZSiGFi@1LI"la`"1A`G(Ieki!Xf
h1&B5+02&(DXr*k,eFQ+k3j*)62VU1HH2H-ALQkI!,+hHVp"4-`,"(-I+aQKS#')
k&Makp@a)`PAX1KbqqY)TDNE#[Y%M$M@(h3-jKC4YiR,H')hHQS*r*PFQ")KVVlZ
4&d2`$GE#m-@e'-[Eb#8`UREmK2%6a3pe[iMZ5@"b'dap%))0#*lDIKF)mVAd+K)
a5R[6h-r&)BK',4KfN!#,DF+T45(-Ljm5%!HBm,8[3N#1ICk1i[Si'ajXL'Jid#*
-')qmiB'6YBeF4%&e("h-N!$p"T!!p@&3)hF"A,)Sam8-!EjVIip,(kAcBJM,G1j
4A(Li)$,ai)'hdlNA36QGPbJMH"3JS+Ic"J6dG$k#J*lMU)06TI01,XRCNFbQ!,M


lPDQjXC((R)ik5m3V#mK%`pY$%!2T#0BGH1MJcZPFSecXIMhMG@G*MH@5*C'"MKM
V$V&ZC'Y!X&(*a@08HHSM0J#2IZAaVjp3FKdr-IR%SDPVF&9*l4PaE'#GNN#%D4`
r5GC30UlNCTA8QK[j`r8eCbqGGF1j)d(h[8KF#c-ZDrfFmpNMj&E-&31#+dUVB4D
c%Lkc5!Yc"M,'@9d)Gpi!Gpk3!0YM+U&Td52H!@"Q3l+'AKXp$fme("r(mD*6UV)
F@2$SUr,4#,jq"0q)8iNG(@FaGAldZ#+biUhidGpl&,c'f'Z-AK1H6p'0ReKZbP2
R4HNQ)KT"1ZiqSF4-!$eVGBTB@kR%-4PNVc%)0NcZX63U0HD(Ye`kbkBl%93UBY)
$!(D$8qGDMT!!8ba+F%Rka8T(4IT`)d$DerI40KlHmVF65LIE6!bEkA5IcePJ+rj
GmPBSDZX4YG3%BQ0eZ1"d2B*(3aXC4L@cab*k"#"Q!eG,XbeK([&J%0!)l*Fc+SU
F+!`iP28(ZKDi0PHq0K%@MpkFleMj,SC$9#abV&DA%X6qJGml('*aXUEYpH!G&"I
9B1c[`TDqLSb`l!a%990Bc46@-`1Ae3QA-diI3BL+#KC!F2fLK#[c'D"Ap$QbC`4
02+cT2!!3`U,qD%G9H)f@LSe#-)[+`5``0dPajJRC2M%#kUBY&$K-dQ'BEab'k9i
NN!$%2qT6'X8lZ@GLlS%r+"SbVD(riKfiXje06T3R'I*Fb6@Jcj8@C!Ia3!+2)-Y
@'J0T%2ZD`!NmqJ128(E%-T-[!YNqAH!%KSa-AFAA$k`,C'(V8V)'"@621d8)AdN
4`GbiNk,"+G(Lk%H'XTNL)q&PABZS'dZrcRr@bBlQmprak&[XD0&`Y,M!d9RUd@+
CSd8FhEV!`5jfm#!lYX4`E-N#ahDTajBXH#`6i6i%m%8QBS`E@!5$cEVY88&CK4r
!R)P&3M2,c'-3(`&VI@fP2iXbDCBpGiQk3)kFh5C+p*XS'53QG'43#KH2C#84E43
'1K"23iaCJ&QN+C!!T,K66$![9BC16dV!2ElHjkM[NS$f"XU1V5F8&eM!$H-KZ2U
2iV-H,([8@UrMK1V+"h3Nd'f)f1XdMRT6b8GSSJa4TKd'-da"LMZ1Z(5X3!23lJB
``2FSQ(`d%d9AA)"LVmDa!8GCBA#'BQq%*VCJBMLh4mL5e8`iar'+'LclY(k$U43
a%EX)D%!&dV*-!S!&1a#`mV&i1DCFbZ4&pp3eJ5b)eC8NT!2C*Lq%4-&h,+B5J!N
J4T`FV0!*4"FCHkbQ&q&kHC%4q&F6Q%3[LLmL'M*-VI,a5N)qARPm@XFVZFEMP9c
jH#8$SV5Tl2'P&U"2IrXbF-&K)`B+C'0Q8N('3J"Ff68DlXYdZ-qDJ[h&ibA+b[p
(5FJU(N9%H8efm3ia)`0lU0Lj[SD+R963YYDEZ$m1Sp15dr@K-5"HJKr[GdL3!*C

!Z$`2dF'BP-!+!,QcTJSNNm01*a$Hce!m+aEAISRA-qLm51J,6%kJdURmNU,L2VN
6IXCP+[Z9U!BXadf6&apDI%!1Zlq-M,#1$p@1,``G3R(3PHRF#91(6!l!mbk`Q1F
*C)UI9EKdLcJdTjcI256KJLf)LVP@qU(L63k+Je9(+r3,-[J!kIAS$#b(VlqihbY
-V'BZ`iSeb$T80TFVUrUp"&cHIUQCCr4!G#hlf3pr[4P$RN+!M3-BFSq@')aRFc0
(3(f+"382!RBA#KrjDRE,q@TNQL)qeMhC-el#m0D1H@ZGfRBK%m8'pS(&fMFp&M+
!+CPV$5'!l$Xb4S-!DP,J*[(D,`Q%YlC"E4*A$pcA[a(6663Y0dF`DK@DXSM)q4c
CYX1'V*p$X0L-P`C[G'R`(5qe[r1PY"MBF!SLT"Xr,ILaiUF2!*00iKd#fikf1ES
"K$b+!8%'J,3#*1J6@eKRUk-&R9&$CapEEJep1&V`Bm920beq[lHG!!R-b9FZBLi
HT-aiSBi!M$K1ab,$cNMlVq0&a#8J6SRl+#YR6BqV6BqcK4)4E,SkUTkq4!%'BYN
V"#%Ql(3%SLJYI!5!'!&kJ++G!+Vp1Rj3"Nl!dV%9JR1-&@4DK5""*+a)P,TTHQ9
(GimqN!#,!4Y)Q!%-4X!,#")$iir!#*+&%XadiK(,e0)"UjVFR-#9,#[`#)cR6JY
!-Lj4dXqZ6&DD8'$+'@PQQ8"TJHmJe"R`b6@H!j!!H!m4$"21Sa$d1bfdlB4(k0B
lh-1jU8#ImFXell(X0+Z-')Q2LIMT`%mLN98'R321q%i,EH$h$pJ'QPMfeX+%mJP
LR(GD%K2,$0,NRNVSbNb11%8dYCHCPT`P1be'%+`D84)Crf04!3aUqUcTM2d+-Vf
`5AT&-Zd0KdrA&`41IrA!SP@-J"m-+MB1Jf!0#d2EcTZL2JbhBhK&`,5+$EmL$pF
C!8I*C#+EkALbTl2#qeLihFGKk3e$EJM)C*DS!'C#6-5[`1GcQ"lRp#3RYL'3!*N
miiZrq+XhN@JF6b`"XM"%5(,jZAETbPqpMb'ik8dM!(M,4bJB#YhNS))C,81L5Lj
J-r'VFAb-M`Pd"-"Q1Bi*JL!5,U@Z"#pHDZLZ3[F*S6[#LhITCdFJcAKV+cPPC2P
8@*C3@#C5P&T)RZqS3M&CikJ5#XViA-d5'f`)@5R60i,AYi&39hb0XN`Kde-[1a"
p[qedkiI)2LU#GiiTd9pPYIcP(lJAA9D!2kJJ@B@A39D8r0Mq+jLU!HJ'PK5&4l#
N%J(j&4eq02KC$lFUJ"X5`5HF'(%fJ"$KBBpS)ST"BIQ9X@-&DS&D)NDlQ*`r5J3
-ElIi")RRkP[DGTL'`P#I)P-Sp1Be0+Y4'ae`1&"8imTbHG$X(dB#af#)9hf9M0I


E$PdcXH38`Q(raFK4R&G#e(!q`bJ1JpbGFZ5Df2CT'S*CPpMfGMF50D4KBckRY`*
&+%bPF5r[G)BV,1RE`2*eU8"iei&'!a!qM[mPq0q!JR)*3*%"hT@JMf*mZ)3*@bV
%%m6GQL$!Neh)i(bf%`#fR1$ddB!I1hkk3%ESK+(k@qrFMBmBL%iN1Z)G9H[1pJr
qhCe$rba[9GKSDdp%Kif'M0[%T6'a$3aKR-3)Mb9Vk"UZ)mLMlB4#L8-'E9RrchF
@@,)i$K)j*C*5M-He`!hac`l!@*!!$X)4)Ic%fF,rk0V!!XHdi"JVMK(eMm(`1!f
RBBpHqqId"BBe8,C3DN#)"VKG*JR4I'Rm[HUVB*+5BDbh*AMRp#Tq%-i8YQErY&a
JDjqYG)pp"i!+J,c$#%U5Ba+j@'*%kfmDk2SQjrYje-@ef4imITF6f+pX[3G#)48
&*X&3J-KK1c%"UJk1V!-l[38!'6Z1&GeMh6d),VVQARi!aF8$`9lqQ0VJ!&!i+&`
IQ#02-T!!cN%'*%,a"&-(8F!RN!$133E53G#@36U"(GX%aLJ'aQM$,"aZmQaM"8k
PcK!!Qe$JDf0"X*8&`3a1!0TF"+f$&,3Zch(@G-L44Y'["Z(e&)a4r'c,#YHE!I5
lL%3Z8@ar138jqN&%M#&CK8rYZ&5k`e35d2%rFJ9!QRh"X85$f0+pcaLF2Xe!iTm
-"+55$bTjP&dMST!!ZqR6$#@1Ra!5mN9c,5K)D9K'&`H6VX(VH[BDBYPHR,+pKq6
K",l@B@J3"K*JR9S'YF`T@dmpV(q"jf%FK*re$+6GCL)`F4F&"j!![P`IAGI'Q`D
%)0()+5R$A%[fZT!!UqQ8GJ!!4%mT9$er`e(i@3rb925JDaZ"9Z*)cL3)Xa%5CS`
TNBMX)N5S3S5@"PEdFP'"E''l)2"9"Qk#bX!"f%-0H)Rf2)"D(qXc2IPhCDBRFaP
M#eSK@Yhi'IS1NG5*H86JY1ENha@b&mBfkS!'@#6''JNX8K40,ZUc50pDhmb*25T
0p,2q*NSQ0bc*aF$6XjLTl,!pSF-55A(39m+q@'#f1@#Q!ZBHmrS[I0ckP4JSXJM
!m*r!i&dXEMX2NXkZiC5@[iDe+U-e!B4qlD#3!05["-5GNArF!2")5S4)h8KGJNe
3XAH5X!@BV'a'&ZPP*2**F2eAX%!&*Nm&P[PIZA)rK-3cjIpIkK!bXJRD`HRchKU
#5G-%)Mq)JdFH&88NB0SkI9lX$"2hVcR$p6"%*2CB(-c-,Y8pdDQ`cQCa-1X[fIT
GF6NK)),ZeTXhA3#jFdJ[&,!9*"ec9Ce+$i5+LDJ2Y*')MAqpr2Z8i!FN@Jr%"k%
I@(`+"K3Z*,k`T1pd[dRJdK%BRNCD#,40*KCS($@5[8X0H!kIF@T)aKGkMF,b#bd
4J#cAhF@Q%PDN'JFN1XZrc``XhQ$Jp5&M8Cjl`6Bd!5bb#B@je4@R$NSShUTJ%f'

a)b2p4rX&0QFPLPq&9`%N`6(,9F!)0C%3AI@P,K69#irriiC%'!H3!0XAB(J95`!
*8ZLdQcXGB#JQQ3SSdY9J-%NY1Z%UN!!VNP5R@5BE#)%!6UED"ErHr,-I6[4E[aH
mTj'Hqr+jP-0+4p9I"`QS!QFDb2'Ki(S@l-!XQ#p8rDda0K3lNdZ&b-R%*-19LJ3
JM-Q6p11Y-'C-G*Be+I!"B(DkRV0QGS[fRT@',DZeN!""K`C*)TGmAcY!4ScB@!&
,S*EIMX,ShlD08%$bZSXM(MS!6TF[(U9#Kf0Y4p@b'5'!@QK#MMbJC"HM!,cF3rI
C)(9(pE[j)Kc9J1-,qip5)J&1"E2&C(kFX,(NL[PNfN3G*'`B)Xr$M*N+%@Z%B6!
d''-&Z9@Q-%2T4"*-3aaQQ!d0*I(i(4"kPbFDh38!M`-i6N,[J898TUlM#YL$3,,
'RXrVm@0T'QMY!a2qCP0Ia8"f,4EhSRBJk#&3qCphdI++3h%N@!3,CJ1Bh#d55(#
BL8*Li4Y!'+3)#4N'A5SeL%M*8A8B`!`S&RU)#Icc(&SZ[+!)q1FC-*USHNj6"J#
eQ"`$!*J`@1MmAfpZPRlf3jBe,Yr2+H)*r!V@HlQl,kFVL624`3-Ab5Rql%2aSN"
`Li#94"`9*J$"%ac$kraarAQ3!$5H6F6+ZJC0bkl""PUf5GE[YTfR)QBMQAHY%ee
,b)"V0BVLbdd8I5YYU8KbpbbZ(F&`#NTHFJ0Y(bh'LYHQi4DcY(dL+rc%lL4V-K&
4L@(KJMRRdh8S4N)X44Ql&ZP#C"&T@k%)[(Qf$D4YfdKEAaZ5Z,!)'jM9Pcf*h!U
ZXJlAL3ZkQ8*&Jr`)QEU[lUKk*Jq1R3q3!#"0kMH,0@!6TcmfEBTHZ$IIT-('!")
I,kPZZ@`LGemJeicBXH62XU@TFeJQ$YkE$f1r4E3B+1+ILR59(HJHSf'QZh$hNfc
*@TKVVk6Pk6pUF1c&UVZ[aXY5i4!ipl$BhSM#+!lZBa%[Afa@,pi2Jme#&[%(5+K
KHk)3mH*TeIRFBJYF$je`[SR-CEh-C@qba*Fd0+MY#c'hVAQqc'$CFIhNZ14JMR`
'9%ALbTUeY-b#)pHX-6Tbc6*bj$p(Y&,TM*db44*`KrNa$T!!`R8K1e4LM)P!&[h
FQ@%95!ELUd5!r0!*j6VFTJ518-aE$l*T[KT6'KV!pp)a+1"h`M"NcGY@jESFPA5
3!(!)Rh4B1DE!f!6')bq'3`$eB8"k5-F6LBL`m)aKm*GP&hi[UFL)%6Fa'fKbJKQ
Jl*@4M+bR3@!Z@`&SQ3b3!)"QHd)J&S*C4[%dEd,Yr1h[lE53!00'A,-U!8"mMEf
)Z$*$3'P4)4MB$(Fa@%mIfp*+"0B5X2YH%GFY2!lfp$SYSja*%-25bC,db%A!Z&T


X(#3`@5qhpIIb[[kMa+)+aABU0))Cf'FS-Qi3XQDjd(LkCfSD!Vq&#L*aY5!b6"R
hqQLIBmc81(dND$8U#AL*)5d,cl(YfC%9KT%dr!%f01p&hmY@LL*N)8)"aP9pYDa
"AUGf@K[D9RC$IVd0*CAHMSpY4dhHAJC"E!ANB@*!`&BD1[Y(IhUrqPH8DIHVaNX
[HVUifi@SNi$m2+(!MF+3!)[36K$b[ajI6-K(baJ6-Z!F4Gd1paL##b9M(JU09RL
#SaA4hUB+6bp)*"94)H1(-+MLQpaM'BMZhJ&dpP9%S4BMZ`)"lhDq-i!LXKFG2R4
dN5'$%F#%$0"2KkL0DiA%!X4`AkN$k@)[c#Z*B*9[1'iqCBhdJbDA!$TC1`X"&fl
Ea9$XG#03QaTkXb[#&5)HpSTi,ikT#10kZj`)@`958F)a$`4)5rGRBA[#-mI(%Mk
lC[q[3fZG5[!*Sq%H,B8HNSeB@Lc-P5jaY#)mq`%HpYQ9A!$NSZ1f!+4NLa)Z*03
-3-Tel$"LT%JC3!d"@"MB8"'Q!LleBbFqeJN[NKIXh6V+)Q!LK85j6T!!J-E$V%X
pT*`#X[%#1*d)"LZ-DqaUNb`biaD+$@`L@EdNbhL*Ir*K*BPBRa%8U#%ZkFU`GTM
2@6r-UG"pZRi$%U[#e6d8%1DF2E4#$i93Z$LM"e'DT'r!jd-"#LjaNJMlR!bUT$f
@N!!L+Y-l'EY-C+k#Q&XJDp*MB$8cRS`+!j)eeL5*!PNDJ-NH)Z($"-j,![MF,4*
3[AHQl!3$fPlDQ)m-ikLi"P20R4e9AFdb3L#1l659X1KKAHI5-mK-G'IT#%CK2if
ZM*qK6`M2JSjj5#E6p1%admcMJ2r5jarrj9HIJ5('jp@UCANS@Z%c[,ieNpZ"9PM
I%&4`B8FbC@LP,f*"%iHrk#4AcHdjiQ(La)P-aQf)b!UpT,04&,E#c['DMH)&A6K
B[(6I9JZ+F#ib$[J0-5TeYHHK*N&U+SH43aZb`VS2EZ*4NIAeaH9Lf`HB6Pc65Ne
pBYZ9kp`AlH0MNB0*r$"2$-AEF&"aL)U#kiG(b"`,%E9qq0`ehj,UNaBfrF*[ceM
-++iMLDpp[FqA3PG,5iK39IrK53qF)RFQMJ`IHSA)Qf)E`#&88$k6K)b#&(%!l**
5LZ'VN!!,!Q,6D$I-kjY'!8j!N[VaBP-S[26e,CES!"p1pa+cP$4meC*JLK55NUj
DQL'S%2b#&-$bLM)jFeF["&)6SD5M6A`c9pl%0h10QrKQVV`*#C[iTVS*2pY%"G[
%3'iIVLeKQkJ3Qi40m%Pd5AG2iR#3!+l`krL5-q)QMdFS(00a,eKmZBd&BM%kKN5
Yae0daYLT8DjBI%qKS*E2'L#J8"-BSkPU&UjBNLkLZe$Y,Q6G2VhZae@dT%1@-N5
6Sq3@-4C83,)HL`'NZA'1,pI(QmDLBcbF[FVf"HFKfC(UXH!H'4!IZK*m!d6Y0lL

Rm3fiX64NU6mENmDG2fP"C"6ZZHNb2haL4Y*1XqM2HQ&aHFcramp1)Y$Z6"(pD(S
qjKqAFY+LJHU'29qkc'ZqpmZlbmbL+mZ1TUjV89VZ4QAC+G'&aLP3UA3+af)T(E9
lbVR(CBk,cMq[-)[&@EFaS2MD&4UJ8eD!p)N"Tf,&imkb!9((-Jb)ZXaIr@$AbKU
c+'9j-8#keN!$JNV0q9*S3i'+B`d'K&hQEablr9m[M6UDfj%iTjcEAHB,Afl4h3M
p)05bl0RR-TGVKcCH"ZTGMXdi[-YPhMldMmTPS#ikDM"!G*PrC,PDFd28iilRd6c
Z-VrHpq*rAFE#"ael-5$S-MXFMmqq$23ENA#SR$Hkc*pP2$cK-Y$A1VCLJ0CPIZ6
QPGJ0dGrNf)(QQl!i9rrMrAG#R`"%HPXBGK4Kd,$,22QI"ejlTbeJ8,hH0JBGUc"
Sd'8qrBVR`fPZSaK!SNRB"JD3!"X[kRcl!%2r(+(rHaPp#FhUJ6if5bj32rD6-BE
fYaRDRaM3PYJLZQLE51+6lc+((V[ih`cC!SCXL3&C2eZqBYSFQKDkc(qBpEe+KQ+
8S@JhS1KL5bHJL'4$,[21r[#r6`2*BKEK!T)Jjl[-J6jlff@JZFTPVTQqe(`CD+j
aQArcd,0E,`20jehQ$hrl,dY[L'D4brcaeqlY[!`dPlR-DrrdkTHAJ@D0bcccS[h
Tbd"cKmYFrErr8(a$0'YGj[`r[P9i'@KZGTP04`,2A!DD@ehQIp+e[$P00+@I@f+
Zf@BKZKh,IfGM+(B4LRm`"+KI@',&V"%fr19r,$)cp$jLk"de"U0I@Q)5D`CRc2j
rra*MU)8*0HY8fe3ji2c!%[1cCSL3!1e,KU--V8mB@YpH!#d%NaN6e[@p*&*`P6[
2rGr90d!+blASjhF50d!+VMcKhqUF,iN8LmcJhqrImT*S)CLYQrlbmKZJ"9IEm8I
YqCG%#d*!1[2eiKXJK@$`c)lDhldN8R#%TArqpC)E))9!fTjmV2!'5`9(RI6Hh82
64!ZZEdNa,X6D0f*#&)i3BNrV1ElPP$&k"R51Rc(8'KKUARfhYj`e1Xf[EKe2CFK
GB8jr@prT,HH0cTcrrX,I-I51-[3qQLCk@**$Mcrem3h33c4p2lVj`3h4JrXirVM
frlS"HR$UmbRrrX%0N80J1e+q[qF'b#'kmKUA&Yd!16M4@mU!rBB,"pIZm&bCIN2
N%1KHE0YrmJE)34$mB0[U6fqiF(!QhF0lIRj$p1$N[crld,[63ZrKGjqTjY+IUlR
REp8m#S+4R$Mi+TK3!YGk+"QEmcBBp#YVc1-X4,LeeUZ&#E1(Ker)ZPe[eJl%2%X
qBj-@-,8$B),$f4Z)'GG*+miIHh9Cb[kMcb',cV"!VCPdea)FFhTV8kJB*%VGa""


88-)[I,cLr)4ec"'P9TTi$i4-QLJATBXd-30!Z"DS2&!!lV*6-52VpJ2,([15c`D
HVNKlk+Z%PjKcpP+[(4!p!U*"VBH,d[0RXQk21l[NXjM@ajGJf@0Qjqhk,`%dGRU
iBb'BH8j0iNFRQCHm'BI&rj)h8bbrII2mZmlEXHJibj,24TdqlVK1`jrr$+a'(3S
"',3%a45@*!B0-9fK(RK92R$FI-FVaNZG[Yp@RrUeFccVQ,2NXlMdKcG6j[Mi*%[
X**Ym$j-Dad*jQK"J(H@XilVFBEACE'VA$0Ce9Hl#&CARhfdD3),m'IJTEb,9!cQ
11IKj"6m9q+PVDQQkdh5KDDMe2)XSRMHRjDmq1H)CN!"'+!Mc%3&JSmL!#,c`0q@
#X9a!3A(Y"E83KB4#SX8i`4EQTR%#LBAdAXeAM5qA0I#+1[#QX@!P)b&H-4E%`[9
i$HZrbS8m[,bJeqMbKUMAKLe'3%Pl1-5)Xa9TSBh(P*Mr@[[ceH210[UARGeRKL%
#6-pM%UE1Nr1rDGi2N!!b,aH,ej`*&PrV@[,H'B[i`Z`8jrMk&,MRda2@K1!Uc[%
aUHJcFV1T6pHY1BZS4#!0ia!f9592qH5T#MB9,)kpm*-8iD"r`e6TJhk``%%rAq#
JA`J(Z4U,GG)[ccGGL&iJKh#dLX@,cd#FY*1B#(dPZ[$UBLrQPVpk#XX#ii"3@X`
km!H1")AL-J$LPJHIH+P'`CV5M4a*T%3`VJ*1i'K*!-*X'6fQ(*pTFK51([[X9rr
b4`C+C#lil-&-!B`3*X)@!RMK#h1Xh#U)(8rfZN`P%3be3'a&`e,@Mq[0XmrC4S6
1G-PA%&N(8Ke!I0Z4!,Hl"b5i(Hk"5+ekU5Dh4eB[b""E4)J&"F!Ff`B$4m'3!,&
IkTMhVG9ZcSJShRC5ME`HSJQJ-@e"L--X`%1*fQ&!XJNQ&3("K8$Sc80KA`-5P)k
Ad+6#S4C2EH!JBclq+C+A$YIa!#i+X%Y@X-1(b45AViU539TH*1`HRC%'%2VF0Rb
JSa)Gjp$KX3N6Pc#4kFJcHI!"!mY)K[&#8cH"RN0NQVUFM(Vk"eYRjVCLqmZVYiX
`JJ!K+'JdpJRak#R"R&e)RJ[MTDGRr)J),qF'CU54+@QL%CHd1r+1a+1Mh$%Ml@"
$%j!!3'$&BqV6-p+Zc#HbIB+4QDZhpK1`9E)+TXQ,V0R*ikVrL6f#YLCEUlU-NUf
IVeHMi4U5%#-LmKCCFr,bbkm4Q,$m84#kH-,HK!G,IX6K![a+(Cr#fHXFA(eSX@c
qJB(,mD0h@IPdH[3$)4!NUV@MbC0JUQ8CM`6ib9ZXpGr"CrRl3)qATj!!%Naml'2
'A*B2XY%d#56q!qbBC,am@!lb&K"lP+(UJX1X`T)5Q(K[q68NJik6)C@46&cp1N@
3!$@*M%qK,1XHSVH)L!$PMm,N@PJB-R"F48S(U[p*Q"a2j,I4Z4+E**9c!*21*92

&[1Th+4Y8ScQ!D&j+#mi%)L9SiM!ZmeDIJUP@1a'Vbam9QYePB1(i%b&$i-YE+a-
0'NC6P`J,$6[bl#NT@0iJ-h8a'XDI!GRf1R@kJmVl*KXD2+Q5ETZ&)FJh-qN6#@Z
5"PEQV39)1#G[,8eCdj4E(9@rb4#@c+Pd%`NiPlU-ad5k3"b*d[)%B)$pVD8C2@T
c-P&TC!B0@%kSXh$$8)6,'de!+F,AZUa*Ri3T`J"S6(*E3$DaZrfNQU"jTr%3CBd
k1Bj)3Z3i$*J0Yk'Nb@ci[,86C(5&ijip`!c@3X+fP&Yd0Fa@0A"$6jQQ`e#4C0c
UA5+r4,CHhX)Xl@-'E@'DZS+!S,bI4'SeY&J3$V-`@K*&@"*-MaLL`+FA"9&jD41
NIIbb&jE[H+Q&rA55F@'hLrS,qqPq[80ZUT-RhQPKM3j&+QQ@cKHfcT1%THNR4FL
+-)48-5pGb84VJkQ6(BE'5+*ebqQ#)R2p"3SEYUASEbXXP6D%eP2Z)*C9lJ#e'bY
!Q08m*CM,&L6#+K()Jb2ci+4fH@)mQL*DZbN3kK2FS#*T-,T#Hd(d61q%-SePT(+
iIl$ld82AL+`(TFe2K$a"0i,83+JE@G-e,*@RDq2T,@[1*U5ZFkHh(,kpi@cB6q5
D"JkcNaJe'0PiqVYVcLHNNA1R[`Zfm[a9lTXN0dUXMaEcfp0Z@+2Id"XZ2PhrK)8
QSIEQ3[VCA[H8e62A+92aX8Mp@0lpC[HEZiraSe2bHNPTY@-blh92PS6Zb4le)kS
fHh9bQ*SGG8`Z`(5$fMfLIR5Uc8SQakMC4XIN1+D$DRHMqU'9Vjbm5Efb'G2Ee1k
*kSH004P5QeK,!p0&&C4q68Q80&(L`[#9fBKChN4QK9I@"mL!m-M5dN64)'0S28X
K['I"6'Td5MP)h6AZdHQc"H+q,AYb65)G5M$+%`G#%Q9l$MAE)h%03Jq-#FKe2dP
hFaMffN3hh2)DCB9rq[MUU9km6&l61c"j&4!A*krGR6fjCA+4EGlN(GEXb9Xa[%J
GVQ($BFL9FfRmk'5SU[qNLkCJ,S-KT45S42Z2aP49$Q3-#)E6,YT%Hbcm%d[XbQa
cb#`LS658BNZB!(PJY[RPU5!NABP[r+NP$KCdpXNBLR8`VMYTmLjqNjmN1C!!##a
qmlL05k%Rp)LNDX)0PH(A6*2`98)NVfN4['KaEc0#"6&Z5)392S`LRhLkpBbY@R,
K*h!0MLJ'PTaK**Z6dC-N@V*ABRUBTKZ*pHAK6EQmpQb0*C!!`TJ-%+TLJ5@II3K
feXITpF1c'(bq#XQL$KX2U5p!BMX89rIU4h3*BmcM[9)Jf#ZjBRGD2dXd0jd-R+5
$G9mdmTVc`L@0Al6`iqIaFaCTYiYVcj*bc0JAABb8f65I4hm5KVPrZ!d+Z@"'1H&


PQa4iZ8pbJI9ebKZhc8Ze'4E+c`4b'Vr)P1a$iGdFG,1AZflk,)!bqBcq)#2Umpk
a9&Yh$beirbJ1UH,E525$K1d!fiSTLJ)d,U&$5`q#FBU$2N@r858j'DD'"18dd83
BMB0J$Ne3'H'!@,j2U-b0QebcjVe9Q,li5CBpNFS34J*QKTiljlf9VcEcLRiNamY
r&bmJSa,KGR4+5NI9jK*Q+K4Q+0U-K`KNFe*%JNEEDNpK8j4pCL+4Ph#J[GqVLRP
UiU1$Zh[++Yk4QBp-$[16ZrUE$S)pCiafPF-R,"'8(a`d*NS0bZTB4&,T8RSS8e@
5[(1-CGe9d45@I*813'*dTCNba6%H#630,$J8)[r0XSU-QS@%KKibp)MSh0QTqdc
KmD1TqeL!'0XpP[TD4JqQEb+JM#DR4Mb-GEYArM)Lrli*CYS`)I4L`'YLGZVpMT[
Dp['SQJ!'(!1m39d-aMab8P#&UkUr,EC(,BpH1aL*0$"$jE"JNZ$)BN-,`%b6-Td
#0Y!V+`F+j3L&&)E#%%0RM!SMrff*$"2lcj)bDkME*'9kBHjhMd`Ebi0PTf`QS(U
cHVm04f!$$daG6e)a`5YNJ@`6$fJ6l@0FC+bkU+SB!U[1L2C!eK3#XqQ&59SR3i3
5Q%#"$2FDMbCe9UPhM!bqBl9UB'erLLTd-#j"VRXdpBjT@hJdYB@bY@CZ``4EB$+
p@+kbc+[",P2LS1c8PZV(S$V1DhKpJLU)k$FXBYkH-+'ZBDKV$-XI&Tca54BXDD$
YC6f$qJBJN@jL4k!c(8X`e(%c85+,6@'#(H4KQfNL48XkY8S9YX!H8ZHcjT!!S0C
RlepBT3iY24GJ`V13!!b#D"[9i9!6*A'(-5L5qc"c8%b$15U`eQm+)S(1Z&Z@@qD
@Bd&8P-!$RpXFb@4BGV55#LF!Lc8CAfNJUJX)@lr#3$X'QQpCJNeD1ij'PN&('`q
#QZJQ(,C`0a))TYl%)jDkVaI+2P2[ia&-IF#5%SCTfpJUNXfm!F8r@$`X#%8%IPS
kUR5Af#CK4NJQQp92U%Zh5AbLejSkK1++U$Hp66@*T`TECS`IA(-)8E83MHci!3Z
2!$FkPl&dr&le1JM))Ih"iN`SMUm8qk#%lchQ9!"VG93&Fm!fcJ"L0RDBHJ%1SJC
ha`rZr3YH8$8+pq0)#BNE0Bk-MUUAbp8M%MLL%8IFT84rXMSV`5&BXFf%)0M&62P
p"R0q3iDC9f!`9Q&L&m9H%fS$UJ,rbdefE-K$99i`GrplHX``840pi4*28PS5Bbc
aJiX"$P`-F"$#K&dYXSp3j8SUJ%e$&B`)K@N`qL8r,95k6Dji%aMK1U0S&B5*S))
1@G(e3cUJe!JhISJ5mJJG@D1eCQ3Qea-PmP5'K5EN5NVkrAT(,$b8$P%dq1brNB%
c,8Yj)Y`1GY8I'BElek%LP-0L0`Lj!3"VdVJ,MJZ$8LKVb%[h8C*qI1DRPm!8hZ9

B-iS"$S"S`,j534P9flaDNYY6#SQ&TBbpQ1SeGAN(88R&--!eP,9UiBj"l8!r!Z`
-'!#Y28BIKS)fZG"j+K5Sbql2k*%ccE`L#U#b5[k3!*!!'++!*FFF+C1pN6%8-iZ
(H4SP0r8Yd'"%D!!RFM)&6-f#ZHN9+10"m#"e2[2@GP'#6b6)K3S@5P"2"Ca`*4P
!5hYB)T!!aeL$LD4m6$mcSX+@V-6Lh-c8bA+K,e,kU!3lkJ`TYS'DJQCLD52E+(N
bXR#!GbK4)BSMImQk"P3@)JZK!R)jBcT,(q4M"ifaKH!m$bM-3I8d594JI,'#ML@
M9[PJ"-N!SLq%3bqTKlDfpV$%V1Qlaj*Ik6d41*KDK%FLG9QrefCLABq-ji)+!Z(
$IdVp1+pfT12MKr93G082FaNB&b,VpeFjafJ+JE26j1SpiGqIZSbF!@E94a'3!%-
G9GqZ3qC,Qikb4++%8JZ5-B`Q9m`j%8Jc0E,Q)GQJ@A@0Nh!09!4`TB@'`[64*EK
*Ic&YPJb&#cD`#1G+Q"d!XepfbE3@i*D`!0Za!'AF!bS19)D)%LPI&"C'DD+&86T
SBDJCkha+@!,PFA9*6USI+@V(493(aKJI+*hkQR&j!YH4X%CrH3kR,J2b*D@AU1(
51bm4e0Lpj"+&GD@A#)XfKah'!`8X8)kSb-aE5iQX[,38qDKb#L#)RH6mLfVGA$$
Z4I,!b9#M8)RN,j13!+aP$JVfYjbI*#HB!JN0`!kh!"S@C58X!3J24ae%eK5ih5C
mT)*j+6ET@-+9#DBBXTar-m8m'XM%1Y0))#I2iDKcjF`ZFY5cai5%5jK%*+c(M`B
)lR56NMi4Rj1#P19@i1F9S%r'm,AXX3&EX11D6P84@30$EU++A+Z-h1J*TF'a$)m
44a&YKfh&QjaJ`jT0%i(F"*11N!#2a$r[bd1M[-8!pL`P`I$K1'4UPAJY`JZTeJq
$NC!!Pc!X*'%a0H#SHe#L8#+l'cVIdlDVUK@1!A3EC+Ej3A)h8HI2ZPN1Fh%ZX1[
rUj@CJSFMV3$Q"NdGD$i4#fpM`-a'(19PL6UeB"1#62(!(FG%HS%TQC!!!#"S8%(
3MHePB(Z0cQ"bJJdi,JJjJ)"'krmJQ'BLbI`XZ)@Z&F&QCd[T$"6!%5d%E!&85(G
"k@3R"#iaqc(4cl+c[5B2@!jImRb`&0R*mm%BPYY'NrrNM0DILN4C)j6U%3JEGPq
BXN+HL,MF&c$T%J"Fb[[%&Jjb5LK%5J-)m%j*me$ifHIZ-lNDS"`J)68JL6eH25(
hKGmV#E"Kq!KN)4!E!(MY@'B#m#"kLTK+aARI)J0JHk,[4XI3%He"J!$6P(pmTf0
B%21JNK)%fQL0#R+bU8"9!M[&%l(G-e2,%5KISHUR5,8F#R[KGqHP&QPRLKlk5"5


`*[)VU9*G!GCE*YUYS-T[YJP-*aAE5c)9*&GTreF*aXIY9$%HC6AYI4G@1PBd[3j
QkB4K8J[&)qFF4D63%8Njm-R!F%@)q#)!e69F!D#p5#$k-M$G#XTXK8C0&QSfX"I
%e6YXDN@b*MVJr`fV1%Y(%apS@*9m43$m&hG8M3bcSU6AG*)"b4%)1ZFk%5b0eH9
X6j-065PceT&KF*PXFA4Xq`Qe%#JD9D"Yrp%a+KT-*[0NJ&G[bL"-E+iplkDk1A`
+iP`#`$B2#P#mB09HV9Fc0kimKk3G$8%%E&NSjBAe"9)H%VI*3JdCYTH%8Gk)+C!
!UAap)1mS#DN)%MhP(5h9,+`L#f`TN4aVl(9VmVbSINX9,pYINDmKY!6P+RND"J#
&`QG"m%+T9K%6"mA8L+P[QEGf-L8qQ)VY)Z'3!#"FCjB@VL51&p8aN!!6pbp%dh"
C33Y8MTTF$(NA5qSjJ5&RR`Ud&K"m-ih#MKep3$ekb+$djD4YIPkFK&0HI&V#D9+
&+Tabh@KSDN,cE4#4%dNij380`QQ6L!0)1!QEbpY'%k2GH34BeH6&C3'9ec)k-bm
AMB+#J-+Jie3afcFf#)J&jX1B2!Z&N!"+Z-C2YL%E,3YL#(('QUFb8N55$$c"d'Z
P!#G,p3%RHG&T!dlbSJ,J41-hJNkUGY"fDE'qdD`L06)Yi%K9[J!F+3Z1#!QZ9&5
UF5d$Y&5jdY`cf@+5fY%a8[KR")eSC0")V'dQ+8kQLPIJ2+55j6rh)CK38''*'EP
b-[SP!ij!bBTlr[B68$R%'eb8'2$F31TNYiY)5JEhJYXj*Req$1+TP)ZY[5KX6TP
)cNF90C'V)'0C"ZAa4G0d1d5)bF9cS%+MlTdGEN(Re(HrEcd[A-ZhIYkhIG,Sc1e
Eb&d3R$BiabJC!J%)YNm#JrJm`"L9b2U$P29##+dCj*N)QJQ!IfB0C5pATqm#S-F
FK94bTFih0H$B("cV4!-NA0QHJdB!`59bffD@FJG4F!Gap+hmGqIRLFEPlUKDIS*
B`(kSd5SG#GrDVaF*)Q1Mq2DEHNVj8He#P`S8)a!1XT%GbR*1%ShcEd2K"hhZa--
2h3NFLG#55!d'4iB,!!6"`@mVVl'Q!3*qS+,$Fq8SSQ35@HJ9%FV9CMqG@SIS+XI
@kXSIPB&$JLJpA8m9&NDeQ3TMiP,d"L3*!q"k$pKKD8%LA$0`+LPESm6c8BPV3)k
8q$N-X+SNhp(8FHcchkP56"K0V(5XAEJlCU%1QkRkh`8"aii%Z![*d&JLQqT'5Qk
P,EE@"hNE&2XpaEUU2aF8ZlXY+SN$bQ3*h#'Jb(F5f!F%+DR#%PQ2j#,HdHcT`e6
NR$l)+[R+9ipI8rff,A[f+[bXY1+Mh)R)RCYSGISaX!-[HdDK9P``JbRr$eB&DD'
UHQC[GEUf(54mEb3Q9%e+R@#Ddp6TU,"TQ9NHbF$'*Y*#LDb5a6BHd3)NRf,5#F4

KKRLRX,$SJ1Tbr@M`9P)dK%QTMaj6T4Bm25S3)UaRKZ"K"(3l!flCpB"VH3b)1HK
IN`LTa'Hr(ZPjG#iAb-P%,QiDS'c(#+#L"'ZL*l+e00!@4EV4e+m381V!PXp,(BF
URa'Ge8mL%"'$@eGYafHGX%NN'r+J81aPbGF!3RVKQK&)d9m-m%(&Kh"eIJZNM&[
a),rqLMP5%V1+Er#&8'pf&CR+JeHJp)%DfXVj$2U)@BqRm9[m1KjAqF,i'rcU+qM
+6R1AmeY(0ZP`N!"B$#B+e5UB'Q+")R2,S)p88RaA,#kbY)cjP%4",#"2YXc%4##
,4dQC`RH2Z'+$V#QZq@)Uhb!U6CD@)+"kYeU1HGJ!9)-p3pFqM3eFr6pa!p43#fI
k))hIR-EN!lf0dY5me#f)lLe(10p&cF64e#e)TX5f2KFIk4)U"Vr+Y[Krc',!8EI
Sp"@X8q+[%K5Y0aJ9UL0$Cd'8,8f3!,q'kK')[@brEd'@R#i-fVJ1aEiI)*X*%EL
IQP+RcG3rH0,M+#Vr+59(TD)%%PdTU!kh!ba2G[dk-LdCjT5K#!0SBXl!%Hhp[J4
ETVBJ6brERE18KXU6(9@,8D9J+5Aa"Q64S%9&Mhd)KLaChPSc@j3arPUC384@44G
Pe@#T0!)iI)&KEMe#,,P"N!"I04#M5"8(c%F)+1J1mK`NL5Cam"(FCTH*b&flN!!
JYSY0YS2YRJ2#!iL5Q3T0YI[P,MQM#5$*A`"9a5Z,mE%0)-b,HX)Q@a$f"N*B(K0
()P1cM`1`k5k)C#Q$L9-9pFeJRHL+'#+jLAdHea0UKS8$)@qck4S)Z9p,(SH(0hN
5(VEN,AKmN!#m&9R'fNUlB%LN,[-ZB8)f+9)GC3-!lQ4Fp08H#aa`kqkTH"%-Kl*
R,kqdliBj8I*@)R2,(BRZGlkdV0N5QhVV(Dm5KL3EL,43b)3&G+Q,Y3J%bp(8$9"
lj#%&V3C!,a51(%UAA`')h5!X#T!!''CS68hH3PIZ6Z0ENbF*&fFGV68$X,@eQFr
#Y%Rca3$I+PVC%T)Chr,+&i6Y#JJCPYI&1ZhkJ&jFm(@pcBmD,RY0hFjEf2`E-2p
kAhEZmT65$S`Jq"@1CK'%lAV+(Qii8,eJpc(P$IP`Bq!Q9ap2fH`EKU[5KD[d(39
(I++(VXq!VPX2AEXHZU,a%%5!3DMS)bdFDMK)24KSq[64(!kL-T@ql''JHp0Dhba
C2lj[F3pN#k"`'094m9cGMPY[1hCQe,DS2-8S,!6'J"K09JckLJRQX#h)@r#6MKr
a#c$lh-SH$b#bBDk,B)4V)6T[XHN0*-MaXa!relmJ4@YZpRJ0Mk-F&EYFZ4M0GMK
QViUi!GcBa4ae$j'J+)&EhX-Yahc%e!Cf6jfpdNM!3U20)&k0*YF5m5UVHSG-VR,


YX1bfc9l&MP`0J#HBYpPlGq1"U!!c"kFF64k(6Aq(1H8@`E6248580mK*585!6Ia
2J6&"`A!A@rj0dHal2(P$YS3UCjM"KhFQUrSF5mj)#LmM!5Za6DMf[()Q'eJ(%jc
,(S5UdYNJ3I3)BSFYGC!!Phpal([$I"Gle,)&h@-8B#8C#`S`98KjNG%maJ)6$SP
XJk0mNcRM"5B`PT(V+&p2h[S8%hG-E$$fLe@2K%Ge+d0TA)*%-MUVRe#GY*b+*kq
++1CdbFI,V*f--V&i8"$h*9`U@[kQRK,2I%(dUfk0M--NZ09$M&ci%'8*Z#*F(43
%Yhj&)d)9Fe5S'Q4!XaI*B+BH)-&C-*Fd`E6'-XA*(ZQl,daZJD(-Bf5XBmZH2Jk
0"QhcTUq`c8YZe3HHQ8$fIT`8S@pkNKlE8,cIT`03,TV0T5NV`)M8-+8PMQ#a+%h
[T+6U%GrL&*J*m"mATUp#a6V(U!VC(aI#a-mamqRN4M*C5K`154ARMd$P&*Dd%5"
ETL!9KLCZpXF&9$frcpf88cJHSQH*Qa90$e`kK8U29TMLF,-rQ6UGpqT23DhGD'S
j9&@IJQ+f3(#!M(bJ'Z9`G`qC#Bfrai#p9F@SR16jLFa`U%VD4@4*phQK@&#!"IR
19hh+kDqJl*`lR&$E!N8DbLiBiT+LQ#dbXKHHRMkhqrAZedR0%DQMrR&KYLI%YT4
J'f"(Ac0XC(6+-C!!@SB[R4)DdjACRU!k)%J$8#b5qUcCdqF#N!"(!f!UlIGF!SM
MIpphRk)"B!VRBJ(baimQ$`*pUeSirdqf"#'f"1)l,!'l[LC6Ea%%K2,G+E5d4h,
GEA6`p('iELmlH+M-`UDB[-edl-Fl8Ee0L!PA3V%QaJlY`+'5LM3TA5J4LYajDi5
&m+F,'r3I*$!32`NAAJB(K#VZa$@iH`e6NAA2Q[drZr%cM*mar&Jlj[h2Q`4q3h-
BFAeM%M@Pa#K%b(15+I'X)3Z%cL`BR9XLMIS%i!49i1FY4@`jDb48SV,qH5r@JMQ
BP9a4+J&qS9bj19Ah$P&@P-0-I*5*`S)'H5dQbB!F,Zb"'9%4&X-P4$T9@KKrR43
eUF#RG(&dEKcCI@(kJG(XZA&(IQR$)%C`B%U1QBTX1maHRJ'`(k#ea8kRJ`!$I'X
C3k-+UV)3&338I[#!+J+NDikif1'&T3i[*!8+G2J`9j(ad!!#Im9ITdqUIPhBNUl
dPR$"I4JkdXI2d#(HqH"MQ*f&Bb"m&TdN"8!j"9!1m`c8b!,dmYZY)%Bk3&XL4iQ
bSMq8SZdX!!1)EAa,!q$P1LI2e3-m%c-la6Rlk5RT8*58258G$Q2""d!$H5N-D"e
PjNp4DYBdEiU6M!i0NC-[9jC%a'452$Z,44!KQKLbd@2XT4BDeG16NTTMJJ+Me6I
Pa3931ZdqY[E`5N28!5!j0jicPlPq!`8SQ+G*3Ar#-db,0URQ9%L#NXRSTe6a&UQ

HE(cl$[l-L`%HKp+0J(U)p$-mS,5YK4CM0CMKEcc(PN*I)3HCP-&FjUm9c&c5,jM
$kTP,%Z-Hkk8r,+5PGb#C'&Fa14I%R("b(iN9E+'Q'3Y-6P-df0T6LU$2M!T*6*(
!8+Z`!RYDC-HIBP(+-#a-$Pr!8$#Bj*C"BRh)6B+14%5c$XV)+ZQ2iL!`'+Yk,!k
9Vb*[C&@2qCLa9Sf!e&r,@h[d+dC$KZ@,M$"hXE2&,9(02#$1(eS'Yk%M4KK)TF#
`3'%3&a3D#%21&Z1!2*Ce#3P8qJGi*pXm'dL9m2-SLY%ecM#FHiG3pD#"qFir0#+
)Nrq45H,%`)E[J")UEA[f$*-+e2()!S(pd3hdCap%+A!2Ei3+m8*DA0XY)4#Q&Ke
*`0bLb&'Bb*8GF2a'jRTH1BJcaFX$A)Y!r%"``,eKS`1LmjMM'A4I)mGY,ZGMFN!
R)Y5IkMqiC3#"Ub)PqlkU+Vh3H%RCS-i%#NZk*iL9jdD!`RS)PK+K5@V4"lF)+@-
5%&TdZ&Y*mX6Gj(3f[(L6-l$3eUR)mJJ3EA5F"4[Z"QY9ZUN3LCQF9CN*Sirq`Ca
r5%pRLVIS6m!Bp,aGhL!)`&"l+@-G"T5&3@bR#PU9j)B)`%be%+bCiIK'GCj'Jq8
XlVk*#Z%$!)9)N8#@%PD-&8)*J3,4@)HIHZFJU96!jeD+f-4K4VUY)p@Fb#bfPAq
I%8N14ZF2GI3e1AC%,NERrph8J6C(6D5E'Gm0XJ&cdIKVDQ1G-+8Hmh0dIDjfKF&
#r0cNY6e`"U$d5dTiid!#P3h9Fc+am3PABm#`-!"r'-!elH$fmV)"PB3I,D-cl5r
r#N1#Pl@$aD0k5p-9Ek-N"SBQAYC%NC[)39%@2J4qBQVTSCCAL"ifM,*0'XL&J3Q
eUN59!DePLXFj,4NPS8&!*)9hcq1$e#P"#@3H&8KK(T%RY3['JcY)Z$1#9!2!eBq
T8ddqlTEJqJALUlUN6b6f"jUJqNK(3fi23qA4(!)bl#$6,[D(V4LF"5Kh8*0)cX%
X22l"HC!!'T!!ZLAKcbM4$Kke'jV'"55hPp-V",hpb4l"q5Ki1J2Pa`f,arNFTYk
1%K#LFq%EG-PIdRrd+,hfKpRNfi``qh`TC,*Bj+hY(ac&2k(E&6CdY`U,XcfS)Y!
R0+FP)Q',+!m,S'*EURE`e@mE"RB*LjLr9adB&4Bh[iMFRL'MSdTH)8TU+@MRDFA
LVriTJkNdC+ThmaFH9iqBV`kG,+#5rjr#NZ6IerU*V+@[d0fS)%T3jmX,f-HmYA1
e4XAcqB*+hhj"C9D*DZ"FSC8GC$-8E2&"YC,E*%j*"1N2Mk!r-J*1X`BrT)jqXr0
HFJ,+Mm*9T)44JK,$a8d$lVl)$P*ia`f+XZ3%#$+T5[e[!+*5%M[paJZ2k`FB4Y`

KjD`Z%N!`CRXY3D40VjcN6ZG[1GCGM!,[80*3c5Rm)5M5`VLa`JUBYj)KFi0cU+8
B19h6"r8$YDcDK+&NTU46ReM!$)SpTC5&$aQ*6$i$3jNNfYUS-#`S2q6ecA8XL1!
2Nb%5!FKkDff8A!mIj8lKchC"CG*V(BAdCm23(`e$aSSSZ0-IV`-J&2l!K(a-03K
U6GP%hP-pP@m3-5#4`9bYN!#TDiT4T*GA`X4fN!!%+YcZeFT'['V8ep[X9869a@Q
SiUfl'5!*kV+CU#-5X,A0kNX2$2YTm5Tl9F9k#jPU3J-cXahQBXPec$$ljbCbRMG
KQ"P)),MR,D1%6H5N)1mY)m#DdSZPHSeHUEZMkPrZ`f34i&ZQ`RFGA'39I[D#c,L
-+Y6(5b'*'lM0XS@2iHL`$5"0pLSAL[FQb)4(-"AE@rdIBCJ*`X#(QpDT$9Dba9M
TG236L1Ch*'6T@'H!@!0KSDJ"IPk8K6D-+Pl8Mf"+)PMp#eDJAiT#pY+&Ep#M2ec
qhkc3XF6BZ,`E"A&e3[mI!!!FPN&%3e)$!%6B$e80Gc3"%#(q8!CIS@,&aZXB-m`
3I6,X1S+8Q-8MaLJJFl8c,DPNi6a2+p!L6U#Tb)MC*A8`jicCiEBMhV,EHGkLk+E
(R%HmaYXjBjcc&X2-cMQc'1)a3p`dhSB-!GYrrlrh[GIAdJ,ZlRIhq`XEY%AP8))
JH!)J-e01LQ5R%rr%i-H85"Qh#!H15d(f#H"RUjF+4jpMUlIDGej-&NN)Qr,$LF!
VekHFY&3#28qdEVi`hMdQVZLA@T!!6,40Y0SY6d-)KQL"Kad6fM[hfqbGE3LcpED
0Q$bUAlTL`,DQFlpc$4YHLm,T#BUba)S`USU9Q6j+rr#AUr4,"j%@YBMaG9C+'[A
KdJ2SS-6P!8bUX@k3!qiX,D[[FZ[cQNYTb(,-Z[R1r&ZVR8jPFR-TMTqYVPKDHY5
6@B@()@JdEPlA#(+GTNm5@CKq`UaAhIPKT(G41IRD6r,$RheeA@-`R8ql)8db5*1
m9[[!'#BG`U3"A,jDhrm'ACCJM#A!aRV'f,34LE(ePLS0B`QCXEaeMH-05)4$QCB
9kaUYpQqYj8!dCYZ)`ASFZT1VZKk2LeKf@9E$Z8-AAF4$Kj3`+THf09MN@1eMlI5
"aaUVr3Yf()63eVB@!hIJeGPiYBbrHJFH#khfclMSJikKUp@[p*i!#FJ9AZY8CF)
6G63C(IdB(Z,$1(Kf9C+IEB-Q$E-&A6(+&R6pNf`"YPC8X`ABI8&5!@e'HTQff3e
ee!Hc!#l0YNpfVKDHS*8[2U*Lb1`f+DK[b4JqD,JrR$Pd#qU`E*1CGeZRRJQ2Sp1
hH@QTUl`@ra*9b4m(bj*TdfdSJL#P@"1,M@QS(LN6a,+,r*,&QNZbqX-+Fe`-[@`


"m4jCb*JQd9r01J!HRdZkYGIr)6BabS!5H'(QMlE(G+mNCF4F+5"X-fGZ6dPIX#"
Q'K#LjdK1mUAMZHPUZTB%UYY6,UA%CSUL$q"NmMbjd)CC!K4Z0&kPa3Clc"h,ha#
9X5'AXrB08CET(IkQk[-eL,+J%'eU4aH5f1CMp@NeCc2+c&Ac(mdiMQhCX+dJIF#
j-PRIMmp51"m'k!12rHLQS'`r(PHa5(ZY9'c3jedJ8E`+i$%*1%fpb"BiSLb(,HL
#8e$60)"9Z`EdVN"B4bhPDJF+XNVr3lfJiblm"&-GB2YDBLGH2SfK*2V!ic`@1Pc
r'-#,f$NIFMfQ0ZrRi'98A$$@2H%p+@Tf3Y9GbXQ-UE)5eHb-M$dkA5aG+0V0hT0
b-cYaNdpM#MqHRCQEF61QdfAV)K@"-TCe+IhQTH2(Xc-LPT*55)jZ5MX38),jifE
KFYB!YF@LeEj"8VYc8cbe[e)UYXKUVib[GY%B6qh$LYU(1+STjiLL8P+iqD*D'9R
KVfJ9AKP4iDmLpHMqXeFi138Fc*'615&CQ(d-#+U1iPqL,0P[,-rdFZ64$NAeR!N
E!6cCEViY9hkB"%IC#(I0A,085SHC$iJUp9UQ`p+&&-%eVVB%K4DN#Vim48HG#@X
2'ljT[LNG4Qk-AR*86*fC+`)L!)%2U2Xbbha6Z4Y+4&hBK3X$Z($Sk(-*"jMGI1&
6A"fJSrX,-4epNGT[1P5IYqifIGkbZIKia,Tj@6@)UKX[cLAQ-@d+!S%fQNMZqXl
VIfcT2INfMKF"r(2JU#1b-L6@KQMDm-R#6'Jf8KNPF1dNDZ2VaYHCa)dcHT(q$62
QRBe)T#X)$G1Tm,UZUB2IVN09mead-DU$jRjP-*')3LQMkU#Khp*Z'4'9H&4&)44
#D59-`%[`D'3)CC!!#AKM#%)TN33mk*D3!+JX3-F3A0jaKSY-$dqk&bfLV%"XV%#
@45k3!&)9bTJM#3-PPEpNk,bq4!rc#h8PdRi1)BcX`dSI!d,iaYF)!al$H$b2abN
m4[$SKLP!'!JN+5"`54+1Z%Zck1X2"ee4D1LiK)D+"aNDHJMG$I5"aa`X1U!Z$p#
3!*8'3Y4&8kdQ0&5Ldk)K"CRF'65*DlD#+[*LHGQkRkUj1@URERXX*cI$9#[-eLe
B%'&8c#b51'S%GPa5(J"S"#aim0(02ZjL(hhd-Cj*bVDdN!"SScJ1&aC[&-a%fId
&)8d5VRdeRV`UefL0*cX+SI[INP3jT65#+LFVU[6A-e91,NL9aBCSK!j$*80QNQ[
IFRlpFZAkhHckhEMq$,mH6SFT6p)(QDQ`kmPFC3PGIk68lf2A,d&`DlUq9A-pMLK
G`aDlTHYV)'lCF0e&Up5BfKp'ak4GrPp[KZ"Y8BqK@M24)JRF#+TP%pQLfh"XAKS


%8)H$Yc,'Yd)!Vh,'VeVYM45JAX9M1Q0m1KjVLA&-Daec-pEA@VCT@*qZB4f(60R
0&PZC#'lN)KL3!+T2Z5`+biQpV'B"CPp8YqIZLSNL"%ak,CD8ZcdP0bG6qfl"VeC
-j(0cFP0%"B6F*JH!j)S&'MbYUDji85M6U-Sb[,Sr$)1E(4MBJC!!P3Mk($2%K`S
*)8#A''H"ISpekSL!k0b!#BK`hHUGpi-0cK)M%!SKci4"Rq4dNQ''M44E4am%,Q1
9,"5QiI1BHQAm1EV+DPmjQ"qQJ02qA"D%dmC!`dDJ88+&E)0J0lA3"ai-0'`!$GY
T*TbP5K(E6QZ&dkB"$6ULF6&Eb+#KA2rZBU1!'Xc+dPaR&U0M6J`&&kX[qCj6$iM
Z$p,FiQLU-6@a2cM1TUda#e41"B`KK(BD[8BG[IUAD[ZFIHbe,``kKI,Lm#NJFHA
D8AkYF%S9"e,h`fV9QE!8MJTr@ARJ@08fpll+Dpi[,riha`IY,`fpF2JcSdpFqAc
2&fE28QIf[Mfmd[bZiCfZcikX',0dIfR#jqlkdmkrlI[@JZqZrYUd@`1GihX(ApR
aQ[k)mG9$hlH'qhrJ1pVaSqHrN[rATrlbc&rGZ"QmP*@4(NYNRXJpm1,a[*aXe`p
efe2f*,qFp00G2h[bEhlbBmrPae,6(Mhlq-PR,Rlch$HHrXrUU8mppr&reApel[p
pp292rrq6rjhd2a2rjDh[V&hAX'V0'fpZh[L2YHq[Ifr42p9mHrkrflqhr"mqr0H
PVfrj`m)r,VP[`rfEr[RKhdhqEGhGFhjjlhp2[fIHlHGrImH[V[kQj4GErkleJB1
rE[[jk8GZZllrLl[rrU%(QbmdhGNiTE5iC*R0UF"+GM,L[$djD[SH(3&35#@S+0(
AQL#3!"[2f#9@CblQS5bK)r[3`[j`NZ#11m'4P[fG-NPiRFe@qje$#+e'8&8L*!p
RThMi5MPFaCmrHRC@1Fb*&'"!9GJ(-JVMdP1($Z!NUr(bQA$#bp25%2ZZr[l`'$V
9EEcEClbFF+ai$3%-VZ!6Q[[$5!)GUi%*@j)rH-+AjJV-pq3&Nm3S,JTD+hl91`I
l`eede6(09DpSVVU)j(MJD*V4NeL6*)aR%dJJ-U5(c6ETCG4Y0`a4L#'E28'4aG9
5`%AUdqF8ed&pLbdVlMY2e3--Y',J)K$,N!!8AP%e0l-G3eGS1L90KTI3X5YIjB!
h$F0[3H5Ad!+G"c'e4r1bJk%P[$Ml,0$5Ui*!Eab[6F*VGNahKb+N89&im!S0"N)
(GI[U,U0L*4`"A@IYC8TF*`j6!HLfNlPJ+*%ZRUbJSZ,*%LSUhQ5e2r3mIH#a48&
&a9[`Q-Z)G+1#LSVRDSNdRmT3%4haB"TE6*C48EQP8Nj31+a6ApYIh2VD)`'hi98
3[Rc0&NDY8ipk[V*d8,``)&Cc-dc6LdLrQ!99e8+'mBU"UJX"c5!8J@Z(3`mfSUU

Cq6%"!$T!!SYVV2EQG[SJm6%FBNc6F)mXP,L84%#6!%VLiC0'j@E""@6cKBNe(P`
lPNQUAF48Z`JNHLYAEDh9[VZ%2["SB+UP4c8,*%mce9D(U,C"SeSFm9!A@bc5)(N
)@1mFeN(LXiJY5!#AXJ8%Z*d4+",Z$l)Sh5L&kcRC+HSPQ35V%JU+T5-,SiYGbLX
+%Hhel98c6X3bAYbq*dr0bpfHGbNPim4h9G"i&mKmqU@85fVZGT8&#d8L096Fi1k
Sh3M6MbUBYEL$J9ib,20V+h)0AUALd(!Y6X9K!-Ka15V!8S$UB"9mHq@pRGI['aN
qZA+[F+"Di+C!,4'GJ'L5!YB['Z@!eHlGa!*@5[2T!3`1I9ia9D,ZL!TBlGk&TS"
eGe*d`)T`F*jD,SH##&&ie8-6XSS@+@6G[bP#b,TF#3Y%-`[mPKF8XRka84ZbmS3
P!MpXI@MP!55j[Ec5aU[jZf+kE$9EKa!`me*+ER*-cGU65-4d2*UM#'fFVf2T4h*
3V%HjC%"@FL!MHc*5U#Tb*+`TfS*+Z9$`&q(X"3XLM&C!H16+MN%TD!!)#BG,UG+
iEDa+8aQ[`Jj$5QiU"M,Nf(S5iH&3M5HV[4I+3K$N9FXRMLQ+-k#,*P@R@35kh(U
ARS+J!%--$N)-P0iLSF`-h!1&`lKV9*XBS'X39!iPfVQa9"SYb,(JFJD(MQ*"&i)
JHKd1aEadq+E*f,0(P33ET-jdb)$QN!"d%-XKHfUk@5f[IY4#b4#[hT8IaD4"e1-
9BT)RC2J@G@VYj9KJiPK`-3cG+R[hYFmlkNQ8pRCL%pk[B[Um9,V-GUmDb%F`&qJ
,!F`V$$#IL!1B*q)"TPZJ`,C8&$!I@@m#c(d6SJ#c24jJlKXa!HCY,Fm#-,G+J2R
)K!)!Xl%LJ(PE-"*J+X)&*3c01'#'1Ek0!*Pr%D#T2Gd%QpVK'3A1,G(!@@@Z+(!
#q"`F00-b$@UJ1Y9#BZd1&@fSdL%K15AF#ic+#6b3!"@!bdC+ZD'*3F"%hL-#+%m
m14%qb#!*iN3J'SNj%QS$Cbj$j5rU@A)jK$dHF2H4!iC2'SD`GI85q198"!5eQ`'
`'4M3[4X(k&`XSFJC**1ri8H642$%1%a5M@QC(@S!eR1)U*'JD!a1ikNqZrm+Vlj
9NTYhkcHrPaUX8Ml**)DR#ZfLK8m*I%maE'hFkU%$A(kBTM3Ql'VJJC-VdH81q0+
mDA4mAM82[E"GQ,-DqfA8)59UCf,VJB#Q!-TTf'`)"06bPT-`k[8HHAfir,h(bKi
MC2M!aH&Z3q$pamaP-rF'!NVM!2BLQZdB@)+C(%($)i%!YMQX(XSrkAMLb0,HX[F
[PehQKcbMPV@Fl1dH&HpjKXA4Y%6,1q1"J''@38DdD+L$SjC@'ch2)b3eA4+[!i@


`NaA'Rq)8aPb6F%QSEjp20HT280AL`Vc1kaY!Y1JIh-,$3%0$ieeL9$A5%5B#)!2
5MX)[S")iQXP&eSX'@QMZS4aZ,cqKJ0NqPB'C0f*5cfBT4iMV4b%l&6$jmL33-Vp
%b%"B+XR)@L&*@X8E!45C2IMRb$aXN4#lFX30HTNDF@L%GT!!+@T[(%9Y++`SGjH
XU&CXfFihEUq3!+)1&Ak"+fSaVc3`i0HU+l"I8GHfKq+V5pQi[#QZ0RR6CcA)KTa
G9mQ"caEeY'&*1CU*@UAYd#M,aj6eJcM+fUe49U8L4[H["LRPcJ[9Q"m1G8J`TFa
@TLNEp4XMZ@bd!+T"P0i34-NBMjVNd%i#md'fLCZ40e%m'V8*&2(p6eGS%dp,QbK
I80!QCK9QmYPX*)GY*#r14VUM(86hf`Yf%&'$#A++iK9[&`rSb1@&TUlQC"(XX9`
c-@Y!3$QI+V'9,k6e#9pUcD1a&N-jTA#pS8(BNic*Rm9KdP8)Z"$%G&lI"&4#U$N
#!-e@ZVQL%FB8T'K-1"h2!4Fp3-*ZUNKV%+b-9)P`1EVeH@mDV*ZEh'D*G#p5YY9
89Z2T$kGIi55@1XiT(4G+KY'!%!(N6ZELDY+iZ(DMXYd&&eGE4"GAQq3b9ebI*NG
@aUAY+A'5F&ZTm4@T+PNJL'cLTLUPB1m+qd!#PU228G9R-)Lli$L&fCK6q$`8USZ
p`Lq(TCZEKXk%JeiD9&,eG`E02Z-EH+RUm4GK(Z4eqDQ4f@1H9#`0[Zi4C'+A6KJ
42IVAYb$"CYhXR-m$ap%3JEM)"1+C1!*4(5fdQha&#HfS,,4%C2'D#L,E!j%GQM@
K6fM&eTGk*Pb6&QY6QX)a)6%KYlQ-ZDr'B8iKQ-Gk@HL5)R3LH%8YH`$)I01"1E9
Zi@-K3H@AK(p8V(mdYV9VPZD#YHb#lm5jB"+EZ)K0I#r1a0V#"+RdBZIehpB","#
@iF'V,I%"L%rPL+Td9d%!"#Df-'CHMm0-A3Jc$MUdD6C(AL"I!3"#kD,1kh@*PIU
!Jclk6q,6cBQM)`*cIB8R+i53!"reP!,d6@T4K0#%B!1DK1iXQD3eM@L$1l0XG%%
[XFYf'9-jS,5cN!#C[8L$CQfKeM%&r6DbJNSFTJeL8j-)VB'X!c`ZE*684"@2*M-
24mpS940&B1j5$L!!CDrCYff3!*F!ikXI&D8Bj6!BmahJVb-3Z#@`3#$3I+"lPYb
aK(8id1(URL89P+e0FRkMNlC`&Fe)"&XJN!#!J`S024'5LBPM3"PShJYA#kU8c6Z
S1AC(1$2+i55HP"a1GlKNKa1FJmcKe+C8S8@b8S@Qkd-F6[BTTdd1Tepp%Ze`ZM9
Qfmdf9-8V0S6i+L8RGmDP(-SdCVYL1@SLpcL[[1l!"daJ-$BMe93SCXk-+JC+5BG
5q-+bqKEqP(rSZ%(++U3UQk5Uhqm`UDTa#929HDDU%UDUmp'UDPaU8Y8G+G'U)Z0

19PaETH,L,,"dJih5$CXi#dJ@R&p)(hJJMGXi5"pic'%X,'%XK"JJm+R6f!*(r2i
KYYLY+DbY5Q%G1d@&YD`M3Q&PS'DI%SXU,Q9d4JSXIY(2q'%JZ+FP`bCP!i&6LUY
4I#U"8b#*`!Q+2G3pDkGJJhSbHXcR)"'59-U4NNUhhc!PPCUZXU65DDCQ&dXURBj
1+MA0-b@9cTq,6LSa`Z#9!JT*XFHcYj-D+$mHT4(UQN'&(*38JZB2$P6(Zi5h'KH
E"6@,2FkEX4Ma5HB)NSV+RqF)Ka`X[&,5l#09NBSbGGkpcYZjQNUCQNUK*KeA8j2
92Sr-MjZiSChp`RaQNRH3!+NT`G4d--S3dRjK29[JL0X6TS"(84-Cfpm0PPAP4aU
iUL!CX#XJ%cL6GQK`4T8M)3TH349L$DqL#M&48CDNN!#b(9%+bCG!-N30+C)DlTP
J8N2cqSUUSIP0NaVQ"H1TJDHZ[")S[Uc,"3JUQP$8`)GQ3!dm5$f0ULiRYE4G[i&
!TP"k96CiQYjK!S8(lp@#!X`IXf43U!`&K3FRQd$KRXHL3B(pG!'VRNZ')k(5cda
1CU#!H8"`P38%[iS6%(6,PBq05X"4+!KD($RFP9k%H9feP1T4,Pd&iLrD5@L8-!8
rJ+0j!6q085B0G*0$H5QrhU-*BTJKBN1))5)'N!!m,KQP9*PbLA0([pbjbNfGF0l
RV8++`MQLk4T9AN1e)@r9-$SGQNi$kbc$iLiNlT[l65TDc93dS!e@q%&*INTTP%R
"VY"eAVplR%)T[$B8Vc*18j3J9b3A(15Z@U!SB0@hiK4DIdL3!$Y+c5QNB,IU-+j
UB-Q"dEL"l@aP'NXZ0aA"N!#H-I4D()D#@U08CQ6N*J0#I&cM4V"fTe8c@)C+%!@
*2HMB5@jkeK&J(AhSQ+hTF,11$R48D6SFV-1&SY[2Le(T8&R(1A4-eh3-X)i'G(b
S&#A[m,!10&H`VAAjmI0$,5"-V8LEYA%96Y)DcXT+4,YU1GbP9bI*5lVJ+AP*E+6
*5f)f@9jL5lB6mK)EYjf5Pe#2l4!c'lEEaPN`h4djQ#D8`e%jQ%i%L(djI6G+k6X
[*58VXi5rUrZlC9A@BM6d80(b,PpNL5G&[DJ9$iXfId!FGMPTqd(Kcb'686pq))`
I+I`hH#UXQBber$lH@5ChM[21HEacTk*!I)k!I25BQ1M`8!HIe)kZ2JelFKIF3`G
%KkQVhp4e&9dZ8jI18AGClYb#cR1D6PA6Z4DG$CV1!8hR4A3Z0(9@NC+N+k-*3,T
%!1Sk)TKTFQ1d9bJ880aEd33Ja%cclN)%)"6aErpTAPEfm6KfIpr[f2(pl26Bm38
,-Q-TSN+1*8ZjC#!X9"i1HZ%JDL8K8F[aBh&GSX8m+a5T'aY%k`dY8QF1(#iHVFR


q&qL(pYVJbQRK$JarSJVZPpDJJbr,%Qke[-i$FYdkREY$Pf@CTZ,k$FUdc+8%B(!
CYBBkIiN"R5!@d!$(@GXJ@K*P1Vr$Vd&)cc1%p+-i#-NP(63Ma!`(TV1$-q)Fl0%
35mG-RRk0J1`,ZN4bS,FIpHMm[eLeXP0*Mb3,3hY`51-'3hUJ,R8kZG88Ske@F[f
'+NV$Z)iarX-iM$GS$F@"qKq5NXIi0d3rd%EZ3$)!Kh'*pi'6KGbm@N$B*3(#l`i
9B2LG9K($lmQl)KPqbiJ,5P#5fh(-`%r"pa[@TFGd$#"#"fE-q(ZfSKEQG293%HB
AN!$`TjqC1Q6!+3lml+3AKP9Zr2KA!-BiE3M8r8F[SmLD6Be$+%'R[L1mGDZ%iqd
"qYNr8V1+aQLGZpd#ABklUfP#l5SaP'%BAi@8$MTlhm'4l6!`pF$8`X-2q$TrAER
JS&N6D1LiLbP2D5b"i`%fJH-bf%M*cP8H*LJrML-SmfPLjr8je-cEhAY5!U%SC3h
4P#+5S(QVRQDAI521CA8K6JelqBFi0SZ#U2`i58,UCXk-088%,*qbblmHjr+@8)G
+8bdRZ%J[0Df*Nk6XNXNb64Z4'[-d65M3BGM)+Nf88(Z,('"5UTd0cQ8!J04ldbH
Q4([6*r*QC+HCrbPfD)Z5d&FD+cCjp-T25Y*L&e[3%5bTiQbKihM$P$l&H*0hikG
0,3i6Q('6eeE@Q@8bbH#[8U+qN9ha&P[3a$1(KCCpBcNeK8KmT0d'@p#V%l5*5YS
%Uh!jf)6R04[Tefc%U0R)Z8)E'5aJ)p-d'cNAYC'R0"[T#pR)Z3JE1DIC5%M#eFN
6N!"5XTp-9`MGmB+i,DSJEL1&d#&m#LQb66&[NDHd-B@2"$ZNBP,lhjq$UZJ#[M'
*i5bfD1C(RC@0H%d+Ef4($3FVf8XRmLQPYPXU1U1!qqFMNiP0U2!TEQ+c&U$@-)"
D&3HJGM2%XD&)a,'K5-3aRehflFLA,A1%)Sj0YXlV[dbRCMXJT$IL1N1lT'P!m6G
-MAJH&[(0DSKS5MrB4Jh0b)J@VjM0BMkDYI!','ZPiiaTq643[m[rmmfFN!!Hdj!
!d4Zd*'*HL*Lk*'+k4"4!6(G9K*MH0aD*Q1*(9!eUZH3%MGHXC!IFGc2HY%6jkEM
CA%%M[#%H'Nf8Jl!G%(H0Nr-TeC[+M9Y1SqX`0C*!dKP0*T3T2MkPjQcX)*CpipA
*rQ#[QDS&l)MHmJHHkIhFD!RF@#8dq1jPcC(6F@3h(AN&"j)"Yd%jYNrYGLZI0fD
QJV3'P'(jXSG"("h+"!1QlK)ib!S&NFQm%5Ec[BU"6f1TBP`0YdZe$"VfaK))5MY
GUalc23U$T*'ADK%M5GI`)rNe'f'%raY[NJD!PM#KrQ-FSHi1&HS0%0GlKbSLe-U
d8+'qIf4'KITqAm@%ZXkM&HSk6m&#rBH4rkK3,ccel)Akk2(XPjq08"I$U6j,&ZU

a-3V1re`&Hj40lD1THrFAPlb0)dG0NeS`D8+dm(GLSJ8#5%d*J-5hN!"3dU$#$SN
D@0TNhXBQ,$H!"2$#ak+,AP-@@m`"`l'DabQ0P@JaE0Y&a[X`ClZ!VD+Sac@J3Xe
!q)p)hjR66ifDqYJ40@0#1YJJ#&$!kXJ(Mc-fKX#'R4RDdm&Ve'28j-REU!'@HaQ
`r$)bX0L5%(E2'U`Df,#MTr2K6[[!NS'2"qS(XJE5"hbGlJ&VlFF$1`DU"pd$8`H
1$1M(p@m1R1NFU[Q`Xk'Qmd"R[@"r!!!aY%&%3e)$!&L-$e8,ECFJN@bVrb3[)3V
[kRGTTSkVZMc(F44A84YhUlTQHe)S"I9#&h*TcGEHV[aFfS4"1Lj6Fef@lA*"rAc
T#8jE)eDRBE9H$V0@CFYeVC-CVY[9j#bXB9P18f'%X&cl-%*3T-TAfceI$jIQqr[
phdY6`*klhChCRId!&AGH*$-M2a%5%3)4)JEh+Q8UNF#2R(F))-AN"Q`+M+Ja@p&
`NJ98[SRE)*DLMMl3[EP!cVGLKAlIRjI*9XlH"NH,)5S0'@SjT1AR`4kjFLb5VdS
NI[4,&MaSc*9VXCSRVG"-HF$Kqd5MY%*S[NB8!aR4$D45')JI"T)rJBCdRSpHB4A
R+fT$D"#@c26)%Pb4QK1AbqMEpLGGEmdX""B!YVm351+R90Y3Ni5`k)Z&T--h"a2
YUrX(`'F4[K"6aN%+RS3*PdbQB-)Q62GCQ!eDeALB-e[VrX%Cj@4TQ59M3BB@9dj
lU@CH*X9,C#2ja)0Q%NLM`cGdfP%1r5Lj!3$aL$J1$9&j4'UQ&IjpIe'j[Y[KkM8
BpJ`Y(G(@(aF$e0rhCj8"rIS!GE(YY'0Da6%q$NB-H)fmHRq2E$eBlD[49Lc9f50
Vd*LZ!BJF*ZKi"%fX%9r@+R[#k3TBU6TekT5-"9l`eQM$P2`ajkP,cJ@jkPKe`R!
(V2$-)!###%p$)mj(dm2%N!!(V*XCU&AUB'0@J)h-@'4KTKU6ii9@KL2Uhf56Imr
KEE0#'X'8KMepFNPP9P%,2"P0Z6LDFAEhl[c*$Ef6)3jIS!QqQDYm`2'+fcS*36M
NcQQY9UUV(-$a5@A)F@9)$&1$1qiXKfB'VE$,!@MhpV'`GZ1*"c8eVcjeCc+P6&J
9%`k[Ye)#fLFMl@3MjDCN[LK9Q',F@6j@lM[1CSXJSYSBAIp6@l6$-HfcLY,XZNT
*9C6aVU[jA(f4'a5&k+6%dXJX8f)jHG)$-'%bL+1jk@&Ri'314[[E1b6ZEPQj+S*
&+l-bXRIEBYMBPNMi8KBP11$&U`KRYB)SIF'kZCE&8kHr+1dhVZC2q8rHF&LR#&a
ML%Zpi3"m-R*%PUU!PHamq,X1c6MeKF4)S1#48%'pcEh6`cCeY*ICKI#0kNmLL5+


@U'TqE-*`RjF4'&(3eFX6cB*%1LKQq#`cX*Ej$"f@R*jJL&LQ*jP))YiLPRCDMM5
K$V"JR)aLD@D@+f)j+IANZYHY*0G!%3Re,JY49XD$a(Saj)6#HLPITQ6b-BYmmHA
`fTm@NK$kXVk-%q)0KpC%fBMjY18`El#!d!F0H&--X*Qrhij`#,'XUBbh-RVlN!!
$QajL"X2dHUeFdI6kq4L#ammd&'9%3)06UT4G9hPMJ6+I5-i(Y%#f+#e[bM+kUTR
K@PL!KTcdNcKm(TRN"*md8E&CJ%CiLB!5@2Fq6!H3!")!PL[h)i2q0#-G!$KjHU*
IiLaPNH3lVQB5I1![PFbS$Rf0R-a+S[+,CC'SAMdV4c+CYLfIh0`$XmGa8qFp3DR
@*S)r1"9&-VbS-,N2f4r#&FKq2UGKFMlh4E0q-LhM&0ciQje+eL[6$5i$*aS-plc
+`J+*!@Bb"$fFT3e2E*`2F2!8)[K'3h$e`EAPe!KLSZKZ&S%(T3%dB*e#+%MP+K1
SpUS""0c%"CMiKPpP)XTpUL(C&1)%#pcfaXp&Ahr"QcdA`dr9Z4"q20VjSdLDpfp
1KNQdJ''*Vf2EmDc8CXpq9,'J2&ThpU1qJmSMkqa(hhK0H45QV6hKfQK8maCpN3i
dU2j9*[b@@NZ%X8!P!FD3!&LFNeZB4+%S5eDGBp@,*APel4eV#S#AFd0rrQlaXF6
!h'1*[X!JXRmV6H$m!'b$-EpD9JNQeYpNpV*)*q#i5#$b!SY@llM@H*6CTNi'56d
a3`eNp4*[1bqe$brdq&k9mMKhSFIIq)(bf(r@Bd#a9cj8(SD*l(L##Bcdc*XLi1I
+Hr,,dKcXNI'*Kk"%P-Z*#5a3NMTC)T63C)K8S!8#"14-#$+#$`KM8@#LfA#HBVM
H'j(PN!"XH)J&0,m9%X'm6,#4A#FSY1A*Hkc(8!hZ!,*#pE#QjPFR)j0aU1l(j0#
DMNpSBK2#FB)-Hbq8U!R$MJX$a(5e-BCUAB6K0PYPU%jl#ip*"J1Fb%U%Xi3'0F!
XDBI*UEM3c-T!0@$#'&FXbk%K[%,,F[bBhlS,8D%qMQ$pe0p&l%T6-)kQS"4+cdk
%QDk%6ef*lHH'rUNVdIH`'2MH6J5jB"E4%prEkB[6aADkH-JUYdNmm+'bG3*J(EC
fckkL`4fIPY'#%(BLl#3UQpeFV4BK#`i)Z9CrX[1B-,RrL8[miP&G%'C98UH5SE'
*V50c@bA6Z`3Mp'Q("A&dRa++H*3*lElrFbr&aKTMDrH,*SPPIJk[M4l*XFZqkA$
$&a)9fLTHQ2cL@,LK,h&2Up56BLQ[pV$CL-[V8M[D`lP$XX%*JV8LPJXP`VPZI'U
k!JCC-mT`1bHa`cSjbXd26QJ(+9iLR+*$m[rcrk,rMrpLCrdA8[j6m9m3rqNA&4`


)+6P#ebc(&6KM[B!rZN%68C)K5'(3+K[bRfj9$,Rc6lGHd*!!ph'SP`hjIc2VC(4
crC!!%V3E-A$j)EPBaB[[*kDErR3V"KbTac808D0FbQkjD2(Lla,6pV!MNFM+ZY4
6l9hPB8a`Fe8BQCeLSj%13&lUNDMQiFq)T-qB0Q%)-q(2%!J9J1M+TkVPM4j9+Tp
"c@ldr!-X,6%bV4i*DkNM-3iE*1iP4UU#)'E#e-#pBbf)DLJ2XGNpl@4R%UqE+YF
kUP`HUP`qUPbP9,QN[!ke0`C#rjpjQj!!F2pYCVHeQjVM)jd8+[eIr9!*2l2`b*Q
Q!d2&N!"-GI',)8pc+2kV9aXLR*!!eY+jChJ!-4FKp%r#0&+aYe"R1G3DiHT1+Si
6CS@5a+6N5@SemLfdd+5f`SXS+`!XBM,rR65R"3l,Q[%Hq6#lG-6ZKL@$%RDS$`j
CmNFp2cJ9PEL@,dr4j6%YjNU+4c3P@[I`M[fq9*bJQL3HqdQ)QlF48-ddQMJ-6-S
LJJDHFFlilJX(r[j6TcM35eNiDr2I,NdNC%a$-2,E15c#YLJ['Kk6X8SNiX%&Vem
*d313!2JbQVS)m1-K%cc2hHD`pCGc-JcLcr4a8l$[2Lcj8kJ4C8-I-G&a3U+C'8T
ma!U``%'Llch182*H*%cF5K)BdJc(6LLKK$0rKKdX[!D(kYMC%bphi[V[q@5X!Qi
Yhi0DXeM03E8PSDK5I*dQBcZJm[C0KTkk!lM'DGepAb%BrQd(Kh,Q*"`qEb)Nm%)
59h"L!!MGdd4%le3d)Z0cLDFj8EYZ0dC*P"rJ*KHZr"lqI&5)'cNdZ*M!*9F@GT&
T#RehJTRLFKb9liG"1Y3`89`IMTfU&-`kZ@-rZ4(ZTb4ITL3r6`B%pcqUCP,ZS%S
RSd08"3&,!(k`&H*eIcjf#NV59iM2jZSUR+HJf,XQF$%$JdGLcrbDb08leYd[Sj&
H(fI)$["Ha*V!#l@5iBdL,PQK5rb&Z#YA&h9Fk*+"&TF-Y,a%YZNEN6p-hdKGY-8
P)bdZ'6RVNZhk4Z6Qp)h8a9TF-YcLNZ%@PfMem9S&L`Fj1'5TI!Qca$Y4kH!3p0T
Gqqi!h-b5DF)CjR8d6@`ar-3d#iDR`N$X,8fRlj!!EMV--UGJfFU1r9lla+QmI+j
m`ahhh8G1*5VUirMTQmP91S`j0Q!dXPq(kE6"YI3-6+1ER8$ajaVqA!CBH)f$BNa
5*Uk"N!#lc-dQ3$!0%&VAB&5(B-VAm((SFa`kJp-PQVrY)#+DdC!![QbK`LEfVRe
Tp[BSJi41,@AFBM(Qbjf3!!!"pfT&&L+ch($C`d6Er#U8eJ&@C,06A0hRGq0eh'D
3!*0S'cDcpb#ZAT4pcbTE2ir'S&@AFplfIBM$pilaieQp1[$PF2#,k4@#UJ()X(9


)EVdD+!"%c&K3+N1U2R6Y&**1T8U!a[BhZ%)La#U(MP)BpFV"m8fe&3j9hp%5(")
KHXi%J,#,T6)r0ErE2H8*D,-im)h*F$lme"dbpTGV+r3+(l+5PB!4cN!Xr!q#k9!
&N!#)lhiC+KC`EK`2,[T5"'aGI(`E`VIE%$JDY-V'"UGr``p4eHB`k5S5B43IIL6
A99Gj&N&M!'40r(NNqXc20q,+3Re"2[0LIAe1MTe#T))JH8pJAC,KImrZ3PQ6Sk%
AKVi(m-29r*4R0cjf9PE*a$+J&+dQ(hcU$QqXS9#3!!FAPY6+d"aJN`iF1lfL2`c
B#Y+h`3SMbG[&NG#c#qcfP,fjpN8Sl$C@f!6XGc1Bc!2`mF2PQeT92RJmZZAR)P#
"i"hF&[0"HM(#,b#F)`b(i*M0f)(N`!-PNm18-ldGJp01*B%lZ3,#8BS2k+3K2BN
I5ZNDE-C@&f@LN!$1Y)T$1P$,![Y6ZBS$MI,aZa9Ybk'j8+QFQ+XB)%9VeS@F-15
+BIcTj#DAYI[T0XP#IF'rHYm@DF*-2F3L-"a'hFfUB&ihEpf3!!r`KiG0[3dLIJ(
-Qr)Z3F9BAKKpS[[8&bVkE+EerEqi"NGQQ"dhH0!J6+%#HN5c,Y%0S+!8*M08P0i
m6f!RGFqIf%cr)CjQKD%8H,*G1&!1U11EB)a6c"j@%4Y'49!8f6jFX@Fbq,kF*(M
ej&8f3q!RFa8lf,b4c@l4Z,3mJ"$XmEQ+!ka3TU)j&5#4qP`r"-##iZDfqUR$LGf
*()Mm96KA`UbpFB+HSMjZ)"UfT28NE`kK`P@PD5dD1#j5)Z1N2(bN5QbN3)k3!2S
iARH6P-TQ0%G[Hq[U(XC2Bef+AJl@RH5AQSf6[')!41(AT+`Bd9l,[)M4Lr(-#j9
H6'9H41K&9HC&P&i8ji*D&NEG8p'Q@A0"@iaCVY9J'D@P8@45l%GL'V)GU$MJkM9
K*,j'"(m2j&e3p+pC`HIkBADHEpf48K'SqcMamkBY4mEXS+C[fA[9Nb%QrlUU*b8
+(8!-Ged%G*TFdr&a"PAX4HQVXC)Fq(BcQEM[FqaNFqLqYb"+"dQ8eT4+RH#!idf
%0q+9pekN$8Nj$&B-XB$dTQMEIiE+h#dDl)+TB2B"C[D8c+NfqeGMDaVE&SKYUm5
fU66#HTEB0NpXZd4XUb1QZBKTPiKT'V&X9R0PQ,8Q`kD&$)2@C9K6b$!P$kEi&DD
dCTKLCTJ5&Naa8c9l`JRApQ`q1&0qm"CFrRUp3aBPNIrQFhrrr"F5XmprdT5MEph
AMQ3SFcX#Jli9iaDlb5k+Dri-Vk6FCGed1EMDSqL1HPb+UUb9-+"1i[Xk9b)"UN%
d-0%BF9A[[AAXKp6NL9Dd(9Y43"M!&ArcV'F6VV!$#&4Cd3PRElMUI!a1!AMj9$r
$dYMLA%ARYY[1fikHLQ'h)qC)$#F5q"Ka1k"bFVV+i5eTGK)Cb3Y9rjCZVZ4F6+j

L,05SQ4#(Hr`)ZmIl$c(*T!Lq#+SE-hH1Q"XKYNjSTA#K4m#"A0R*RB%cp)@*l&%
&P"ZhGM28NaPJ#'*%pLXJAY9T!`"Ub62LXA+*r8+(22T$r4"[mM0i68NArpEKa!#
b$h8)S*@61-i3ek0eRNd%"JR)m#F%%0V63$*5b&cP!JK8H1XrcH``2$SN#i+!Q!@
iDE*-E"JJ&Vqd@l0V4[0(Y9MM!`5m4I4,U6'&3NJSI&*#8*VTC,MXjj*EZ#A8p$K
#Ma[e4P0LA!&b,3KM,4fU`XqFc0Bj3-Bd6L*`I(-AMQjDdr&0QfF6")"8ed1NA1+
U6$pfVfFZT$ANEcjh4bHDmbB#Ni8PK*8ie!YiH-&GIL4kIbmlTmJQba2)4VIlBM2
AAEG39-Rp3IRLG`8%J0!EAU!Jd!-!bLVKG[A#a$[Lm"qr#p2Nb5`'aP&SiVcm`%T
j9c!!$2ca#3mlldp2[!140`kcVX2,-r6b')BX4h[`iZ[dBJR*XmbK0KqE4TDR9cL
j1L6'0ciV(k#L2PhcQrLKaCGPCFQDMQFqj1-6ifcU[(R[(+l0bPCFUiT(r[1beIS
h$%!!#MqTEaf@49Q$Ri*%%j!!VrmXIk3qb`m`#"9-IafA2[a%j1%!M0khNYPJa[N
rmD@0cdDh3ffc#q#i,89Uqc*pV0$(Y5are2a-$%M5bjejrLKjQPkHDT-Ii'8A$DL
M!5cqadRY(q)PNEVG0-"(!rD)LG%H35,JJ9q3!,hdNDH26QA3HiSEdVMYM#Jq44q
(k3-"J&L%f&SLL*DamZNi'CXT`)*j'!L#c@j-FJC-l`))LXY-#L0jVPR*ZPcAE9C
!&U$da-kZkrL)VqPipJ&&'FRS05[1d+`9KjVi+-Y+kD22A3GTr#9LldQq$RqkF19
jGN&%Nf%A*VI5C"Y-[aN((m,"lRaCV*a""SD3!!!5a(N4Nej$!"3#F-$JEJS3lD'
V$kcTf')`m)YD2%LLSikcMQ)9IKCDajBB#ND5X8[60FY6B,HKcS)$L[JmA*2ffC+
+L"4C(q,L9PBFP@B[h#-q'UfqEj3E%8V'6MZklAU,SaI)F"$!pkil(MfUmJ6,P!j
S,SP%bd`8cY&A10K88j5I@NJdd`8rmDRid"#%!053!'MfcLUE@L'"%!HFXrHq83j
0*Lkl18[*cie5TT,(SfhY@pUa94kBj%9L$iD-+%-'a%Z`@ba-465B1%VHHeBFML9
2'JmXSfSC#"FXFp9kC2di95fPUKYJkM4AcdFH'0q%Mf1e9If4CRUe*#Vk)cdJ,am
5BZ14AH1E@+%L8jSh3ZVd*eU03UT3jJ+M2U&QEj!!3%Z4))+jB[YK&N*TEPX&!GD
c!+qK)J!)IUdd@XhP5r@X0-F'IF[,b5F(1mSABj[,mm(RlR#6#L)J#A8@I+UIQhT


I4P,)IYF2*"5#HMkYS)1TZ&#[F'%f$Mf!H+Ub@4f1TBCXfD(H4QX[VRfMR08p055
bXTmGfRef8550b#4fCd(SQTa!(++3!&SNV6#5D69550KGrYQlY)&)fN2D!)5amGF
rPqV6EePPMGBBM[cVYh"*T$ESDEGRDje(NK38@RPI46",)5!5p8bbSp!G#kqP`%9
I25VH!!9JAS-#-pR*k@X[m+#mp18Rb[k!JJSbLKm!C2Lj*d-D"b&9VZ4bMZ'$[!b
8qqb6C@FI9F(1"LZX"1hfXa`()P9c(2cRi+Yl&N'SH$jJ'hVDH3,KSKN("qkA3c[
qPK,ZidMZBC!!S2hji0Sl$%F8NQ2ETZ-Fb"cEYQM3S'%-qVLfK'CJD-[2+I(0X@h
(5UbE@pSjbIPcfV5#bYAbb9XlrKE+X(CiPLpEBKHP6Q8+[9TF!IPi#m8J1QQ+bXH
!D4rhbF3j,)Dp5eC`VFj8KZa'BJiZ'HC0a46`@EY8#(2Sh"pFQeDij3f(HaEZRL0
N%M#j[-P+19C1NdeZa-FFI!%9ZiNr$QMb4pf*!8UZ%@6B5(c#iN)L)XJrd!*))&#
rb'lq)29J!'iNGVB4X%i@jLB,U$acXNKKpNjf!',5N!$C"5A3"hHd'PYdDql5VaD
#UlfV[d+LXmShA3MC#-FZFMEVd`X0%43i"&*jjGp,!D`2jdA96HAed2"91[,VE&j
-TSPL(l+SNfaV1YD@8MKGqM3QG%'!YeTPA,RpjYKYZ"+a#KU#kJ&!2A1GXhVI4GS
qJ'j8qk*Q@I&CaeMe0#ZTiQb2,+,T2Mal8G0GV9+ZYaMU3-0p(@r&PpI-c*AQ8re
mVA+`8A[`8MF4EES6`4iff$NN*K+b@)U%a-#X*4+63rDhN!#8HqLeff*h*b3R&8G
QNMPbUNf0XkU&f+pKXCrZ1!4`dUmR,a8@1'#A$))rTi6J8E6R,MZ'E,j14EJ)mS1
CBH-FAX[R#Q8#LS8V9*K&ec++br[Fj1)8*iDX4l0PrC'B)P$c4CdY(8NU*'+bFpe
Teb),fAb5XYI%KBL9)KCl80L8aH-GGY"Cdr(FC8@e[mC9jVlV5!L%&E)jc8h*BhE
eMYdk*N6j,l99I[Rp88fYr2lRHl(*!5A4KbM4c!c$M3acbX&Z2(50LL&M2G*BP"A
l@M454K4"NTqi@mN%mA+KI#+%aCaCrLNdPB%f4[53!!+lGhPGb'`0KdFB*UXAEVA
4VR*ZZ-V@I-jN-$m'YcJ4D2d43[X$!EcdLKG2i%8E"SA!U*&#'4hSd--Kj(*D3N,
$C%HZ3$N9AiF,'MYH9EhTUkP%)AcTYqi%CVhR&-DpTVRB9H`fULU5fcJK5k6QFHq
HhEhZ661*Brj&Q!-E`rfhf!311RcjbPlPSShHSVM)DjM,-NSCGfMf#F#c@P)*"pf
"ND"i0j`6f`1c[Mb-d#65)fk,96VS)LTH*LUYiVi5Uh9E3L+h+mE2a4bc%#D&8NQ

QYCF-[QL4q)$U(i,U(l+iF"SFlH[-qriB4YpZj8"d-VMeSTDL4Q3lrVbSZ"2C)8$
'X29@C29eE+f9R!T8@`&Ed2$bMj!!+%e)I(CLFq2LMeL!8I95#[Z6i'S9JJ[%U`m
+D%)h@+9EJQjbCCK,[)JrlES6!%L3!$p#!CFaEKDLkX@2QSUEl()4MK3!,MS6V`2
#2!3(eMf*EVM[VNmFB#IH4"XH2TVS"%Q88SJa'4f`iLl(f+fP"9cr+2imLcrVZ81
%,h*d@iZM+rPSC2!3+CG(De#Gl(1*e`qU[T9!#'Ddmb"HBh&jBQ0!pGS2UYjiIG#
e844X!)RDr19Q1$&*Q&+RYjjraM$GQ`A3(8edXRX9%)V()5"i-GH%UF,&PUB#r!6
`GQ$(+KI&eCL`lCi&p&N`,c`3$Z3(B%b(k$#rFYLMA[Z&0M3Ki00QEUj``9)q!Z`
VjT0k!E8N-lLbY['Hq'Mb*!QKEL+%!9EqAY1E$j**l"')QC0#5'N,C(iQLMdF%-8
e)5,F'B'Mm@2p)"$%CQh@'TbI&`8!$rLHaBD'))EXT'DXM!Lb)))X)B)5!e!Sh*6
U3q'I6YI&I2cJV89jlld@JQLrlQKP[5+(XZc1`NfGrD5XYe0eHE&49*Gb%SlPpBm
*Gd--D"HN%T,T)fY+U5jl,e!GQUNkb0"[)&3+5T8Bdf6S25U5de-UL3Lkc2!lQjG
T(TGfU6L3!+"KSSXp*'1l%(Q*[IPF%Z*0#B@fLQ+Z"1(N#CjE*Q$Z9@fHVViI$,f
XACS)3E6HMcqAYB!Z*N0V&*%rL+S!9ECBSMZUK*V1HX3QIPPFU'A%DSM*r[Zp9#9
FJf"0cqrC)([qrR#L4lJMFN)TS[GA'(`Ca0I3a203BMfk%N-c'#38`KF[@h"["pQ
E`q0I+S8&VX'KcRcDL8#ZLZ)-e`iZ6!r"35JmYV!BA`CdJb)%`eYl%[Xj20$KU#h
+RpJDN!!q06$Mqbi)C6MTV12NLREN['&EV#2Rqj!!Jcd`[K#&U(E55j!!9SQG6h%
!GbI-`1#YF2K+[,k[Ki!"Cm%NXBe3iSPB35LG8c$aVX"j+"XTVje3QHcLX22a%),
1%5iDc`94p5[G$+YH)mG,C%QiAMlRH-,*F#q)[K`QKIpp20(PLl`k"#F0TmD%DM0
F!Rk&60hJiSK`iZ[@QYa6Xe2VKNM9r#*0eBM3"bZEb+Y"ZU"*85GAX`c6Gd%-G-'
C[d6lJ,BIa2D6[$N8,ZSj%81PCbM#'AMHPqH#"0iiAVh)Vdl%L)cp5@+lCY$b!5a
Pe&$%`Xf-8*M3J@q)J6%)cJ+*"5H*"HHDMKm&&$IAlA"lKi!NB2ZkU"JF9T3&ECX
L(QkQ#3Gak#rj82N'#BLE3M``8b!FR0cXP`83NB@#ir22)`2V&3&Kk@BmirKUJN*


QIm3AY8&Fr%"ETX#&U0ClU$+h*2`1S0-1Z`l5m0981@3IKdDhYbaBElH6k$"*G"J
+i2FZ!$mI!Akr&XhRVcNBaS3kkZ#`TRH"QXJ,"2QpQJeTlVbU3(kmB4hdFbY%T4h
NAlQVQJ%q0&lhA4MJLrVBHEBakLch4P)%9-Yi,8$((FR`4KlH-drJ(`*FVi"FpPM
##G*1BL9!%2m4%H5A,l+S1[UBI&0ad6-8d$[1LK*GB,J*&J+Tc`B`L9$R*l1X+,0
F8+$RVc*a*+G-E2c,6f-#pjrC8A!1%erpUdhmQf&PSZ+%5P"d'SL4[6#)S3S3`fj
[#@)!%&1+JP(R*-XN8,Si%F(Z1$YZVRj"4K*lS"T+X`(ZH+08FV-j'jUTeZE3k(h
qf%Sf1&1pV$ijk1T&!lB93G%l5S!d0[Em8Ndak"VNac[q9Rr8A,ei[aAFdXq1h)@
bXHHRCHKPVZTMcbr+N!!Mcb)6i3!8S&KKN3P")80R@+"5jdaV)1+l&9'&VQ5d*)R
lEQdZm!Uk'FZb)+C,Kj8Vfj3,4j3,4h$K2QdV4&Bh-TA8Vf)#L3iKB4Pl3e4HhI&
mV32#p4#)3!F&893)2j!!$!dm+,6(X8l'0U*-EbLfJ0*P3D9)%5i9c4jPSkR!M&I
'G[%'X58UF+CXD3"EfX%1T@-,ddpLNB,LZ((@aK3K(P08,J4cT1A@SZYTDb(DQT-
+'i%%*ZEe3ENi`9Uckq9mlSJXKRDmhB*piCRUSYVGkaVFm6EB&pjb*`0AJ(dF@ZI
(1pl@(h@!IIR`FC9K$3*+`-$S9S*+`-#SFcjJ*Fp%3%$[`lBmY8-C'P1bY%p*hU6
)a&39H4!Db!T2'U+Xa#JVPeXQFP8SYNdQ!KYpE0STe)+i0XHCE8$f$Ql%4LD`NH6
B4QbN8V"#+&$4k3NQf!1hf!')*chaAil)E'"q5V1R'H1fk3JCcVDPL+[A5Sle6Zr
J(cJ)Y$%BGbE&34J'cE9cr#+6SA#kZE6)N!"`0)`L1qXb@hfHLr659T&NmQf4('+
VqQ6HX#dZ!(V&aHi*l68i5h6CJJFG)"&8Q!dAm$f%)&Z5!fCD&AFJ9NJb)0IJ3--
RpJFiPf%4`L+%44!,&BX)&N%X([i$Zj1KL!8@0aNX4&FZiUMZPSddFQ5h+i%U!`8
*9*!!0@Sa2PI@I-Zl!Z%-Kka[KG%ee#fIHfm[[3+mCie`Ce'qC*j"2aJXYTfb*3i
kDVYfXJr8!RBS9Y#aFS-K)bZApGM-RcQ2`d(!E')B!q4MhXVYr`b6bfi2`Y5"4*m
1J-$9VP5%'[)"VC)G4q8qJL-CK0cQi@krKT63-EN,2p22RA$BpYcRY#)Bh'icRRC
#18'"EH!KGlN$2k-D,!JZlS9MD)dH0Ubi`TIjiL`#B4TSa#&3$C!!&GeKGDGr,Uk
#$30jer22b1XJl9ke44XBXKrfVcBD[hM39N#(I@L3!2KAja%@j3mi$Z+a&4)2V0k

*R19#b2Bk&p&!Pf#iE2qbCHM&,J3S-95j6K65@MNZ,B-6&&d#EN54Qee)a$!$H!e
"lMCUbfeNfF1%`Shqr#N3q#RIDa#6+GrA5@J1Z&q"bJHJEL8A(*pcZ"`Je!C-"RF
BPZPlRi11B24N'6UTZbcFJ!V"9HF@"fh9`ih`V[jmlL%-PJBDJ,KZIi#""Uriq!c
#RLXZ('Ma+`Jd"#r8p!)NST!!!$YT[V*Z6FHI6lPch%NA$R$TPr0f[HS-IQMMFFV
%#XJE3i#r*ihj6@Q&'[Yd!"Z91!QLL)PXGMG"b!#0BBNX!8kZD"C`XUq9P5dpQU2
XeZ$KI['3!1'j5+C3!LGkE8GB$#fP(i!2qjNN-TPGdf'BR15@QA9SVC0ml*!!FVP
G+A$#"ap4$YBI)X44N98HIMK*'mSm4!'&#N0j1)'+"@CmkYhXd3cF@AA19QIMkRE
6cd%J$"ZL!(5BQB3U!rDL!m%4UAk@`p-4JKh6R&G&X$Jp1jPNQTlIP*B`Xr1E4,K
BGhSp2D&T+QFdQjR+@@[0I&*Q1!Y$6qD2+PY(GfXhphNfe3BA%+4Lq$L#SU0-'KT
D$3&!RSRF)cPTR`#F`meHX1%l6-M-8aGS,%$-5NZB(Nm@C+8*XR)@aP[+BLA!iT+
&f`I+Sh8fpcrjmk[@5Craq8f[lSeC$8GA(d3iRF--8Rl-QV'DQ3"'H"G%ejYC#MT
(V$[C'3j%FfG$EmBTM0`R3[EX'22Q$R6m#&,80i%QbE$e*2rr1hB8HI-[P+iKhkb
fMNj+[D2)0krcjm3l@"C%jiJmmI&9C&ZG+"*4#!,c#SKHGmj+q36Nr%0YeNS*NF2
9C,4rUT4$Hp,k$$YU"2a6F,J`)%j!bZ%9LYb)!ND6+2KL'q)&KmlkpSR3#lXhJ#d
[ch1J$-[@8S6*3))MV+pDZrGrNeNRXYXkM5"FL"021"YBhr%ShFrTaY!S(lSEI3p
r0Y[N3lRSEbFHLqlk)SaY%SbP!(J*X4GZ#IKST%kHfN(S"a#XIS#VqA1"q8eRXjd
-m3!cRT850R`fkrHXkBLm`-@r6f2pr93%r[jrmQGA,H0#l)p@@l2%rPh%p+[%FR6
9q6XrXAa!9-6IM5MXAV*fkjdkqJpCXrm'PNHh%mZ4F,qlRQ%jIqlA@Ikl9iRPR3$
31ffjIr,lClqj#XH"b1NEJZ-i'q6X"0`0!)V1`UQJPCNeF)fk)6h!4E-9dj!!FLX
hLGdj9+Y"AILM%%['5(Kkp$I)%!c,2NX1#`ImXhHh4&mRSm%Re*L"cH5L(eJQ,q4
@Z&p63)PHrf$L)IFX+f#i5(``QB,bkX2dRXQ(aBHYlKG1I)"T9lCbB$N[B9KmQ*X
0blH--0bCD!mU&dLhp%EVri@6dUFhLD+(J#a[c!XcK(+cTXJ-"`3,rY"p)62-##8

"NThd*YdcT0KFPXP&4'lqfUXf2U!9eR5%E9#U"NJ#&`I6RZQhCS@Ui8*'h&(SP8i
BhXcqEh,BLJ[-Xp(T4bR#TNphfX&&bI`XZmiM3q+JAA63UcJS`P8@"b'VdGrJ)0G
C"c@M8Xp3Q$YXRC'Yk(CiPSr0A["BS5cC`#N-cbjb&,#!kRp!Jq!*ESB4#0,Y!bE
G-S+kMBN&[8XZ*UM#"d6AYli`N8VV44Hfr)1UD!GM4iL`BN"ba&B8VKhC'G[jRcQ
eqYT'2JEFa4Ckd5%"0I'CD,2-,B+d'PC)UjFcC&9R5l,UH&3cd*9aVpGN-Xp96HD
JM98[2DX[&h2F#5`48D-JSKS8)UUYPQa#GD[pD,-%39DY%%qM'H*Tq%,%%bG')a*
$,6#TK-V!hH+Z#Q'1erFcbDQmVUIApd6M2$%#8INLJ"#B8&U9Zf(dRM[mTAm&C0r
,+XdEd3`8dc6SCd8,0h)iV!IG&XJcGV$3"0`Q!"F(AI%d(Sm@9)@X'UJPUe")0%@
G-%`4kE105,D+#j!!E"AZhHaB#-+Y`PY$K4SMF-U&J)UD3XMVT"NUS*[)-Gj'LJN
bX4',ZQDfLX+0$9eXPh[Y4MNL``mJ6'ai$9`R(1H+RNf+3N"5a&hNDS(%53cJFi%
VCS[#`3`ZJDL2E@9a&,*4plFTEadP*N6m[@Q4P&k0&EIK8",4S54LJ"*4j83-,,a
5eD!UT#'%60GS2XI0k,1)3hXQbG))40R*"'+k`ed*9iJN9h"dBAZakLLfq!BU+lD
P0,ffG9h2jMa6k(lBB#GPfjrr`,AZU#d"m"@LqD9I9KjGC4#mrrhJ5frS,hcM"&"
ajb`QGbqGGh#&c!S'jc,$'L"D!T0P,ehR9qKm22C5!UmqQjG#j01J*)ScJ(QQaB!
Ea"m,Sd4ccUZq(hlTMBjY@!4IfTafJCST8P9EN!!U%RJ,(I0'-(NCIriNMA!cZA-
)([*TG!+EZ)H$e2a4+$afpEN(XUILmqMFeL%RUaD2RcXmm4!'(F'I8TYXrbDka#8
(%`SkA%@ikNML28!aQbHiQmGhi8Ur$S,M1N*DT3KmRI3ff-[3cFYZI`!313SXl*r
MB5"[(,X-"(K3E1iVjeqE6Zb(Jf[2iZ&MMBRY2SEZU80P,bSmGi'PZ62$c-b`-!q
$Z`)GK)k*-TGkEp"N+"YcVqd*3@,30TYSF!1libD'-,`*3Xe#YU"SBZ(j63ebp8%
[#'Mc"9h`LXjeD`8[([T%&m5S90Y*X)GCYE#ScA3ac!rl-`m4mRCr*c2*4JmL3ZR
Sda5'm3#22Z"El2bRZK@'dF1QY-Q4#db1YjJF5CmX"p)Q'kG2PSGD6$EF'804"Za
Y-F"XFIQlDCI(,h"jDB[*mI6,Z42iNrZYlr#MQ0)Bd9pD@Ea+kmL%e9dH)@[iLCB


eSS[G3Y,)4H%8i3QibJp@,`iIV&j5V96,MNbiSfQ3!*!!283d-pK33b4P$jS`15)
8(a0XS+kP-`iYNFVM#D8MC0%K+m(jL4pcPl64$CmAa!P))9-4#T9(heH&#1!ZbPQ
9!+B)(dpJH$XAE+I150#jI(ecY#$8bFS"S@5SDpmcdKa(m8N3632q[jMr%q(k`K9
&%E%3UL[$%+S35U(cll3J9IP!cS!i&0@hNNQXHdIJUQT`GqC%&ST(0EB#%Ba,I&(
+I-F[1SElDPI*pB*-[HHE9`M@d'ZeemN2E"j5[4k3!)8'%G(@1bfD8+GGH*@k*%A
M%851kCp"df6EVMPd9$q$`U!3EZa%baHTBQ[$Ah9V$D,"G'mE0`3)6[(i(EBFE89
&NqBNZIdJqc%'aq&FpY,QLCa@j#B-%pYp0r3-bBXLQD5'Ua*l@E"L-(Gi$%&UYQc
J#Z1cQ5K%ddI1Xhej8fXPYC1QBUkJm6466JUTh,FM[F($KNJ%kB`E(Fp$Q!HiDhQ
aT@rX*1"#IT("hm`-2T3qQ)QBNNTbKXEaaUKSQ1Bph*hmIbaqCHRp+ZP3rSN$!'G
#DDdlbSj@dF1#a+#1`6N!QeS@X#,q`34US!bXqHP)YRM8#Vp6NPd9M1#TAVd6TcP
U#-%dM9CKbRbKhq311p"eaj396MGIShjm8rjUSrYR$eV'*FIa2QGe0JHRFp8fcee
eAh)iUpfj,+$LVUX2j86K*PV52cG#5j1EX,5-%hM05cZ@F9S1B@QRTBAP%#hG@&U
dc',TTQ84bb`Y#eJ@DGQ%CB'@P9JfdE)+bdTDjV#XSZ8#PMPDVQ+j3-XT,&GTkF&
bLTDc@(TS1BrP,#h(iE,Qc`DTS*(m6c8EA+KqD%'Dq"2((c[q$1'2C3A28Z!TBU5
[lLZ#NHl[+!6rbf`@q#F3VZXLakdileHFbh55a%9-Z-VXR$bT'dL)35FM$e)#T,[
q!"9!(8PrS+[pbqF@Mj2Dhi8rfeRYFc28@iI2,Yk3!#f+6ZGq1[)fEi)ISBS2kT2
rp8[([R,kC0m5EkQ#L`YfSBV(S**h*F,N8Q"30lX@LSN-falHTE%LpMAJTB8!DY1
&TYN5&ji'N4j#XliDS6'I1bH+!6amR%b8!C8Z[k[1rBXr6M*dALYNKfRBfq-%,&3
iq)L+Pe'FlQdQ2LT'6e(RQK@$I&`&"j&Vr[e`aFZ*F6Vq3hk-*[md,QdAPqkD%q3
NGki2KrH-NL!KJf#lVLb8C0Ym3VTRP3,B)mY*G*!!9$R2EU0p1K(UFC!!!TRDlkk
&!k#5`#`@@#"!Vd1`-r#UBM2MqH"89B&l5YQfiD,rVK#c%)S+i4l0LHk$I$(A,H8
eLmU2eEj'8#4PcEV3F1)MDJR1[GZm56V35&0d1d@LZ!jc-P@F)q*,9ZaJ&i3@6U,


F2ETp6R3&R46GMb!%A,2P6MDqS6TrPd@QY9$N,XCU%)*K4fGdH80KX-2F3((emT!
!MX(&!af$5qc+h'VeDMjVPMX-DUlf95kV0ZY*"iF8E5Dk`TZb3RTL+4[YBm@"C0S
S93TGA45(jN'F2I5m9,q0Be!3PS[$T"L`SZC3UcA)#@'4bl5pKF2V8A*ijHTjl[a
5ACUBC@J4lVF`N[GB2Hi2#(!Z$d)#lKA9LqV"kQ0LJ)d'Y#6im3q-6#UGPkY&*FL
qQVR#*',"YH(Rk)[S-ENd9JlhiB!9fY*IGllVYTjKjD)NL+flFNQ(*m109!9'G&%
3pY',Iq(,SGELZPTM%!kQU+(jrR)fadepDKCkPYQPU3mK-j1EU&BC`(X`L8('LEX
r[LXMq)0`cSq4F(!NLALcj',&aQ@L`kJUEXja@1MH!-0!@IPMr*-!-,GUhaUDY)*
*UG-Q-5$-NbkR69V"T0C'mqN(S8K)&,VDN4JhCfiaJC%iFe4d4BN-"lp,$G*r%GN
0IM41+[qPAkGhb#5k2G8Cq4mY'GQQ-c+fQ8%&BQ5E`XK`1L0MjfM!@Bb-I8L-"%J
9@a+-M%ePVSKR'-QK-%0Rj$2pGHECM)c9%#-0(A48HeSb8[eYKT&Y#QJMJQ'G'@C
'RK(-0%pMCKaQ11TQ%jM+2mRrNkPP#5Sf%2*Y"A2-L4aqNX5SH!--`,[FNP(rFHi
r[m+-kKY+Be3FM-)r!8E6D[KD6%eHB#UCa6GfT%fYSDNU6E8V8q1R6B9+T+RYD92
Y2&9ZTDQYbY5D#d`p4P-2TdeYTDQM0(9)Q@Srfb!a9@bh+@hU%+CHSSNPAhhLIk8
MVr5P65c"a")!m$hL(br*'(0%0qB+hCMCK$k4EXba0M,QYTE',$Skb41`Ci8b(8J
+'(#$CJPc!2M6HXMakA)3Tjr!&VJj&"C$cZl%j'JP!i3I1dkJc$)6b4mV9CT-3b"
kBpiDJ%IFR9A%E)BX)cJHDMI(VbE3Q2lBU`5-$GNXd9ca-QY#e2a3k6SdYTRBPaH
*f1rMIkK,YJ-3$RKfcb9,ZA&ATM6ZGU-Sr+h&iHCE[JrKa+!H[1Ac,)GQHb(NJif
KYHdH4iXUdqLHr5b%2(I&b!i1RYh&QeTbiQj$qEI[X[-K%jedCHrLXaM8,`BeS&R
QZNkK5e9d`N+Efii'6F4VFPKUq!UD#![m3Qq8%236iBFI4e!,AG49XD,`,R2PXMa
`8BjR5(IpPCRq#Mp6JU6RbmNKap!,&6(F`*f@iH%RU1N-d*!!5C6K!B8*8[k@f#$
PHi#mb+d2*[ab&Ni[P0J1$$CSDT`RIV++!bM+F5DZlrM(eqQaSErqa`rSY5BDkM6
T1,eU6AZe$YI-YXMDE)YX66&Sc8P-hDIT3F@8q'HH!1P)11X(p[phELa3jk`ml6-
8U)YB5G%e'X-flNcR29cN(1V%AS0"h*8XB1-jr*X9(0M$TIZAdcYjik&eAh2HVQY

pUTdlhiRGC[qAFqCc,cR3lE)dq38++F0j%J&0iI4NT)2Tr-mVFI%A[$i0D)mj3JN
Tkdcq*e8Z2)$YTDle3J03-5ArXhYFL$#4B)0jp(i'!#3TH$%GaCbNAdhE)Na"fNq
lL$YM0849"Q5!%"XjV*JSF))#a34NV-#iba'ZiX+8EE@&Lp-lq!)!!#'"384$8J-
!@r8293YXU3$CE)[rlLlVZUc0RYV8(P,VjlTm,U9d'BENGK`QpfYYBGhfYXeZP8h
5BhBLlPC$CBmA1Bf(ZDbh,@a+JbfY8*8B!NcNH3X@SiK1NY0FL+GA1`iDK'SDJlN
SjAR,-!k$[D6DprIrIprZYp[ZSMecjR5Hpmcc"aTX*5e#!#4"%#4")-pDaHc3%'l
LMcHS)XA-+V&i4CK@ZD+H92m)V`qRh"HArXRc6%IHdL,&hCDhjlRVVU9&qV5V@J5
RAK2L"b-YLjDHaU8-Ph1iQ(%jL8XeK,FEV@ejDep(8B*4FEYUPNkjrMBdp')e1JH
[$3dphIXY9&`Zr41b,!%LKCkrJdL@NdL@"C(AF@R'T4kAqEM-`f@1MdKERA!l#4h
VJe#K61Jc4UM%5DM%JY!+A1T`fBA,EP`DF@Rb)j6P*25l2JKpaJJY@V!mN!$5DaB
XYq@RK9MQ+L-5%+UqlPU`[#0[`BYBA[5[4m8iZT%JrIKI1r+@4$#CTCU-`0%J*N[
m*jI-YCaX`f*[cB)A(h@*E[jMDC!!IZMi%204Xb9%$hqaC#jrX@!jUZLMF,@,+Yb
-Ie(qSXVd&+mD$E55S$hIda@qZ'!jFprXUPN5SFrI9-1*S2DjC#lrC%F(%cq4)YG
S3@4@Ga[pN!#(3iaNY6##a#JrJLfTL-KX1RC+k#(PGQf"IN)%849Sp!3,rb%GmlV
d4j`9J6T%I@Kk`LQ1k*'bb#bUf1Qc1#jXdCRC31c8Z$X8##T"S"r53kKqb&&AK&)
A%F95$[23pQKJSN`BIme3&T!!Sa`44e-flJi'J[&31PBfT!I6ej!!SH1ZXU'Km(@
!,"!FUAA6GMS#`90$k34$4q+i(+a5JN6Bi54XX3RCQ[-+A)l-"L"1eCkqMHKM86m
Q`),*$A`i#-(N@893"[K[)eY-PCCBV)9j`Z&$6*Y*f4fHi!Ha5iSJpb1c+-JC5NX
J%@[j@(Xp8ZX6M%0`"adk`86,)4Eb#HV"r!VD%2@''h+%-PVq3&8`LN[RLb!Z581
6B&$8U#bR$$6+'HLkL500V9*FB-JKIS3FbM$a31[3N!"l#3)T!dH&q))1k-Rfcb4
N+LSR+5%$b8Sh`M'Jd('SZXd9G9AbX*TH4Z(J#CDKBMSHBSZU!,aZ`19CA$ELXYc
e%Qj$Z$`RSpZ5)`j6eZJHij0!HF%4&11"$'iaYV&H!'dE@K+dP%L`4D[m&kQ$#j@


69%a,PIX19(dNP*-)Q2@"I[-iQM48JF6(r`R(GTI@T-c"bUT!JE[da+Kjb"KY@B)
0AL+5kDP6ihV3(JeN$Z15cTa#4IqT',*f(6q1-p$pPq@%Zh`"C+c3AN4QdA4T9C5
V#!MSj!82"!3Np!0G50k"8qBKUQaY@ckd+Q+0ZeVbkA2'1T&Xb6F204F#I"fLcS$
(S6be(4q(YlD'd[%bJ6"rLVe)kGG&X$R,`j1k3qr!4,)jhi0%@ajdKc`)6IfTX!K
R6"cJM(i!"A''MM#Q*4J8Dk%33UX1Me-5G!CHh%9"4JRBAB93!jJNjSBGUS!k3jN
B$V*%bcCcDTJP@#'1X3)`(MCM9*!!kITh&jTHkKEj#)#e*AP!P@X"P@-!j3e(L!9
4L!@45"X44+ZF366'JiJc5%q3!,+BXbKHh+%a"Pqe2a*BiKf40RG1)00Z%YQjrkd
VZGek)KM28!"f"HqSZP)92q#GeLIec0ekmiHh"4GhTNG4KCcb2Pl3C)pk0RVEpQf
jF`NDKiS6%q'8IYJlile9G%hPFLD#cFP"SJhZL(U#r@$8TdAjQlC5Hi@liYjDICd
k!lKMLKcJFHjBGHGe9#lp@ZMNf!iiTQ6S5&fK1bTk+q$B*!Uj$$VfkGCp5d@rZqU
%&bkJBMHmARD[HbUAXd+`rj5Y!3j9ZD[ZcE*dL!!NfLKUpP"BjTka'Uf+HqBicj!
!PV+f[,dfa4UCaFF6!"Z#p$&MM9Lp0Up9XG'#h-rZFiP[J$Q1KJYB"RGKHPCVNYX
4kD&&%CP-T!p#RqlKK$lGidmS)T1LX$C%6Y[N"'1Xqd&3h-##E[GFeV34-aJRp[S
V&1fhh#5mqe%YQBL*(JMPQ$-Sm-p'-#BjS+1iG#5I3)Ulq)14b1cqDCkSF((JNX$
&L%XFPbjFVL&!18L4r[jT`#a(+I%jNUV0lN5iG`SGPhjFFR$*CKf46X'5KQ,P`ZC
aaR$'F*!!E[HLqLj2bVCSkBEV08Xhe(FT&qXCb"1I-8iLQ$1jUd9-6pl0%YNkmrB
SUVp#peMeNb+QQ*03D2"-G5`I'Ql,khN2(AAkF"ZYQ"U6TmENUEbpclMq"N$Q0#8
`'IL*d%Yj'9[1P%@Q%8$*pJ'%4[fP638*#`#G*P#GNN0C6LSk+1jfSdPP@p"L,CV
Y#`"V(d`Jq)G0"`XMkH96+U)1QDMM54,95(S*JG(D%Z!J6iZ9&KE0pJ8ZSYKA!jD
3!,ebSSa2jGSdd#3KJd-*fha"AE!#bi8bdD-FG1FNRkr58m4Z#23h@[rek0!31`J
(rS[l2NJIJ('mE`5'Mq0,@-5mU"Y"J1DVaB&XkVEJ`k&e,9iYpJ6ekE5#jLd95(#
h[j2PTQ2c"LlCXP3BMG2Tf2YIkflr"%)U@UkD"EZT8r*X,clcD,RSjNd(G9#Sif'
+J@`k*+MEXq!jeZf4Y'i2G9d-X6l,S)kl,-1D8#kCC#Ll95MREJUPEY0Vfb&DE)P

SDA"!L-Em%5(T6XV+E2m*VB6j[0U+"i5VTMl$-qTAY8#@4+2+@'ZL1jb8A`bM5Y1
G(UA#'iC`"TfG&c8!R3TdK%0MBN!#T$1cPZ*1B5d)HbMmC!,cq`Up*dP`f#6"-II
&qQpj@M@`)9'2iikbcBNbB+@Q[Tm&rl)CCj!!N@2DJKm88jHirP[B`2+f2!LVQER
&SCe!&KJSQT%#hS`BH6-bLUNcr,MIh`CL+Bh%Ve40$JNci-k"cJJ6[YK-`MUj1N-
6j6XJ2QSKAY$b-5NEm59+R"8+U4Dp2@1+K*,f*r&fR5RaqacqiMP4NqkAqB[rhab
6iT+&H,0*9iVmaFqi6#*2@SM[0LAHYFeIr&YPTX6M&Uld*db+9eQ)ccIT5Uqrq!1
55A',c(bJbH5QC2Q,pjMl%%qdjHhHJ#C[#E(!hDZT)I)YZ6eT-V4fq41iIBl*$,h
K,kjhQh6HBY2eE5E&MIlL$eDEG+A4Ap`V6'lk#J[aAT2LVrZ,2hV0C,$8@iJAQa6
IibpZ6*YdjE5&q*K*m9CrmIhj+2iDQfNSDR$9l&h-K5l8-H"4CSU*I$8MrG9m)1c
a!4-3"#"(`%3,P'i)4+A+!3BX1AJcGl'%-qLpmeMe*Q0krcP(R`DLIM9`4K8'K!L
9"+M-3$FUNlY'$4*2#1TUTfrJ9FaSlLD`a'K(1(Z#FAFkpQi*`'L`8&iC+B0TbDR
FSPPE9D4L4qPYa3a)mVN`Rc9Ec-A1HQUfD+01T15'PKUZDDh+3!0UqTeU(!$QV5T
JhJTJhSS+N!"f6Qq2hPD1l""kd"DP,KdM0mE!E`$h!,eLReDLb9mI81,6pRSkM$+
CMThr,$k05AiBKrS`HJH!c+#ae&HCdFkaZ-Ua1"b,$a,(fR9q"SPM0e51hB"M0`D
*Be'9Be%i&KdNMT@T(#Z$Bf@$a,'M+XH1`V'MJm3aXmSa-a`c$a,(UP@19F1akN(
L@+[+X9BieMT)((1T((2"-GFJF5bYFL`0ap+$a,')bV%)()X-%XHU9)j9`E'U3H+
B8H@B%BiC"iPMee51AB0Me`D*BpdUalVK@2FJFHbdbV(6F1cd)((XR-UaFh$Xh#"
a6&)j*X%aDC!!1(C5jGK*1(CbN!!iGPEPf&NiGRD3!$JfUA*X%Sj0$K,(CP51cF#
aQ8(L@*(+X5)i9M4)("Y416B#adEqIcMQ2F'UU6CiVBqH%+2Xaecf)bQ56je!BD$
$[8!N-5!hEqq2(k@LTdXJrBLk`)993,$UM1XVXEc)D1A&Lhi+*e3)iS"i$UTp%lQ
I+8ND(*!!qh8mZEhU&LU+[PGNkmGadr8'Va[$Ad1'#Qr06V8DG3'0bSPPEARIr,U
p%qd%A4!-EPT`BP9EhPhrm53%SCCf9maId2a3mdFLH8Y#$i[N25Kmf,G,4`(Me1G


k6C0J!JjrJDDd8b#I+F,JaGd1(JK-B"NAk01"bEDmEamclF#G14U"1frdjF#G6JI
[b1l,J6Z-KKfiK',4aK@EhUK,mb!S23R"QEDmAfCY@M#1SYBl[ZX[k"I85IT49q@
e8YKD&1VTp!U,8i%-Vl3eA"MB"p)4JdK("Sc8D"#TFD")GkibK(6RUJ%ME65)Y((
!5,FB4,TP`%MR'83kEm")$3E6cJ%(dmibJdM,"ScdT%'N*`H-0+dKEIrbjY8QATi
fm6*Mq18p[5CHHJfrh,AGa-YZ`brrVGl%5a-,[eYLiQA%m-[l9jKiZGfAJ6!q!P-
UP)8S9SVKNX%PKD'bMRZXAB,8#QAeQr93'V!piUHqmN!LES9khCL5p#Q`2*!!m$l
X"8Zr2cD4C%SX6D`JBKeABT',)BDCQQi6J)d#U2(%,Xk5dMe6[A&!E5G'Vrma"`S
eXDrH4+&kCMp8D`30Sh1N[A%)K,RbXaP&VIM(8C-C&IDC*N8'-U#K8T63#L8Za+R
JB9+j,U$8&@PiGDYR)`SF(-C*Aj!!bN(VAi53!230AqF+Hf4f4S&EqV5rbSmLGP6
FiX8!d1%$V"J&+Qj3A39ip44[9-*4VP+hSq,X0BLYJYLU1!kU"k%Q0-Q-XSaKNmH
`)*X0Bq+&1@PDTM)Jd+XTe%'9+K%3X5dAJ35$V1#m[d1N#JQ64"PXCLVhYliAc9K
iQa!d`(S9C63+NhBcmRZm(BA&qZ0U`9[13Pec(8)L!5FlFLYjSG-r4N%d`ibp0-S
[BGL&AP2'ZFc96#(e&qGi0J*e%bPBF9%A'RXXE')L%4c1Q2klkY8k'N6*L6#P,(i
!(p)))lh0Kj!!%rQU%X2$Y[N1'5BLfpL5CL,#KEp#L+I&q'8FC6Qf6,e9+qLiCe0
Ybd@#!MbGE+-"C5jQ$'IB#k+&Y,R1cGQ@Md@9pp$JLeiYSF56lLSNP,pMD4f@&XX
*SiiPM(Z(LVf8B(CKDS[mDTImDJY20*LDid`f'!)q0-F[iG6j%Jk'Pka8@T&drXS
b[i3'VI$XK%2,b+50[-dPI#X9Pe2"EEfF`2L@rc[%j#d'JQ@d6&[#XQBLhSV%8[[
DCjk0E-KjAdP[2Npk81Q-+3qal"R$SJSSf)jjaYa(!SQ,"iEQdC!!2#eC`C!!6`a
*2k1hIV9mU"H*20@hBQBR$EG'SQA!IBNkS4&JVjk+#qUfG!RA14`)#Cb5&2eJ!C!
!Eh40B$,H`CJ)*Id5*(dN64l5806*8*(N9fpk$hLYUS&'G5U6!Jk`LP&pdMaNLlT
c2"X98Pm8k&MC4ka'&j5+m`-Cqf8-j[cb(D(EcH-`24E63lDSdGi-KRV,D8U'AD(
99fh(ePcGIa"+)4PRm5k8b$`[NCTbPmC)9l'`1-M#CD9cHU9c'U(5j@1[+f9N@TL
XmS@*ERr3MF2C(h`B60d1"EF-1N'6e18ce!f5@68b#FQNakFk-j&NUM03DcGfQ-H

KR"RV$+hqa(CNc5Il$q!i$h'aVU6lQ(bF&CfDibZBi`IBFHUFdhA1D4bRdhHF1KQ
CGT`9UXEL)"S$(!@Ud5N-F)3b)8bZCE`(k8L'$N4UQ5hAZS95DUPmq8$#8[Q56F%
G9F2P9,jm)0'RmU92QAXA+F`48cE1C3UT3561B4KlXTR*&-FZ'V,$c(djKqii&HP
FF4H-@J9CF"S9'qYDXd4DRQ14d1T864`E9N@$(G$!*rAF"fm93Ib!qU$qH#"Qbff
RS0Q0"LZ)4P#h&hVkrFPSUV*2Qq&%bV$kT8ma8&2QeQfEIa4i)NkSS8aUcr,dacP
U4eqSMBAlIdeZbUl%E)@qSm"C"`h2L+0U!%G+`'"GEX5kZF3c&SHTSl!M6XI8AXB
He9mV4K*qK,rd@jMajNGqaTCZi!)mFa*N,SkCEL$RN6PMkIk,)fLNHFB-Zf`m-q`
9N3E+#UL,ldjl+I'$B4arj@[24S[-f-8c3kf!1c"#RS%5NJHVN!$K)CQ3!,dpSFK
a6ZL9V85)('2Xh#!KPLA*GXUf1S'06`kiElG`aF!@IMFb`)8P!e[iEpd$A&JrX)@
l"NK`e`!ciKl[!"If$QcKcCN",M`p`)@V"lC`CrV*,U4"!$RG!2k6[SC4(TJJK08
ic4['8cSDU9%pY#hU"!YGZN0Z&SHGRD9KCfI*B"G+8AHK3JDl8*0bTifDZKQp&G@
GVDV1`KID3#P@19b+3C,VD2%IG@f3!'4AL!DQS$[`04"riDUjRiEe0()9,qUJ'+G
pB-P[dF'Recj&pBI4[2pfL@+&k#kRk#iZ'RG(DTRc$SDZQBZLL@fPJcecPJ'jcLE
fYdXd)Zb$$H#5PGrLJ9&034Q)GK60`J5U"ZMNb&[#A5E90NFIfI1'PMhad1TD@p@
D@S#JShU`cdaULQ[CdF5bSj9PdKlRp"lR0$)TlXZN2A,(9-ZN*[p-FS)Z1FL'E$5
DQA!'R4h@9%CfmiVhE9'@M64Bj!!bNJmB@DN'!"R3XPZHfYd(d,,E!QKa,QFN$[J
",9mi"k$*JeB4"LAY``"GdPA+T$S-&"i'drjK%,G#G*G6G"FAeDHKU*pNJ4$d"8,
FHX!r%0DE#J6&2a$@$c!3NR'%`5@%JC&YlJ',c@9Kl,Hj#VQThYceKMGA#bhGpU"
&F-R9*j2BRLCeD,%0fk-1+dbT#HlK5DH[N!!#'A5Jh"@"IYfQ!,!2NpNikYl*46P
rT%&p$X9f(i(q##c&TU!)D&pPLjdem6Rr03`#Q5(mV`f!(Ld!%M5!P!d&PJIA9[T
#3-lqV5e2qE+I!I-e5cI5!)bK"-bQBZJ*(`6K'hk"!4IApZjPYhhXeX4ZGl,E(Hc
f5hCVC,G[XpYGl2C0h1EXhFPZGHbfPYe@XpXDGPZ"@hVI3qb@C,I(f5h&EZ[CM5R


eNX-Be(5&+M04HFQ'H+X(&k)"0j-!KZC-S"[9Sm1`idiV1KV*IC@S$JL'8bhhkID
TI(X&kq*8H1jLhC3*EE!9'j61$cf($c[(Ca5IAIa69LiZp`F0e!1QKVjN!kCJVX4
98lH5Ge`TiIKh-GHD@30D&ljBZB%CUPfK0D83l[82aV9QPX4ZGJS2DiQ0K"r*@mX
#jEq8X5S!KaD8Dme%LJ+'!![RJ[QD%cM'36Bmjd[Im"aI9jY%LfCpR6)1p$"6hDc
$KieL$9CVN@k(-B@86@0bC@LUh9il#S-cHM*aTfIB0kLQY8J$!["MQdm4RC+[2JQ
([(i%$A@NTaj64eTAE(*#M@kU%peRTrD'h+NpJdjYHG`QEh$8ek&&SD#*lL`0SUB
$(iBahZY5IDdfd3(9I6SS#ZPV23I*,66q90Q5E9p8RkpIV-qRiY"&FeKaD$l%mZq
p@4Bl4lIJ$NcfdN"B[DDqGbUr"6r$B4l'(A-L$,N&fLbJc5+dp6kd@IjS)bFaZ8a
'ZibKAECJ&AGdlTb!SVNI-B-BKUM0R8FrAqKe[MK(&G5X%`r$%Q6NJBZI%KdBL!K
(M-``6l35@lAFj4Z)',[Ta8-L'*Qe9CMGReDD(pdHVGRVA(iZ-X[-6Ra14L9Sf!!
KkaZ9,8P$'Q&@BdL0LN`C`&b%2i+MIJMLjN`PX[5l56+L'ML6!"0BRE3,MbR%[p-
3%c1LUJG[)ThMq*rLH8qQi+m`9C6#Mj3RL"r2fhkQMpXrG%FpZl@#'0@#&&[`2&[
`2&Z3!2*I3'cZ`@Ta4RKaka%+%PajjA`aN6YI+*JU&aISF'#!U2C36JMCm-H"D[-
i#YrldH"3`3N@)QJ2BZ!rIC`*&`$!I')U(i24BpYPFaY)C!S#1+MJ!`d+'3caiX%
)#UV+br'!Jk"BjdPS#"L*lTPC-J%0jZIR!&"l8Ia`4NN#c46!ADA2j66ibp+PEj!
!5rTkFXM2N@c0%HIKK$b-@`if%#FQSEJRX)QMkXb9cA0XJ5&AbYEe-'8FKCQ'EXV
`QeQ'Ha,ITdG$2%m)Q$!HE)!-[U#&`CSNV([[MNf)fdAb3dc5DlDTRGL`d1%S6'"
F5#EdmI3cA%M3`b#5a'aNGfX9i@CQ5c`C!2k+4b%R2!iIfA5#,f96$YQ4K*db"*Y
T@b,)M%##*`2CZ-S*-Y1L$G@-P,PK8+#'M-6%DDYS+DSr4lAPC5)RNCE9'9c@1$D
2QfDJm18)if&89#(cY'eUMa`ZR@5Eji#4D4Ma)"-,E-Md5l3K*h9XL#)kbARR0U4
&8N1Be[Q(,E4QI5bNEHH4#Cm)EHAhUj+*&M6FC,E"PfJejjJCeHLEP+h6cX`1SK&
R@6bHS9$f-0$PK9UHHCiTCdE(N!#`*HG2-VEI,aZK5INCm1!Q0Yjb(N)A55hS)V0
D5!3X3kC"Bb![#,lYP!!fVaBpRKk0K-Y"'aNBp9XkSmlN4*8+c3AY"ea+BDY0)dU

b$qHf1B-NZmmJZD!+NQ`RqBr%8`L8X(JU$EB("Tp0bpaRif*'&5iDi[4NRkLl9+J
66Y393"a+MfV'Mc5Nc'!1K9!"@&c#pT&)P#GF&DkYRRR%9V5$p1"K!b"j6GX!6Xi
cURB!!k($)Zi0%jL'aV'4%P`JZdpQJ1b0(5dEIfIFR-!'VkY,"JV8)M"2%hX(Md[
aM+Sb!mCqZS*b52@S@8FJiCINFA!ZjS#9hl2U)!(Cm6Ip'aPbp@!cEC5&i(YJSXB
b1J*XmcS4KQklflF&GYS#-Ql#AKq1ES[qiSeN`FMaNDSA+Y)&[KIPcb86YLTlK5&
@"L)1(iQclr%I,`L0[6%RVM#QPA%I`im'pZ1SQVP0B,YBdJ&EHfX6E!e$rJjfiQ2
lqE1acJUBGN')k'mE01kbVqRmPI2kff$m%-[Pc3%FmF#d0$kVmAN@i0NC&2ldS"$
a$*UD(QC!k`3"qKEZH6IYAY0jJ)eR8,M8Sb9jQJD!(d4Sa9RaBS)ClLPMM`G#B(B
Lj"#F0cB4R!m"`E8R&CVGkXNAR1b-![DdLC!!25f`'AiKkar%GKE%%m(r-EBirX&
MB)Zdi#D%FP`1jH@8f@#*Ca"+TCLi5f16B"Npq9C8b5R[P[L#`qHkaqJq(p$$Em-
afHM,5'0F'`UEe#GY-,$3DBA3"5q&dr4M#LJ+jfcrlI3%QbV5hk"AB181'-'@AI(
S2KEFK3hhCm))l43,ce+%CcF"2[Kd8hK1U-*6RrjU+`Uj[Dl$IX`mj8-N"f'(C4#
U-TF$DX&Y4qa4ld1UX"cM$,1I-@Jpa9KVN9q3!*(4*VF'dXB&!lPDT[*4@Xm!m*E
,$&!$B"C`D'"DaiV),!b%9&'f`93)C5BaHQB-$Nbk@`f3!)!S3hl36%E2$)*LlfN
"KmcPc@fYLXdje#c9bC!!JMlQLN",F5%XRP%63$E,!$XCfbU6Ul900T`b%d$QP21
`e4SH!Y,2L3Y(ak2rK!,9jBmiaTRTUh'B[XUi,iRRmI#Q4kp,Qd[)-%cL%NY@'Id
5(ZEdZAiV!RZY111p*#jmBH8[qG&JkT0qTPk!+93GaS5d$TZYNAIBf!-J6SJF!$c
k,ijUS!iCh3*4E#G!,jNS%PI+f8P4,)jBVMULFi'i`c`1-#+l6-J"!&EdMYMhNG!
4A,%Gd8#ePLf(4D")frL!61D`m,M3a2C$KD(mE%Vq[(!fbEF2!!@QmM'&J$Vc95@
&1**eH6kk(j5`e9QDc[#I-LZ5d'Rq"6SG%p39J-Na0(d`)&A)f%iLN!$Gae%BJ,M
rK1MhC4NH9[&j1+5%S63'8"&'jA"MB6$$+VjZe`cqXBiAa2!i-9Ca&1C,f)8a@ZU
@*9JedqFN#,DGM(e)MkHK"9p9fU,Tc"Zk*cEe18*Y3fkaR'Q%2$%4&MN!CF2LEE2


q9[5fCmbKH,+eUMMUVJSN2kK+E,9AH6BLmC6V)CI8)RP$jh,Z@I!I86ed[cAkiE&
SI0hU@SKQke[prf(CLV,ELdYhdHX-QpKS$Rf0"m3&-N"DkYR)(X!$4pV)J%c6G4F
U!kJcpJ5+`A1k*Yh)!PBNK3hlBi2ja6pI2MAmjQA&[@qVqGNr&pi()pd!bNETm#r
9'PhD5hHp309IS08FUlcX!5XF'MlCl5imH80aIqIi(iql#e%pB(q3!&9jT$1Ak%0
h,f82[m-2[4$Qm0I$d&8f'GbQ6SG-!*h&b@m@m3lEHP*931-!0Iq)&8Sh`IYZa6#
!**+1!j@C`8HRN@e8S,pHiGRQq0k2N!#ml-Tm*T6N+Jli$1)6J`J89MR3I`hLr@A
$aBA'k8qh6"6J1+8`50KM(UmXK8Nl!QQC8CQAdNd9jP"PBE4+3A*4VZ0K)V(+3ZT
)R-cF9q8D6RZ0dqp[95rB@i8&Pk-9aZMqLZjKQ2aKbS#1EUhc5D&(AD1DM$QcR4k
l0*3qbkZPU2+$UL#TfQAc0L1UAFcMVeDb#KBfhG+F&%l4Fr*,aqYi5!-DRR%'(SY
d$TrJ&68GVDMQ#NeGTJk`eL%-Kdi"FI1LcA9JU1-8m%!DiZ6GQ%B93#F(*'$+'"m
SrT0'8!&ZML&4eD8,+(LHY5*iPP%PeHDk8q01"1Id%"'L4e-4LfG9@9C86)!3Uj+
T@IXLEdl#"9UA!5"4&'T3PhQ(P`ZDf@1UqNE#PV*TSI1P!+(m&M,$R&3T+&qd4Si
5AEX'VV8XA3``DE9$$`C5-$Kj$CGiZSX-8S,er&5XBiaSA6VK,MhTF%lTBTfb$QB
TajhQA,Xj%k$#'c@6'+RhCa,Y"#Tp!U3L4UaMj#-4a!1%RL2RmEGGqULN4$U*bc[
5Ikrlj$HrD8fm*pdLYEce%qR!(#R[N!"0qR&Milj22jEq6f1MG1lmZpEcKE8Y(kj
erZeFUrUlHHhUPSqPYNmHqHFPfTpdPr5G(hemr-GMEEVdcU%hT-$pap['m`l95cm
kp0DKGhmXE5iY,0hqp#*TT,"d'I[rmM,ehm,P1elj@(VPd1m2IA$PkV)edX,jdV[
&KaCGZ5SGr,2d`rR5qDrCVpDYdLI(TAFDIR-eUhle$aH[UChhmZ,5imG+Abje(@c
VSHGGG46qX+0DqS-dq9MrY38PU@APck9ET3dleajD['+9p1fV8X26E4IS!$qA!Jr
rbmqP[bb8MKhkrFqPh)95GE(8)Gfd82*m,6hFpT!!p26$9pXZcQQlMX")5PNPAdS
,hpZ`3ITmAZQmV"r1HAraLS8V2PkbH2Zq$aEm,PqDbC@QYeepGGr,#kA[II$"6ej
r3rV`VCqmGRA1STp+eXCpqk5&4dU[I2$HqGVD`[0(2V(QrZ`6DprrhZel[Z()NAH
Pllcbf,F!reUbN!-Nr1(HmVqPAlrFpX613hrkXR$*cMHN"ZP8@p(h&V9m18pD++@

PIhK0+PiQr8hkD28bUFcD8*KlT,!LkdMTmIa2VY4,IpMmdrHN`jZ[p%TrH$GADQf
8T*F[pdTc$PQIPMa5mk(0dVf,RelkHqR2KfEHNQllTI6hV!qNYJETRqGGNHlZPIk
P@ITrGDqmMp0A[Gr3F1cbFFQ@$`#3!aJ!!$5S!!"I5!#3!`J!N!-J!!!r2!!(UI!
!N!-+@-!!5S!!!%U!!*!$'Qi!N!-"GJ"1F8U$CL*"l3!J)$`r2!!!)MbTm!!"5N&
Q"%T!C`T)3%K"))!K33!%3UG"q[r1d2`"!#m),c`!!"PZ,`0K!!+X9)pR3%)i#Pj
#Tbmm4%&836mm"0@S(h!"%F!+ANUICaK1F6!mUA#R4N2k!#SLL%(k!#!`2+P`TNG
+JfF%F!&1G8lY!#*1F8U$CJ+Tp(!!6R9J"J#3"3&1F4mkrrC+(fB551IJi%(krqT
3d%kk"Dj-h`F(,cVrhNjeB(*"6%&%4%008!!$!*!d8(*"E8MRB2"d8*r#,dJ!)#"
2)P3aD3!8!"JK3!!N-A`!!3!XdT%K33!ZS!,I`NcI$`C1G8Si#PjR$#!U!!KR$#"
!)""R"Lmkri41G8MR(`C"q[qHF!`L+J!%`VJ$'Q'NCJ!"2NKkrij1ZJGZ@%q`H[p
DCJ!"$U%D,JJ)+J"!!!4R"L"i!UDJ'b`U!!3U+J!)'#S!"*I8PG3J1[p@S4ir1!)
JCJ!!l&42,%JJ1[p%)JE#Z!-D@%&K!2p-)$Vr2-#i!aT"q[mi))"+K@B%S5*J"#"
&S#GQ!!#d+NJJ$P#!3IVr###!)$Vr#P'!3IVr!##!3QG)HJ#m,a9)H[m#,cVqiLm
krZ)[1[l+,cVqbLmkrXTK!!e1-"pR)$m!5S9R##"0S#UJ+f!%)%fJ)b"1S"mJ4k!
E-Gm#)'"J)%kJ(b"(S"Yb!")%j`RM'H34!!%!)!)"!1!J6D"T!J!!(i!")%fJDYA
8ep4"q[jf5T!!C`K`!D#BF!1JQ#"0*8J!#(!!60pJq%je60pJq'!!rVir!#"1S"m


J4k!E-Gm#)0A8ep3`1!)J-F!+B*()*8J!#%cIB2K1G8j@!!")j`!i+'i!$%IkrLT



&q[iU)"5`NQd%)")SJ%U!Ea)J8b*Z!!LL,L!8dC14NR!!B!3`22rC60mF!%jH6R9
19[r)51FH1#BZ!!JS,J!-+'i!%%(krESY52r83Llrb+%D,8Mrc&92U"``(cS!$%8
!!'pF5'lrl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dB
r!+J1)"mY32r`FJ%I!DQE)'lrm%U3!'F398m[#+QQ-"p)`()%`)&Ra#mZrr#TSf#
m%#i!&'F+@8mZZ!+Q)&qJ'cmmS2a1ZJ5'9%mY32r35S"R!!'H,`"1ZJ2@@%p+!'F
+F!%G3!!@6[S#'%KZrq4)E[rJ5'lrf%kk"@T2l`!-)#lri+%H,8Mrh#!)C`!"C#!

Zrq5K(Le)rqJJ#'F!!93[,[rN,`K1ZJ@i8%mJ!fB!!+CC6bmm3dp%48*RU"mJ(be
!rr"+J'F!!)iJ3#*3FKM6`5m*6VS%Y&K2FJ1`3@Cf)!dJ3(!SdF!Y52rd)Qlrm#4
4F"M9`#e+rrJ[#Nkk",TB6be!rr`JE[r`S#P35LCZrp3R5J!S@8m[,[r`6VS9c#!
IFZM3J9'!*d!!,&925(Vq-LmZrr4)E[rm,``["#mZrp`[,[rJ,blrk%kk#XC86bm
Zrr#TSb4Zrp3PE[r3!!`PE[rF!"!PE[rJ!"3PE[rS!"Jr2+'B6VS$9P42*N!r2+L

I6VS$5P42)J!J#l#"CJ4`!'!#F!%J!#9!!"`P4!!J*8`!*%Kkqm`r2+$m2cbJr%k
k![K86am!6VS98MmmSCK1ZJ--9%p+J'F%F!'JQ#"m!!!"@M!35-$JJ()'X)&Q$%(
k!+iLI!!!!c`LL"em!!(rb#"ZrmbJ'e92U"``(cS!$%8!!'pd5'lrl$!&8d8r!+J
298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dBr!+J1)"mY32r`FJ%I!DQ
E98m[,[r`UDB`(dM!FJ6!J@F),blrm+QLB-)NE[r`5T*R%&92,`UTTM!I5-"b"-#



"CkS[#UQMB+33,[r)(8!!&NcI((K1AL"I6qm!$Nl36PErr%MR!$"#,[rm2cbJr%k
k!La86b4!5S"RA#m!6VS"J&K25J"R8#!+*N!J3#mS!!`r2+$m2cbJr%kk!Gj86am
!6VS81#",)'J!%+!I)%XJD!!BS"mJI!!!!9S`%%M!i)"b"V#"CJT`!#"m!!!$2##

!(A`!!Irm%#lrr%cI$!"1ANje6PErk%MR(cKC6kPe)"mU!%KZrqLSG#!0)%!J%(+
'd)%Y32rm)%"F5%2Zrq`Lf#,B@8m[2%4"9%%r2!69UD!J(bK!)%!N8$)U!!L5DJ!
%2!%d+J!'P'S!!Mi#0LlrmNM$1#lrlNM%PS3i!8M%PS4U!P+$iS-p3rrf0Llrm%M
$1#lrl%M%PS3i!NM%PS4U!P+$iS-p3rrd0LlrpYC"282rqM)Zrr653Me"rrKC6d+
R5'lrp%Kk!'Cb!4m"FJ%r!A,r,`&#*d+RU4-J(bC!,`#SF`D&!*!$H#m-)%Y`%0(
!,`LSpPP2UA8J(l#&C!*Jp&92UA33(fB#B2C`rcm!3QFJ(k!b,`ZT&#m-UD-[,[r
SU(0-haci6Pj1G3!#!!"19J!!51F!-#4Z!!JJ#LC!)%!L+!!#$)&"6%&%CKBL+!!


'$)&%3de3CJS`+!!+FJ1`3@F%F!"J!R!"60m-!%jH6R8[#PP22cbSER!"(`"1ZK*
i)&mN5&P22cbUER!"(`"1ZK*Q)PmJ5V(*CJB`2!)!B!3`2!3!*&p1G8j@!!![!cB
Z!!J`!dM!!S!!!!J!5S"["(!"B!*`!#BI6Pj1G8j@rra)ja`!0Li!#$m$6VVrc&4
2(8$rr()"X!&Q%!*$"rp1Z[q!X%0Z"(!!B#KC6cmmU*p`!4m!6VS4m#!I+J"C6cm
$(blrr%kk%H!J(bJ!X)9Q!R!!60m!1%jH6R919J!!51FB-$JZ!!JNEJ!+)%SJ%#C
!)%!b%!a"384Q+$)S!!)-3805CKif"(,rYN&R'L!S!!4b'1+S!S!!N!2r-J0)`E#
"C`4`!'!#F!%G3!!160m-'%jH)&pF6dl36PB!!&925'i!#($r2`"1Z[q5%"pR%L"
Z!!JJ+!!%FKMLU!*!!2pJ!R$r6Pj1G8j@!!"96dKZ!!K`rcm!6VVrC"!ICa!JEJ!
))#J!"!+!!2q3!f!#F2p1ANje6PB!!%MR'$JQEJ!)+'i!$#",-,`$!A!!*%`NJ#B
m!!!"*0H5"T)!!!*)"T)!N!-J+$`!N!1!fC,CNLJm!!!%N!$CNYH5fC)'NJ#3!h`
'NJ!!J!"`!#4Z!"!NJ!D5!*!$*!D5!*!$)!D5!*!$5!D5!*!$2N*!60mF'%jH6R9

19[rN51FI1#CZ!!JU,J!-)!XS3#e!rqK`*0R!,8crl(!JfF!Y62r`F%MC`#e-rr4
`2YR!)!b3!)Z`K@-'F'91qJ#b3N!q!%*!28$rj$B(F#5f3'4)F!5f3'3%F!"J$(!
!-!0CJ'S#9S$NJ(J!1!-Y42rif+lrk#4%&)!J,[rid)$3V[r`)%!`V[rNF!%8%R)
!%J,MB0&Zrq454f#`3N!q!(!"2!!f"h!IYN"N4(!"YN"N"(!!B!a`!$!$8i"U!P+
!iS"i!$J$,86rr0LZrq`N4"5!)#lrr0#!d+lrp#"!-)C`!435FJ!5!Z0Jh%"54f#





d3N"-haci6Pj1G8j@rr")jami*'i!##CZ!!`k,J!3+'i!%N*!2!!b"A!!-!(3J$3
'FJ!b!V#"Ea4#3$3'FJ!b!Y+"dS`J36#!8NCJfN*!2!"`!Me!rr)f"VC&C!!!Z%*
!2J"#3$e!rr"`!$!$jB$3LL"!)"!Y32rd-JC`!$!"d)XJ3"J3GJ!@",C(B`!!JM!
ZrrCb!F""d@lrm(!!-!06J$3(FJ!b!V#"Ecii,[r`GJ!f"#e$rrc@JpD-)%0+8'B
5)#lrr0#!d)`J3$#Zrr*8E[rb-Llrm(!!-!(3J0#-)%!`%$e!rr"J&M!&d%$34M3
Zrr"b!$)#dS(5M#""-)"54b!Zrr6LL#e!rr4J!2pX8NCJ!2p%60mFq%jH6R919[r
m51FF-#4Z!!Jf,J!-*Qi!$M)$F!!`!HD!1!!`!h)(`%%k!(!!,8$rr$3%FJ!b!Y+
+)%%5%(!!%!%d"A)!-J,LS()"`)(4V[rm)Llrr11*dSXJ36)3F!!`!5e!rra546!




&FJL`3@B'3N!k!&*%-Li!%R!!-!(3J,#ZrraM!Q#U%#lrra)Z!"25!C!!!8cI$$K
1ANje6PErr%MR(b!NEJ!)1#i!$$SZ!!ib"(!!-!(QJ$`!-J4d"m*#2J&f!$B!eSS
J3a!3G!!8!#e#rra`!$!"0!9b!$)#d)(QJ()#X)&R$()"X)&R)%U!Cc4J-M3'FJ!
b!P5"dSSJ34)3F!!3!A)3ikL"V[rm0!Cb!$)#8S(5LL""%K"`!"!"iBL"V[rm)#l
rr$3(FJ!b!Z+S,8$rr($rFL!f"A3!0!15JZ+S`'lrrNcI"2K1ANje6PErf%MR(cJ
QEJ!)+'i!$L!m!!!"*0'Z!")J2!!!!NM4VJ!5)#i!%Le!rqab)01Z!")L,J!5,8(
rm#3m!*!$J0@Z!")N,J!5,8,rp#4,'"*f!"B%,82rq1D$HJI'49*$282rh#BZrrM
LJhS$aN983ce$rqCf!6SZrqEVBce$rqKq3-J(I!!F"$e'rq*i!HYN8d3p42rJ+Ll
rq(i"bSGR#(S!1J46K@!#H[mp4IrHH!Jp42rN5NCR4LmZ!")[!$m$8NS[#NkkrcT
2l`!1jd$4E[rN,bi!%LmZrr!r!bmZrqa1ZJX)6qm!$LmZrr3r!bmZrq`[,[r`6VV
mV%r[!!j#3$e!rpJ`,[rBX'i!$'3!!6S`,[rLCcSN3$mZrqJ[,[rd2blrj#m,6VV
pMNr[!!`5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!")!dflrj'!F2blrjMmZrq3
[#dkkrI"36ce!rpS`,[rQd@lrj$!ZrpU`E[rHCKBb,[rB8Qlrf(!!-!(3M#"!3K"
J!2pk-#lrfV"Zrq"Q!!#8-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkr3C2l`!-%J!
J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y1Z[eS8%m
p32rD-#lrjY&Zrq4@E[rD-#lrfP0ZrpT+3'F!r`!i,[rBGJ!f"#e$rra6JpD-)%-



3%#)Zrrc5M#""%)"5E[rBB-i3,[rGd#lrfc3ZrpK5E[rBFJ!b!Y+-)%%3J'!!rVi
b,[rNF!!`!9k!jS"-haci6Pj1G8j@ria)jami*Qi!##SZ!!`SEJ!3,#i!&#e,rmK
`*0I!,8[ri(!Jem!Y5rr-F%MA`#e,rq3Y62q8*M`!!!%NeklrP#!m!!!#50'Zrj4

`)0'Zrj3S2!#3!i$CV[q8fDlrP#eZrj6rY#Jm!!!%N!$CV[q8,@lrP2qieklrP#e







Zrj6r[0QZrj3YE[q8rp4`I0'Zrj3YE[q8rk3J2!!!J!$4V[q8)#lrP*!!M,#&B`T
`C6e!!#K1qJCkF!!Z!%*!28$rM#4Zrk69r!!!J!!Y5[qS,@lrT2q3!#em!!#!!2r

S5'lrk#mZrk3JEJ!N6T!!8%mJ,[rSCJT`Cce!!#K1qJBd*'lrN!"55VAZrkKMD#"
Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!
!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[r
dC!T`Cce!!#K1qJA!)'lrN!"5V[q3!"!3(8$rS()!%J$5390"28(rd$!Zrp$33$e
!rp)JEJ!F)"$3VJ!J,8$rX#4!,``[,[qi2c`"*#mZrj!!6VVlmNr[!!ib!#!+F!!
`!G'Zrj!!,``[,[qd2c`"*#mZrlK1ZJHk6qm!$LmZrl`r2!%N,blrZ#mZrl41Z[P
F6qm!$L4!,``[,[qi2blrd#mZrj!!6VVlS%r[!!ib!#!+F!!`!G'Zrj!!,``[,[q
d2blrd#mZrlK1ZJGS6qm!$LmZrp3r,[r3,blrZ#mZrl41Z[N+6qm!$R!!,J"#3$e
!ri`YEJ!Jrk`JE[qXXHlrX'3!"+K#3$e!rjJ-EJ*)rjKN!!$#-#lrM'B!!)`NE[q
3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e
)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k
3!&"2)#lrm,#Zrr4N#R"R28!!+%lk"%)JE[q3!&+Zrj!!%K"`!"!",J"`#$e!ri`
`"h)"`%(4E[qB-LlrQ(!!-!(3J0#Zrl`J3$!328$rQ#!(iSJZ!&0ZriaJ!2mi"'i
#52qB$'i"!2qBC"!JE[qX8UlrV"#ZrjPJ!2m)"'i"!2qB1#lrQ(B!0J3Y3rrieS2
@V[r-)%-`%$e!rjSL,[ridUlrb#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*J
NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q
3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i
!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!bJJE[q3!&+Zrj!!%K"`!"!"0#lrM()
!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qD)!IQU#i!Q@lrM%*
!28$rQ$!ZrjL`E[r5C!!!`M!ZriaQ!!#-*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[q
S,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!Zrqb
L,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K
1qJ*B)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)ZrjK`!$!"d)$
3V[r8)%!`%$e!rjJJ"q+),J"6E[q-B!$r0M!Zrp+4E[qB1#lrQ(B!0J3Y3rrmeS2
@V[rN)%-`%$e!rjiL,[rmdUlri#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*J
NE[q3!&*+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q
3!#e)rq`J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i
!*%k3!&"2)#lrm,#Zrr4N#R"R28!!+%lk!9SJE[q3!&+Zrj!!%K"`!"!"0#lrM()
!-J,MU)k!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qH)!IQU#i!Q@lrM#"
Zrk`b,[qHF!!`!C(!,8MrP,(Z!#"PB#"Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+

Zrj33%#"Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk`3J$!ZrjT6E[qD5N"R!2[
H)'lrP&+Zrj33%#"Zrka5V[qX%)"Jh&CZrjSJEJ!BdFBb,[qHF!!`!5*Zrkb6lJ!
JN!#*NF!Y52q8-#lrQQFQ)'i!'0('XHlrP'-D)'lrP&+Zrj33%#"Zrka5V[qX%)"
6E[qDB03YEJ!Jrj3`,[qD8flrQNT!C`$lCL"Zrj45V[q8%"!JE[qX8UlrV"#!B0`
JE[qXXHlrX'F)F'Fp3!!SB"3JE[qXNHi!)#*Z!"`LL%*!28!!+%cI(2K1AL"I6qm



!)%l3!(!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4PBfpYF(*
PFh0TEfi`-c!a,Q-!!$`!2L!!!(JJ2M!J*LBJH#!m26-b!!!k3fpYF(*PFh0TEfi
k4'9MEfe`FQ9cFfP[EM!c-$%ZB`!!6PErk%MR(cJq,J!)+'i!$$BZ!!T`!$!$1!G
b!$)%N!#"FJ'`J@m!!E3p42rS282rkP*ZrqJ`,[rSX'i!#Q3FFJ!b!0+-)%%3%$3
(FJ!b!Y+-)%%5%,!"C!*JeP0ZrqS`,[rUX%GM(()!-J$5M#""%"!d"h)!-J,5M#"





"%K#`!@-#B0J`,[rSX'lrkQ8#B()i,[rSGJ!f"#e$rr$@M#4$%K*`!"!"28$rl$S
ZrqTi!$J&,86rp0L-*N33%a5!&Ulrl5!Zrr$3J0#Z!"!J3$!328$rl#)Zrr65JG+
Z!"!J36)3*#lrm05#e+i!%#"#-)%L,[rddS(5VJ!3)%%`J'!!rc)`,[rUX%GQ"P*
(B!$r"$J(GJ!f"#e$rrM@M#4$%K*`!"!"28$rl$`ZrqTk!$S',8Arr0U-*N83%a5
!&Ulrl5!ZrrM3J0#Z!"!J3$!328$rl#)Zrrc5JG+Z!"!J36)3*#lrq05#e+i!%#"
#-)%L,[rmdS(5VJ!3)%%`J#!Zrr`L,[riN!#"0#i!#R)!-J)N,[rm8S+5JV#"E"i

[,J!3,``r"Mm%6VVqA%r[!!``,[rU8N!q!'!!rP`[,J!3,``r,J!+-#lrkP*!2`"
1Z[if6qm!$$eZrqS!#Q!!rMK-haci6Pj1G8j@rq4)jami*'i!#$SZ!!`QEJ!1+'i


!%Le-rr!J2!!!!56C`#e-rr4#3$`!0JDf4@3XH!!i!be%rrMBLL"%%"!L,[ridUl
rm#""%)!J,[rid)$3V[rd)%!`Je*'B-i[,[rd,blrm$m&3QG1Z[fb6qm!$%*!2!!
f"VC&C"*`!$!$d+lrm#"!5K"Q"&*'B1K`!#e!rq3f"VC&C!!!U%T$Cc)J,[rNH!!
i!be%rrcBV[r`)%38%()!%J)Q,[rm8i2@V[r`)%-@%(3!&!15JZ1S,8$rj$3'FJ!
b!Y+Zrr!J34)3F!!3!6i!,@lrj2rXF!!Y32rS-!G64dT!Cb!J,[rSiiJL,[rXG!(
#JS#",8$rk#!ZrqcLL#e!rqaJf$3'FJ!b!Y+"dUlrp#""-K"`!$!"jB$3Lb"!)+l



rk&*'8Ulrj'!!re4-haci6Pj1G5*I)&qJ*5k!DJ*#Pdl4)Pm5(c!I5J&R"+G'B!+
M4Lk)6Y%LAa)I-"mJAdS"C`5Q4f!#SNG1d3#3!`S!1+!"!!8!N!B"!!!"HG`!!AM
F!!!%23Dfe$3%LJ#3!a`$XJ!64%P86!!0!+*"6&*8!!S"5RCPFR-!!3(18e45)!!


"!HC3Ff9d!!!"rN4-6dF!!J)+8e45)`!!!Lj%6%GB!!!#1P"*3e3!!!*'BfPMEJ!



!!P**3dp1!!!#ANP$6L-!"!*U4P*&4J!%!UC#6N4-!!%#iN&9Fc)!!!,kBA9cG!!
!!`C$6d4&!!F$%N4"9%%!!!0b8dPD43!!!hj'C@&d!!!$LJ3"rrmJ!*!)KIrr*!!
!J!Dfdj`!Krrr!*!$eJ#3"BErrb3!!5B'YY1N!)$rr`!!!DF!N!@errmJ!!)&!*!
&J[rr!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!$!3#3"!)!rrm!!!2C!*!%!J(rr`!
!""F!N!3%5`!S"!!8V!Dfdl`%Vrrr!!!8r!#3"!%(!$3J!"8k!*!%"!(rrb!!"'-
!N!@#rrmJ!!4c!*!&KIrr*!!%J`Dfdk!!Krrr)!!%N`#3"BErrb3!"+-'YY2!!)$
rrb!!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#3"!)!rrmJ!!6P!*!%!J(rrb!!"28
!N!3%Vrrr!!!9k!#3"3,rrb!!"38!N!8"rrm!!"[$!*!%!J#3!b!!"5-!N!3#!3!
()!!&-`#3"B$rr`!!"6m!N!3$k2rr)!!*GJ#3"!4,!"!%!",@"VE6V!%(!"`J!",


[!*!&J2rr!!!*NJ#3"BMrr`!!#G)!N!3$k2rr!!!+%!#3"!4,rrm%!"-,"VE6X!4

,rrm%!"3a"VE6Y!#!rrmJ!"Ai!*!&JIrr!!!@r!#3"B,rr`!!'!#3"S2rr`!!'33
!N!@%rrm!!"S)!*!&J2rr!!!E$!#3"B(rr`!!'aF!N!@#rrm!!"XL!*!&Jrrr!!!
E,3#3"B6rr`!!'cJ!N!3"!2rr!!!E3`#3"B$rr`!!'f-!N!G!!!!EQ`#3"B6rr`!
!'lm!N!8"!%mF!"`%"VE6Z!!#!&NF!)d3"VE6b!!$!'-F!+R2"VE6c!!%!'dF!1j
E"VE6D!!&!(FF!3Ve"VE6E!!'!)%F!6bY"VE6F!!!rrmS!9ib!*!&"rrr!!&HA!#
3"[rr+!"Br!#3"2q3"!!"ANi!N!Err`!"H-i!N!3'F(*[EA"d#-3JFh9QCQPi#dP
ZFf9bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$Np
hEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9ZG#!c#90PCfe
PER3J0!P6C@GYC@jd)$8*8f9RE@9ZG#!f*A8:

|
>
|
<
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
<
<
|
>
>
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
|
<
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
>
|
<
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
<
<
<
|
<
<
>
>
|
>
>
>
|
|
|
|
|
|
>
|
|
|
<
|
>
|
<
<
<
|
>
>
>
|
|
|
>
|
<
|
|
|
|
|
>
>
|
<
<
|
|
<
<
|
<
<
|
>
|
<
<
|
|
>
>
>
>
>
|
|
|
|
|
|
|
|
>
>
>
>
|
|
|
<
<
<
<
<
<
<
<
<
<
|
|
|
>
>
>
|
<
|
>
|
>
>
>
>
>
>
>
|
|
>
|


|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
|
|
|
<
<
<
<
<
<
<
>
|
|
|
|
<
>
>
>
|
|
<
<
|
>
>
>
>
>
<
<
<
<
<
|
>
|
<
>
>
|
<
<
<
|
<
>
>
>
|
<
<
>
>
|
>
>
>
<
<
<
|
|
|
|
|
|
>
>
|
>
|
|
|
<
<
|
|
|
|
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177


178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015

1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052














1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096



1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119

1120
1121
1122
1123

1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976



2977


2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993

2994
2995
2996



2997
2998
2999
3000
3001
3002
3003
3004
3005

3006
3007
3008
3009
3010
3011
3012
3013


3014
3015


3016


3017
3018
3019


3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041










3042
3043
3044
3045
3046
3047
3048

3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076



3077
3078
3079
3080
3081







3082
3083
3084
3085
3086

3087
3088
3089
3090
3091


3092
3093
3094
3095
3096
3097





3098
3099
3100

3101
3102
3103



3104

3105
3106
3107
3108


3109
3110
3111
3112
3113
3114



3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127


3128
3129
3130
3131
(This file must be converted with BinHex 4.0)
:%R4ME%eKBe"bEfTPBh4c,R0PB3""8&"-BA9cG#%!N!1irJ!"Nl91Je0dG@CQ5A3
J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S[,hH3!bj
KE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!!Z2i!N!0b!!%!N!0bm(`0TD9

5CA0PFRCPC+@P!+@3"!%!!$J!3,Ea6[1fm8mc!*!0#+H$!*!$cJ!0K$!!!,J`!!)
Y2L"#G@PXC!!!&e)!43!L!9-#3J(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!f!%#

d(A&cY`Y3"!#3!h)!!,IR!*!$FJ!'V@`!!!%S!!f#5J!!YVm!"#dq)(4ME!!!UV8
!I3!3!GN"`!(!rj!%!alrq2r`bd!!!)!!N!HPN!3"!!"!!!#f"X)LY[%qG3#3!mi
!!##e!*!$cJ!3)r8!!PXD!!!I+3#3"!m!3Np"Ae4ME&0SC@aXFbl2J!!!3,*069"
b3eG*43%!rj!%!*!+J(!!N!C#`G6(%)!JUNrXG&95kD&*R9PD2))ceM6*#M!miQp
GY(1#221Vi@,r,&UQT,,!FY-0H0eEpm[QB!9+8K1eYGiE!3LDrUVYRm8p8,HYeA[
&bZ&kE"8DUX`JDH'd1,E`4N95fQ*N5lTpDGCiMC3"TBiQ9BCHV@p%3heS@2cM#fe
T%9DP@E$KbF5+`5+3!'SH8!1+kHlHFj5-1Q0[9Nd*a%aQ,"51dVCKV@13!1pSRq$
ee(YjGd6h1cm5V8MeVbemGTMEajYl9@DMLp-'QZ@C&lV&`I1r'S5UAIebG))CVF1
F42HdK2f#k6N'mrbq2ibj`)5M2NkfcfPi'[`JqP-(k,H-+,CF#"e`S9`QXjVS!Pi
K,#S5@0#0JPJ(8[8CUqJ$QLe@&lYJ&T`Ea,ij%6-d%p5bY*rqYdHT(CXBbb9K9H&
-M@5#QCRqDfNbV)HU'S2dp1pdDMEAhCJ[f*m"9bH+SI0b1Ip$8Gekb[XAF%*M"@I
B@1$T$5k-CJb`NbriU[j'[U,Z5k`d!'21!&I3iCcbCL6IE6YSCPTLX08QhIM%a"L
'GPf2%jk'#SC6dh!H6R+fSN2R64-CL#5RrG5@aF*Jj-c"j!e+V2HD-K@6[acJeHJ
mB)AX1R4!h3bSJ(EMc006')VUdlKTMfBam4@rlB+&*am,B2",F&VMAV(e$*5QhY5
21!j('V4B9T2$LFQ$18!GfX*!R8!SRVT-cPIAhJ3D44JVeNXcTZU4a-'b3NN)GpR
i+kF%!+-GKb[2-e&ZIY+#)5`AC!,`@YaaPUb2"rV5dL'mjKr,hqMehJQGFS5fMb2
)[[-Y@4(CC8TL9'DHf9mp0'$@U9h[ENADJ$55i63IBqK+kVIML(EUL*JP4VG-8BB
XFUF+UMr'M5XL)ZK&V&r"%&dS0$f5L6[f0A@QV[0d,QT"0GIQPD9+*Z8I(3`c)6T
5+RE+*E9mRL0D1ZrT&lYH"%#aS4-i@VpXp)KL(LDe9-06V('C[4Hllq*+pJ6$r'd
MpcYLC#k8YDJPG4AHY5GmX*c`0%kMP8$UkX%Uaq&Z4K1q2R@TKYp`qPUPbE$lm'm
YC[hT@BC,+YkCMkXc&BPiVqbjM54+bbaIG#@VlF1&im@5)8c#Z1$5N9Miq$541A@
CmPP2KR2L!ViSIpIYY@PB',qm`2F!hGcJAXPSX2jaceJPjFrk4@'SHmDe0+#cp9h
&&hPm"TbNffUBqTBXXZY,Qe(PfeIirjjHkfGhrBNYrGkXNT!!YcmD+Pl5TrPA9h+
BJMpSL`960-FYB1+T2!KXBiNkkV0!MGU,2-NlfK9#kTFl8VlrB2l"T2f0eG9brii
DI)l)r(ShG1'2HQ[dIiJ+S#f,m$`r-CU4-EESh"F1*5GRI[9!D1DcY#rp@mkA3d+
fQ'#DLYRj5l!4Sq!%,1I2LaL%CI@Vb2M88*%U'6A3N9Tc([pV(#I,,Y0p$ekDhh9
S!p4)f'DlH61b"$'jqZ,hr0GEdd&4lVR[#Y@'S2F56D0kR(FfjhL[2$%8!AMlN!$
p,!+"PQiIJN!8aD`bZe+p%BqkR'P#G$Fc3Fp"YV0&[%0"JFL5S$6XqqU#C"6V"'p
M*p[-,flmGU`M(9@UG[UFfF6+i9lH(M9H@1d(2!KP4G8kk!"rp'K[1k6+$lVr[e[
B(qI[D1''j`Eil@Da%M3aB8&BEqf*!`TXU4prHH'!5FSmq`Z!IN*(MiYjG'pdfk8
Q(jZ04L)T4,h!iAFbCiBm@S03bbN(b2pRb44RJ9K&3!lM@QZCm2'EGr6ZGR+KX0&
V-B8H%+JDqcUKK2U*AYpJZB0JVMUj$a6Z3[p2)hQal$$Zm`2d"d*d@a6@YUqj1@"
@$rJTa0Q6dQbi['!Q+P!U'+fMdr500idC6ThKd6L-AE)VFM+X@X(0JUTT'q%RDUe
jSLH@&c&4#UHIU)DkcLCr`J$"i8IS(+$HRf2!6P)9bA2SPd-l`DDa%`VRV0P#FJ`
C6NHiSf&l(-ZdcHiH#kFH&'TZ,Tq8Xc*KEk8bD8kNE2+rDCFm$-1-[[%85$TNSM[
Z(H-6idblV8TlX`kV*"YZ-Cm8'A)#2UIDam2E-ej)d`Td[mje*GMf`iR'1k'T`f3
MQCMX'L(j''-phNUYYi$e$[XSfQJB-H!4-1E*9%EjN98b2Tj#RP`B[%YV42,b&0(
U2,rZCDZfmL5D3[!IKJG,a[!'`hDZVQ#aBK#HkYYkT-0@%kmdaH`h4icH22h(mrR
qhpldhS'dcl!AlC%-*d9rC1qVc%k2l%m`&-2BF'AXj%fY8b6@,V2c[f"jKS,q*Fk
G)S1H[%5CGSD['$VEfhK,*HkEB%ke`H*f25rBq%GcL*bm5beBI,[Rd+5$jU8[!EQ
%XZR'V1@!4S`+MDMB&!Z9"(+NjQYdckdX3NP@rk0D5N2024BSU*hkjj*$YAE`H"6
jVZSIhMb#Fc!bmX"eriG%[@RhV#I$rkYi*e1M%(Q+[F,mqAHa[@dKq9IYT)h201-
)Br@3!'#(eE1-8)mVcBJS,%2hdSN91d*XLXPJX4Q[Xi,NVBV(Z%50lCJ1c31*BS4
h#,-9P(*r[PCIID%Q+&pmJ6BJJ86NYR3CeG0X[1)+fKQb!rRQ6$[0)pKC-+#*J`&
)N!!Z!iAf0([6,Z#i+NUrK!C%PcBU&TN)Km&V'IkNlT%ELqb"lQSAcB8QbNq19KI
afFYA9d!bhUr!GH1e*B`2qp8C(@jHa-JCf2mreLCMfJVRZ@,eB"A'iHk,5-+S1ml
9f2I94&SCPaD8UZ'9T0p`THEk#NqK*kX,U$UQK[%$e2Cc#LVe[Q!paS$(aEa5bEq
f+($@JF)$qK*44$ZXCr,c'Fm5SVSFi&HZ*+Z[mZmp$9E!M``AlRG(cG&SAq,Q@lK
ib*T*-1p1b0NJ"4dbmQ0!pM%@BiGI-08k2Db9bA0i4XlLTB(@j*!!j$p#fl)CIK#
jMKUK$2M"([Ji"iB[lXD23HEJ9@MQcjq%!MA6pBL@Xhp+ITqjLr6qe4#Z-VjBF%Z
-P`LH4KMe,#[+mAkAQr4Y69a&RUbH(`6-6mK)b0LcDL+iaX&JGe"X19+Me%eajm"
03V+af((U[XmT2![a")(NUL0)FL-aA-Ma&"L'SaVk6rc+'Rl8-E20)6lhhFLCr&C
UAcIHf#qjeT`a1TSqZ"G'q1rDHcjT+4+[,#J@R85Fb6ER6a6aXAm&E+q'hQV)UfP
mG-fm2(Ub9fAmP)QPGHLR90@8fFT%31-[F(hjUjN8%kBQ)6V(9(,J+p$a!AL-pXJ
25TDa84AM4!U%1*l4d9J(P0d'JSX(YBbXTkT%b"qBVF%rF#VNKl8(UClC@H*C$Q5
T9DhX'QTXK6k4'*LZR!h[(id[RTB2je+4Ze`,fRk#1ARaq')ZH9@6D&+SX4h328B
F5Jmp92XhdGT"+h)48q[Q&GAUB$dGrlQR#A4&fCU%jPcUp`G0Pi*+Srl-!+pN831
l-mHilFH63G(RdXPVUF%XIa5bf3#-RpIAcqpZeNTK3,dqR,@03Ni9CLBb0l%E@2%
S+CS6lr"rkhLqGG8hH[HT8,@[K`GbNaXJ1%28er%1hfm(4B4f*kDrFPGEd#ZV*hi
SJY+fccV20[F4ZCcdrfRJJGk(B([[dQ(hdZaZ*("YkU-eb511rdHTUFIpf#AGEdY
H5l'61GaGqX5%1Qe$FYIHC%B9p3#FqRpJF4+kPVhM,b##T8lec#LFBl)EA&Peh*d
lE*!!bMZ@0!e+r8ZX"22QAmX@VUfp5TVhq&9m+XNN+RJ$j''(df545KP6E5SQ1GY
!0FMec!ReMY!YbP&i$P[SeY6EbmQY6KKGC!`$%@KQD0f,*k9NAJCS#JAk+!hIAh3
d*X`))0h61m2ITRc)UKdfZ@PihcN&YSlA'LiV%RYib"NdA!42BCJhk[FbLc68XP"
j5pS&6EJG82%IKDp[**fKZ'hBAX&G'Xbhj&22Ub``@#9i)NH)ZX(FBa3F'9bd#pA
!5Q1P(,Jbe)pe5NZ,EZX0*#4)8(Gbi1(cUp2kpTEbM#,JS4(,Yr40+1D`D9!#MJU
fkHj&c)@"bChmD(S9LkQ`i9eAE9$!C$LQ3d#K8`L@181hf*BME"251CfMSF9ZIVH
)'AU830JU,[e6@bX(D3pmE`1Vf1I#Ki5!PB*'TH59'hl[J#5iIXGE,5S4qq!U6P1
!2$Qrq%Ea-AX%$B5GFPhhIkhrL%4qDE8!T!p0i$5N4#aEE-cMM)bj59!G&4"D8P+
,!rDSVbU[6Jf&H+rZZK6cba4GMHPkq8b!$aDPl)rQh-)'*8IaFMici6!QfU,2"XD
+T#[J4CMeJSNqP+JFSc3Z-GlLAbjSclaaH!KL*!5h`XqUPq3NbGN*Y60FDK$Kdid
G(2+e&VL9a2+0l,5E,8UT+Cq(P2VYC!9JG,eI8$X1KLb9XH&bKZ[T9kE4qpJfa!m
Y(b2DT!m1Kc$),V'HU8l`a-e8`lmcZ0l'aPh+"lf-E`M#mjL(l6ZC"BKfLal49'2
fQ@AdGhR5rL4H#L5U244(Lrj'Y0'H5RSjY43[&(P0l[V)Sb#*k8a82Ik6%biG0[P
KBPGK%VpbEDbI"ifA23qdHH`1EGDb1'+``Ie%0V*j*%5fl(FEmJi*HHF[AJB6c(m
d5h2k!X[`#abSEEI2NEH83(9K8kIHJbr!"baG!"c0M6R64r`J82[QmVU8F"!cY*)
MF@BqrbTpqA!#,TXDX@&Mfp55qjN4`PM0Pe1#)dMcNC4dBi4`LeBMD6UJ[LYXX#D
-VEiE&!k['Fbc84d8i(cG5F00QlA[eE6TjE,kGfG6*[,LG6$1Sl[c3p*Dl0l#P[c
bD3ZU8E6Sk)XiPS%f@4r6a6a8k8%aYqAGbEM-AE`M+jJcmbd[MU9Lj+V-3HAH-p0
Qj0c[p!b8Ui-k"DT"ilN5*-j!kL'YYkkENp[4TDXV'52VI,+8TMMUSdYGlcm3%$a
*8[5CR#mHK&K!@m6c%`UpHI+ieVZ'PlGrVK$Xe8+Ue,Ih"R!KBCrLjTVBZZV)am1
8H!h9mfFBcIZ,NRdS3qLJ*+U4LkNS*MkD"e5B(rK2@A8$!1j%(B@)YLJp-h-m56!
NVYl[X9BYcXjh!k%'A1&G&ai92c&KAc3LMBkC8NUa%Mm9H!PY",[YjZ*EQT!!E$$
$F*rD`eb5p'cNBJfL&YrRCp'CPUi*cP&YAHq+Qbfei5NbfqqBKZDXd4`c&EK)@`[
MBNVfPr4b`L!YKpJiY2Ri$"%,dFQTFh'd9lqHHmlZ6[CMK3Q@mHQd0ec@iQF&-h4
d6KFPjJ4'(2kNJVTABmCF!(jSPBA3hC%V(IT#%HKF,!QMN4'9CIM+1DCJdH!)PU)
iN6%Zi)4ARJ4JRQj@-d,L(4S#Jh[M#mJiMmc@!fi+QkDfGl3e0VFJNqLGpeEP1Gi
TE&X!2Z-@E1LBB[X06,HA$NGMF66PQj2rc"Q8T++D2(,-'+8XqeG-+hm@9HFb!)(
[P*dkQBHTb5re!b`"8bBh6`jbkd,bhK#9VeXqe[TLGP,U&BMENXa%$m*QbM@D3Ad
!aA-NHJP&[L)P1!X4b*dIEad&hIc@(9&*#I$NRRf+a"beNLmXT[HGPQEYmLZP"Nh
qlQ21(0PRMc0Df*1T+pPGFl++8d$&r4ZX[,64pbMX5F8-(Gq#'$ISrUhAGYZF[5a
l0K8kRFC54k%j!8BQLleHc36&GplF!EpSeYkLd3%K,AmVCPGGHEE#!$MGXMiRXQ0
(@0X!I%lPf@+RI[%a2Va8e(9CNIrqP$S-Z200rd`S1r,kFCPiUC1SM'(&r)jdQ!P
*1aK#MN@BM4M5ZB%%M-PpM`SR+%0-EJV-@9d'J&UG"YUN)iQE9U6&dC2,#kb&l"i
'2NIT"48%l6%2C@XPhAVUjm+mZ1%E%JAedi+B)YhAX`(Y+8keA(,b,pZYQ)5k+#T
4e*16bGE00ED5HiGLUcC'%K'6$6Hq9Q[&2&,#m'+@8Ffq@m)M6d&,X,#2GJ+J*6p
3q*VB'QqRJGpVkZLY*dQff4)!rlEd3d%T@Bqcp1NS@pfHmVb4RiT[d64$TjMI#b*
XHi[drAaGhCEi+&E*`14)T+IKqih$b2R[RKVZX&%LiP,,DkVTJj@fbAD[`@+E(a$
hGbHadLd$6i485Qc*,b9Ul@"(R'GUj9j5CH&$46QBDfY`55-d8((!KVl+B%Ub'p!
rl4`N9f3hS5AV(I`*C%&&JDd0pB'0cP8PrG5D)(DQ6mT*eA6mr5'f*''4jpaN"Ub
DM+TUKhNP`X5[rq3Tel4XKHaXVYpCT)4F[q3h+(ESLhBql8)FH*FILj1'H5K+H5R
cUQNaef1I&UK&-*bJCeLaf*)9)5[P4a6AVdFflp-i,TH-1KBH!Xe#AR#r-KaE*0B
*8,&QCjpBEq&$`6P[NB%Z"E[""![J058!FT-m3&A!1"Q(%fFkjH"QK8+RM8dP+19
`6Y(8r!XLlbBM"@fP(LFNi%C"CjFqFZ-"apCi0Ahb0"%@j589(c1H&dj6*m(fD,`
(1T28!0l"0qRFaHMrGr#-jkC8m2$KG2D%6f'1)2$2Srf3!&["&e5bQ9VKUA)c1(k
kmdlEZlb!B18r@!'0%DZK*2U%1!AIT[)I62XB&4&5U-c[D*2kH#,+[l[AKr1MNIN
5Ikf9+T[deeI"Y61j'Y%+r!-4U[J+)`j*29!9bd1PPR9hY5HHHUHp-'AM,&00!k@
h+10Zb9Eca+,mSCJNL2aGhcFS,F%6GLPpNf1B3TK&i4rfBlS9CU0((pI!i$CV$Dj
k5S+e)Y++AU6cLX6DN!!@S'2*c$me[iF3LMe44&6ZSS8IZI%6j9589m*fI[cB%le
P+HH(6fM5hS&k)3ka-*`H%fDdcG!!3X(bEr4ldcj*5)&TB#9Q+RMc-fp'5A[p35V
i-'(U0QCYZ03-dmi9i9(mE6%(E,6#Fam5K)Je!&XSU&ik4&l3ihcK#8V&C4A%%Z!
BmB!Mi$)YaU[F*HAZpdMI1e@B"NVpi0N+fUkd$&FSrCZSLcI@Z(eFeY5!@qF)Kj@
%R[5b'N2i+8B4V+dS1bV#)a%5'-RjqU`q[@D5JM+c'fRZ2E#428,j@QINrIhID*'
08qjK8jT![QX9+Bd#G"kd(q218mT5UD*iRjVI-K4le`LRl%elA!R41D0*3@4,U4p
,,NcdF6*E#8I1-J)d5"JqS*3YG63QqCl8Y-eD`Bmi&b6(#fZ#DNj[5rSHmmZ8`(V
J[0"DDBNAcEDmUB#,MJe3jp%2$SF3R-lJRS2QN!")d(8a()HqGrVUS9mb8hBAa@L
)L5Qp+d5+NAlXbDS``hN*0r+f9eM,Prd8crc"p04hQBfKTe8b29j%Viibm+Si8&C
(*8D[2fQ+KM1bY(+&92-("3h0VJTPK8IITX(*#(I6hKbPbq9@Vf8YJTAKCE2%HD$
9+Tbm'KPI3`8Vb'Sl-*JKMVj(Z-)llYL,l6jSQf%%d3,pVL#bdDDeiLprIeU"Ea(
BK'bdF'Tc&8'@bRF`hi0LlE(SXlK[2pE@(DYhBV`#!da1E+`4UGdA,df&dipcBBS
-hb1!X`D2(rD+RK*qCA+81$6Jh[RZ&ZpLCZqPDYbZBF5EG*I`VN4r(RDSdbC6mTL
C2bA#Y@05Jdm)03kdEqCf19b#BA"A-j1I#VhJc!m8B(Xa3'L-ISF30m!!BcbpQGP
@l8H[NN8R)D#IJCcTd8Lk6EGqHUR,q$QLEFi@Z3eq+iM$HqEl+GUcVAAf2,4K3KJ
a!l6Vf![&58LBcHV1iqq8cYY)V2p$Yb&chcf@$3)Sr-qD%I*(Re1Q('@&Uj!![Hd
490SJ@RP)8DJ[DDBGDmBkCCb8UYUX#Ul8i5Pp4L+qT[[NI@JR"+9#F-1CMqL@0pI
YRhlHq8`"H&4C$"lS3T0d9MfDmD82P9lQ95r5PjJMU$emEFIXMIi+a!TL"!GU84f
D*(-MMERc4[4Q1p0SNCEA!G`pZ!I3J8K@2&#X'L3rTEiHRdf!Yek(rkh'SeY#+LE
LBkpc"jj!8jhL4Dd*!)LL!aH-4c4fVCA)fi,HT(`E93@!IV*CcA8#IZ$DT!cra8+
UGriU59U,iSVfXe+qDpCIcY[SZf)1#[kd4ZPM0VkF"*1B8KE!GSBcH)fj00fBPb(
rU"[BPVCf5SXJh,rSI[BjT"h(V36qm12Qm'@&*6!["#ILhfM%!H+d5"0IG8AY9Mm
I$Z'a3(B[))mcpbpi"5Z3!"2l8PiMRe-FVH!DZa9@Mj1HdbXakIDi"$fI*62YjLe
QBIHS(MU69h%PIDK"Hm`'El4h%Niacl5V,k*3T"krihHa8HJcFSVM1'bm*a4HV'a
%*ZLd#*DPpRjZM5bMrS&LZ[)ebeGH9l%AVUr@PCe,8HU@JCr!iCK1lPa2A(pd&Z#
@M8Y`cYYCm3"PYRrKC*c(Vif0e(GcTbYV+J%k`TPhl8R5093++V3%3G,8%m55CBC
X8#p)KEZp"+dq$XHTc&P"GD#TfRS&+3UTY83U2!*rM@Gl3G#(P)m!irPl'$&j)S5
ZdbIVrG-MAAEq((!r(CIGC1HC+)!b&%P@lZFIbYrIhQiTVr48TQHaL0TbTpI$!4r
KbEHmap363)m"lr-$q#R-daYdkGARVl+Z)rA@S[Uh*lj2JpEj$iNfmIX@EZ5``j!
!Z4M2m#Bf(84P!d@6Gjl58V%FcBXaJpa6dRS*ma4K)12GqlC9R)1M$$QNTA$r9k#
FdM+P6E(#Ik$ErC!!PMe1ceIa"J1eYC3YAEL@)fUh[9EM*4CrDa55NSkCacU5P9G
+mNIrL8N&mU6e)M+-K9hZG9U903)`G39X0EcHU`VaQeRf&cB+iab"1rbfCUCG$HA
C[Lmra9UPYDifprR6k0J(53`h*a#UeNV1G-rM4'0CVSPReMrfjq3J[@+"L2`RriT
S'')3q@HpJS!RL@8)$c)l-E`"&6-Vr%R4chVJZi#`r6TGEdKfr68`ITPNE8phR5Y
FPXqPjS3,q[4&ai'dmJrlU%KqURhBB`r,0Bb'k$XhGC!!F%'M,68rPFbZa2%Pb3@
SfUL*@+C&TlUK4e34DiLkQQQ2S+iL2XTSYAE,"2`P6+b(k0mi+$K1UcA'-TClFqq
T-G*0LNRUm#IA`@0Pd$-D5H)Ph#N!HGU3!m5ilKHp`mBQY9GkYf,1jMU1dm,C8[l
3'pEpT1ZU0f2QVJ)*+8V$U3S"E"X)LF@B@r*EC%+fj8m65c0qYBRr%!b5aaJH`+a
"9`D#lF5`GZa3dI5DC[&j4F[aAQe)hSAMST(*@LQdVQUDjpSY9+2pcS*+%CX,FH$
q-9[JNi@d0(!fUGE%6qX%DqaKAZ[FAb#USb#Gf"B[qQ"Lb40dYYSDT%b`KNMT8VG
FLD!Rf&(E&,T1Hmqh2d,51eJP-6DPHm-rBm6)`C5dAq!2DEj6kfpbG@4H6D!ha)Z
T#QM2d-'%'hR5%bBf*[KV8d,hSAB6aK#l5IZkld$eA!B[YAG5eS6rQGe&ZSPRq,X
,05"I$GSApK9Kr6ER-M%9FdpVjCaekRdl-@lYT(EDMa&XMRaAa1NS3@%clH0(%IK
-MkRcS&CHDjK8jUa`1E3N6&*Kli@Cjm,qR#E4m0a(2$`L91I8-`%&TB3d5`S%j(Q
XH$F3j,AHU1qU,U4Z!JCEf6-K#h(#qH60p94FfmiBDC%MekF-9RhdU$LN[QC5Dq4
(&hUXKED[*[q@AQm&,%**F(hmE361qZ8H+52G*cIk`$Zj,aeY6&d,X+B@HGUqVJ[
QR"dQT&861VrKPk!N*aR$E!3c[fYi*2dR34JXPLHk!qVP%qr!S9*p@LG#e0"`3D1
ZY8-q0aj2dJlHl30X*j!!"Li"J4+3!)I*'iD0CL,[Jpf5KBFH4pV,p6kQEkLXC39
rdZmhcjFl)UH2h"8-l*I`+Bpa%KDlXSl#U66BPDK2*#B2e4V2ZQL*b(Qh*+pS1X8
p()Y!iB4e'&+A,IK[f0e,SYBb-#Q#ZG1#cc@C`iA3-Pf26c3I4K3XCB#I65"54,!
A`+86,`SeR)%##Mi3C&a!5V2k0!Q[i&*Ua8S$ccj5p)4A[)-b)NL0%LI`FfPAqYL
C9CJ8UAB+NCh+E8-9DF0dQmeQq,4USX*FdH(hJVBDrf-"d51&'fM(6-Y5NKAJ%@'
*!rK`Q`FS&bjZ!K0BN!"*"G'4iB@2ADJeBq'0X8U8VLqaf8Zm`eL#UN(pJ0[$AGB
ZV3Y`i@QEk,H'"1MEcpbLCRe(MdU`rA5ZTLakeR%UbZJrGML2T-JFm8b!(Afr,,N
,[d4NTYb8h`JbI[4i&ZmY-VFqSQP5N5m93X"dBrYGILPrqLTXLVUDjiU2'F&R"+A
ada@'lZ'3!26+K)ZQ#MmeNl3@ZJGEEKZFB!Z*$+)H@r(me5fGRHMrIFSBQi62F*P
)6fdeRR@1KCK5j94-IjPF(LjV8D-8BUf4RH$PrCm9L95%@kG[E@&[)8bM3XDBdh*
dLXNGX%KS%K2C8JqjGQDV!-8Jc'-!hJ!R'BTQX+hVPQ4&EH3cUZhIk`EX3RY`HL@
a29QFA-kXjSMeS6%)A3J3AI#h&Y$)CB,jJd!PZjI'G4Iab%CR(he'+2%)J[4q!4R
(""k#J4PI+6MTGP0TTjf@GH4IG2F8!AI(!Q23#59Tl@$08Bf&Vb$8G"ihR-8HCX`
F(2Mp8ij)j0IcDLX#epMeU,F@$qQkhk83D,dSqH$q0EVRN3aM``('1la'Bh9)S%V
6&)iS0#X81VB"#JF`mr4(&9CBqd8!cMEe$A36Emq"F'$b8+P-m"ll(kMJF`JrjI5
PN!3"!!""!!#dSDNkY`1GhJ!!!5J!!$k3!!#3!mi!%I[i!!(Mj!!!(AB!N!32!&4


ME'&`F'aPFf0bDA"d,Xq!!!"!XNe08(*$9dP&!3$rN!3!N!U!F!#3"N,"e4bL'T9
`EhBGJSRVa%A9D6'YD+kU#)ShAT,ZqjVJ$G@)r6[S8+KmFUK8i[&0qQJq5)PNf2M
FUDTMf@'qMjEYVMBI#h`P6lYe'A'%liY#F`&aeIQFZH1cX+LpLaDDrN$&i3(Y)5f
N%6,3mSR0jrPZ&Rf95F(i(DHBXa6%h,Q4iRlD'm$2'Gc0cm!6Aa%*TVLC'++8SCD
'akR#)12Cfcd98e3IEedNI&qQb8lbD'IMk%f(*PSaD(1`YmS,Q*-HUdQ"`l[l,$,
GA,Tm3*UMDr-M-$CGfD9Y)p5BQZFVY0lkMMfCbRGI3L'Yh"9a$bYFU5BGK0`bTY-
Zl16)'kUFV6&qd8rmipfjJ3IeePb*pV%`e[m+AD-S(K)LTLb'HH!mr2kD*K!kGTX
Pl&N4`3hA$$@5a`U#`RZp(iEdTPHS9hYX`$f,A%MG'QdJ4L5'ciSX8r5X,e`!V3V
MNH1jL[BbQbS[*c9QPZLD(MDeVPD0NcpM6b'PVDmbET-%!PJcfk3Xm3D)@KGfC*T
U5fa,HGp2ej*+DAf&V'%GHhj1L1dIkL!kdb5NZh-AY[+3!",rB*Hr"a'qk-rjk-U
&*%le[i!08,lFBLNrHT%YLmNlaa,P1qZj+$!$$e4hRRc5`r03+Gm*jDb'Z6q+Phd
+hNYpAa2mNaD"2INLQCS5`)QXBI@[RhS'4F4r2,VDb4j#JJ0H3-`G5f&U),h8m'R
d`jhlcZEaa0b'j"bG+efhYV%&iRjU%Vc[kT4U!&FSSh#I*FVS[AC)r,CicPLfPa,
9L3Q'm0@EJBqp+BVrIQU%Hc0H!,YQhYAfRMVfjIEFCET"f,!Q-8BZ4Skl%3BmdiH
K3GAB*232R9hCcR!p$f(aRp4CFAHY+I6blBcBFGXq(0RAPJ8)QrB1IJ3C*8H#G42
@H[h#ZbG0$#2T8U#!aNp*FVR8Fr@@G6M(EL0!,YpSBFkMpBh1-mGMU(QYlP008hI
'2(`V@hriYjLhKbj!@N"ckNhlGDkjp6lrShmKi$lfdehbhc[LPNMC)`4pajh*h6!
3[PGdSiGl""1JLVV+@"SkP-r*1Yd8)M1Q@da0d,@`Tm9H9*!!l+CfbTU1rFP*)F"
-&1C2C4FPe3`VQc@$E-m4)UT1@6eSE"J)aZDNV[e*-CmYh,Y81'h25!*&"J6+(c"
ZXZl`QRdAK&$I9,-Tqm04T-E[a"p@rIDa@*!!,DAH9E"39$KaSmqCpkkDVlME3!R
a-RZ!+X,!)@U*$D3q%'eA-5Y[*l-E@'&V98K)9B%%fHTJh10P[lZaRDX$9R8@6aZ
BL`$9FFDaIhQ+!ZEQaLrS,MZGLEk1$M*9KraG6V$$HA48CbKmjCcZFkK64iF#R6+
!BScfbcrqQ-$Xii('*KFD+`1X9k235Q%2XP6K#pVi%r(%`IB!DXl'(VTP"QiB6)j
kclFfHK$T4iFb[@TmHRr&9@&6L92MmDMAZqD3!*8hJ)YY*0#"cCqc2b%PbrN!GQk
5rbdabZ4d(l[)#V3+((r0,k3*k2eYL"5L8'1KjhbJq51C`12IkhHcJJA)K#j)e))
3UVfB'fSKEL*!Z,3"RDE3[Y90E@Uh#S5(rR,1c%k`hrTaj`dPQa8B&V6E8mGdha%
&SU*cb[AZh@'Z'rpN$SLVhG"5#(rMQmCfFb+FMChpEMX,bS-8131$!cH@1ad00-C
R+hSQ(MPMjFH'pq2VfMNe"A(G%9!a6B),IaD'Sl2b*0213mb'"+9fF1GX#Y4#EEP
r!BMZm`'CGMd[ELl1B*8d(,0KrRjeVdch3b#`N!$6@+MPM%%@PXc9GDb1"V$-r9"
TCF0JP'KDC`53!,Mhq@kHCECr(BGh0CC+JK2cLHUY+ekVh!DrGk@F1I9qCY'4qYF
2XY@1e1Z"dp`$8pS[#&RTk#S%kf`YV[p&RTcPC5@,"e,'BZFhL@GiCM$J*FEh`#Q
(GlkbIrrD`IlmB(HmKj-R-QATkpf2#cYIdQ,GHI0bS@%A%"A`HBBFjd5)S&lE@MK
j`C!!2+jfjCK"aa1%aJ&hG(@lFd"0V)+N8"AAeSH6a"DQPipBXJCP6R9-)MCrU*!
!hDDGDM#b3[rem'iEF,NPj$Icc`,-qEXCdlr,Q1PDJahj#Vck!C+D+C6Y`%jR&jC
a'c[@(JGBJ!(Q9a`CU6aI1cBUE&QJD-HYUS(kc3C$*CN9VJV!'KP-#eIdTrX&[b5
Ir(MQL81NLC8UXiBHmAVJ,BNkk*)Ec4U23Y"fK0ce+Mp0QAF8Ai00Lar4H83e1aq
pTTP5#'SaTb+D*!SU'QYp2[j61I2D4!YDpr[dH+qM8&BM8%'hibIb*&A$"('#$hj
8Bc&FP!eKI@6[+1pIMT`ErZFJ0Vf%4rBaBGH-,+L`HUY3-VMp9a4iD!%2IrI5#4*
H`8cGp,CpC1G$'198SPMl`4$DER8*9Hl8M6Z*eMrBm#&a*8hjK%iCXS*4lQZYBbm
Z5hA*2,Mf4bkd1*')f@eU5494M3AcQ*C'BXL-'i")f,`P65KR+$rJ(U*bI)LGR3Q
Y*bDGi#l5VaK-[l#(@Te93N1&8$&[qPlG[@jj64P#9S3SFe4MDK!8&A)NaFB,pfd
6Sp(%6Z1&Daikraapr`Y)R'@80U)MIP#Ri81ck9+`XNlNhpa6Y)6USLLLBa8fL!3
0mB6@f*dFY-lP1AA+IL-L''QT2GTY1h#4hcf6@!0jVf%PE9#1AFeDKeSa`YV'X5F
%IDIME1XX!cp"K`GQj%FiB4l0U$[J+V'BYY&'d%(UCG)0P'!CB+)RLYr9h2acYah
IfG&MNP$KjD(3MZRS#j&9C5(SI4"N+"&R@#*m4,9[Tr100Z4+Paa-B$&R,6kiNjT
&1a*kGAeilSN%`M8EQDCJ3U5r3X0b1#%CDL"de!dUB2)fJGf12mP,V1&rVZF$M5[
$f'f68Mh@'cI9-kqYKNmF"([IVei#!-%K6qHXjDRSKeTdU$&Qi%'Q@KTjF9CZ52F
(hi0p'pc9bH%&1`b"[2lr%8!!3`DRSMRE!qhc'kK`dIAYX2%!XeaK)D`-"3Dch"H
j#Sml!cG`Sr,P"DV@LA9C'ij(2BDq1LQ&#&f`2&B[QQa&KIaiZh50+E8RC65%TdJ
b6$DjA)cJla3(AIj4"i)$+VP%L`8)qA#8R2piQ+mDP4DE`RRZJb@GS@%A6S`TbKY
mQ4#cf-+3!0CUa1`)XV9TI+SpRQSZ1Tjl'6B5Dc+@dcqTZ1"kZHhfjB4jZAiF3CZ
rYra(X68PHpDXIpLYN!!EGEdiKPG[UTEaFG,[rVHb1AQrXI[+CKU6Gk+`&c-**[U
b$el9h*iZLdF%R8ZUaE6Nr,IVpbmbhSrT2JH5CCMH%HTNqVbUc,LEl'"9NAP$!pm
R,RmhC!C(&G0D&M[Jq53aAXRT`m$Q2G()A5el8mEF"e(HS[GE[6MV4XP@)N8'[!c
8LRU4(cDN)2JK*LQ$$GpXQYVp-LUFVUV'refBcr4eVK*kRVaejlTXFJP*m5SeYh)
K`-QPhBT&6Mk8h[N&rFJMB0V62#i"Vj!!IPV-8@e&P[jIfe4A(fpJ++m(l)")%)4
F!XDQ#SS%Z53"aImD,a,T&hfS[ZeLK13dDSjCJAUQ#"m)#@B$Xi96cbppUhhU#5)
hhJaV2hHe2$fS%f@`L))"`fZTN!$X9DVUYc3`DNqa$d2#KTSJ%`,lFP39HT!!(FU
6Ni'%d5J5bf98C-pIIC4lbAS!bTHFRAqDNC8%d"j8LX,BJc5BCXb+#ZXpJNi2TbX
ie5%4'8Z$9))B-*42DNM&L3H,c*ah#cad0Ea#4UU+6lLmZA-YEbV-jFf6Y@1Y1p@
+dqUI%'arkRQc8C@rVl!CFfqh'!h!pQ#SQ&SD)A3$fl`!)f9+5qidVZjcGE%GH#q
%I'`J)9&Gf5Q2HBG$P@lLfmF4l2I`!),N18qB!e98)fH4642b)r1SPK`bSBhi0A@
3!*Vh$EZdrPNYU%`0UCUm@ULDEPXh)a0Y(T+Ki$`3N!$4K*bScI*'-U@S3@),YRP
%RY8Pj,192VYDe,CClCPk[4bhcP@UZlARcb'1S[CZiUp3G8B59rif+c8eleURS@m
I*IpDMk,*aZ5VM,d1dU!-p+3X6T-#Tkem)[TC"k&hh1F!ciG*#D'Z+VEFJ8mrLAp
Pk5#M'*8b+ah'0QAQ3VmUm(Ua9V5%aIA$0e`FASLH8PGK8H%c+MHhqUa5`FFL+c1
D#X3'`5[[adQd+j0c8$2f53Y+Q)HKi+d[hEAE)d-iBcX#N!"lG6b+NrkZ$ilYGdm
j8SYQ-U[5jN"l)0m-T-U@3aE8I*F1"2mf6Pb`l#ND"DGVCa#108R%Yr$)!jG9A2N
GIaF)'1RX0S"2`p(***b6r'jV[YfX5hc56#T-m%%JfI%D+29VlhHEYlimFXVCRLT
U''qbiVUR826HNR2iT@PU5B2j-ZA%Ek&*AH`Bi,+QjJP*J)0)Y%$"r#fY%288Fk6
pXa+6!9jNA#f+1#!0fVX%8jHk-4IpILDHB(TM9",'4XA!6&`E'C@f!!Dm(V&SYeZ
MVdd!(i+jc+60J(pHkFiL#bL6(r$d#kP"Tc8d`56%aS#3!2&Kl[L)KZZhjG-4e#e
5XVl9bl2lDell2G'T-Ycl6I@"piFYqm5PpiJ%UK$dE1&6+MFT%a$p+LVQP&)cJr@
%E@Cramc+J6B9[SjhaAq*Bp0Hr(1Pp[GYJFi89qBp,l8p*hGR)m%Yk@JHkQH0JeX
9!pJLU[MCb@R)G4aX1ZiVpRDf25p4&"9k)Ba,9rkebkfp("![[iJb"r5$S,eGHU$
3!(br0@+V"lCc#(l'&bma,!KceQ&dUF9Q[DfT!rR(fJT%Me3XQJ@ZV*q(U-"X8S8
Kbk4K*Z-[Nk4XQ,l2#%Dp9P"9#'Z1i@krV,`c"`pd+Qq(2K@Q+`jEqV18q(`PClr
KZ+)%0B6YQF02D9ZMNa98)jrmjS&`p6KVpbqcC[)Nc"KAQH5YiZ&krb"[""GpM%)
qJ!,jm6NGeTJm8DM85Vbf(C88"lI,RZr-1S0,MlFqPQV$a3['bb6448MXJA2'S+6
%2mKl$X"bD@Qe*K"HekXi05mcR,))K%le*k`*6ShA'BbIdlM-[K'2Y%'6,%r-cPG
8Y@GcLBfI,I-pURYK3G039K6@J@FCdDZX$!T)bA$G`EY65mYQ(jU&-f!mcrF#,JA
HLf6`P6qFIh@(*`[$#2ZrAERGfUVD8cX"!*phNrGm2'(JQPlCdH"k+P8(+!CH#cY
%i9PI0LhqV,iE%I$GN4BH-*i!Y8,(KrYr5Y2F$T)kTc"'c@j)$M,)d"@2i6Q6FB$
Q%%`D!)HdDf6b,D%2dNA3#ZRM$e,k-$PY2bLb1$$KF(5qBVVrbS#aIb4CJNiAMSa
*Nba(-kQhH493`jQ8j0$Y-3bf6d@e'$8(D!iZ#Hf((PdJjP+ZUai)U'N@+*l2`QC
!@Ih5Ec-h*TeKf"kfFGfSd10,C`c*I0iKb&QLc`BDZQ83FBH#Uk,-A4p!h4cNI`P
"c3Rb16BDTeiT66ZH$IDpY51"@b,Df!NB42)(9+Vrlm[Sk@@(VjE+L@pfZdZVPGV
PUGH"0A*(rqCm2BGZe4&Gk231k&%DcGCqS1mGal$e'qB%+-5GClN(IFfHQTL1l3R
l"f43RXJU%"pqC6NpG3i!k2Q&'`4mip1!8UVHQGRhMCcVchamXrRCdGlD'H#0U$Q
'2%&SFRK9J[p`LI'0iKf@"`GG92bTZi(Gc1Yh,QHjk91RrjRAP2Z)jK3-kTYQV`&
fk08K3L6q`mVdjUUJ8VN+(M`ES-K6F+L+UQ!Q"N'A2Y(E`d586-#'1JP('9-lJC@
Q@"KKEeAST*fL--kS29)V(Z$!b)1RE6a[DlmFJ#cf'!hE*N9I1JHPBTHCrCc!50V
Heqi-NV0YFE4Ql853!"U%-,G@RM$fcYCA-XlfXSJVVc,P,PlqUZ!H)'$!lf)TYc#
F"bV$KX#4RFVmG3hY4`3'&4LelX"d9,,iYp%!*+0#$'NY@VD&@r4,F$6,*-+$RBi
P32mh@Cbp!2h1BrK*aL#Gl@*j"[Gm'bd4i-*lq!QF,B6LHBGTdHTlRTrB(d(ma-E
@*RE6#5TIB0a!Rp4&+5T,AEm0@!f,U5"D0ZdHpTEhACC'p3aHeP#Tm0q%X(hm+"C
@&FX+4Hpp6U&jAXTU0UY5P0m@lJCabqN1f1Ep&)SHrKMrU1mCF5fleMS24-Q-Uc+
%Z'D'b)ciCLZ)-[LFS3GmmAB#T'@ed9DTEqfT0P[U1M)J'mcJUp`CFH#*6j3NFX!
$Pcdm4YKlc)49clSJ@"Fr#DR(CdhD(l,1I`JXY-D#PC0+##M6!HjZ,fC,$6P`BDT
)3hPiiBYaeF,PB#"'a(*A2+F4r)ah*TS!bHBJcA#XrR#E#bb-M(pVh'1@5#LZ)+!
l$4eZTlk&1RNRNb#+ebaCc$FQ8mATIpa(X$cZS**qIdi5LUdB*MU!1ahP4Ve&'-'
RD9j!KC!!`3IA11kSLLpAVk*plF&lBZZc6-66i9E%!@@(3c)iPh*FGFQX'!qbf!Y
"'!0mpFpL#1b@UVQFHL`$PjM06+ACN!"V9ir99fj4-+6d-fm22A8mT#5IL@Q%lMc
miQXU,H-eXB6XKEb9b)+[&KlpH11Irfh(#YUlTXF@8f9Hqlm@fdDMbmZ#3A*!3q`
#aVDpZ$)YRAdB-$BMh0L-i`NljpdH+dl+$1Q)")Am&PbC1d8p-l2+MLRB8UEU+q8
p'6M`$eX3iV!i3,%U(j-kB@1q1FIE#pL$fAa(c3V@PN)GbXhbY)NSIeAk&eq'E6i
f1iL!1"R@UM+Q*G"kNBEj62[UZiUaC(1MdHRGF(q"rYrP46`PA9CJ#qP50pba3`q
kqCXN01'"6pE[m@"--&S*B`CS+kL$'f+F"P[ce)m%a2(3P6mcf(MHj3k%S!JSpCG
1jRcQ9aV2f"P%,eHPab%)ZIB86$k*'6@`EEP,c(96$dplQA%!BMbrf$E5iN5MML,
3fI[![BCVEYJPChY3YBDE1q*bUMk3!$*VD1*E$DAUU`)k8GcHTPY,`A-"LQQX$dZ
mV&F@CMN(Tlf!H[TZ1K6ibh*9eQYFI1kVKG0+C0+0FlV4'DUcD2!3'dB-cK%8da5
@TTpd$42a8f2"R%l0LaFE6+eEK1`+IKTaPJU-HF2f`TPV6em!-af6LZ@BRCUMh`@
Yq,d@NmPk,ke@BSACbEe,b8Rj3)hMaXZHf4QQ`Nq9Qj*)-I,JDJD3!,iAb1iL902
f#GUj%Zb"d&5@IQq-eM9qGL*%"QNlQVe-f[U%D*JQllH('1FXR-B3UK3FJkUJTY$
ZQ2`&+"V`0J')2#kimmIkXcQimMr%QPHb0q(8(3A)K1c"JU+UEM2jqDfB(@8)D!4
mQjYA)q36BGVciZVC+PGPUMBR`rKHHj*Q3TZIq-FKbI8%GMpZkQKVP2FppHCY6XX
6Th@%15ci0aZ'"$a-044AhImebJ$YDb-$T&Rf*EZbHrYBFM")#kYl5M[F4+r&L"N
Ge!b5MMTEDJ-,cQ$(bF2C*JVAH%IDqhT0FE5Y%AfUY*HkelJBM,bJ2#EK(5EJrVP
3XF3RH2SC6+&rYl%pm)19P%B3aUb)PY31A&ZaXZR+D(!A[-i46SN2emSR"dQIFU5
,E(Cifq,rXS#-VH(b,N$)kHH9SS9ii(D1(ac9mCLr1q["8!5fQq)eL`4JckkC4%&
!VVd[ZD#%bTkSLGi3dMXB2U$deC9Ua54I1R*VV%6d("J*0h&(hf$j`NfEG%6e#Cf
"4jYJZ*8DEeXlaCG`(,hEAMhm1hXY3$bcFDGBpp[e8e,QFD163I&*bL0%M#@jQh"
6F`*5MVVJZI5$Ik`lX,d'99M)YUIkEd%5bV+Pd(lk#2@YC3[@6EN@a%RK-4US-VY
VUNb"M'Qbk@Y(XX%[U%48iI[d&p`r"X[2IUNl-cmrN!$Z[e36DdJdXpbNkHrqCjJ
rrG4),E!(51"66MfeJh52*aJ)[N93i*9C`c5HN!$c1Dr84jKTbT-K!#QUXp%3-G0
[h4c0f4"mYMY0Y8-)3KXS0aIL9QlfTBhmd5$)9EYSSm-r#jN&-FC6fi*CS1i*YF&
FUE8`$a*Ba!1(PdBFZp3LiaPb`1mPqh@m$j(QefPJLBY5Zj3!NLqj6G-jJ"&XX"3
0`6!Pc52rC(Y2Y$L@H8Bjbfl`d(qL1ri#QQY-4P5G$f1Z80F+[Ih*Vc5LhH4$2Y#
9L1'64rL'M8hMfV$`iaD'd2F0NhiHXER(N9"e'$!d+N'T[eUB[ShXjB9@,RPe6kS
jkVp9%D+kA(&C,Lj8QPcU`m20Ie#133bL-m)CBJ5L*J1$D[c,K%#CS,@1!aTQ&+"
AB`SYT9HBF,$QZ*M3Gl"[4&K8lCBpE[+66"BLrTjb[HGZ$3S1%(DdkB-iF()$6@c
HUlddk3*Y%cd%!!1+f[8Cd&N[aMM[9h@$hkPiqeH2+r@jQ!`CcKmA2EBl8Emf#J0
16TLV`TURKZMSNF&SP6Nh`Hp5-#Se`eNSj4P)i!`I')j%V"3m&eb5+@H&6d&2c2F
)FMa$4`23+Pi*l[S2*RJHcNj`4J5j(KLl`il1CiPTa!SF'K[KeQeUa(h"Q#,@,-`
2ZMBV3EBDQpI0EpB,pe1i)"9j4F'rTSeJL4LcC#&KTjlPDLb)pS-V54D2ITBPVPQ
N5@mq,CZ'FSdFlQXBN326XSb[BTG0DC0ViaE3HB`i"qmJ`[&E8T4LrA9LkMVebG#
*$NMb3kqTcAK40k24Ic0m*@8lZ1)9Z5R+[XU+HC@2JU'Z(QSDVr[b@1,!B6a0#Ip
`cLDVB$0$S-*(DB(1QR2j30MiANC$`BC03GLVE&Kl!'"e+e9k-e*'CG@6VJrIl0!
V'Ge''hQ!,D%5X'V"5IE+P!V"5DICq&d&d,6D(,*,5,kPA(c8SK2P0MYdB4,Cf*[
GSh`%Y5N2)&[8Y3*Q@rCcPAUc#Y1cAGee+CK6"22@MN"cdDX6j&QXDEl,`d@S"RP
pCP!l8&S"CBJq[bZQi"paZNAi+Pdj9!LmljkQef2[PY,09$l(&)E6CM[SAQj!,@$
F*[Xj2BJK8KK[8F9jcZ5iKEP#j(hEk12dlRF"M'A!SaGHq60*RF+1$!qeUbcL++k
$NZfFVDd6V6YYe0UZ#c6$bMXP8i-NZ2AGS&Q6c9&q1QYIXqfE['-kc0'09F0Bl'a
48(M`Ihf@cl-(PX5,STGmjZ6#[C-MSdEkA'm%IM'[4DI9&Pb0S54I1H$aJe+8[[2
YMR*Gm#b5bRmUEfS,I8(YU`%5V+J#d)YSG""Zp'Y4`+YJq2Cq-Crcp%Uji`VNmlh
'X%Im)#N0JpS`hXlFY$Eb5QiFlX%9&iZ++BJ&CdBAbrBH5abPAZMT*ZQXH2ml,CA
QE1h&MF"QDHZ$ii8TqZAXE1kC1$&i4fR5JAP5EF*j+V,2Bkai4A[a6Sc$+r+j9ef
e4PQ)D,d3l)aeV+Li-ikDcq6'K@)[5["B1[3BP3hiEdJT),M3i+8Cf9MfB(Mh)QL
1GN8[!1FLHYdG5V%@N`U83+j,),jEGahCf`lqr,E6JjK$BE3CYr8qcalSiG#NBf3
!XELMq!U"e0HPYpP8"cLk*iTbllE[$LDmDi1p8rlK'jY9@ES4m1-I9BkrpDJaKHQ
HlXHNZ"DH$T1"a*ARkjd5-lfFr9U@d$ST`VHi@kihfY6pe''iA"ERcE$J-*4XF8p
DF!$F*C0BJe%i&Ep*5#4+ZEbabb9@lY!2%SM[G[fC1NTQSBT&L1rbqGSaU@M[0jr
VG%aJf%['0*BGDA8(C!RA'k8VYTP+QGrHXPXMLr0'H"@K%jLph(XCjfX,JVMJ0PB
`M4k(HB$21kp)K+3c5Ze6#p1d0U!9JpY@"9b%-$J`,i`'a"U`L%5E*08M&2J1rUq
M5PMHLRbldEEJ%$jH@D3!)alHjVTF43T!8!4cqJ'-[a+L&hb0INc$)P2&S'I,UQ@
0[HZ128+qI,Gk+iAef!(b$RqcB2VF-JfaMjDMipe["#B)*a08b#i#!9ir)-*h$P*
"`cANV-*erJ0jk)jl"B8iHJjpJEjbJ4@YRhQMF9%9b+A[RfFYh[pA"aSJYBK#"J'
T`,(,j"c4#rM&f@#DK4B)@F2!iJHmE@5j,H15,CHUC89FC$h&AE%NJ4iph'f0,UJ
H2[%`,iF2V$[b*Z4+fU!K!LbB,UN)!+@3"!%!!$m!!,5KSlDh!al-!!!JY3!!K-m
!N!21!!q@%!!&*98!!%AF!*!%$`"8Bfa-D@*bBA*TCA-Zci!!!%#b68e3FN0A588
"!2q3"!#3#S"`!*!'3X(9&S(3%pJ,JrR3lUbT4H'R$MeND'E1Nm%f4Z11Xpb#i#K
G356)GE+bb+*@@V)Y--!X6-`Nb2VHFJ9I%dlHe[8TrLe*D&@8h1BI$'A$XC&Sf"@
(,4"$qHkTAb[fKirA9eFC365P'&D96hQ"aPq8N!"&,PbJG"be963G`HcQk8R5k#J
290!j%0A502pf$XP$5T4Dm8,[SRlqX#5P#5cVBYdVMrIRrA$$c3G,M3)e2,a$8K)
X5$'-N!!C$I9CBpU)fYa4IaEHc6M,V5-,IB`[*i!H9V%*Z-2TbF(FDETIpV6JZIH
Rbdm"TS``p!U@TDUZ1R`",4acYC-2XRmN1*YZX"QR2#AG[MfKKMEMX`UDqD1E1ca
J4l#ihlDVS@mi8*l@R+Vr)3e"m'mNYD4`-Ihc1`+BZ!dlk9XKi)13!$"-h3XJZqm
3Mi$9X,2fJ*0eVU4TAi@h%)Tp!$,'SB"J(BG'P5Ni@V+FX*ja`H!UREL$8$25j4c
ZJk[#b68rd%C@D'I+@p"%UV`'S&&EQ,!BP5DC+`[M9*GiPTSCVq0'Z$$$`&L@'cr
cK*Bbb3crpH!#eeH*&$jIAVa0[+h5RZBT2P4*S5Am*2Xm0(c`*rIR),*F#mQmc#[
Va"JF5+L[LPfA0mmH,EFmYH+q#R8(94$XX$T(4!J&39N8Q5P#S2h)Qp3Tb358S1j
ZC&1X5A,,d&cfPp4KZXp+9J`Cc#B(+CpIREJ3)#51"SHdeaS9-#!H"F`F9B6MhM2
(Gb(DXZbZI'E5Z*H@9)#)pk+5E8i-+f$+)er@Pp2JdfaMa,BaGA5FC)LEEXNb`1b
#Ej[8+HS"Lph[3lAEB"IN8lS'm-T*Kp3&2q#Z#fNlbBjhr2fV+`L3!0E5I2c"0%2
kXF0F9Sbe1A[I6M0r3aQ*IFdbJ$F$ZH3"Z(Km2[CCP$fE5bU8M#`m#Ta),*I(aXm
%jP*I5#Qp6qGkSebQ@-mC`9VTqY*i0HDj"$YPF2MA1(VbC4f(GX,*c'hZke$[5Ch
fSCX@"(RRCTk,K@Q+L&(TSr39Yq#c6+fMpB(XQ$PMljVqEI[-X3Br'@S(0E[MK+-
cFpUfb)c*-cEe[0dqYQj&JS'4T-mjNKmA+P+UZaJ3C"j4i!J$8fchP!**2MaPp6U
p#@1Ui!I$c#THD*a9b1B$$'B6TYXRF+&lkh)-p-k5d0TaRc)Rm'22l3&-SM*fjP4
9J[5A@Xa*IEK'S51'*fr6N!!e5!3*Q*DJ*[FGJUT39JkS6S$9m+j%E6q`FB0%-8e
N"@#q-cE&P*a@iQR-L9mIMEh'!M5%Sa'[-a040pFba[ar@-"l-FGpHkGU#qAdClE
!kV!&%#,MMcN%&-6LAlVA@M(SMdE0JV4Mjp%rppehcjIe$qHB6rT,KApH9L0j-*H
',a!rQe%p#J[4+bUTZL(q-RQGRmP94Q"IU@am4BlY,+"i-XKdij,0AL(3lYjZeII
YN4!CGP)5cYj'1TBA(TYQ&Z1j)mAM5ar4%MjYqd'HXYHFLRY9+Y["Q-D05bGYfTR
Jj0ET(2%9Pf*fic#pJQl8#cHI"rj'0ppBSLQ`jAV)bF,2hM#TM8bk"QBh8`p+Jj!
!hCU9qII2D@VXM-3NER6VX[pdd-dajc,lfGX'SQ!fHZN9p-EC13%@$Y6NJ6EMGGU
LEl%lXBMlB)bA,!5I,Kf$GSXMGf-31QeNcJUqT&jhLF1M9Xelf)%jAC6LSiN&TL3
9TLjZ(Ea6QIhYBKiI"aYJq`9L'3Q%'d(d0Z0!SfU5P#'K8RA-86RUdFX@#ENX-TR
Z'KkKc+JN[0ek!`T%@1EdFKSRTMeqrJ,LP*K+Vk9V#-R$b*m3l(6*rMXY58c9U[C
J"&rUX"fVm#H-bdJ"J3i&UZYBbC!!&Hl3Tb(pq31X+@qU63@rJGKKeKDb`82aIYf
84ST#5fS2MD[4QhI-%m%8hm$TcpUh'`Cm9$5k2G#cY4cqEeBaR6cjXZqR00&b0Af
)G4IB%Kp!$8[-9I`UmbfFk(M#3hiFj0P8Fb0MUh,M@9T3"c8@R('rfhiCi"RNpQY
,E$0dR1I0,V-mBfkRR(CC16mNQd'pN@MiP[b1ITbkJ+EHiHBeTK"ah&2jHDPS&h,
bSM&@QpIfSAP5bN&'C3QHSY(iJ(6!K&#(9C(VKi111CNf9&f2*2VhNMpH0eJSb,a
p(6*VT*!!R$TM8ESGN!"IKm)BXS(&6BlC1L[93jVk5)H4X!DVR$"+$Q$[*EeR8fm
h'i!3HMZ-kJQj*,E&,"mH0#-aS@c2434,SGr5V5$j"%TpI6l0"`SbCHdVkh9(ac6
F8jTI[&[J`b'Ue%4Dr(#Ji``[i[ZNjSIIXC!!2+)LT3l5*BeLPeq*Bm[3b(Z9ppi
hAb+jcTl"9m1@D**X+6C5ZG+@ZAXl1e$X(TaAJfp4L01(jK,(A&X2bJ[2Z9fGLQ"
cb"6k@G4h-N+&!jJh0j%ImYPjUTKHAUhjkK@eG'p5VerSA)5(TX,lC&I(41-mVE,
FECL')eJEkJH$f-ShMU5cCCL`R5RSGB9U0cEBI9k8Kf+$DN3&"8LSG4MjjdBb["8
&XhcifNNEFFql0+84CFCZMF2JX8*F%6B)S)Fj1)GG@"%9iPV18Tib&XGc0X0$$4i
@3D2frkX-L5@jm-1Tbqr2T%#i9AJ$hNGD2djkUkS!r1#d3MSDk[6kS#1Q'T@[')&
LbJEeT@jZ&&29DCVXf*XTCSE9H4Db`0iC-3K4FMkFBC,emab[DRU$SBeMdT-SR&2
aDa!ZSi4qGMAK"XYh"N,@cLS*PF`3Lh&I0q*S#4j%hh,3SpC8bbJ%15160l1k*!@
("Jc29RkEFU)D$aCbah1%QBMMh+TjlSKb[(hYerI$MpKe8iR%LDHqZmcdEJPR-%G
RN5N4ILk-%@(JQ@R8fj83IkhSq69T50J9&Z2j!@&RC*50h+T@i9&[B8C(HUQ[-$E
DBQ3mNf#NiSMc9mkD6dl682PLd"c%BQm"*qC`&@3XjpURf9TfeR1p#KkFLQm6Qj*
ejPS6lFDHKB%UCZ&Mpjc%(HAX`e8#B'ET,qEr@G,23E9SrL@fpJ2hB9QGUd+'Y,b
Hf-5l!peI4UIblf@6A!DEe,M2iUd&3rJHcd2LLIQppdp9KpJGT3T!Lj64fM[eST6
Yic26Mf3GIq"S#@Gl()9L*8J"RCN1%6DCq8B[69NcEH+2jG#SdpBk@6+)L)aRQpj
)3V5h6iZAAhGp331cpZ4Z,mI4CR&rQj3qB"KhG#fJ[9bVlB65TY!KY"E`FMTcl20
,H[2Pj03r$)mGYR[KS%'*h[Ve6L(b@Kjq4#SD2#p"-(%JJE`YNGal$D9bHllV0PP
4`1q@JIGaE0MiSLI'lC[90r3mc@[Y%bM'h2'qSl#(52r0)(PP&H61($)VZBLEeh4
&jBV"3GKi-43i2E("f6Himh)CB&h15BNG4F$d5FI'jam$pdK)QK8YUqI$cMDA[#X
a%9TSfJD2ZhGC&`cXCqJ8GHD$[#*&0)&*DHM#i$*%r%%'kYP#T$*rRLm!JU0p&fM
rm3)@F+p@,9r$8qS*-pmQLN$FE,8Ic6a9i`IhaCY*G5P5*FShPb58pTCH(rMQiR6
VFe3Q5U1jTi9XP6EY(V+@8`LP#8&9dIAb@K6Napea1,2&G1L8'4Ta)V%JZcZ"IM+
bc2'jmfJrrBqQY0jE5`2)Q!)KcUJZ8KMYp5CNP4Xh)CrpV6A-E3CL1H,Saq-VqGi
G*GbU`8"lSL35j,6&Yq@6(%MFd5k%KccK#5GLNEbjZSS90('3!"eMiK4YK)!#Xh[
%b3-c)rGC(+c#FH%MkATLZ"SXD,XAfl9jDF0SLDB15@UdrY-9ClV#*[6+bp&,3'P
9R%hiVmE,"T%'qH8e"DPbr12&cNP'RV8!@ZVPkb6[Mlm8Je1,kjNE'qB&Giqd,fm
E)lD4GV&iQ$`3UFhG*YEKGjH(he8fD(+eBJN6ZBCGkpch48VbbL9S,BbcBR8(jZ6
T-9p05H("1(LceEY@A+$N`k["#EklE#P6dc8j0r13!$#d"@Aj6A2LR8l3al-SJQm
k`qG)&R31mRJjMhhi6E"*)Fi)J02Tjc"H2K'KbrM#I6p`NUD'cl9X,S40N4d-qSX
MI(HQ,Q6I-d('D[GXdJ8b5YMhJMQE,!4XhGp0%-liUDG$EX8U)HHd%4QMGk9'QRc
5'Fd0ha+#c2"p'h%$!E0I"(8U0TDUq'1Jd8+N0j,CJ0i4jRakr$-`U0F"MbcEI0*
(e2qrbX6B3m!Z)@ppfh,rUh$@$YchXlDZ,9hfMGH,"H6@29iT[cCFlRlA+9mUTcG
'#aRJI[Klll`%,+0!(4Gh#$hc!QF[Cep'+cb'Y6mrHG!HTD2ml$L16'YBCBqFQbL
'p%RHU8pij`M-L+FdQmpeSTBrY5B*JAj+),2Q"*!!IiK+K[RX2L[K-((`'TNbjSe
``UlKMK%ZSG%8lVQV%TF'U$QGkZC"LeSIf0Z2q5`)@pml%h2$,mArJ"q06m%M[re
e"P,*Q9E5C`j5hk3UrLYpYkJ4TL!YPPEQ&I66!,&fM)BA`m[38qf&Y"P,aUaqeEr
T`[(VGAG@S+0Y'Fe)`JIhdJjXZ``Z-DUk!icK+26E5NV)#R*ci5QNN!")3FVQN!"
!C0)hM-a6LFeh$H9PV5S`Pp2MQ$PM$-efkH9G6+0jdfScDX(PMbK8QPD5HhRbhce
UhXpAJ'9k[9DV5Pk)55rmMT+Z+($(A-PA+%%+(VX)Pp0Cm"NmmplYbX!c2GMdHJq
9YV$GGTFTq&CZ1QUaZHSTL6pj,+j-LkU+l!2aj+@U!-[[,B$C#9clV$mIEVLJ@E2
$1T'90#*p$(F$RL4jliiaNJ44'ab+PZB&9lVH-@FLde2SQEMeD(c60*01F*%P*@N
6c@e'apH50+3B(&l(`0Qk(2&APAZk$Z6ZI&Sa+EZFe61CQ9(KIf"3UiZ%fYTN*A1
m5+*%kcMVjeeP1)Uhqfj9IRe5YT!!8YE$8ka(QYR-KSZ`Zfbdfac'$PZ,MK)PVVi
*8qUhG%4Y9GYRdaA)EAESR`HI5Pi#(cm2MefI-pLjqq,'eXCMMBiSAP)I*jAVe2V
2Y64Hm`j*RFhG*YIEE"@%G[q$kDP"TcAiJKrXhfalc2#iD!$)PH$'89h%44'TfHA
4PTNkHcG5(,,f%@4C'aZUVEl0@e`UPH'%d`U%["qFimGAKX(PViSMKQEmK5(CmDC
Xp*a$EiKGHjQdG20JJ*U'GFri'+4!%ZKmQ[G&T$HFAMHdfPE6kDS8`k0J,5*#1dA
43bF`G(ahGj`FjBY$0Yd9Y9`KUT-SEk1rK(M9aR3(YLXdGi)jX(ZL3Jk&TLmfi&%
pbM%'i483[RBbEA82fcX6)ALb"F,0@C'$`[2PPd(&L'8N#D9`i6NCqPZZ$YcTp)0
k`jQ`H4$i%*PlTGMJN!$Xb4&k4MVY8m1K5NZE,hYaLQR@+C@(b[Q8-AX*kaIb!8k
8Y$Eq'$"H8rG5R0CR8r9GXLjc-(U9-QPGEkFJNZVD$i&3c"VAR'dfEPE`P[hH&m0
,FAfSjYdPb@mVmf(Hh2F*cK1e[eIVpMULCIqic#FSbK,DI`Y'ifp(me1Z10&mqRa
lphaBI8HH9Jj8dGheU$arU-KI%rkffrh@pb94`,G`$31J1R!J-E3HJRU6XS#)8Dl
8Rh`1e1(0*(2M%0ri!3!bJ2+h16G1918JX3f8rdfViE4epr8H'PNiJciS3c*&C[p
l8jbFP`f$U#LT&F4alDh#NMaJa'CJm`)[G3HcXU['DX!FL`CZdEl-3IdXN!#&hXZ
,FNPDdDd0VYmTY+,k#(l!@YbFbV$T'dS4pcPR3jm6"GL#@))9(ji'(%fYibbTVp(
F,h9*aa2Z2KSY-N(VEiaaHbZ"Q4X[PXQqZBJa4KPk[id85AmEN!$b%,q1flcai[3
"ZIQdr+T,`cLiXlV44Jrbi2)UFUSPqRk'#j0fBqKP,fZkDbr6lFU('+V-,%1N%Nl
C(SKpf'3AG*G"+E)cDi8RZd4qDY#Y-ATI-BUqeeEE(NL)38Arfkh2,0#DE83JH"D
VZjUY1(6,0fV,b$cAmbr'qPr!&3&0PU'GHlZB&kCe[AD3!'VrUe0YrrA"r1[9Xj8
J*L)d)jkpIV6QkI#4#"hVT,[Ip)m8lre1-M6FiS#1Ndr82#)X2cm0`0#frdA1M2f
E4UXHI0FC-ZIc19rI'!McD"r-mX#P5(`F`EN(PRrTG@)YTD2,RhT%pp@6ZF5E+JX
[kjcRPfriJQm+EiCN,0bkVkNip-8h+%3E$Be1C9fX8m[B$Ya$r,jD`a6DcB!!cPk
Cp"5-91AQ'kk2%pJF!MLXlVP3K[Nfb53M9"[`C)DZ`YTfQ#F6Yq48p50hk2Q!M[I
pF,#!##ElhHcQ-F$dHK@Ld"p!eYeUY@%#qA*#k#RQUK)5X$dLrk`A6h)IZA-Grr4
Ph!-F[3h!j8f#0h3FDK3U""MMDfTpje6Jkq4LLA``59aLLCGDLQ3[&kP#6VSd#R!
ZG96m$-"MX21Bf"*ECY+$$&dZfdQML8b!c[9G,'!5i+kc1C[HLS*9HEK&UVUS"*Q
6-IIDiZ)%fXDbTF"6ACG`-mX'8m6QFrk"+P9#L(eeBAbECINYB%aPTqGR[I*$5H*
4,JMdd-fm8[Ei!XmQRXfUJ$ihd@1`MN9iECP[50r"[$$NhB&r(+a3NR$B1%aGlLc
r[p[YMf+-&+p30CUYIpBCb'2R'flT*4JJ4$fK-V@G@AXXT!b1DTMrD9"[1C8Eq,9
9L25&"fbSA5dLhK14+(XIcTD0*'XE(Pjq1QLMAr4PGp%bCV8YCrIL+EGh8fLFqZ8
83`pmmRc$e28'SiRa#q5E)3jlc$jcXLICmp)XJVNM-GGl-DfmK6A%Jq!%0l$%8M[
XHbQjP!`&rEi1NNJ9C%p9`hHeZVL-`3K`JM)l%-1V3rqdH`i#bLlaEM!LKc+!Xar
l'"C@Q&(fhCXSVBDicT!!$c[1+dN5PIQPM85Ml29j9f,N1DT,!DPAMY,X@aN@Dim
r!ZdU"Pl"99GBpXLN"Ulqre1@-9bBPf05AlBMI&)m[U#PSh5KcN2NDPpra%Ed@UD
kEVH-+93+JN6-N!#YZ&@!AfTjk'VeCVFF3P(LkeRpVq`PA)rE39BLUplI4mXE6HJ
bIJafVMY!m+p)p@eIXb0qD3eIA&*h+cmZhU#!+"8()*5+JiJp%5X!XA3ea#rER`A
CAhC3[2h9['I(p0J'Y6`3'+JYc5eERlZffNNH0$lb#Y)KB-D,PIc550efI8'2dpP
,2-86`aRm9Cq#pS,U5&-`-PeM1FQ%F+Ep&mlB1fdFC0Y54m6KVZ8!0rJFEl5Ce+,
8r$%Q+E+SZS0'!HFI*'fMX15P2AX%i*[T@Sa6%er%qm2``bhk'UX!Ee`f"QU$-31
lj@VdK2K8a'mf8!`%%8SjNCLVSfFB8cH)+J$ccUrMbc1#l8(UI8LKQDGDN!!RTAE
P`p,(K`8EDqLN)Ji(pCRSrcfD0YXE-B2dKZ6C&aL2I4fk)Qi!M5'8@JX)`p-J[I4
jM)K8m(Tm["MH!&SAD95d4JZ`*JJFP(k(SbYqPqmaZD4RZHCU'`3Q3pf)Y[-HK(Q
Lh)q-Q!GYma!)6r'p8%%H3c*T99Mqr'9Jj+'d3bLqr2FJX!90Y1'liR0dI4VR5D`
NV0)*eB*TYN6IVjeA9HZDE`RR*4pV2Y1rA``EfX1#UQRaRF#UacQXHhV`2$X$ZbN
hQNmfC`jM32lcqA"FEAdY(DA%r8f!%AMU#Gp(HV[GM%J!I'9KPr8Dd+Ca!QLNc6"
)GXFD3p+265-pJM%j*@HMqFE,e"S"DU5(c2'lAH,59YCjRjQX'l--CY6,"C)kJPh
&bCJXMNS+DMf"2bVT,Z4&T9LqHS6@rQ'c4Rb!+Dm(qD[I%65f4ki8Y@qPDFX9NRY
S`K('(B'SAY@*G9NE&XRJ4VTiBjMSYl`*dlYYlQj-bT8cK!,YF*-bKjS8FDN*I)3
ph!jrh@r4TKMP[$!2J`jfj+%cVJ)IiL6UC4*e'LFBB69mHdNM[L+8GFhfM-S,hS4
,@E6Y'6db"kM[+K0arY4hq!j*B#haEaX0Z@LU5PNAi["ZUjT5(,&RQ%hXB,Ucmk9
Eb'p*hi'TFHY+[B4hE"pHYcr4%pkh92P518LIZb3"cfmZ'5m$S`PT(0Nh"d!+"9C
iB6"T3'ZRC&)6m95$N4$#(2eY&UNPf@clA'PEVm9%!qV[pC2!I&rG3*!!A'+f*X0
I$,5@ji@EN`C2QBCq$S1SZPU#T4+V2@KZ&pKqNL*4i#Lp"JdG9fk+E+6X`8PJ2N8
l,XYLCKAC4kZh*NS1IQDhh21),D[-QX-AJQ-[[NHTRV2,5m8R9jPk-rK&d'ik@A`
iC-EVHd+P'a64R,bABL)FMjiR+i%VKZ1[36hUb[`fUpJ8`*`fDNdDU9,X-lAhEf9
N!LD+FqUa8@"F(*0-mRHUq*fq0V@bd9TL6CfYl)R`cV((D$X'&Z8ZrrJ9kfK6,l$
ULd6j9+!4iBjV*GCDXdPp'VXIFN`b0q`iTSfFR-2rQ2LeDU3@[U4l,qZ&%)QPqXh
[XX)@e3UNF8YD*!piGK'0jhZ$dS(YQ"r&I6CBMrV&(FmE%cKbCYI&VeRHK94bTC&
rPhPZd55'kTJ+b2%"&UHmM+a#8-5*d32PSc9j03+RmmEaMJS193%e$iQCJFUIqQE
@fG'Z6NAN@Jqci'-%9deA+lBVMG4%@mZKhXB[iAq,9GHCfh"Ql3CI`h6CTa)F8PE
X%p@H1J6"V'*+XlYp13aMpI&iNrXN(a%C49fV6HT@E26c,EGYjj!!@%U,HF2[H-[
mD&4PCT9PVK2MX65B'GBqHr(pJb8adqeF"Ul$)0heD*8-cAS4j2-KX'dQQ91D&ST
Bm&bm0GfrmU[CB!8rT[l6f1P5l+85K66b4(k,h$!MIbH,IPAP1F,I5$EAEbV4ehH
IUU,&R%0J100SUBAqk8Ql!M05VYj"X%'Sd[ZEkPZ[G5D9eJD[8K0Mk)@UG%,*a!e
p%5(apUPVkP39i(EC9@AfepAPFRH6bkemN!#HKIc1bRqf48N$9p+Z8MBk[5`a`B,
1#VJqH`%AYT!!YUPfr5)Q2,IS338J5U!ihZHcDAf!4QFTT4Q5a[h`+ffAiU)E'mL
$)mj4pk6B3HS1%G,F1GNKJY58E1Sjk83A&JR2Nj2aaf@@E0214aDYh3HP$YDlN!"
Vd%P'T`pqq5LZR5(1`2KZi#b*%8NhXpI0d+@H@TZr8B3ih'G$I691T`,!'$2rF*T
I3HFQKS(f6Y1L3*h+HJq$fpPa,Ea1@+IM*C!!b0j[80aeJkYcX5Gd1Am6,AK)r!4
E@fM'NX16@,3k)kGideZ8DN9cHb8J"K0U2h+!bqE%$kU[mYFDjZ0`(5JCVp3Ejf1
Vb9L'UU9k&HN%*%kbdAPa!1TDX44I1UCCEjcB`$6fdh[Vl5m5T%*UC!-Jhe%#0"m
PmCeSVSZkXHZ[YLkdIh%CA,N&ii#9LVTfK2b3!$H,NHYXaq'fiI8*jpEJ1Q!UNV6
9ZQ#ehm-iUV$U4K`!p!BVQTJ!d,TA8VR$31X0dNMXZ[LrS5M*G5dLiLQH+&HbU+i
D$29V@MedCkfA,DHS1)4D&c!P8JPqX%89P'#ZaX,X[mTXDNXb[N0bIG96aFIrIQA
ILYe(YNR)DqeIVX"!m`jl!C5XkhJHDb$Vq[LK!G$l4LImAeX!(F#UX'GQSKqFAc@
h+[NNCBQJbLdqlM6IBlEjUTj`DfH(r$m1MleP`,",`PIS5e1m"GG9ARKV,VP$5l2
K@qC[Za1TZa&S%CJj8R@,aF5l(#d3Y&d%MNEUjLY"4G*b@AHr,0h#"-X+#2&-&)q
NqKNBhY&K3h5)ELiJQ3SR$F$62E-I[rXPb%V`FPGFQb)bRD!3KM$MIN6e!PjLViR
5SGhZS)iY4F`M8"-rqB&ZZc65ANrVmYTqYCdZTqLbJ8b6Tf&+6BD%5R*4B@m)X00
M3TBP)$(Bb)MERq95ISXYehD'N4H)r+&'*ZZB@--Qr`#c[HeMZ35dC&pc(m,hBf!
#j',3Vi13!0`5$cr4fQibHC%jAH22&V!TK#!#-TA@bXS%UI%`5`VL$#U$LKRF,h#
@8Xp!I&kqrH`(6%ldAY(FP1(QEb@ST+ecfK"HQ8M!8JT4j8ZPk,MYk3!j49--DF'
JplIPCBhKi#0G&fl&I,aL`EX&+FrGMelbf,1Yp-(5hr@PM3lbJ8+XXIiJ$`[@X8r
!G6JbAQ,`ICj2hC'$`c9mS1!K1D+i43Pq6bC84FP--DKQBGQ0H&6(ai"G$"m`D2&
@QS11lTH1[eGZpA6GiC!!'e6rQkEJ-(hQAl1UhG'B+8e,GV!JCTm!Aa'h'rq691q
T[5,'VS)E$E&DSii"Aq[(JC+41`l[MSKpS"Ze82V$3I!p1e1`mFYApjdpS8AKNY9
F'JiCeCGA1%JdMC-6V0`dl(D"'*DkC9@lRc3LCUiFDfIe[&jffENIrPNJp0&PGd-
iV,kGfd*a!XMN88H!+NJ2J'BSY8i5A'Kd*0ZJ#3l'N@"leN`5&TN[q%qNY$JA-N#
AIN8(I)BAQ6[lMKYUk$`)c("$1Ve%lZ*QipMMGSB265q"H$'R2&BP!p,i&[Rkd1R
#F"YN!5'5bDBK#bc-3*%5*a5eXV2ilIp&G@NME2iVaJUkQpPbPNC[ih+2iZR-hGr
UTM!(9mK`@F-ehK@`YE)S2ZdL)CIqQGj`(0NCb%EHRAa+6'm)qaY@B%$C2C8&SBE
V9*-[Nmm%VJ(KqYH#E#NFZ4I$peTppCh&EkCh@r0FF(GmRXEbliN(hM5H5jGN0h+
$`Z[JmmN0#-[65'H#YCh'08i[)hJ4pYQZC8El4"15,J@`9LBBpGJ#me!UqR-VcUM
P1b#'bMEXLZ`5I+P3H&((ME*SV&EpXlG,#Ml&NY+DX-Q5cepSCLFjH*+4JqVIh8G
IE-IFA`$j"'2fPkQpM[1`2B@MJi!UpmI#UI2,*3DL%XbkLl,rPPc1r30YrBpPCBP
8A(PUA-6HGJ1e[#$+U"J$@R$cjdNCaj*qZd5eJrS5TP`13G#NM"q-92'XbqUjTD"
c`NS4L"qlU#BGBBjKm@Q%'9*)qp`qjE9iaV!lqUBSYV*X(SHiaMjAXhRUjSC!V6S
CY+p4rrD[KTUR[##'qX1'%XF-)XUeXb`N)))+MBiV-X%RjSJAi0)#)3ECp+)+Af,
ibYH0V`3*RjYLX[h0Ij+Ui$A0)a!SI0@qZ+++eeRMDp4f-%*,PP9@L)`F!p2`D,*
!8$`QdA*UDS`K5RS9SZTK4E(TXZpJ,Ii0'd52c-B"M2KN1Re)8J2CI5Q&D-!C6[L
Fl1pmr"!GY*fSiFhB6RV0AU(!4dNT+FBl06relkcBB*SY*MKD`AqIaa4lkCmUdkH
ETQ8b,CCb4NL$e)01cdZ0*BBH')c$19!j#8pe9JaKiq-0l83#DhMGq",p%#RVMC4
A#PURdiF#V6MB$KCARI*RNb!+-ZKSUR)002SQJl$'E%mR`[2#fmIi+%ZYlYVc4,U
j+H-Ai#cDGl(RNIbd@VQL"4EYMDKecSKp#,T'm52qLQp%LU$390@G(%j")(@D$ml
rZh@9mI,0f,05f,m,6,QUhZ8j'V0-1Sf2q5NH(jE431j"#-c55A+EQI&[qUp&M1J
8)9h[ibR$qN*VbFhKpE+e!m8p%9V@bFD3!(,jB"i8-D-kQeU-Er,dL6[QrU6$Gjk
fTJhfPf$@`A!dh5Vr82'E'I1"'4QNK"[5CQQ,eGC3qaG0j#Xfek1Blj!!6$R+d(k
'VL+$L81l@'(l&GD2KNQ@8l$DN5+!p0dP!f[4Y)GQ6Sc#j$%!0TrJi-Y!ERqLEIb
JPA`PK3efSG0(B5YKN!#b2r)RB-)2(Y[El86GhJkDLGL3!*%rI3BE+ZR)l6K$&#i
T59jQpkUVkGS21H4D)BfS"Vp0pE+5jf5GXYhU2UPE1FVjB-+Pk#SR,P[RLIr+hL*
ILM&HVLhmJ44d2l81iira2iX+U1BII3jIlZ3`@[+#6E*N$YA(0Uh"pTN&!rJ%1B[
&9pY@!XRr(S!X6S43K(UJ[)krB,K)%MPJh,eX4a"q)Ie@P`(Q#cL)28N)KKNaDRX
U#E*2KVKr*DbFbDK(V`RNN!$VlE(!Mmp00!5qRhb-J&rSqE6QJ@af!05rDk3K-,d
Jq%cYmkHmL)6rSSr18AUVUXH2N!#dpjBTa[HK0B`)mA,j4a918FI&j0e$e5J3"P8
U,"G-D*UX43#T!TZm1*iPU6l-Bi%mIK5dTm@fSJ@b4DFSNeT5[k"db0,3N!"X'$9
5!9*-Aa8&1E34)R[mB'CcZc!(h1,3-X,-H`(hNKd5@La1%rD,!(Xmp*+[$edRq3Q
3!&a56G@-5M("50AYffArLUhNBrmV,RBd+f$)qFq-%FB&K"kMGmJ5-8SM"JBrq3'
rm&Ael$QA0ERp5,6H@Q5R0R1cDP0e41EcpGI6FHKK'pe6fqk()$SmR,pb+S0%c#P
"*1(Mh#!,,!iq&UL3!-@-lL2C6828CHpZdc+mIc!Gd@AR$%Z6CKG5G6K3*KDG0S#
2VPk5-1eid"9ihI%f"1aj%0+)b6F*TecbM%BIVmE0&6A-ZpkB[`'j&XQqmi!["-b
#9FY)mGa$IDi@Yl%[lZV1-Qj)#iKM0Q)"+L1`49GD&Y+ZPEpG4Ia$E#ZAXbaG"1N
P6k$FjXmi(D`ZVXeK-iV3*))aHCkqb3M'1-"VVN-2d$@l"AKq@r8-4LD,V-acYfm
l2L3VTFj-QR!ID(EVfG&Nbe3KaN+8UXk$)f6I#Cf!TjfS$GH!6mrl+Z9HKq5R+$@
l9-P#aMjITd5Rp0a!d$+bC[CAJ#Sb%6E!MSa0eFh%4A1R4b&'jI$GZSNb5`MI&IE
aqkqU`MK`G&USj0(X)f6fc2NU'`GKCbqhM@e[MA`&GA-j9m"A)VrJ"Y(I(N24Mpm
9-R2#dIjPdpb0+5jc2RPI`U8HD3('QZ,eQ#c%#P52#0#QZAEj`1jJX3AP!"r[dSA
&PYH*-DI8SQ)rr+A29G[PaCi3PF8lXHPdhmQMHXiZja,*cZq(ZJ&Xj!53!'i4HAM
(NB5RA-JlD2Rc4[&GR-5k1f&LNX#iVr"Ib0)I9kPX*@fr+-MQRXc#9lkiKH+#[5L
rCJcX"f#Tm4*I3[eVDNB-!V33VP,C'5DUhIU`-4I#GH-*YPJ,j+9AbX[+lV%L5Hk
p'9G4L@ET$U6C9&'[GG&6f+QD(hiCiUdKc4VTG#Q15j%I*kR@AH,2Uh`9idlG&`8
V6bXCJ,FiTp4G2%0E,*fQY9pRkH9B)4f4#XKRD0*PA)M43T3-X&fePXBIacP6jM"
,-4*4D'HA*Lbj-U#3!"HA451mEf32h93aX@J+Y*&P03db1K246Rl6bZ`piX'`k8A
*La&GPDc#LL-Bi[X*faA!4+ZfrGT43Ge(m@#he-P3VMjZ`dF6S#"$piP#3IEX@G$
+'3$a$eeKef[6XL#F()PN6A2cYNSK6N$eI4'('),)HJX!"8b@)MBIXAfD9MJmp#[
EB%B(3ffpM3i1PFQ&5Z%%D+)cmd'UpKa@qIUpj[-ap9Ymbi*885%D534-hq68LZ4
jI'(mjiCUa8QlkLASUXpmMMRq9fJc)fkV+#5Di"JDIrGEq*THTVA#pJ2mE)P+4iC
L3C&kHZ0TGedD[AJE&rV[CKB2Xe5SYl"5N!"#$JC)lGYeZfXF0T&$fIJm2d+(UN%
%!c+U&PLT$keE3"ke"ZiMRkJmba3"pq@[lPJdrd#[f0fDV*eiRA8i8@Z!3c+5$"j
`2Z$6e%KVMb"jNd5UTLAXBHS2`[1T&2`S@ZMd-11ccG51jM`[!TAU3!32Mi8e)1`
*5K+E)kD(9V9lh*DXk(LTKePM5h#M9GeD6$'-@K%Z)pI8EI!E-@Yr53URmZ*RB1#
+(UUfV'%f00Ga)SLi5M#XG#PHaiF%DjBbbDR",'G'S[-fHGPLQR!(JU`k#qBNLle
rbmacTJS-!D-pcL"N8Y6)d**KA$"@DP6p$@CfceDq'2F1#aH*`(@+UpI0Cr$44`!
JXj+jFTAlP-HG9FjJI'K0Dq(SHp0e*,5+IQK[,R--'d[MXN`HSGY"rmr,HaZSN9a
`2lP4La94Pdhh9U$#KR2#&(qTD[6f*NKC(V'X+CqPcM"&k1*KXMjGhlkap[kd,C9
,LArDI-Bh0$@3!0(M#%+B+IF0mla-0'0G,,I0%q",BXdh`b$XN39PMYlG)(Ze@fa
p@LLV([aDE')b9ca45JlG-$Cl`N#B(D6ccb`!)I,`MXT)4X5$V50bDI!LJ-4MNiL
"lR[%-5[JlJp0293$qH&9LEaAbT@IeGE8,4XmUMQ"l#[#*R6e[(B#8YX9R30E,9e
4K0UC-3e%EpaaqCQP)XbK$4CXIfBMi9N29SaGfU1d9dM`3lii+e8hNbPN30T6E%"
J#j+j&VJT(ckKf6m)L`4Rk&RB-aCY5hAADNR*2!-)QKYlZq-bBh'2EAr-kZR6(l8
b+QCPUKlN6i`5A`$Cpqb4'D[K81`rk8!p8U&I2Nc+e6F2JHZI)afK8hiU8mcV"LK
!D4&)jT)Ql-C2qqS-M)&1&VTUci+HeCJ,qBpVk[3P`mF3NP`rmbZiU+U03D5B"6j
h19&Xi"8M,Ja2cITH0R@E0)UmPcI"E&p80AkrXqZQch8``cTCQN*PTHd1K6KP8cS
e6NZ2JAf)[fplTF-4k8D%M-k6k"0jK)PiEheU(mU&$%3kU+3bm&PaDrLDc6TNC&$
M3d2@lLX36F!SqbTNU22QXFl&!le0I6ddfZ8C%80"C"B2hGTp4d0-DqlcX+(*kSV
@a65%BF`*b!p!UQpS-5QHShR&K"S,+82-!$6HD!@V%@C9k@c5dI"jV0-Z$T*YNDA
[brPV8q,%IlKX5'k$A$6`l'$,5b(8MCUFE@fMeE$U)h55@X-)R@fXmeXT`2Rh-bp
(PK59em)K%FKpp`!faJ[H3QAiie`adUj[R0MS#"kf*9G#Ulhcc0ahkef-CSFAjkl
+iZ3m`e4a*SHr`UipJ[#"-f5p)3kYZQ1qeGKfT0VH'C(Dr1aT#861KUa+'TaaRKF
j16ZjF$6d1S`"fqNPP@pqB9")5qIqdAQU,d9V[TFHMRPq,KbHiG',SDqS%FUE9LX
clqR1)%S#1SGjP%hBLk9MK!5C[CbbP!`KPHD0HbXAq-Ye'(Y(LV`-fJi+ecjf%lf
IkN!J,@cYV6a-D-el12rQhieX`S*[mY6UeIr16LKe@&M(f#1Ca1M$33Fr5[FeJP@
T$CNce0pH[J1BlBXQ*-AEDF8E6N,G6rYb)QdNA!L6&cL0(F`l[(l0eqK@M5%q$-6
Bl3kUYMlmaZ0cdFU-HSl0Dh`*-9B-SkIMJ(cm,1LEpC+5DbL+6eq20,V)l+iK@Q9
*2T!!II'([&+D$CmUC@3LbH`R6!IGh*MIJC0CDC!!!9*6db[NPSH9VZJfSNT9UME
p""#b1Zrk3kTTX%PY!+prJRp3b0T!k`BUbP,H)!Ji(Rq&T5DfYZY4*iBKR*T8[!G
4ci4Uk*pM'E6'Db23EC-&##Ufc`1m(SNF30U+S3l3kPrHZ(6fiEkF)Vi!CcS4TQZ
Ym4-255@RlA9R`"EFA&DadLX,-5'$Daq9abd'8m1jYDL*kh&IM'dr[LJB2dqra`-
VJdD)[`$mGHSYGFr"h-pQ%UUSX'E[P0ClS1IHR+0mVZrqqRpm53BlKe9H3`IC`UU
T%LfHARf"S5@#ZUH1qAhK!FrpVV)CIH'[62eSULXi5)AIpr`KN!!`fYVTH,4ZCbc
[06T[$aUk$*4$H3FE#H$qU%ckVH4bI5%JAq"C!B%$ZRP,hM-'ERfC6&,pKa*iT5a
J[@mD,d"Z@dJ*dH*@NPV@kYNqZq80NIVE`2(i%hrP#(QGaA!68jM4j-HJ#G[pR!6
XD(JZ)F0CHbf`Dd0#l99Ij3K5S6qY%HH0h2[)I*!!CHR`e%TRGarZ+B4R[hQ#GYN
Le!Ac)N8C8ZJ-&#(#e,(iLBS*-He!F1FLFC%(Xqa&&V9SV@!-jp"3N6L"%A@"$mm
hBBrr-X@%KT+5PVA5)P4-5A#Ck@S&i)'H"M@`f,EJJ52R-'d$D0b3!2@$B#lbm6q
P[,9GrIVEiLERQL5Va8i,b'M@Geh%LrFEPkpGV@TJ%0VMLc%p)L"`6MbHU%['Mb!
'k#0d[j+%JYS(Sb+)hhip!$*6-qqNi*P6TAbkX6ehklHlBKEk6dpmfHiBPYe2bIq
RMe*Gb-K5if)HLFN2kqX(r*P[aSrQ$[c`[pP#"Qr9%E0VX,HPlVj,GNhQYpU4QM(
*5ebj&`f$hIHjN!$f0SB@#JEcBFbc5+9@3iVkb-F&fkNf3jA8ITHAGi+%'em1ccR
DJ*&,AHMXkYc,3`r@95Z(0PVl8ArCSVQTBAl'1lZC64U$R,CkpTDRG,d*0H-6#99
jHlb9,M#d5,E'+P4h8!beM8q$N!#-6Q`&hI4pDebB2jR9Yi2Y6&1#mU'AE5q'6EC
&F++[DZ[DT,&'5p3DQP0hZ'["H`diHB,205iZc$5BiQ4UXPRZK$lM2UK-*eG+*3-
83(A,+iR&KK`CDYK53RT2b!,@bpD,JECC%3kk$p)V(b+hYjkSS6-r%r!@#ETTJar
C`[-[mVZGbL4m2(hHhGSk1"8bD[dE1FR41)Fd3L#l'qJ2SU$K&eIaX"64&F0E0$D
q1f8)5YkdUL)8&imBh0@ZL"QDdFM'Mb,`,M$c9ND!Elf[ES(ITNS38@CY+5-Um&f
RN6#004h-#qpk@6Zrq3$pKZ*2BAZdDG3[Xqc1fh$DM)mTTalb+T6faT%cPA0q#9+
T"4S8Q4r164EN8)ViG4b)3bbqjBCjl@c+[hS"DHPZfVC4-b-'cQcD5L6$(mr""*4
"bV)'Z3&4qCQ#5$hpaGR5i3cUCfE%kVJI3Y[H4Y)BGb'28BPbG*1kErpiLI*VG%k
V`K4lQ2F*Rk#V8ei$3Z3rpeGQ[XYl#00lVUB`%rShh83)28,3b6M'B'Vr3cJIC#!
DIU+da[T"QjY2@pU1*3McN9pmd5V5r!XUC`99DrRj(&MpG&q9`0TSGNE5('LA+6'
GXEZ`,BrE-+KaZ3k+YG,p`lR5Hq-XEJ&V-N`"m2A5E@iGmidSI5*8NMl`rYK4jSR
SPS4Z$c`[8hTRc'a"h"RSZpUcM65L6aV'0[#QP#B!%1[E1`1qcT8K!$8+1UhiE0$
m'aK[jl)`N!"Pab`lkZikhA2@ll&a(%@R%8rGUecmX3h[B-qK"dCT[R%G&SkiQSY
mC$2552cic'rXq8i40PBi$XT2R*S3+%`$c*!!,i-q#D)dL#a[RF"AK6r*Dk9,Q[i
lYjYebS!)fUVqBS6LMIhUE[pj`8dGkURYXP+l@idIb[hEJ!lcmKDpRQVbJNk,Y)h
&)f"iU-!Z!93qZ#2-@Y5H9G6T%bEk+r!p#bLAEP&3+5mi4KX-V,*D0&8GN!$+KU1
!M(DdjL5jk%3r[afj)LAerEKFh4plpdT9G43iF'HQ*d!K4RmlEJ"Eq*8IcZh!r!r
$V-#p$$`2cNa&Hka(4)d4+!+C@FpkpN#'[04k9-pp'MeCcYEF"lENU&[iYpXq6!C
UTfMre,G6`QcT)BXPPB+0Ekca4(AU34"1lACDEA"L(kDX'Hre9UTP"PMQ"+%Pa@m
(q'JrH2$IlqZZcJ`ZZDUSQk&fV$k9I0Y!V'UjI&*h-5qij[-8BmA0V05hiaP-jZ%
ZllrG!%e942[rU06d"[PlC9-RbT28,kQ8*YH)G03AbkeBAY,(-V#$'D'pedMBhm`
Y)&MGDV!MED`G,QXUZ)(D*IRcU#1HZZaY+8"0+DGbDe6hXKS+rkIQYRl3*,cF$GM
-mh(4M2L3!%5,m8d3d+U@SR(Y*I#E0@IifU(3q@8hhrmKGLeUVr(9(JZ['M&ZKP@
4p$4A[Q%$3"3PZ5cLNV9-U[d6cUp)3[bVDPeDHaQi`B%T2RSpA3,S(11[3)c"93h
G5e2$)*2Zm2Q!caj2LFK[i&J0)K&qZqq)qJE[06dcb0)!#AYZ1ZS*13HRKhaKiL&
MDlip(I0'r#&[X5lAk'"(F%DASJ2,PBSGXK#RXY0jqSBd6r3,b`HC@#'[!meUF4i
H,dSLR4j!4q[V%N0[PHSe+GQPGSMa+"EV8EQ&qV9B4DUmfbKY@S6AbU[9pc3bQrN
*[rqH0NIU"MTjJ4,1'[a$Ul[,*Jr5MA%'$(kidL!eBHZ5ZVN+DL5Nf8D-TmlX(3Z
4eJV2Vff3!&b,RKMV3A5pTJc-T`Ei3)KHNfSL89Z9"VZfZ$"H$#e!(CT9hf#@B"1
rT*!!4aHTVhGRR(hY1rUj(V(6J'rfY-#XBL4HIpkhUdak@,V0Q#Aaf2'+cke$AS+
8'Y$IFqXfHTI8ACPPf#d)5J@lq!TPUL"5NJ"(J4r"`Pc13ba$dbf8KI-2)UlLI-B
Pd9qNfkXhqA@Q2b!D8b,Jb!D1Tq[ppGQFj3C'PNFjQYNfSKP2RZ-6k#lKlHq8MIm
"A`!9"BYAr8"YS6JH)D02ENN93+mq694G"1kK1hT"(Qbq(!J-QXkVpFN@V9f[P8K
ETVLecId$9majEa9+ZVUTBB-ZI%bM#cM4r0m1rY-'!F)ZG!$ZH*F'''NHmfY!D'C
K(*'He4bS#G`p+iapQm8iiel)-rbUQ4AV)5'K%$E+VfF,HdM3$bbCPP,ImKm1SG5
m0(piE061hTYEk&&Gfj0jIc[(8rYX-c`TrmlC3Dc4f+L4"8&'L"j8%STr5mpmK+'
U-PDMV'#lf$NS1*iKYi2rFS1Cmc*jITqDZi'j"$LhBX1,$&m@T@T4DUZ&db8"92P
L+#+b&V!bdreqc!pl3F%8!Ej)fH&P1*RfYUi0iA`'1fdGNl'9Cprlhf@r5TN6)#i
1hZ6hh#[V*c)NBa)6+je*H&KPTXQRRNY$"M)#XJ5K[j+pQVLB0cKMf[R[edIfPC-
(%hr`f%B(+$8'"SN6dmf-p(cB#mal&HVq8""%XjS8emBP6r&fefa+,Q1')hR$,dl
5`,+hG5m2A[cPR3IiF-I4"EjClQ`X(mh5,0-HF2CEcaIABB[X5NZRDDcl9rZ884Y
TaKbQ4`,ZVqPXAES4"Tc&Nrf,[2q'ed,*YD&R(H*DDGh"5,2%JU#D"!-DU3f09,A
FmdlPMHfF8+Y9LjfBbDq+EMRp5Z(9*&AM!PrFQJ*h'&KlU@lhIiT5#QYYe13(hHq
r(bXBpd*3M68I3A@`Z6+(hkU8VNM"1(Ujd8-qRL!bkG'cKbkb6Ka!-"KcVChA))#
4iqG`cc%-mT*fV),JR&q+eel0Ij6I&mj%Iqr2@CD"0kXE(hA@ljhN%ERTE[IDaKA
,hF2EFcK@1@[T`JP9#$q%fBf0!j1*a$H9"H80rLNZ-bNhI1JJr&j(hPl8HKB!$VR
eIEIQB(&pr)S(RGa[&S4M@A(Qf@MXM5b"qm49**Va#3i3S(5F5L[%kZ1LbUVHlLd
&`bRBQD`%QEaEaZLEIa!T4q@GBiUCZr&@(#8@ma8U10rBk),@pKlSRIP[KM)je,D
@Um5fij@kNZXk3&9i@3!MBL8j,c50TJDQ5c!B3&PpF-K69l4Fe8mL2e9kqD-Jp-L
fMeMDH,F,XJ8c)3AA@EE(Z,pKX@P5T9N&T)AU`lZ,6DjI'Z!AlK2Pl2d&YlGk39#
@PrarV1F"jFSK$&Zc1bfRM"-ZCYcl1jKU$Di$@%Sei&I)0iHkkdA9l$afRT)[*!D
NpTla!ab4F+%$ZR2Fmk'J#i[9,kq)dTBNR#aZpHFfXK!J0j2m92&8TU@MbNh4C&M
[jTb$(fr@B&rl@k+lUqm[3YRh'e,ZVAc4emL&G!R2jBH9&TpS,@[-JkIJqNSdhme
X-69P@6a3!,G#aVGL(k-M&&a4b&*HZ'4bPJ$k6Zc&349Ph`K+CL!fA3F6NelRLU(
cpBBmjL"b+@IDGqHmj`GaLih&"4ShC&NAVVU-`N-0$['G,`90h(J9[!I9C9ik,NN
h5Kc8("UHYSkk)YD%"JU,GQP%&FNGD,0fZ3[aEqCTfrNMhMQaQJHd6(0KFrVclFa
"(**ickD&"kK,F(5ileTXCHFLBdja,[@hhI9Z@+XI"0PKT3aYMAEV*05cJY"#F8f
9@$EY39(K`c@Fkf01h3V%*L+8@`i-2N"!jflR-&@QrRRdU)Mm8q[Y`J%&T0G(iH*
kF,,LF&"BQhVlGKSkC(8VK+``lefd6dEq-h8mSCJalaQb5P"!EJJfhSC+BcLrm4L
0%f3"UE'T69FD4m%M%eHEk,1(mUj([8f-4I09F+l3')q(6$mS6IF-'q(4BY!!#'@
Ei*mKhJh0&LQh`%L3!!9K*-Scb@&%R1m$@hV9k++*l%$(SP9S@A%i'"Md)Y@BiVI
9L28*U),*9HZ*rF5,C&*L3&E2qkN*-,8@mj!!jIL5%2*0A*&MkbpB8a$DC8bZ)YH
-N9YE,d69H,)R@3I(Z,JAmNNPj3`&S5bA2I0aadk*V#qS&Pq6ep3YNRUU*MdDXpj
-i,+mpe@H!H$&Rar#)dHcr*bk1FfPKV)r0Kp-X0IS$L!N%T4dQA6Qr6(QN!!X,j4
((EM*f*!!&ZM$ZUp3hS*2,mLMEVpffX[iRFU4,Pr%8MHb[J*Bkh4"M`9p([HQUZS
i,I8&DMc8MaID83@Y&,c'J6Iirm$h8RRXJVETi[Ar#a5e!2KHQPQ`p(#bjX5Y412
E"GCj!-38B`$I"4IU`Rc804LSerVUKZ8qJHVJl816H9N2`,M`U"S3H0YKc#pdIT2
*TIp@FkN65*b$YlLV``XZe)eV&,EDp1$q`V21Amm6"ITpmBN@kZX-RGTIZHj3`b(
HpKlC%fK*EcPl)F5eq+S!'XB+LYEm%md5MUM8-T*[02,ZIh2MmKBL@#jP'K8[SRL
*(GbNmmPB@Qq,AZ4Z"CJQGAe11j8ZKc`2JHSSq14S@$cY)p!5ZBf5+RZCr[J@@Xe
IEerLeSY!EE1""BL#Gi5a%+Rf-q,cB+IZ1k-eYQ!cG!(B,p`@@VL(9eMMHFJ$1QI
91$N#Q-NS4Q''X&ViTU[C@I)[q12mHX3CD%,a,p5p1KY0JMZqMCpRY+AjQrM$-!c
liZ644@2Y0`bH6MSa[X0RE450fBYm%eR[6RRNIVZbZ1L2d&A5(K#bJSiiQ(#h2%a
39G*jUPSe"QDCm+G2YcUh#h3#Tb(cDZ0PPi(C*C*`6@9+VdKpRCpI*'Y4PC%RJ%r
*mIL)$q&RBVp6fGSINN3i$"*1!$'0f*Q+jI4Q8,`41Il&TM")6A"'&ZFM4Ahi"V0
Nc9PUVXPQF`H"kL$A%EhkAf)T,!$H@*B3B-EmdTa42k3bHXDN31Mqj68"3'hKBdm
"JJXUX9p'0(fkNNcVP6i9&#dIFfDTZZ&a9qc3[DhA"ai9J9'CiSTaNe,E@$i'Tl'
c1[HJpeV`0CZ!pLG@$Hj,&0pkfmP1*D(!%A`cIa,$35r)'kD)AhlhY(CMNq&Kl[6
H(El9%EeArQ-(b4&-Y'Qm+acNbKlEflN&YMU$3M"&d1e32mSf&k8p5LD&PQ-DK'@
F&@Hk@Mc!lU0+hBZF!@9Ci!B4P*3d+$VlDY9hp0X"KUb1p`m(%@)1R@'@)2!MTr+
fDJ#X0X4TNLYD(lUVPAGkY*Q`[TbG#%1GI&+dD6Th&jbd#cZ,mC6QEqcV#1!QVKY
)[kpVMhrXZ%FAKJ&0pJ6NmS#+C5jp,aSaQIP$S,3S1mURIX`bQ%e(ai52*T0JL6-
NKkpcA*!!e(C)b*DJ`"MBq-'"jNS-Zj!![hX&T%8q,'(hE8#'Pj&YemDjEJiNHRK
!"%KiIDT,K22!c[%P[PkMjR["+iJq@K8SY4bLhA9j!$2(mBZFZVRISHIKGbdR6r9
F50[Lr*LXH$R'VP#d(K!+"ZfFdVPQ#`)KE8V3Sk$j9LbrZkIkI!("qU'CGHUC8Yl
GbY*DCB30k#6rcmX!fQiikI1KiYBc[h-`q22dG#LCLTTr6@TeGheG2elT)BcXB`%
LYcCQ#[aE5!%(GA9i*48r2F[-&F2q#`S603Tfc*P9$A3,055XC2c"$@rQ!Ii`NX1
QlC%)eX%PSTCr,TNY`6CGK$*CC'`e1&GM2aL$Cc*dT'H2AVT(mmfR&pMH4"-8h+H
F+U2EV-)8LM!cbqrDDaek'*pr%PA@AS+3!(CTf"SEeU$l&%DYZ`Dcp*AJMUG!IiE
fh@[0lA!8VYDNRXq4EYl2U8-r1P686i-1VCi`%8f+QNI%8b+rP+e22i@2X!+#k*m
V43Lal4mfR9-0,LkE)B"C+3HCDfhh3B(2ZX9mf9C),BQk%'&9CF0j2`*LLXGbMHN
$YqiBN!$!lKfQU8XGUA&a5%mX5"6J$'c,KXYMb@mkK03''LkV$8J$f0SAiAT5@bP
kIB0)CD,HNCR[G4B062VdXIhP0#Zpj#ABe4M0["V'GHlN%5YM-D%j3EalF1JMC-c
`+HhEjqh-HBBdjp(r3`MRS#6*Cp51$kCNm-3bMA'qS%U$VA`pU,Virkm2U,+h*,X
BZ98@*bG*8Jid"A+@-CF#k03fGG1i!V!VU01DCpJ2&-)0`C&`09(#Q#JCc8c0eN5
((2,P9+!c+'45U'6@rCdH`*GK29HllapmqVJeC4$Q-mTCdi)0ETc&2qHM,b5d'cq
[HAbfcRqNN3a@#UFi8$c0bR-fI`ehR6H+dfXE1-B)l-9Cp8lUcDd*%Q`Ud2qII(d
-#-m$b+K!LG4#b@0#R*FL!",raI@6Drq&Fbh(!1Z-E8khqC!!-4a#3P`ZTIii5i(
1Tm0Br1I[0KYJYV0`0E@+54b6F#GQmMRFqY41@h2)!Y6GfNfG3Jm*(X4&#F+K6h0
4TZMGcS'Ea5LdV+B[&UI9Q@iEYV16h#J55FLdK"Uaqaq--YYd3cTF5B!%NRFp5Z%
*#`I!Q#DLUJ5(&QU#"+j+('E(jPlP8R4`j6Z%XTdPi"#J6K[lI1DfkZ9R40LbX2K
66DaBi,T53V&&-KIc%5BPcr`rSJ!B)a'R2['R"F2j2TRp0haK(M3R1BUp"SGIjHY
)U$cZTflJbAJLE-9f01Fi'apAaGrNV0#HD*QhViL1B(f(lC@M5e1L`(kcbRD2rNC
TGZHNS[j'PQ[QilIaEVi5B!AM@l63CKaSAhQ2D+GBILE9TH,1D3N`EEcP%!8cd@*
0h5Q(Zk$#U6bR0Mm![L[%hf08a)aVrIbICA)ikP5Pk&eCm,Q*``UdR)U"8$)%1R&
a%&(iJ"Pj2jRd#j&64(K5JNSaDaYN6MK"X3M@N4G5i'Hhbp+L3#kZ4rTI%$)TFTQ
6PbUZ4@!RN8HT0cd6"hmNc6&3rpZP%3#IH(U3!"RLjHKfB+Bihf9)b,U``jd13ZU
9%B*rF6CcjV#pNJlN[A'EMGaad[5mIKM0f,YbJFcL(DeH(EUR!DFZc-'UQmF`4&K
D,8YB*43e%j!!1X$A,E(#Hlaqk+DK1l`2QHCKQQI3'bSeL8lqVIPC2q3"Q#`f,1d
[NQ5TUjEZ"I@PY,"12QS@@rLDP3@K'9FD$`SlfpX90-Tj4)'ij*R)Mja!H'MAeqC
i9p[DK&`5hqb-Ti#!UD1$Ph6R,JTKU"K,kH'bj$'p4l#+U"1iPcG$hm)ZIbhb`Hk
P2IUp`3*N4[(4M)5TH[c9jc&X+UXAaD+C#jMBD*DY0dq48A8@c,8cYDc#B$966T-
)4ErJbP$D`AKjA6E0`cJUaeFCc$5i,aJ&0#!&I663U*4'Y4RJV8HZpea-EGK%0-I
9#Ye6434CpFpE#9hS&(*!"PXaQrSqDMZ*-m8lDYRQBRQ6"MZ6CD#C%$Y""#HfS[2
Cqj8DJ4l*)IT!DRp`'Jk+"LaZ1L*6f"Yd5R4e#1+PfhG6'[e9"NY(K@Gkpm[(+$r
jI@Y&["1M0F'HN!!PV2C%(@U@1pfTN!!GD3JIFrialkpGRI$KfZ9(8TjZ[9cI49)
KeRUMjLJ`$V6+bY+)A$S14b08mlDHHA+p%&QZ!Urm"G[5*N&RNHY8Y8p@q[4i*5T
X"H!NLAj#E@i'D5FqUDAlJjAjM+NQ-md$Gm6&8MC!qFCK!pDQUer,BlS`i9Da-Qh
M5em+Xiim9[EUadKXlG,H*-aSY109a8H#XD6eakc[lSmeKXKf&#*V,RY$!'eT*FM
Xh*Ab1q#eJGq4p8EhY#!!TC!%!3!!2!!!Y+(%UEEa5r%!!$k3!!!!YlF!N!21!!c
TR!!%(IF!!$+)!*!%$`"8Bfa6D'9XE(-Zci!!!%#b68e3FN0A588"!2q3"!#3#S"
`!*!'3X(9%JSR5P-XqP+QSIBSScBKNV"2X`if)YU*R#6B"KBZ5`haYSZiDZTXIEN
Kcpm!'#[L8%JERXN4rX9R4'V[84K`G0,4jZP9rCklGh4"N!$Adl5Lm!U84KLR9cZ
CcL-9ASZhCfh%P8C'BrjAVi,Yf1F9Fe(4#%,QMX$%AC+*cI"Sh$IcJ*a[2F#q*&0
Gq"61M`!C9S*9lk@h3I`l6pc$#0`iNJ`4jAHC+fj'4D28UkZ6bEKPf**LQU!DX%5
GV"XJ-PNK9pL@`pNp4@#(CR!AD,&rL,iMi98HSXXbjG8+JH[if``)UX&TH$fNXQQ
hDKH96,Uca+pZbcc&(j2(NBADq6qMHF&paUr"&9p+[#ZUkkX$N!#YX1Cl5NSL&KA
ea[`ikU5@UBCYqarfGAB@5MMX+6m+efTp@2$MRcA[lF82-RmGd'J1Y$j'Yr+*VJS
fMje55Nl@j6b3!',(L%["*[)fYrpH*meqIqY'rA3fH%eHPN$&p&SmB%*eTiUQ3r1
Uea@ChjQK-clDXf1NAQ@PH-8-Np*Q$8T1YQfSJVYiI#bc66-QT!mEeM@PVM--Vmh
G-hI4NEd`QIbU5+$$b$N42J*DJUF[b*CZ8mTIp43Sp`#D[YXkRhPkKERm9HKBeF`
G$ED#4XAe+ITVrV"1Q`imjp*ML[LD-kELTF)S9[!IJ,4ldaqR8rM##cN%&4'GekG
BAl,a9`2&1Tjf)I-$E*D(8T3qpq53!)PiLfLiRpQmkE4HU#AYai@Kp6k[!cK#hS(
UcFH(N!#[`G)5*BViUi&YrBkb'@r#QNqTpD&e6@aSmNZSPV5+hUYRp2VfDe[hSKF
qLYS1$"q9jTXHb9+m%X)R@jD0iSQdiN"MfbcY0blJM!jVcYBlLqYYqrck%['$jh"
[$G&4A-jp#LGrPiY8Z1G,4E4JBeT-2Di2')CIj5qGmi)"Saj(YY*FGYTCZD23Bkd
%kHYAJ%`84)&5(&8iF(VUI-m3&ie&pAH)83Zc-3E,cB+&BDhqHh'SSj8'Ah)R*X*
QeT&hFC-"p-%r"61S`e4--K22rArH`DK1&CiY&HT4(3)cGX)X5[fFNjQrMr3dB)G
54e!qlaLN9a`'(UN(%hiki6$9'G@%M@,J&@rQ9Ud,U!a2YlhT*qMmc!BiBkR)D'H
lERk&8YI2pY00akeJadY"l3R!3QI,Fd+*&eNS6hDd+[HpmXdTQqd4B0hf)`'CFre
3D5'U3UZQR#C@"m@[@%PA*+&&$kibrZPjTmrSLZ(Cbp*cCcLS0Jf1("2Iekr"dGl
&F@q'KA*j'A-YMha8!-Uf&Tp3&1[EU+60Q3Re1EfhCfPNj,bTY%MkCG"pI8mrM'5
U2NSF8RQ$DLSr-K-$9A'3!)T3J+pm`dTE"+'Mc(YGBAVXU$XJVDk8q2iVlJk906S
2!pLb-4#+l#P4GDGG"Aa0jTA&J$aC641ZfpMpkVffT5"DPXkMR8H'R44iPKbKbq!
UMeCTINBJZ[m(9h3YV5F)EI,S)m0(G`SPKcm'44l)lAR4&1$4Cmc*1RGSNT9Nk%6
4@33eh@%M)P9DCRMJTp@*J4$"2N)JD4a4DcmXa"k2ZYa-XjIPU[%[m5J*GC5k`f[
ErK2D,ZfiGIQp!'`h4a5pI9kk-!'%!X%TVD[@HM*(9mYPaAQRmN$fTZN-#hkE1&L
pdcbd"K3cf'`+8ZFTeHN+ZFH*RlrEY&I5@&*KDY9,iNRXZ44Q&fCS&G3IkPILR'Q
d2'epZSZ3!1Je,`,2PY#41Y1TKK5b6%@,2rj03NI5ECX&I(Rraki18)P22TB3$S5
9Z4$!DMrJ#khcMak5UhpDXCq+0`ZX'`N"MmGiI+DTRUM@P%TmNke#JjQ0mXM"#Z&
%ZS66G"i19Ym8SJlcV1LabkiD%ak5-UI!M5+@#D`,i##Lp[jdk+AR820BYIUTkqD
Y34G2ea@K$S@)eb+Z%VCJL%F4*f48B-(04i[#iHL,r!f![Ue9LDcQ89+XH+`8*iR
&,J(69ZL0R0C9*3Vd5PJAYe`,hXj9"m4DC0e`Pceqb-+YfTUqR3%br1e&Z9dF@j&
jS*2imlI5i-KmM$%QPiL*+J51"UZ$HQKfclK[X*k!'fY2C-fGYVZD[i`qk1f!JLq
j#(RV+3iRS8q`bmHi&`jUFcLCi[I0`F-)%iPl6'pEaqKdP5$4,2klj6,"kMBR,#B
cA3YqM+fi3[,aI62rQacAQAF-R0qrH!2,@$ZhS%k)&![5JX$6JB[B2,C+f(H*hC9
T4,H5qFmbA6JKF5rV2&`X$G3i(ECK*QR03Cc015B9+Nk6dqbpKiX!M(9HQV#Dm2E
+fddQF6&5mCEI6(fUDJ#l"rYr$IEHal*br@[XX[S`Re!VT2`R[9Jp2M!`F8i+0G9
F1KDBCeMV@mN-jYXVD)2`5TH8bF-lLqIZfSRi)cAf-*VIH%[@!GLS6Z2dpj9V+Tr
+e-d5AQBeXCP$4+6A((kTkJ&9#`K$cd5Xpk0d@m@cYekFr#P4JTJ4!#Ih9E)L"6b
$8jXXcT`"+Y3FG2ThEV`EDq[PCKLL-lkU[a0ae,aE6$lYi+Ne5mBJ3clJa2i['G2
k9QF91+D#4V55H6lCYZPc##A0j[*#UpRL`QaDCTj"kT@l"1+a'TBEqjBjV-Iq($p
4,lrmk01QD4+!''8GXdTj3Shqf3J@LAFdb(`CH@qM-TJf6qXGfKpVmIYhK$$mad*
CHVV!1+#"9U[L[TV4FKp*9+Z%KePeC`YTeNj`QQIP2c#"$GARmmk[&#ap,QPfUCq
[MVF$32[EUaZ1K%K"pFliIB1TV@i+dbT,0P!KHAI3(*Q94K8[pKSQrr(dmRKK@XV
TbTjY4IS%'`5MJ&XjYVJRi5S4F-R3)IAUZflXGJ8pj0"ZR'HJ'H%21[i)QJY!'eK
c4["!Ze%648#BFf@jI2H+2MrbZD*9N@'2lM"[0PBCpl[UB2P%Q+&E)Q3638eYq2-
QRC`Q#&E-(lDEE%'IeaZmNZ5!kFd-65V)ahHkA5#mkYM&!5'e,Bp@U)2afM@f5a#
j9HAc0pqNjFN4+eU@m"Y$*&dIY8r+ZQI)N!!A(2)BNl&XGq2*LmUR,4qVQIq(5IM
Cr4+L+S$k61!k'C10i1RiTVG")Q[FSP+0NPAEZFXr6f(F*3QiJXi95MeBhl9B!A*
AId-B(e`3#j(DY0pA[1m(ZAdfNrDl*VP5Q8,&`)qJT)a6j+k-9[-'cq3G(Y*,DAU
[I@%a5A*2jN8CS9"JlM#TmBqXGl3H!h,*5R4$I2fKUZS@qXFa$6*NYi#*#9Zp&Ik
YrIMrjECfq60&NJAmEBa1&qAMPNNiILr)pVaq`XHl0ei8i6#Bc,3$S01E,"d,Gp*
$Jma1($6#ZDh'hlaT[0T5p'r#fqe0YNf#X`FE`)G91P9dD)jJVJERf"RDplpPF*U
qTDp"L(2ASp8*bbY00LNaV5qPJ4$UC8JiEa9FQLST"1f2QEURZ@X*!)#3!-,B`fX
eI2%GNT!!$"VMh568`&['Z40lEldl46k&r14"0elrqLPVHM,PV%@$%T0Y#''&MbF
Z`(*9aP"D!ec--EK*-q!EDlc&@MP%qUAJ,AEF&-cP4JFKkdr$AN5$5E4C,r'MKJX
&rA0Ec@6lDQ,+#)$f920"mchhT@VG,kmX)P5BHcPlp`IY)M@EM3#kBc$$%ENjhGQ
ALV%MM4S[BNYKSbIVlC4`l%ei'+&l9,&5)keM@94plF[HZ82EQTMTF)'Ic"#FA$(
UK$P@XE5G3dK$k@-fA$FDKTM3&!((`jUHK6I3669[G0"MrR82Ec5j*UiDUhA*eN*
h`!j+XC16DG6f8UeV8BDbB&LH[afUG"M3G[Ul65IcBVP4H%RpVJrhPmJ[K*lBDf`
S+2kI[[N9,Fi1[l1l`#E`5@UfL)8DmSFDfi2fQJrlLcQIHSNVlDP-A)44e0P3RE$
*)X%&`f!%R,Y*S8218@UNKqIN8-Ik*`c#3b6$ZZ4%,h@ZqLbY*INHpG3NM3aK&Jc
UAY&Bjq3m(e[hG@&eAhSp2$Tlk-NXNA"QGT!!+M%HA(*Y$8C&Lb,[cA"jjU+rTTI
CD6!Yc0EPRccDpe3+@)l1rrN2,)J32p`B$Jdp[@201Ll,m+RGY0@q3ime5Rh-4dI
4Hr9E'j!!mHX2(3!*,B'XH6BXeJDMa"f!9)#P3fIKmGY5E+D2GZ"F5@ckH3kGlc6
i2%2&R!dHN5rcr9q(V&*R5&MHbaiacGSqDRjD3bA4Dr,AUYUmrqp)0b(8GbmNMe1
+'kClL"j&AYKA@f6G*eHHDKRaQ4#SRZGac6!pqmlh3dKRrlYBI(9'r#XUYm[V&r"
mD5rA,I3"@9C06,1SVCIUSKPFiarmHFRe,'Xr@pQK4jXj[ahMreq$bKEPlT!![KH
FRAQPlaBRTI8['I2a[3[HUNbLLMb+)dbPTjXh36[m1V9G+)[*PREVFFV%b[YASl8
(pqhpp[eId399a&LqTQ%R4Sk6%fq65E*fC-qYQSFPSa&B3(q"jI3#9L8'Y0Ei3ZR
qSP@XfHSj#eKhB9`NSZSBJi30*#CK1dU'@Y%%ENNa6dCkid6Q!DUpa5+f26CVH2C
pF!*mX'6qC54,Vr0[LjjFEl4bA8*085FeP8F4*GQ%M(-MI![F[kAU!mQMELQS0e"
l$[!mjLiVHfd%SpfUrMf2Ve,qRNaA`dLV%CY#"0+mfj5$BYQecPM)!@H""[XD`PM
B@RX!qe6S48GZ3SqSBCA'irdbkjMlFbUX3BRPDE+$kk(+1kkT+#2QKk"Gm+@U))A
'"dBH4rSD#![QlMS[DhdC+KP+km!X@T@$lT!!*dq#QB`ha0fVS!0)d5@K2$5V2A'
N2q+fXFeNjL+8lh%i5aCI)Z5d-NSH1SjYa*BX8TeGPFai&A-)ZrYpeA*`B6,+PRI
4B6(0[cjrZd)pLCM)QX6L9UcPra'iIjV8dSYa-0F56-SS2l)%BRd'"eka&PXAppR
V!8b0P4!C)F%(Xf(q1TfAIMV-J%LXj6ZhcI6-Hl6#4'VYM2T&4m6N9YIibj84#1!
6$q8ACi5k6Di,GdU'KlBX6$)bRm)i)FE(lJ0C00a%LYUkB1"0Q54CBrALckdE#!R
lAN$)Mrp%$S,af08i0%&K,KjLk&ZA05%Gj'-1Fl6GA8rHrm%&3ji3U&YK5CSG@UU
ah&D(*9aiK8L#al&fa!3NJm&[lR(me8@J+[RkIjLZ8*L3!+Td64Y-bVULJeTE9I3
AP8A#A@1PL4*T$IGB&RdN+'rql!Ld*59e)+qX$X6q!Ma54G-'YT!!,VrDEI,cBC1
c`A-mcc3iak%CJ2DqYmiQj1pl&Pk4r53'D!9Fl,*NN8JIhkZh39J@YJkSD,!qh9b
qa*5f[Gfi*QaISKA2!l5mDiM(Vrb-#UTGaI@X$A$4e+SDer4Nq8FB29bN0LXD(qP
Ma!FK!'T$j%d#Y+$)T&+4FX*6I#$!9$aEd9fj#cVUJ,RBFmIBNNcp2LQV-pLUka8
hA6DAFdU8P'd[HT!!mG&m6LqfCfYVR)C4Ejc4"0j6Q2PUKd3PZ%q`IF$iqU4KP3p
hMX#(16V'NG6H&P+6fP!jkHGGfkl5mDR(k6dA52IDQ"qmi&eq[I%G-6F8'%N%Q%c
"me6+S-CBV,88%m5f9'#rZ'H(@jFY5J@!XC'IjlE-*$Jj"d1)GdI`H"1E1eQ+@a9
EAEX4DKF1jEX46i"9(fJ1NSp1FVMkD'eE5'"iA(A`!kl5AMmYjr+e9"@"R"q8rh9
%[4SK$IKf8f0,%+iaIl2$i&AcY&EI(8"!G*KF5E)LS(m-jNh2GDN2J5Y9-cQSkb2
@X-caX6eBdB("AmIKAM1f5l@9DA0A8kA-a'He2fU01Tp0Z%@r!46R5D#I`,f4!jF
1%M0@)D,@S!ZT(kr[+,bj%lYXbZ6CmdY+Bdpl@j*c$3l$2!X[kNrQR(Yr9Z%"Pf`
J$9$c8KRDcXGb&l(-Qm'mQE4"V'e0eRITT&96j[S8i'(-$!*Mp9)4meF'XGDpGL0
4GX"B3d+FkiY6C-$8DI#mm`%RX`V9X020F9EVHB9-+1Mh)Mcr9(Ghbhf),%`[$ci
J[%,pDSZAN!#pj'!Q1i1&hf1E(KTeGX)YCZAU+lHCKL)GrkQi2!0(8lQ0IHki4F"
4)eDTEU!N[Sp[@5SV+Q!ISpH%aNkl#DpUl$)U,&i9$lQ&bf!1i+2NCp*jQ,P9cJ5
Mrd+,DlAhlkRCMQTMY`K5i,kIFMdXM6GaZ%VpqU2%LbE'G[qI9XQlYNpiTb-EM36
hHPqKeRD0&)!+'ME6Xa+iS5B5Y&XT40k#35L`!'VQH0$6pV-S@UG21P"QT995jdS
!p*de0$iG"'rM1,T4+ISmbi(A(Y`STfUQ-FpDe6RTpVYl1'rC)q(#Ee2PL6S8lAY
pGBKdS-q$mB,N5(5**Qlhk99%1eU2!e4*9)3UR5fL%B3-[#9kc[9%d6%d'!m6XJZ
9XKZ)rCek(r`1Yp!46Tb,KVBclRFV-T!!@YGY-d01(m+XYPI!99VUF-BM"LPchTG
8m3P5`h"f,4@d#N`PfHNE5`NC*2$#&YVf3eEp001EeJ+EXN[qkf4eYk@cLJ#i"Fm
IhB9hI6p'2)De15TJ$p*P36%$F5bB3fhp&X,&lcqXR1e(q4*,ejPQRDARS+mPSL(
(2,fCZBl%98mDVUNBYJ56IRX-UUSKB3N*SiDklS%3-m4'd4LAYN0"4MNHeKlaVe5
,6#X&#KGKA4d$%%dj)p6R"B5FZhmdN!#%M+d"N!!i-chq*B(*ShIfpXPp',c-A@3
#h[9p(eZ`QD+KEV4FYN"F)I*6UcV1QV1!A('fQFeE'q%DdE(jiSPJTQ(PVal@[+j
`&Q!"Eq-jP$T)RPm&HhRTj2M#82"$b&!"Tak06(Lh'H0d6F,-6BJ3CEMbp8B6Q@B
r1S*jZd*h,[BGi'rq(Ra6JA*"(ZcYpC2KDNaG41THr)F5a%mpL`5!A,K@k"K+ZaU
8a%"3"mK[G"-c"di"lE9Y6U(36h-CET9bj(-fcQ+)F+DQZ6ih14'22LG!&f#IV6b
69Yf4f`(c"cQ#2q@Y!!F%cDkd*Q[(`TTje2V$bf`j6"f6bpJePAjUZPBMGZqK32F
"e23TqJh"XHrBUHD4d0FEH@biVqd(+HFZZ848lrEE9(4"dL$HT(rUS$S-M)h26rF
ReCFIjT2R-ca*d18C5N"P1%p#8$#!cfH#pK!P,!-RS'4cHSI"h%3alZZeG5&PQZ3
S(NHUq8V#lPb4$KaAN!"Z3BD)1chl9PI0Jrp3mcE)#Vq4!*`HkjPHS`LALr#T6D"
lehTmdPBXEm,VarZLBcjfIfD,hi*RU2`92l)82kD!4l'4S%+VB2Q`Ef1r*&Y5!$@
Vjb4XLCaj[PiT6SUr##hCee*X*C4rCE'*#!&LT9aYZ@*ADj`V6K'"2a9%3dCZrhf
J*d#k8)5,GTX3#BlVcAHf$P"YI%bm1j!![TY9#KI0`Z2LJiYjHM*&8"iB6QAH9E3
MN`Z*6eS3Sp`KV)!&09eUrj1!%hM4T-[-AS&idU3,U&!PeEDH+'-(%@(f)`h1PKi
#J&[+23kd8@`mLbZ!$A583cMBd',cLJ2RqQqI"1p#3'M,HJHCrQVbphM(4Fc4pU2
$Kar-[jeHKX&6qbpG)M3Kl#[8jPp)#UpGIiiPi+UjT$NFX+Nkha&T@%pD"Ufhm8a
bRjLMX9"0c[,j,lYFrkpY4K!0Gpk*R#[M-kM@%-dPGl1`jIQ""CB'8LNpR*+Q8e3
RXZMl%MRmm+R58C08Nd`FU,mY6$$BCa68'Ua9hQ0KiRAUNH$"61'ZPPbZ)BiD33"
2[R+TTbH[3$lE4R`d[`R2R9E9YI0K%[@D-LJA'IC2J+ia@jbhr@pL3"-rjD59,9)
Pb&-H&U0fBYZCq"@dX"ea2bKX-Iark%'2CFbIh85TiA*A5)`kEha#+p2HKA$+`LG
A+P`,S"dRh#'JQ#D92h'dl-h[jV3QED%%4"0ZD&YMTR"9YBpa(9k8@2L+8Zj#QL0
rKda"V&Z8KF0QD)e11SFINM4AP-jKSlfNUjEKX@AGF!Q+T$ica4XjB!LTGGTYUT3
92I'6r0J+FBK0Tpp2Ee44KXVQV1b9m00Cbm'ErHGI'iY"EZdeF*04!-q&(3DK*c"
0d$"3J!M)b(Jq*B0hiDf6V-'Z!6eQla,1prXA,$p3@6bDYma#hRKBTb!qaM9jr$G
m+2S$'k`l4MU4)SjEpTRIp5pj4&Vq%!'&+!I,`kH*'rG-eGVR9Sbli8VqIC9!fcB
20CfbD6e[T+M8b*,daL#pCYF%R*64f+HX5!AMrbS,R3PS"'E'd+dZ*M&ATbf)T2!
CHp%(KdL(YI#-&!$YF`+CecSBZ6d1Z,X(Q"T-QV"P&0a"j)289kMIU`5M,4Qh8F5
e!L&GZN8[@CD6'$&iLCLRr*8![a0rM6JCb[FbU44MNEF+lmHY%9P-JR[d5KqCRM+
TP'Aa&b,-aE+N[)*lf9'C6+0Y3EITjJUBFE*5kKA%DYhbb')AlGeD130"rIc-$PI
+cBf6j4!,IK)ehJMkic2Q1XRTf2(`bm5j2)DqS5Y3ASba@&S9G"BRFhD0@0a*Clp
ll5JBcHr+*#-Ca9XXQ-R1c)#IJI5LBl(0JGZb0V@bP[Q`Z`6V3%a-k%Q[DC!!B8G
alqbr'[h*VUdhS-56B(Ccj$RRa-j2`8a9E(X+FqMC2Tk"F*E4`P5&a[N$I)dmEa`
D&&J%l1)D)98TTe%dMFAVXm@80e+9XJ-iVZ!9pcFei0q98r$`D[d3X8VTXdR'3%p
+Ve*UV+%#B)q4LG3JZTp()H,TMA`rr80k)$m30DH*9c#p4NR&"r9(aYaN+L1V+9b
jDN$@@N$'Z,V6l-ccJ)F'q*V`H,BqpLQpiJBc,LcllCKH5E!M6EGqBZ82RZ0fDpQ
3!)YV&EfA%5961d6PRH5bC%BRr9a18A%d!l5@BqY+[lZ3!(NmqHR"83&Q%-@%$bc
hf&1[9#M2rpV4l2N%Cd4*%%pXA4,*p%MMC1@SfQGS4*bf"a`62V2$hSY%BHYc-8e
[AT-EA%8N3Ppa-TJ&$cLVUT!!dZZ@0ISAhGlB9c$Zj3&rY2)mpCpIajJ(V5'6rfa
D)4%Xq2&KBVM0(E`8j6(j391RlZc-E$r23p-FTi`13Sqe,-l"RS94N!"@2mMDa$d
-,BLieLUR`i`V+dYf,#cqDj0bF,MU[`pd$`di*,eiF,-Z&9!Jr+p)4UfkJ$,Vj!B
X3jmb8D)hDb(C92J3)"HCHX0Ci1ACf3BaADB(!SK#CP"$G50FJC4M#,TfQk#X@Iq
lBf$lFJVl4Xlla6)8D'2f-3&X[Er"Ha@kN!#$jGGTaJ#Y8AU+8G2#9e'[hk[-15!
K$GQ$`kH3!2S$)d3"Ri0)0#9&i2E+*MYLDG9,HH)%H+(q%Q%Kjbi1jGT#4f+iRM,
RNHp&JUJjkh"2$8Yp,$lfAdkZr@U6#dj99*8iGfAUhZ1VK*5AFHA"I8cD0J[Z11L
XidMa)&ah,%PfrMR@K0%XD$lpYX!S+JAdV3I'8`Ujf%GGfILhB&E#eTSNY*8S9)$
dU+VG2r+NBAN!ReH5bGFi5jA2)'J+L,jfe(b6#K[pe9C%8UC&J`Ul4CJCR,E8-!L
R1U#(hfUF4cb!a'06Xl&Ef4pC()jF[ANe46eI0(diXHTT3Bb'cp%`iB-B#CdZLVf
k[jMGI6Merke,83l@qQ[$Jd+1BfL6LVcJ3!)3*Hf&F4e`Ci,*XD8rdcm8rHL[d&G
3"+LX02[8rajrEUj+3k)jP6Y%Z5G5%!CLB2'EH!(4PrZap9GYr+$G8A2bU*H2(Di
bG)(Th#A*l06cF)`PQ42%TmhS[*!!1FIH$c391bFZT6KQiHk9lUGFj,Z0kk@`bPe
C[,MK3q`3VVbmV[34h9aHkqia3kVm-CRPSISfdA-B1k&mV5GrF#%Ali#`rbeC#5q
CYI+-qM2#M2&KXbH1a6i-MQi*+`9AG442MX@rK@``qb%B'qi"5I"5U2d%"%L(kc!
'i1KUk4M`$+#1aLfDI9G5RT`0rahmCE5r%EPk,+P*jF50H0Q-23Z1EPYRDZ5H"CN
%)d31ii90eU-miLJk*e*#R[$&i##3!,YkH1E"cYXSFlJAL(X1A$k+fUKDAGjK'AJ
(JRN,j[8NKBI$VdkmCGF2",@63$L6URKG2klM2Uc1QmmF*Xkmm!PG3MZKh*LQL"Q
!(JeS(paHKCj6mIDjMIhE2#H8hS@e!VEA@E(BP3`+TjHT4akfM`*1dCkhDiiZjep
eK`UJlHHhr%EZPJ9X%1LCA8[$+JR'lq2p3'M5+l[j`hQGiB!fNbQ,-pM(2lADT,#
$V,mS38SjhbmS0R&bmAL$IiIhlD'pfZ%SEAeL+&"U"V03lcfhh9!JZd5ehjaY*FR
mD@q"f*Bi23KdM5(C'$R0YbVc00+lAGSVQT!!VKB#a*qq1AASfDdXR0@arih6U,f
$(#KDmM`De*mIqJ5`N4H*KlcFqGIE64!)2MRBFDZLYpMq3'cFd9Q@4q8Cj#T6QjE
LD@ji(Ui,rcec%+0pR'i-c'pPapiG,!-dbH&F'YQ`NFp!a8N%!'Z*Y0(BreV0%2T
KR!+93eKZ@M5mKbB`f4(4j2VjDRDT"&IT*RR3Z6KF6`ea8(Ym#qG(`q0ZjJqa(*Q
Y"T!!(H!X'GQ#IP1#kE,-3jZ,hl)4$XbS,kVVjBJq`41KN`C669Hflja'B%e+kRR
p(20cY'fBd4ae!@X!BD(ISm@cHrej6l#QAdS8C0P,#[$@eSVcqB9pllIkcrR5)+h
8I2M"$["4MV6aeiT601lZ$2Ml%Y"R"aA3Z`"kE$MkZG%5a-Hce#HfrBVf+J%k#GS
qe4TN[`Q5S5bN,f[KNf"Vf%lXThaG5MmH)@i$Z"5mG@if$irlDKkN&airaVbmGiS
q6-,fc@jHAe)3Fppj+SpNQfZqc2jjq"89A4K8T*1p$l0&DSXCX$6[69eF4e&[*EG
8I3f(@(Q*-pRmI2T$krjAmFe@[ZkPq@-*qjj,4a+jQ`+b)DirV5Jjk@-(2"lRBik
6ma)Dc8H3!2i)&I(hldYQ@PSIP[m3kV"D`qb+ESlRkr85NlQeGf(`6-9m@hG8D&M
@(qm5+e9Y3h`lKM4kZKk)Ld'd9A&lp*!!PEI-q)4m'D%cjlPePfH-hLNT[2C(R8c
C-hAUY$hDHH[Db'8ZYIIKM9Z-V-9l2856KqhUj'"bkBI3'0![#Q%"5!5kjl)K)m)
AXCaDh[9Q,@GkkZ$3LA"a3,p5Gfq`Y5MC89k+SkM&KjMb&p02Y-cUli`f[bP4[eR
P(e+rU4HNLZ15R$YLmkSI,rNrLK"Qb*(bKA$V1rmV8%Gm*FDQXhbj#MecL[DAki)
VTJ#V,Sp*&1B4jSNJ`#8RLVPc2LIVq)i!DG5100'eA)*Ued`0@,p+a9*IC!V4%!U
L3b9$A(`leR*F'T)#9dNNE8ef)"2CP[cN)m*E+"Y*m*HBqHU2SNZLUjS)80-#U)F
0$N6GFm0YI8k4J$*BV5%"qfejM1cBESb5@6Qb#HbpLB`l&a@kKG!F!L-6P*EFI9"
+0j%T5FHM6B%!Z#[Er"3T8mqPQ+(,FE`S@Qq$ib`1"$a(+4i*N!$m98,c6kHQ@kd
GN5k4LbE-Q*223"8keG2@LC)8hA6AG5GE+cI@&@'KY1D$6heRKU4@b`Ka$`r"rqV
rc-hS&H!2$mDJLq"*DZPpB'6Y6'4[IZ92XH8,p''2mVULEeaVF#I[YC)013Ye`(%
+UkDDkYC"KkK+V&p@k9LQCI+IAaaa0SPHFdqii)V-PLPjRr6AYR$N)&R34!,+R3i
9U"K!"U[2LT[l[P#I%N&5HHrJ4AY3#`V9XaA+L"%C[ifk*rcXXSAE+iE5FLma5FT
KARS!2`#b@09i21N"6E5bY3i-%SG188Fc4V*"!YcjepUa(p2,VEeJ42"fekFZcZS
"!Gdd6CH3!)haZ%%L'(q)LmQ8P``'UQ9,@`5URY!G8Ae%r#GpfQ"(mLU!A4%XV3`
BjbLHfh*VUq"q@!5)ba01"jRQibeBK5d0"PDIa!SIrd0ljZN,+M#ZCNH6MBkH&&I
9JAPPaF'!DqE$9S@bhqQ5K+qS2L&e1BTcFF&FRh`(2KbJ&(8Cf08mq+#Q4bre+J1
mA$iVZ!0EL[8%5J%9K"cLNJeE'SiRiU9J53V+'-%-r0EZ@H4@dX`YH*m`14GI)d+
a,dKd&6Sk+5QliMZ%cHpSNX6P86'qfUQ)%i89f[VH9UIecNa@*[#+hdZD0YlGZk5
-c"b*pp`G`FFjhk#G0KlemiF06-@@QK-+*Gd5IRlU2NHD9CEP0SLCE[(2,!V5i`J
B%#rCJp+Zr3&Se"T,-DGc9q%YQk!4MS!46q*"ieIP4FQ8Cj+TM,!5DV@3!*qU5j2
haScS8)YqG*hXNdTK,a`cYK@1EP14YhSd-`f9dE*"5139p2jPLB9P8ArbqLT+,EH
m+b6H'd`Y#&El%`ZS(c#c&TUX$TdVZXDFikq4Z8+6LlA''c(%VBdI(aZ&V)MI"2i
Laa6"F@B34jfJKf*A((r2h`jpb4r#T&EQ@ki)i0NZ0XKAM5)!GK9BC@FC!ql'YcL
3!)'"EJFF$fRacVH$e5iad)JqF(bdcBBpHF&BZ(M#*YYDNK5qX+d36FETT#J*24q
1EifrpRQ1C!5K$NkI0$U,TqG8*`1`VdN16F,0$0%!9[@0T*J*C%p)`4VAh`+1JRL
E&6@KN66hZp*)DI%#B[pFjDB`Y,ZNR1$C4Mb(mlDeKmLI9L4bJ'2l2eh*'e"#*KU
dGYe4MqX!rX'-3EiZ-,S*E1#Ei+feJ84BEYr%0kbZk#K3@"N6XK@E!6kjDk#pdBh
BH3NMUP`jchchLhN2Z#lP@qT(jGc+*&9+(R$q,V*[Jrr&qlYTXJ42Se$mbZ10edU
G4-AB0a`6U*Zp9LkFQCb%C'-1Qk31ZcpA2MUjcL)MUf$"I)CpAqbJHPLF5m23'Xh
K8XMcMX!0$"2H-q*ETHqC0Kc*X!bBf3qL'TSb`NQ4`qF#,PY,EQJM95LP#*S(Y"-
[1U*l%&VE!K$KUEMpKTSFMADH`S9lNK9*'ZjSZZf40AC*`Cd)VA@1HdX9p(e`&YL
9,$-SUSMR&d))j%4C,%0(X$Z'J43U)qFPH6E80VXS(L$Nr0+`8pDXi1"Bp)[FES*
#fQp)khY@m3QkXeHqRP2F,X,pZHXqAN+m5mPR!+3Q8b4)k)d4XpC$PCN(epfeP@E
*j6BRGl3`V9#%2[R!b",d&BKBEk(3m[CX$c#5PY90,qT`G&3VZFpffQQL*1qMhBL
lrPQ1%A8jJrV(X6S+XFPChf"1#`+L%CA1-5IXF2[%NHcmK%%H8@Hd+MD'2GTVDFI
ji1i'f!34Daij@mS6hM&@@$bY$F55-r9Dh*0&,fE(T91cmee`Lq8&6FqpV)ali9I
aYcQYEB'F9X)9hP8mf(kU,N@*UDDC#NV[1RfV1,U#DjC&(*!!RC5hKIeXr*ihec@
2UU#$`'0$BI6@"C5Rb8mGAIjZ'l#2#G+0!+S2kIa8)5f(RmJXpbiTkXd)6b5USrZ
ml2'J8R'2VR#$HaXm[NjY886)$[[ReMQr)$*(54YN!*6*ZJVYD[4hY*46AZ)BGJ#
c9AI(&m%M(6P@I5A6qGbMLG3Pp5h2&8!E'b&[(5qV6!'KqKiNSSLIG#GDH',UMD(
44,YZ$L)mLmKYjbri!JcNLM$`TG(r3L)&dDj&bCqk`48"-BFQ2GVp5PS8lieT-D&
KUN2P!P4cTS!1KY9*"994$iSdK)rp4a#ff-f8aCXcp2jQhmBjFKpfrr5KPmR-,-'
K'rFq3[paJDde2EANNPjL`G@L!U,l!Z@L[CdEb'3TL[dG@C+rhMkmYRcLJS-*m&N
$r2Kl+[LU,aTm[C1!CYFF0`ka`8dk)EGXr(1kF-T9&Bi+!h!KNQq(,+QiC`E%)GM
EYi[XAX@h,Ljf6r2(B!NSQ[QEiCj8ljG%,SAFPfliQkqG#q$8d*R1d0#(ZBr0Z$@
aFlbYCKIXIe3iIajp2kT@eR-1J#[#S6LRd5fPqM3JS6r"T5i!q$&0XmbT(KE%G)N
SQSY(mh#0"QCk,5FBPRYXq2IPHl3HE*!!5,iLaY&qHMqi-fRY(895Iqk`J$"[ee(
3D#i-Dk5+,dFa2K'0PUbRSJB&-$Vd%`V&!PY[!2kQN6(dC@S'[K@DT8`#DpX8KNl
p0C!!NdSpK9F)a-'Y-!q)@mYTb%hT$1akCCF1@4TL!jfZ5A-49[mID[Z*(L#Y"#J
bP1),DLS2T`da3PH0MPC2,c+T)-*liDU@)"UqDpJB4M#A6Ld[*A,Vflj3"GTPbiD
+j812SSG5TD6#LFEUY'EjpTh+k+r`kA%&(Q2!C,ULF&k9XYSJU[@5l`%IqSY0E4j
Jb+#&2Ark'MpXcNjBGDq4aT5Cq*P!r)[Y'm*aL3L6c&d,ChK[PIk8M"PHZZ-5E8C
dk'2miKKZ+G@EmfjlAU)D5qT2c1&SDl`#N!$0qX5F525N+QT1b8CMRjJQ`BTe'T@
E,6LCeqHl""%G"TMS`ZNYUN#RUINV!01"9@be[2"Beq8'A(L8f936j21(VLdLhMa
"D9q)0V$'Qf+)dI[edGf3!,bTrdM04cP)[cJZ82#a`T[pI!*ShZc(QY!l(,UNSD#
ZBJDFf9pNU5(3!p%JF[Km3-2E$q(1LG"LKZ*e9M+%p5ZG4PPQ[K%(p%G*1S-[R42
X&RhZEMSdr9b#M"-$52QVR,j%qj!!`TqGYk0+AkUS@ZhYPN0(8XD-k8MaY!rVSXq
mQ#6NKrDRIT&bGk'*A&KGeJX9IM6C,A,T3elP0JPG"jfpKi(HR[CQ1r"IPpmQ0&$
eFZ!3`eih3[kVPJ,Rah"N1%$9JT&c5-41+mGr+3ILIMG4r4A*ak&j-cD'*4+,f6l
1i984H2e&,`iLm%C"qQl,#bhlLU!AB6FM"$MTmF4JXGi`jcP8c*&CN!$dGB*-)'2
NNU3F+McqcFpm-0FRVV5mb'#JJY1i`25dcEBaLT-C#LPKmK2q(pJ&46%#UPLF6h&
)b&d4hpL'5Q9c,9&lBF*dk"J-,4D1k#@9H!#&jR14r81GdDr8V[U!M%MDQ%E&,*+
95#3$T#m@k-V2m5292Ui+J-1H'e8#cZ(G(2!Z)r&0"Me,5LPiQRP09m#AqET!pNF
P1IGNC-Q@Y2#6GS4RTl[eSrSlSp@q2#bGi9Zb"Ae"-!`iT!rfe($a64CJDJYR$Yh
6q3MfI%X"NF$%EMYBk1FLQaDFI,`USj+V)GSL2(P4FdSH5XBhU&blaVG@qhX9CEc
Y"*aKpqKH+)m!j8ZFG#QkhTa6K9'8`UFA5d@GaHq*Xq!KM0A9KrJda+96IeE'!"M
0c(q5jfl"YiP)Y(N9pKT93d+[E$YM(&TEcaAl)fPA$j2-Q9&!kMheCE'Za!'Cf&l
Zk0$K21S-jVX+YeTXL$Pklej'81d8%heQmXaEP$jd%Flmm)Nk'Cf#E$(Z[3G4$25
)*8HCHB$$+j)rK[Z&l90ipNB#Mq6JC0lfj0BqAcEihTU$RV[VIDN+i(,i&&accl[
BFJj8pT!!paHQT$ef3ehI*QVU-HKHHVB4Nc(9*k&U+eS2EI@)d,3H$f2IXf%pX4%
GfrBYqa@A%l'4Yj[aJV"J"A#0J399j5jLG"1Kd40Eh'QIXZ0&iS0pS48lU"QA*BC
deMZ8jRkbk14Abmrb)BFD&B6hf"#IA4(D6bbbi#2pI"%Nb5lZ+qa(5h[PIRP6$92
AKB9J8@HE`pD(jk9CNkACFBG'k1YTi'ZjAYYEP$k4+$1ra96MZQC*(`+`!,0Rah!
+"3RiLr"m2!$9$ZZ8f(EXCl,becip!r!Kiq3A[M&'lY+TX@%e0r`Ul8jHl5Y(Z)j
iJlclTAlUJS+GJLA+EF-JLDR*3`KF#T*4-"Qeq5R%T1lE1PF(P4r(062h(9%&V,!
#i%ck2%N[Vq%P8KM5c2'$+5BL8r!@20#$!q6*mi"`H9U"SP*-A92%cPk)CbQq(ZX
QYk[cUcAP&Am3aGBAaP-Cd83&BTZi@UcmB!59%M1Ipl"EJ2A[*2QP)QSkKYpI#%a
U3UcHPVahBCKJ[)&&RVFF'2bXrPQrpMR%JF[pQ&f9S1mR!2USrVchU2L6$dTbpS$
ST9mDeGc-I1mQ"eBNkH6&J,6J$hSK(M'N,K,Mi%FY$RNFU)&h`V!8I1iqG@H[@48
H$`h)r$+a-6-)'+5i@FfKXKf2)N$U"(rD,8Xk%S1MA#)8"re8EFBP#Jc#*6jB!2-
eIb9DDVbNH(HS'(RHKr&9VMCBH!)TDKkMU0MmphRVhLF$6)+2MU8I$P1cUSQS%69
k&P4VJ+bca%2e#"@er4R5d9k@CcmFb)0Zc2iCQK$LMm(`N!"rCNI$H+D!4)ER"(!
&N!#3!2EPEIN'YlTF)@'-YXc!f*Sb4)&41+p)U$5r,I1Y,N6NGHY%Z*!!TZ["1E[
TZVlSXk##D(G)$!H%5dL[eZLNmqCdTGelXZ2Yk&,*cD'jekSh3#'ZXrBY`*a`+qV
D6F(+j#P1(bTRXED`9Y0)p&L3!!53!"1jR2Y0Q@,BPV!9hI!&BV1!20DZC4Y9!`R
@iCkMYJA9%`9@U-KaYiU,hMDefKpNU#d-3iiEi!VclZrNM4G@l&VCZ@$X@GP)E,l
G!Ap5ehKCkRFNI$Z2+-F)SiJ'5cQUFHrC4')YL6cB1DNJ&ZI'HcEZQfK1Tqi%T2H
Kj8[#(im'3[KP4UAV*B-Hh5@9JXMe*!@0RA(4Z094NGJDabZiiUT"CAYMDVK)q"k
Y5,Uh[Nr#2#)kR$*!b#bN*hMEKq[QA#$(2Ad!`fd0D&dhT1,-UM-RRe,`a#+H+Uj
`T@%[DkP"ZU1rYeAN$ZmBVI9fa'TpI'm)5(U06Q,A%d%Y)4p8aYEMCY,J@L)rRkE
1)3-TpH53!("(!,9a[fVJBdSkic(2Ef)!mQ)DF3TeihNN$i2U9dM6J9m#G,)k+&3
R5PC'!2eV8p'U-m8Q`iApMZJGH2+afHQf5+YUEDE@ck)JUVmP*KLBpZ6iJq)+FQL
5eMF4lr$0-h3mMH4AQ29$Gf4%N3"k*$p*Zq+)#+ZDf-TXHf2*,Jd`2E6frmPp`A@
`cCdh)L*iLk*4$9jk"EEQH*p4I8QNa6erk0EVPNbL(rfE@I6+8,Km9lj[66cHQGN
jKMf'QLT+[VSQ5dN'-CA!$@fm#ridjGN`UChVfA(r0j%Z(QNGX`F$cGTrm$I-jlQ
mHP38[Vf1U#2KmX&`3KBKT-C'*HBpIZT3DP4E#VNeY2,$'N9[VRT+IE3h!BbBY`b
*fbaB&-9iKVlUM-da#1"65MXKq1HSlZTbhj!!0N5,N!#`+ijabBiHf9(UIHpH,6#
rm#m!+lGRUUHrMP(e6,S@KD1cfTXc`-8PljDIi1el#*UHK`#%l2iCXdlV@CIk'c'
@LD-9ZA-iYU)[23ilcb4Z''ANkL9Y#()9rkS@RiV'%82'e`!!TC!%!3!!-!"!!*!
+K-m!N!I1!!#V%Iq3"!#3#U@3"!%!!$8!!,Ea6[1fm8lc!*!$cJ!!Z-i!N!0b!!8
Ph`#3$NPMEfi0!!%5,@PMEfj038063!#3$i!!N!N"jJ#3!i!!N!32!%,"e1([a#"
i(T,V1b+63jBp6KE&40bkJ6-15jfD#UKj(*k(jm"JiedH0VMYC24mX`HVe+GMeF+
dQmZ$01k[6XH0K4dq8mdCCkBT6YB8X60cfjDl4FpQHiI,ZRhD$mE*L4*AjH@8Sa(
[GeP4F4lYQSHRkQ1Y`b))1"iN"5,R8eJ!TC!%!3!!-!"!!*!+YqF!N!Gb!!"S%rq
3"!#3#YkI!!!"!!!"MdN!!Bj*!!!%E!#3mh`!!3#3"@N!B`"p!*m%!Np,!*!(23"
J!21)A&4SCA*P)'Pc)'j[G#"PEQpeCfJJFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9
P)&9Z8h4eCQCTEQFZ)#""EL"KC'4TG'P[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3
Z!*!$8J!"!*!&E3"Q!)%!SJ3#6dX!N!8%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'P
cDb"bC@aKG'9N)'9bFQpb)#KH-#NJD'&c)'pMBh9bFQ9N,J#3!d`!!J#3"6%!C`"
&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0dG@CQD@jR)(GKFb"cG@0MCA0cCR9X)3#
3"3J!$J!S!#kJ!J!"!*!$I8&%3e)$!!"q$9-+Ni3"Sfd!l!Yb!l5b-LXVieY0hP[
[D[HQELEAJ$%!3!-!N!1kY3b!!!PT+[lJ!985,2Y+b&X1iq9cZS94MV)rcirrVL!
j0k`Dq"(+KM9jKQ+MCf[`V&ir"HlX#m#`U3BL1%aA2VhVbkfM'32&(&P,'cJ,!*!
$@J!"!*!&A3"`!(%!V!3#6dX!N!G+!&8"%iJk8fpbFRNZ)#"*ER0dB@aXBA4TEfi

JBf&Z)'pZE(NJBQ8JF'9bCQpbE@9N)'pZ)%K'8b"fEfaeE@9c,J#3!fi!!3#3"@J
!HJ"m!,B%!Np,!*!(5!"H!5@)6P0[E@8JDA4PEA-JGf9bC5"cDfP`F'9N)'*PBf&
eFf8JG'KPH5"KFQ8JEQpd)(0eF("[FR4PC#"LH5"dD'Pc)(0PE'BYCAKdFQ&MG'p
b,J#3!eS!!3#3"9d!F!"a!+`%!Np,!*!(5J"9!41)1P4SC5"QD@aP)0*H-0-JE@&
j)'*P)'4KE@&RC@3Z)#"3E'9KFf8JGA0P)'Pd)(GTG'JJBf&eG'P[ELi!N!-S!!%
!N!@N!)d!Z!$4"!K$EfjdD@jeC3#3#Ci"AX!#!qJ!N!28384$8J-!!4)08`UE*!!
lLSL+&Fm@d(1X4'`3p5`rIcrXejfrjql1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y
1)2Q3!"m"9#5BqM@mKDIGaGRG6G,)HT+pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk
53ElSG,A`G'S9QL)q"HC1abaeLk9cJ@A[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9
c)KIFIJai(r!m3+*2iaUXL26-$cGj+&$EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`c
Tre6rb@d!N!3k!!%!N!93!&N!C!#6"!*25`#3"3-!4!")!1L)'94SDA-JBA*MD'P
fC5"TFb"NB@eKCf9N,L!!N!4)!!%!N!9(!&S!@`#8"!*25`#3"3)!43!a!1L)*eP
[G5"SBACP)'9ZG'9bC@3JB@iJD@jMEh*bC@0d)("KFh0hEh*N,J#3"!`!+!!S!,B
"(!3"998!N!--!#!!#!#L!4`!JP99!*!$$!"L!*)!m!'B!)9993#3!``!+!!S!(8
"2!#(998!N!--!%B!TJ#k!GB!KP99!*!$$!!J!!J!SJ%F!)"993#3!``!+!!S!+i
"6J#e998!N!-1!#J!+!$#!D3!L&99+!S!N!--!#J!+!#8!4)#!&99!*!$$!!S!#J

!M3%A!J&993#3!``,9@j6G(9QCL"KFcS!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF
093e$)K)4jPjZ%'3Y'84UmN3N#a"CUkBQ*lFpLicJGZI)5EFc8r+CIhHrlpZ+2"[
Ic,He3*,9cZc*j%RB[MZ6%C,P9Z5*V-M[(j%rNjr*[0R@GK&*&K1b0bh*)LK!iJI
r6PQ'N94%1+J,1hML*hBK,0+!l9$&S4Cf%PiIcijT$+G2[eNUFK-MbHfpC'm6p0E
IcBDF5mJT4aqj[p)@X[AQGIR'*!P,+@RBhU3A&C159eN[%2cJbH(#&ajm5X-QD0&
L4-VGcEkQ`r)XP,P*,SMR)FNFrFAJLaU$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ci
KBT!!RHr$(BZ5%%MI@aB0YUmG+cH9Fc#*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"G
BJ&RSpE(k4UNSE)5VZ#(4a%4T(NC4T5D'+#Hca)G5#DG%eC'a54-U)Z$aJ`C3q')
!Y4*YQG#!*634DR+,6CR$@+QN(kF-V(@SLpVJf!+P0U0c9&M$',E[r55!`Li$a$P
LQ,KZKIc2X5Gal+,YACH#6FZ"UHV$eS-Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,
F%r*FlYZBmf)r3FhBZqB8*mKFDkBmH&M*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6
&V")5fb&&5#AJ#$hRCZLJ)NBKdc[fS@lc&8+41k84G`VH8bAIPL!j2GVYU6-RjVb
F3lRZ&DPJc0[DAFTb'rRhYdi*$'iYhrbA$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL
!8d`D3&(YeTiH)j,QXMTfCIrBQ',QaYKL5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj
368Vlrpap[%LPH%SI@AC!''TAaj91(AL#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@f
Jmqd&j*@%XYf`G)B2KUU3!"Si!i4'pV`UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-
k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0'IDaq[E"flB1d$rZ$9epp#4ZUUbq"F")bcdZ
iN!#&AS+9c([M)*1*kmMQF"*$DeK5eBS,0G(8$DlUGG,@)I*P,r@PJf6iV!k3!+U
,`iQMEf'*D&FHY3@1%H!C2CVf%Lk!`1`-EZQV3EfDc)k)alY-h[lIZ!qhTr,*MDZ
6TKGp,[+bNp-`jPQCpEJ64GUkaD!DXF'80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l
1bb2j`E4mDbafS5aG4rV(QBS,DAF-pIPCbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a
9Cbj2D@i@qUC8h'a@H[,JJMDNfrH5e-ha@AMdST,jr-qAljL($06eY9h'+bI[Gal
`F%%Abe@eJpQRlELVUi0e"4+H`Fl,5pZHa$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1
AH$!(GljqYG"C`e[Aj!i!N!-B!$3!N!2c!9i!!3%!!3#3"32S!*!$P!#3!c`!"33
JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9YFb"bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j
6G(9QCQPZCcS!!!FL384$8J-!$%-1A3ZVJL3qkK$[IhHFK&$&)G4%DP3id51JI+m
$XhQ`E%%LLLY5&L[+BUmfRPPS56c20V5eRIKlp5'd&R#V8-'DN`[NHa2f&Rp[Uq2
[+Bkr"`Z$C0@51V1le%jX88M#[#6,5*F+)D6h2b'G@&alE[hp!!hQjM3a!53d)c8
I9H31TRe)rcV)$iI*09++@dDQTRq#k&TppEhe[XIrZIY,JQEAQSTlA2-l*paR2Y5
,b2iCjXre,L1E3r2Sef%ELF&(C*Jd)T(#pFK,#LST),jM##,K-*&P)-*'4#N(P,)
Al$TU(bITSp*QRrABYfrHDa1r,6ZbNYQXrAKQ61GrVaVm%1D2fkBE,&GRSiHmj'j
dIq'+@IR4JL(UGe5X`5E*!eQHbRapb*ZBmZmrGfA-)@dYfHQr'i"Y)IkTiB`XAjf
#C%06d@6BATL+H`a'2eQEE-kf+IpU1*1YDdKN$-N9qrQPKCPeRHf6%JDc)IYAk2D
PL!&Dh!UIjADp8-!q4hB[5KibK#-S)IaD0Zdmaq,MV3&H(T28'jD(r@GCA+CH%l)
[SjdNfmEk-UZA@RA5k`r[AePd(Z6H@GNEi(ZR#f0fIc4Z%cldphL%jIr[+@JqArA
Vk3,h[p@GN`4mj-([2DIj5KfmRVaKJ-K3(i2,4hV#!Ej`Fk``mZU3!'(1Y[VK-#C
LRRM[*[A0b2i&[YCHQ2FM@iU%X,h2T5G"SY-3c&2Z4+H4+(5KA("K63c*QPKGd%6














$!8eN1%f`#K8QC%qL3NCVUAUH+PkT+F,G*ERBE&L6qA'pV%RTqhC*Nm,EpS)Q*pq
ZHNZ6(BrcT3(Q1ld"T[#(RS!AT@fTJ+6j(l-"$q6QQlA0q1#b),24mMSm[r52PEZ
cdS("#!a5B2!#JqS1GX"hm#+(KEAh#0-q(T9LIif+X83hfXl(N!$2KDajX'+)-G-
JaQE+,D[E-L)rLl1$A@L+48kN6+2A(p8riYX1elZ3!%30["K#[P"0iMMN%'I5pDl
"+9($iJJJXeh`r)K66A46"'G#6q'"1'GX)pR$1GJ()$K)%EikjmV"McEMQFiXRPT
$L%b1QR+#U2TXMQl#UCS'[kGY`ZS#8XBc2MHLTK+h,m4QE(`P8j&K"NN8q8LR%p@
EX,5+E$ebj+ZL'$'q5jcDiK"r'aCE2rM![3Mp3ipm$r,r,VUNla@b)ak5[2,NL@E
bC-H1&*8aQNammYm8+D,i%Pf)49MDQ)macSk`RPqK$Jp1l$GJp$"20l0kARafiHF
(YhA#D1kmr%!GMCe)G9dBhH`JPG8R1i'mL'`Aj[Am0lr)$TlmJMAL"!0#e4+YcRI
(qI(aKj4VB",1ikHNqkKTHrD`(NAIr,B64)dBRD*kI)8(FJf)PpYLUHcfFR"8l3,
`e[%Q&bL%`-&&YGEjP4ij#NEd6V+N-r)qKQTKU%paAR`@8ArV[!i4'Bam-j0c+VV
aMi`"$`5'lajYHZ$Xd+0%Q9YU+YAP[#8f$94@-k#0MSPSJTCL5S9dc+@K(98LMU4
HI-Z"*Rm343l'9e"2HEK`Nqj%)qGMQq)+R0&[,r0r@fTq,F''-FqLM!jk'3SQjA!
,p!IDJk%SKZCHi*)1@H!J&`-")$(rh0QR)14RcfEf0$DQ@cqEZhqaEpcchI[hrLL
qclAmDE2-8SaQ2eRA5HPZ"UHTC@-&[Q%8j"YUe1!Y622V3R*TYr#bIG*FD*Ghq3h
4Z'5eDXNV+ZjIikS%GB("F9T)XRmAZ(cKCrPf15FCGQ@Pb-e3mKCMK@#Y%`52'qF
!Gr3)R,f`(j*[q!dYLM3a&%UHIUZL4'kX5P[LF`-A#jZmTbUCk4B59h['2-(LKXP
J,FYEfQK)*'5VB5rk8$c0c%VchKF+rK9N1l%I82R'JS*$-Y3DHCC$hSKLHIN04aP
S9dcrbk&2&L(5F,9FTUfDSCL5h%8pT3QY4p2A4bbAG0+APYepe@I2P&9YYedrVaA
XD'RZ$-&aIf-`D)LDeqZmFX8E`V8*,pFBA!U9mYJZGlSf+Nrk2F&Jb8i'[Rp08(r
[j6c"a9#4MqhD(UBSDr"2$0'm9X&64eP(U2J[cqZ'jp+,JQ9G0j%2YNR99Z&5ifj
Z8A#%cJ*bX*(#@jJU5Y!)f+hZ%ai6K'2DqN[dA!"'Z2k132HllH*P%+r4m525"`N
bLV420j*)$p3L@B%)&fQ2cAHj)&`fiLXClN$MN@6qkSB9MT1F$'G-&b43k21PXRr
Hr1KIqH54*!+d@bP*RklP@V1Rq[VIc)8S4r4Mlr4%IYqf3j8Y'eD[XY"H*eIG-"K
BFc53!+V`6R-(`TQN3UR%li#bUaf'@A0FScBST8KK4j+M&2I6pMUVhE0JN!$FUHS
SGAbJl2@'`P*aRfPNY'bJYShE9AC2VVC-'LV0Nq(bS+A3*b'"X"%i4N195-SpCUG
3N@C&-%3)+h4$prRk"ap0Q11q$`#3!aS'!)!!N!-$0Li`$e0dG@CQ5A3J8d9")$B
Z-!#3!`i'!)!!N!-$0Li`!cBZ-!#3!a8!9!"N!)X"KJ!"!3#3"`4,!*!%'!!m!%!
!X!'B!!%"!*!(!3F!N!B")N&%3e)$!!1+$9-+Qb3!IiC&X0dj141`a3jG5dj2(GX
"&32EXIVB$&EecMiSU&KpE-&ZV1V'`$pMIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'
14[HZ8aVX",2c+"6FaH)b3VE8Z5$*F`Z3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2
-5eVUQP++(3Xq(j[6I`6`H[ijkXV6kQVrRepZakZIr82rqj'@*3+i-fUMJQe@`8J
Q[%@VE)a9Y9jE2Q+EYiAYB49ph"I'dPT-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd
2ZK"S@S!R"-J!R!"-[ISY!2lU#3-4I`$`SR,K!K!FJS!"JQ*J,6L,N8'-h`a#j")
kiZTMNXbp+(%I60pdq8A%+fc,'!#3!hG"4%05!`!!J!e6#eXJ!`1QB-1UDV-`X!%
LBQ!h5l(E@C@J)',$(ZVC`*K9-3YM+VVhTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9
!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D4"4f4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#
3!d`!!J#3"3J!0!!D!4Z)'e"XC@&cC5"TER0PFR3JC'PcDb"H-#"hDA4S1J#3"JX
!#`!V!#ZJ!J4,!*!&(3!d!#d"')J#AM%!N!-k!!%!N!8f!)F!5J$""!*25`#3"3)
!43![!6q)'9i`)'&`F'9KFR-JG'mJBQ8JC'&YB@GPC#j,!*!$UN&%3e)$!!#f$9X
,8c!$Gh-YCJEX'G2+9FBh011qY99@aMp[6qr9HVIZ2IrL'aS!!2!0!!$S0Jd!!!Z
b,4Z"TIJ(GQIlqH@Y,A269XhI@GL6%@dlV3-R+QGCfFQZmRMAGd5&i&,%Ii)B&,j
%$*hc3NQSKJ%P3S!ZU!lHe3A!Ni8FS"Ldp)0C(qm)NQG"[L$ILXeK[1,pDj-&TB8
5+iUjFYcRZF,59(MPm@%"!*!$$!!S!#J!I`&`"+p993!!!3#3!i!!(rp!!#!#)!!



L"*!!!#B*b!!L%q3!)L!#!#*!!3!JKq#!)3r`3#)F-#!N'Im3+"U+#$)bLL3Q-[)
b6M3'15CPp$)5C43N#'Im#!4``"!#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ
!!!53!!!!!L!!!!&!!*!$J!#3"i!!(rr!!$rri!!rrr!!2rri!$rrr!!rrri!2rr
r!$rrri!rrrr!2rrri$rrrr!rrrri2rrrr$rrrrjrrj!$2rrrrKrrrr`2rrri"rr
rm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!F
"!!IrrJ!)!)-!#B%#J!T#!N!)K!)J#3J#%![3!rJ))!!)#%!!#!L!!!J*!!!)#J!
!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P
(#!JCr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J2rrri"rrq!!rrr`!2rrq!$rr
r`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!,J3+!#%)#3!Q%!L!)5!)3#j!
!!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J
'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P(#!JCr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J
!!!J2rrri"rrq!!rrr`!2rrq!$rrr`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J
!J`!,J3+!#N)#3!T%!L!+5!)3#P!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J
!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!J
F-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!r
rrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!!!!3#3!i!!!!&!!!!#)!!!"*!!!!!*b!!!%q3!!#!#!!"!!3!
!Kq#!!3r`3!)F-#!%'Im3#"U+#")bLL3Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!

#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!
!!!(!!!!$i!!!"r!!!!ri!!!Ir!!!2ri!!(rr!!$rri!"rrr!!rrri!Irrr!2rrr
i(rrrr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri
!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!J(39"36!#3"JG6C@Fb!!%!N!3(8f9

R-`!#I`#3!`G6C@G1!!2r!*!$"d&38%`!N!BFBA9cG!#3!`&*3diM!*!&K%C548B
!N!@%!*!$0%&9Fc)!N!-"5801)`!$!*!$J!!"!)%!!J##!!-!JdC548B!!`#3!i!
!!3#"!!)!JJ!$!)-!N!-J(kNJ-6Nj-#dj1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbi
!N!GA384$8J-!!3%08`,FeJD6pp*'c886E3#dq6FZ[0Y0'fE#E,kV#pq%hE$Ej0e
feG9eB3!*1+@)rh3&qKSdTMBHqm5GDpP1JSQ`da$k`,2S!'L3!-@qrJ5q"J!!"!#
3%B%!N"k"!2m!N"b"!&3Vr`#3'S%!92p8+rm!N"L"!&6rN!08+rm!N"D"!&6rN!9
8+rm!N"5"!2AfN!08pT!%+rm!N"+"!2AfN!6ipT!&+rm!N"#"!2AfpS'3"PEhp[B
Vr`#3$S%!pIEfrIq3"[a@pT!$+rm!N!b"!2AfpPErIrH3")(rprD3"#[r!*!+J3$
epT!$r2hh9Rq3"DZ3!hrfpL[r!*!)J3"8pT!%rhrfIbTr!*!$9&4r9L[f9#[r!*!
'J3"8rrD3!eErq2Gr+Rm!N!089+[h+rEr9#[r!*!%J3"8rrrfN!2mrIG@9#T8N!9
rUrIfp[rr9#[r!!#"!&6rN!08q2ErIrCr+T!&9&4rIrIi92q3!e6ir`!!rbY8rrr
fpPErprGr+S'3"+a8UeEfN!2rre6ir`#3"2mV92rfp[cppPDV+S(fN!1"IrrhpT!
$re6ir`#3"[mV92EfrIhh9UZVrj!'IrIfN!08q2m!N!Mr+rEf9[jrpj!%ri(hN!6
fN!2hq2m!N!Vr+rEf9[hrN!D"pT!&prMr!*!-rb[fN!ErJIH3!rD3!rIir`#3$[m
VpT!$rrrirrripT!$prMr!*!3rb[fN!2hprMhN!2fprMr!*!5rb[fN!48pT!$prM
r!*!8rbY8rj!&92Mr!*!@rbY8rj!$92Mr!*!BrbY8re6ir`#3'[mV92Mr!*!FrrM
r!*!Hr`#3-8'q384$8J-!L*3393eP94%!)9AZ4TmqRj95PcUATCN,r9RRV)1Y&6P
H1jc3GFqEVLjEl3C1JUk`V3AFmqjV$&`iAPc"J3XJ$Z3-4`bCdm0Y##l%,r%icjZ
FCiMR%66'8q2A)&qI0c'k%%2)(0[kr[[m2Qer(3-KPpIhrcNG9MB5%3)"N!34!C!
$%8)1!&d$hjVfq3GkSM-)I$p%JIi-VY(dH,DTQlm%+I%l&pq,KG6e2rZA[*+*Ki9
Zk1YTJNrm1+q%MK*aN!!IIC1)fQ+kp4CCBci[B"bL3I2"8)RUN6Ap6DF6h`'adj2
)DcU0"36Mmj9TS#RE"L,9@i0@[`hNhLm(IrBACr*6N!!XQl+0J6[RfmDDYl`eZ-E
FY"[,Ar&P"-ZGI0P*VbG+3ZHARDAA%bA"9VlF#D*`cl+cRIm'%,b12Zk6)#!Q(!2
2j$P$*LG-J5E2RrM!p&ER[i'19!mLFeAc6N(d(66I2qpZca(Mf+)36klmC[al)S#
I%(k#V6P#rY0r$hpUIYB@",(+iU`)$BRrQIVVj*!!BbLV12B!RhBj+rKLAm4PV[p
6I@`Z(mV1**MMND'46f-5JpS*JThiaJ(9e$mc!FYX`5JbS%jQc(ACRK+qcZdJ5-C
%8Sb,EF+8If@U8+AL2hqGqLXec0M8ApR%13bEmE0Pp!T04Dl`k9(pG15+a-THM1d
E%ppSrR'N,pSRJRP#jC&[cqrQ*)1$9[IRhBNF%9hjRr(2XIR2XIR24E$MKqNLeYE
b!h@!Ecek4d!G-&[-pGGEBVU94iL9[h)jSlBI2Q(HkZ+[+[6(@hria*@Y4q8F&#j
@-A9AJdj-(R)FbQf3!2[cZc[L4$4YlEIHBNe59SM+BKeS1Xd'k9K)5mT1D59#UF6
Fpehf)N,XfQ'I0DNGG1Q2r%H*d0P$P"dSUMS1S,'4el6EJ5hD[9K'N!$*Q'clbaY
LY"XNB2b(E,N5qH21Jd12#M'9APmSe-rAqEGd(S6+!K$l`QLhqIk0'dqp,6``#)m
md"4c*QAA2K$"1fY'2p!8*qr9"bHDT!"P(`CE&M)rS()$Dq`Q4pHkf8k[l+V1N!$
IV2j)cTBeXVrk&-MqIKXac9$Y5CM[fLb`QD+0FREL1hrF,,`J1iF5rPMdRVfG32#
2c5+NqHR,Fe621"#8+*2Nc[Qi,%1*8YYIbXSFAB%"CkKCaEG"aA%TXR+5f)!rHSi
%f3p%3F!A[Vb8Lh2BjD(9YZ(0rb!@SB*"LpCq"(P0CF5DY`MaNKBaE+d$"90r'),
RP3LfC[Im"KA"`BkdY9i+[SL86Kk3!,G34%Q"Qb)+34U4(jYD%fNblKY6UDc)J*!
!N3(4@A1LZc@[b5JRl8p5G*[[YiRd81IfK)JPf`+#b0[4cS1Y`Qakrl2fJ(RS[IV
VKm`QNkRqXlP(TCGK4bDd4`)QNpPN(jq&TTlCjI4C2YX%)EBJ,H53!-5dLEmdQpS
$+GqirZKGPSCR-ldecdC#,rmB@fG-RBqU9#8H)X0CJj5Y',!KUXG844BaXF8[UJH
U8mejcBHEFTZ+V)JFPBSb+*TEQQh0Gb16ilqD00@cUQI*BmD8R&4Nb"6HZ6K40d[
BakQ#RV3iIIJ*aIaNR-ecBP%8ZHUB6aTUX`cQ@i0VmTSqE,`ARfQ0*cXAIlXB*,b
Sk5d`eL'6F-q*EQ0J!Z"fGFe6!,BE6hbDUrTkik3mCMmMbrT,(5klhaLU"aP2RiR
hUDXa!UEFM*49-VdXMje*cl#(-38U-IeGjq,LM8rYA5XDarKRk90l9DV'`kDmaVk
RpSTSSkPcmDl032`jFeT)B$%("mc)'XTE8SHIUXiC2lM'&MFYETjlq,R3P#hHjhV
+eAbp+Drj*L+*i'FZ92a&j`cc030l*rUJj2QQ4DT(m&10LRQckN@`9022[M&E4I1
[$81rZ[RAB'XFb'XZ95h#C#2pD0RBN!$Bf"!N#Ep""!fpI2J#IVl3XRk"RrHdV22
Cd0rmke2eI@*Bf!DDRk3-&BZ&`"9RD(rJ9,GbBiLUkpHBQamh6Uea0@r&YMpd"1d
Y%`mhIf'deFDJi'(()YAM6M@C!6,ZTmaT)[6'Ai,)5PfA!X8CXT*f@5NE#8!A8#L
K,&pcAZ0SmmG@RM8TNXe28aDL5#,UGP8rPE$3#e6c6aZbA!c%rbii5Fb2,%@3!*k
(JX3"NTTca2DUZAkEX+d4AR0pcE'f[AiUAAecMm8fdDXHrD[A%Q,M6qPIk8r[X'`
pBX0NUpKiKIk9AVRHXK8Jjaf[f3+ck%$)A+pcBH($`F[Ea-DVp+rdkXf@VFGXlXS
((cPkmq90U+VRp[dpUY@r(a3KQfpZ,`DqF))pCB3#L'RV2JYPq*ZV@j%pKb,C8Ie
4Hk3,5-kIA)SVjpdQ3Q-$64qDhpXad$60r0RbBf0Hmh[,Mfd,D0%iX[9B5[,Q)iF
(QZifIapXFm(ffQ'hqI[,AqX*E2b!rT9qm2L4VDr01JC8qZ6)$8!-Rl0!V@aZ,jr
`F@6k4p[Nb$kGD'QZ(XMQfIH&e3l+$U1XZq%D!(B$MC01R5j#fGBL#H,93(e*I*Y
)lYXQN!!p$4)b-NJT`KT[Pl0MZ[B@aKJN4RN)1Ap*L!pMEIlrjHaf-lEG)GpZ8"#
b**1%dN4EC,5bHXM!c#KBV#e%9*BG-0FN#Q$Y3@Z3!)kJ+TR4DUBPSG"mE&DF,V%
&fq2P-Pp9-,pf(F`R&Fb(9QG@28-'hR4'BHE2m-cNA&9ammIdXBkT#P@&6FdSH)-
Lf240D9+SKEUT!BX!`0"[kS94aLL4M&[*h%%Z"MMHdLkHYMM94[pdLee'Y9P"Q6I
1iCrI*d*f([cfHBR3VGU[kBlP'i2689`Eh@"ZJk055-SbE4FTYb",a8H[lCZXkrC
j'CU&K'Vcaa6eXLDU!cAm9LHDk%*YUj,%&VU-J42G-Cjp'r8Se80CPfJS9jMr33j
'k4Vh5C[YUC!!"&"fLLMqkHKR6D6ar"T8S)eCFP*MN9eV0)h'03$E'p0MlI%H-3,
&$@-aC8e#I49bhZ*K0'CdBK60ZFA&1N5hfM'`j&&l3Jik2Cp,9C%k9S&#a)LImf#
50Gd%bMFk`b)388&43Nc%M#V,CbK5e14'a)X8fJCFJUBHZ$3jP$I-`F"eeLM%aM4
A*SISqUclB+Kq`q&aQ6+Z3G*2iR!&$VM42&hmk2PCJNc62NXpd(acLKT4T,B10*G
5dcAJRb@Ja2&6h9#UQl*XIP&PLbZ')l2LYL!bT46Cih'Hq3j(TH5H`0l!8i200kh
TDbjpDJJ&mm0,5P!`cq9&m9TH&!Xa6h[Yk3jF#k3Sfhkk`h+LflPA'ST59')PI,$
i851bJl`d!6H2BSk-BH+b,Fk9AqqJ,DQG4b1$Hp"#81d0BjYCkGMZTA&NTZ6[Fp2
425)b10U03fCEQENH!%Ua3S&mDk6!0-%3VH#)QKLLJj83(@K-X%XkfDADU9FhfZ*
G3N+AN!#eHF1G$-E&8UC'UVC*CE96cbeZ,V@hc-KVIY`H*3#!90Vm4I8[V&j#rY%
dLLbRKbl#P8PEA2R#[PPjJC9-`2m+6!MCdBe`0)*"L8fb`rK+E8aKLZXN4TLEQYM
NfkXrHQ95b#M`%-!ULPr*&Ufr!#*L3",`bPlMmB0CSJZ#%L5SI694[*LG3R$a0-A
EXq9ecUjb"&Gc`ERL4eV"K#J6#qB11+GmU442TYfUckcUiB'E+[8!&$l@2p6j[*@
CUfSr9I8dI5%eDj0f1SET)*[ZdNil-1f9TXmB4'c#Y*Y0'd5Xa,5264Y%8!CQP5&
`%(LlrfDT-3qbC5'@(l`e#"*M)B"pFZ13!'YMXm5q)6(&!C!!G!$ZZ`XHS1TA'@a
Pae"T!E+He5d45fh2AJ(`+iUI&K$iKLG+#ak!D0Ni"3**+m!J33$2,1(dfB)a3"e
b6m&Q+PE9`JjR!8aei8JKM[$M))lC6,QUFAj`VH*J#i"!@@8"3DF99a&SZ!!(DRP
eHaNEEAmRZk$%N9Y3!MI4VF6#a#k!Z'8JaY9$j'AMZl8aA2%**UT3p25SUU6M"5R
QY!!DA2ZQidJG1CT*K3Ymc`*0)qpN&aA5X[QEMYbL3XTB!M%c$HjNBkE1[VDQ@m"
3p!kjEad!H6e39*3R!Ul2f@YN5af!SeSf"1rPVS6$U#cfSKQ*6kYQ)++ULMD5H3L
rhD0cD#lEYK'ip84G5[+1bhGBN!"9[M2QN4fD1L,-Sr'QIePhKd8hJDd9fr!Mqjq
SJm#Gh,f`"!54VqMk`8M[)+C,#)4S3Y%Z*jhTlC'19q(5TYS2TjXZA"8ES@CN`fh
#Dipb"c69i8fEr$&rrTA)d25qR+d1-$[E54`KZDq-#CVD9`Ee'03A)UA-@+5b1&[
JUZI+LZ,LZS6Qq8-C+-Mb&kP+)S3Q8!5KXEJ"P9H180h,&G%"-AZE[`3$C@!ID-J
Y+XS44H6N@@HiB([*[TkL`ZCjh&%6SUZIYr88P)5"2d%81+MqpV&UUh0'p)YCFB8
Cqb9(*DX%L%40lmBjQ5#j4Fh!l*)RLDKN@P3)Ti'dJ15@#$*2)%q)+`4ilr-fIB0
!I+"93Nk*r'@-Zb1@l!Xf9E4Q@j0J,$,R&YV`XkQj+EU)`$&9LEdGC['DULM2Mm8
P99'11TVV(X4%"4BiNZ[MMSKH!%D1b*!!iBVTVTcU5*q%bR-ZU1b!#48j0MU`T-i
kX+6+R,C@6GZJ+KpN2"FfIC1KkKRYG[,Jj@i`,9jbPCKZ3$0-Q0j!3dcdiF!S'0A
d`Y3N-J"F$LbjDKeB2)aT[m2&+blrJB!aBieVbG9bANIY`Yh"TMaFM#l`%X#18aa
JJR1N8bD3!"@[A3la*KT-RlU@2%U!b!NpBKk('d6)bkHkk6L-e'A1qhFd%C1S')d
C&aIrHp8D6#bj-Z!Up"UB#&b$f"P&8H9@lF+l3#%SYj!!+YAPR62@[Pk*,HdT[&L
b#jq&M@P4K0-P#jd9D+KUBX*l`UKDi`)+LaqYQ5KHUai#Q)!#VQZYQSSiFqjf,`F
r,8"a'Jh"f-8VfM(KjG22m5TemD0U0ZhQdl9XfTmQfVf%B[3m!0E6A)8*S(BHk&*
8')N4Jp0JYK`)%!-#FY-"`9mJUZP&G%"iPj4SZP-(JGV!NT)h,36-%(PLU,6`lih
HkKi%BQrK*ULbMS`3362T%*TZH`ZQVNT6KF8djI4q$J%8X#G()r+qX9#!QJc%JQB
#VX)&2B@E8Z,,,G*9$8Fdh6P*Bl`'diK+3R@6Y,9LMDCE)8M`TNGNk1('!caE306
f`('H90+#3k5F2IJjLS-0($`DYR-bmT*(8F6IY!D[Pa``jb)`JTN3Q5JYh%6!'U,
XU*j881M(6e3L&A6YMHDCqTU,)'V+1Fa**9$leh558!#0)Q3aUKTJ6PPQ3V-hc6K
*$YZYf66X2*Jh5-0f+Y68FN5R[QC4BA5bULhAj5f%Lb#Ua-PpK!M-Kb+[A5GfarB
USmd"8mmjKbUYGZkLSKIQdR&,@ki3KG&VN!$08E!-dmpG5m[6#"JZY3#Jl`)CEiS
*5-[[*J1P#q$+eP0`KB+25pL6R)M*AbL[b[h+m5bUN!"&ck'B5PdUHfZ`D1ZKkka
#!ZM+5[94BhS,C+P,T")[#VTRKJdU#H3kHZda8M'#p4i8*dF*r1E"1QP2K,fBXE1
6TT@"+'$M4G"4BY*(+B,DLI#J&NL5QRJ"8'`&)&Um"CI)[D@&SbHZS*NPa(Z1AUI
202$f+c&Z'!"9%0f%j0Z[D,Sam#5J[MZJ2P4dJG881+*%NkPS,P9#X49Y6"HqXDr
Y$pqBdmr-8'2Y+@L`pK60,1H+1@5`9LpY#U*YF!#RKP@,2STdJNF5@SYmbm5NbmG
QLMFE#LH3!2'+E(%UC&$XZ,J!LF$h@ZH-,4q#`#F-lS$F@CD$P-C!HdI!9rqXdar
Y%+VJ)E[$k-G3lHN)j8@pU,bAiZ1fEm,VXP#@Fj[4TQ@ZXUmdHSPjZ#2`[@J3c"A
iZ1hdZLa`fSlXPVF6$)NMR62q8(UL@e)&Mib%j03-m*%hAH8ic#NNGeY&p5@Hf4c
YR1Y)#efp,@%E%c9I$LE-@!#`r18FTjUbZ3$mVkfZf3Ib#3lRJ2J-XdkBBllJUqZ
3!0i&3r9@ek6,P!m#G1'16d3)#AS@hE0A936hC@T+Vh@D(!"HFZ9l#,`2mDYXpe$
#)Jc@*FkeBK!5SGLik3)r%J)cULe-Hc(Y`b)S3RMTMAD*8-#DQe4h"D`4ekXZ8FD
&9ILlK(GG`ZPlPB6kSfRl9+'V*kAK@R9AD#@b',kh!`9mJrcQMj'T1R(2K%JkZN)
AEr1dG!@fB`rIL),iB%m#mCYI25r+a#hhT)A8SX+4&Yb9eiHV+h"mc13%QEP3lVi
K,CN[2%CrEFcHHX0jq0d0ejEC4pii,di,faYlHb2pYiYaB`#[IIHF"hfa!JSq)2F
Ri*4pq*2lUMV[)T1J3PA+KU0Pp@+H%9F"&mXSL,B`P84GV"hCDV0XBrHp$&I,k1c
j6TpM[V-PYQZS4-KrR)[-4@+cF,F"0EN-D$lSR![f5+adIfE+'96HXEcMUHHab$M
cqc2lXDJMNMB@bqh'Jh!1%![qR`bC&TY[1jQ"4@$NH(V@E9LBm[+))C!!NA)mMaC
e@9M43V$rB%a(%iKLScGk34a%%V#@k)A3IJ#qhSJVjP0h4ApjJM,6Bb$CG!91BlQ
E+Q#+-J`FL%4[`1VXBT'f5Hjq"SAPepkerE$(((A&2FlKU'ZIakR'TmYCJDNZZ%b
)@!@Z64TK$XBJQ6*%#5QLFmHP4P!V9q@5i&Z$8SAe3ThGKb-LjZ2ZJj442Ndb"M'
F-,GiR+,SMYR#[Z[LMf8rAXlQaZ`VmlVpDq%bc-eM1-`mr'3H!)h+`&iPQ@)HN@L
kSMq,iNCR&*pJRRI5*5&B&&-L4SdcZ5[JIk%15Cdq3#!GE[T!MS0YkHq@MBaJ'%@
Q)95MpTKGkKmiV%K)9i'2cqPpF5bQVKk,4DAKXM%F'8X#a6K-44rFdB#F*RHrJ5D
JD,Q"QX8!r-3)IMi&'$PZ(+Q149fUDIC3Y5"$fp%N2$#d&ZDDNY3,`&%rNX2!+3+
6H$N+)hcjXeK)mjRf!Vq3!'qJ"VF(JU*[[#aD6HI&0Pc5i`MB[G@K@+Jk5+,TGD)
*cNAh*U3V%%a8p9a%NU2S&m29[`"V"E'Fq)!c0(#'&XkJPVC3lEF2iiVakULpBQJ
cR'Y+%8`@L@Me,Hp3SM&*I!8r2LeF2$qqYY)9dLDMf15Yp)S(1LLSA"D2JU9R0CB
+iH'-flK5HUVlT)#ES)",dHP&4UdIj2j5"'8NhS"Ca([3$%0L-k&@alcUc5+!iVA
%T'EXQZE(B!$H4"f+C6r2d%1a`J#ijmN9T,QDP'Uk9Bil%j5*D22!IGh[(*lY1JP
(M-N*TdrYZDXqYNZYMVLUHr4&#"#qfaU%@j0Dp6JDfRIA6Xd5)#G%iEbrP5F'38D
5MD+-0mJ8jR3h$P@S(Rm(c+UY'2K9K9c!,eBcR#TV%'c$URPJDe'p`!pqKFEXJKr
4iGp`TieU(+ibMK$CJ+l&pBr`DchDDp8E*U`fH9fL8%Q,GmLTEKk438&BH)'VJB[
M)P"LfAAF#9%5L6,!lKQJLjViKPqN3rc9,8Kmi-8P)b#5HGJe,3U%TcM#DRj&928
9hka2[eQSq!@1iV!@45NC@p8lG'JH2r3#[p+!h0V9eE`+pSN0BMHYaRlh1m5bP5,
B'+U0DB0rYpk!q#DhFQ8p`#1"'j1aM'e5E50(G8Si4)N8T%e[,RI6$b'K+Q8$*%'
)U`!*Xd@Im#lUmSQm@96%hMNS*IGU'T%5AT9m)5AhiU4,0mKRkq+8,6&LLj2C)J(
3R,dUj5Y+USJ'eJZci[BS%4pSZ$da+`jR*(pd5286%*@[R*+5aC@5Db5DAMH$1Cd
cPqSc1+5X)P8)Vdi61ed!eXfB!#,bZZT69L5&S`ZEham$mEEjl9Rak#,8TL&9XAf
+(i%iPLKKGPFm9U'Ia*CfG3%GHfJ@#)Jhr#8CXrPS+`!`dm+#i%0%q1!*1+4%*qS
`CA@%+HY659Q2,QI+LNS+DIS8)(fpAMfQGbAP&-jA+UI%"p5(9(qbYfJChk+QI1%
RT$6lJA"PE@r!BAYjbLUi&UrD$-VD$J&fC$Sdrfc9kYQq-&`pMei6VKi*m$DB+bm
@15QTj(8i![!-M'2'(DPRdP1%P2b3!!TY-NI*d5`bmF+Y2%RGL#d`13((-I8[rA`
L+8hBYaJ$#P+a)4(Fj&*eT(H@1cSN!PPdB'brF26QE%S6VC0rHRrd#M)0LBaE`j[
Y2'Y*EK3q,+D`3+*Q*"*6Af-"ZDihEaU"kZ1+jN283pNd9+!I%#06AHj0ANGI6L5
k5I6)`MkSGYH%)U,&NKCSElYfCZ45V0A@eqTrGBP+95G'EN$HNeXFcicLFq#NchX
$NZ1*b+9)(bU@@hGicCr0YZ6-aI@q592Z)VVBBp0Ir(Qh1HpeN!"!*[Y(-j(&8)q
Ua'GDr(T*E"081["k#9bl%2&6pmTaHiXd*4(MIM%AS)eDQX,"%MP1ahLcIFISllR
MQTEBlX!VC'FajKpkj,Mfi%`j6K%(ac@*X&G,53jCGT8DcDQTrG,a9ZQ)P@FjPQb
&Q"CGh&l4[UKNFqZLNSH`1C!!Tq3SL&3J3jE8%L-)6ddm)YVd"XPIdBX1PYN6E8I
Ke,T)9E`r%(0SfI,qI5&Rmc)fQi+YY6*E`H1-,@PJ8`F0#4Q4dK%E*2$H++*(pq%
rHc4kK#mS%HV+k0(4h[a4QXc)1A1F6bBG4qdqaa%N)JhSX`&-6ZZB25FV3`T@Ah[
4NIeQ25@6prH3!(2,lXrU!hd#581ji9rX(cTPRYMG1pMIf6IBhGEA'q%Z[ec)mD`
,CjL3!0LUK,c%K%bdp8p-IQHLFq+XAJ`&)S"4AVC`Xi@2,mj,JF`Sd+P%NVfUB+m
kfB5'XXD*0)bS2#mL-!+EP"d[SK1EaA)dIGU0E[P'DQED,P,&`TSqU(MUqSFLNk-
6N9%K4Ma$+CR(dc2Pe*aFq`AR`C6MkI"`PSqI@8TS&PR,X&eH)2Lf)BQVGmqd@-K
dPV,R)$$DJ`U)`+RAZ-"Z$GrD9DUNi*C4NVKQ4`eFDNY3f809ULmN!1-G0'Y9M5#
2jB)eQc)l$PXSF6S*P-4GhJeepC!$4bBe[81mf&&GXCC"E%@Bf&SZpK1klJ4P&#c
Ji&36&heC,rT`h(i[!f9UDI%'#PS43P4j9Bflka-Jm%mBCm2TI2GR&M3BpJ4L0R,
&,4V"CYZPV9-`KFK,q,PLM$BpIcLqZpl5SlS%Gm+!-l3Rm-jCdG,$+q,(#kN3rHP
JpbNB6(pE,dFG@I0P(#M8)bp,KC2k40h3EdA%q!dTLMMD*ATP)fXcqmh[pj@Tbq`
pH`0dK%a$BYVRNjL+lL1eG5#V`4KS115mbA')M[cS,&9fBL0$#*8GmU-R1[AfbiY
`EMJ9Y$(k-@3HU"-$f4,`)Qd&!5"#aMr8h6RBIeDlTI[-p`HS%2H6UJTIKkT@@XH
)rQf&'eLQRB4DSqBXJBBGU5ZQ!eNB5GHTQZZF86S(86*XFU)k+T6Bm1+qcKQlGKf
13jA4YVqS,B3#5%KcVp,Y'Z6R+0"A,81Q(,qH%S[Z%6cS8F,V&K"00"6i%#R6(+r
a&bXGI8prKUE6P+0[pda(b&R4(Rhc(pi2(Je9CRZ6$JiMDDSkLFCVI3$6I[J!94#
ED9$2q0cJ[Cc4p*E0peNKh(c5b9QaS+)R6XQ&(Dm"q2R#0'KbJl'qa5f*FYTiT,B
BMQ$$bh$XJC'i0%QZE80`lj9[Y&f%S*PU0c8rF@%A8&!lGr"SI`B4IS`L[%IBC8N
NFm8JBI0'iPa-+Gck)%B5`6H3!%"3H3JCJ9#qUSR8"+EA86c!m",AN!$K(3LShAC
I$a`@#ql&&Y6F1&SN`49e2A'ZfYFS+q0@%,3'cP+(%HTLCL3!1qI$5-lfG[C'*YS
Uf`T&ebiBLdGIkHm4MQe#)kRH2[E1T'VA`'d%Y(!3D"H!PIGli[B4Z8e6Pd"A#IU
Lk`G%Q(+EYJQIK-J2*%68U(`YqJ*Y)49!+#hk"cq[K),Jc338KMDMYrc#F$N1pr8
16TaU'k9MR42I`G(KUIlFp-b8h-ad@31McNc*c%h02--&UJN-YNc#j4)rbCLDXN#
4D#$k$K(HNM'[+GF!i&r@p%Dq-pSp1%N,"8*NV(!dR%D&(SJd`P$iA4Sbp`lGhYm
jfGmR"6HiJ!A&Z&63qdeNkK@Ii2LEp5QKfE6i,$h`JZr0Q60$[!!6X@h%`LmBC`%
GlV+hC2'Sp%XU4!)E+FScSFJ@&"IeKN"rDE!l-Y4V3%$DX&-b$)"N&5qLN!#SB%K
Ak$Y2q$M5fpBl-4Pfd%T*9rd8jE[VHB8BG@5*6LFjJA8fcc0KJ%M9k,,e'frVKS$
"ENe[*ppiXIRqEj!!f54(J)"N1V[V(HihUD#@6-L[4PDZ2E6RVccSS8VKlQ9`-d1
a8S(QJaZ"4Q1,%qMqc*0MFB"5EdY"b2LR"LJLjFECVh&aZ@Uh0N,pXCL*h&C1KiZ
cmST#qR61q*ASLLYI!`KS+1rkJM[BpAEPp8!hqRH$S[-([DM#Y`QhVFcV8RhSp(h
2"9GC+@+1)f,31B9kLel"9''EHXrfGdV"US4("iVXJJDUm[A94Y'9(f@VYP1eU$H
RBcMBfpR(Ma948L8H'%dp4FAEAN@R(4B#V)dU'GPG1KFAkT'UZk,I3RK96rc0HNV
Bj3$3`BY)#6dl,a!AL5PHh&*L'f6X&"86F'jb%B(%A'm9FTa)GE8pR"NA[[QCipM
6-h%XZMZX#%E8[3MPS*P#9b'cS,0j[N&CH(d-L%(a%3eGdL6VXJf[jDKGLa)UPEF
)M2ceaSkidGY`+%GkPB&AKfAhjaCXGT5Uh8304k,Hm4*(2r(*5ePqcRSb&YVfUMb
9El&+6Q!qr4EfHC[R!b$f8SFX6%NpT+$#*k(mBPcJl8(f2U*X(%@5[QLF3XA,LmC
4UX#%2LLcLK003$PqCk+R6[FENa21Xc,ElM#rB)SR8#)NTT!!P@V[L8GISdhDTka
6G"!%d&B*1*3YH`3ZpZJV69`-mNb0i@,c"&`a@&&-J!LrIJmT$XVRi0K1(JA,T)X
CU2-e&-8SqQ&@89afBD9P2!kfNA$NT)j[N!!&GQm2[9l*Q6Yi-Z@G%T,+VB&&jL`
I9GiL%q2TL9ZMFCqDMTjMk24`92Cdd!@K(VG-dIBDMcDiP1T9`45`dD!!2GLLe!#
"XNcpT,K4YEVq%h*`M&J1#bZKibH3!0CJYM5mDk&HX940I$c8VINFe-,qcV2GTdD
e+U8!03Ah),ATV,b1`!5lc[%5&5YffA(SD9TiV!4``EAUYi-*G*Mep*(Cr!8hrl2
fL+lhaMmbK[CYF9)J823C81&423cRNG"Z%VmbBDCZEQDrI#m*TqSJZN0YrZb6)eb
Spr#BkLc%SMXZ543R4ZV)-6PFT$3jpc*-i"N15#$V"38)1D3r)c8S!M6aS@%L4"-
c$"0"QQJd6(KTBKiAMQkHN!"Xl*RPPfZ1F(+9j4dH54j&*&dkeDQC',UpYh-dmVP
HQGmJCDU*(&11-U[#PAPr#90Q9CJbqr6+[2qQ$NQCrNV+p+p5QAj5jSa`C3j+JRJ
MBR99XXPYiZE,9KqT%HBeD$![!r-l($$hE$%!jTF(*bC(%9+C&[592DQ"9jdQ-LZ
AqPA64-[8E&GZQRj3-c%'S(p2!"06$@Ic)L!XZ06ha1$1#2FF!H+&%"9Br"H5#2U
mJ$F1@cM,*Z-U@'caKQbUIT!!E1pXE*NNqQQTfLC!UeiI$+lf6k+4hBYU[VYcp`3
$b9&9"rfXQiSS&5mmmYSG#hRNV86"6iYK(RNSSKmi6*%hqeLfS5Vh8'&Mj3dE)JZ
JF+f9#Ji@[1X0TR09+Ykq-k%a++j)EckmX`a8EiA8-%LXii@&alS198FKU5qmDQ+
)YM"%NkLQ#KAJ4CCTm)$JL,PCCA[DN@hIcF%`&c+fKMpa28h0JLkDmU-K,hl"+dN
GN5lT5RV"!PCl#lD-Pa)30cL1icSh0am%PTXXXIQXL9(K'!b[D1e6V-$NRGe*cI#
HZ+3@V6&",Am,Y6#Gp2G1'Z"B4-p101&*L"U*$%Ie4%9Nb1m(X#e,Ve"S&eZec8!
hLR5D3[(k2+kDdMCZSj,kFC(K"RrCGiiEM4GbRA39-`38X6S,%8P5MERT8J'rG3c
+Smf-8E%X!9,'0jSkG,pa,,5M!VB)5b#Q!`-[M,Pc%E)9QcTkd!8A4%dCr8dGC",
E"!QA`(pe[B+F-F6)'AU$P"Uj*!T0)8Q8"#BC42&Ua6I!'jd%!M0#aT!!PT!!SDq
`Si3ij#a(TEebY8Ul"eA4U0A23,!5S&bKh`LDZakU(P&K68'GF3AbfSS&9c,FP5#
#Bb%PJ#)!3'AVLFH58Y!T09)e5D)'Y%eP"ZC*@1XE'"AS3"+45dZV@Yr!abCm[&(
H3FhmQ!4X+&`(rr"!H2-IJ%3j66Tq33XZd2%,@UaUN!$TkDG#F9&5V'3A$FG@5Nh
+bQa`r0K%$)DQj(IlKeE3NQ6A4R(Y1,mfDP9V$5A)VP,(@L5#Q#6q9e8dU9Fcb($
PY!pA+AMG#J3[8JS'X,&Dfj'*6@V&*VQ5r*`-iQCL+jMBC*b,rCUD*[AJ2Sb#3IY
-Q%HVF!p(d3"!5B,9`XF%Mc1&HbUciC)LBM!!U$mPK62iP&ddKBYDq896r#,P*9(
4bLlaa#S"Jp)&Ahq%ASB"STAKX2@lD'69&qfF(Rl4"pU0'-!peXbZFAVi0AjF3d9
"NSQ1aLVd6DKRCY1%&*!!$[82mGB5%k$@"L1e9BNL-['CS#N@M"6SP9bP&iBLmq2
qSE!5Fle8-,jU&6aD%Dk#KIb5e8VrpEYXDY@A&F[KPhh-e@fSIeQb%aZk`+"%-4A
8`0`[dX3"i6LEBapr0HS6rh25Mi6G3j'U@!6$Z4RYF1J)%CLfYRd+#6MX88Vi29S
e1R4!&E0&VN5U4Lq0$X@),FMC"'HVN!!5L1qZfNf-IQ,FI@Rhd25cH34fYXK90MF
bXa3*4PEDaK4)(4$lKFdGk@dBc",q"4idIp9H,hIDjBQ3!2lRT2#RkC-KJA*A%4J
2G!5k!S1"dF$*J$'`*h!j-#r3&*JHH$p`4f"MS$43'%U'2+(fd+D3!#QN#GdEbJS
G#0@&[JUp'*SGUJrG%GSB+Jd9"T2"m@"(X#Xi'"`0fS2T`D2"KF(DB%0`CR"ZF'Y
`TcIN9AX6hNhH3HqSeqj0paleeRJAH&rhc[$1m9lVhHcGjIDl4p`kpbbhfEhERH&
1F9[F9pf2Z"HjkpehZ*pdlr,jIF-qR@q@VmqhfhIHGm"hfEI!eq#EkC[VfqVE@HB
VQbT,P0R+$THePCdZ1eqf[kbUE(PCGGRXX[UbD@8hPpeAYXXImPIi4rcYrKhq`hk
(IlIrj&5Kq!Im9)dq'a0PGMBma)IjE2JD(cVBm+Gm1-D'&rQ`K`friN1C$4rK`aB
f[*-2[@aB682I,MDXjF20E2JL(pl%KPrbiGeXq+pmq!8E[X@($@cBc)HeE0M%K`[
CX*%2Ml(K%Mj-Bm2&I(L1$9rR`a0XZ)J21pR`E6jdXH(2q(!('rk5$e[CF$BI$V2
K#hcSCm2T0(5AX1(rjX1(f(!'(cl1K[r'Kh2Cm$riF#BEIX+(,f#j&6m@8ZTZQL)
&%&-$CeM)KPc&lQ0Xb*AU6Q0$VNEh1B@S@LiURc&)#1X0i$Gm1-CHFJ@jHpL3!%H
"@fDLUV5L+KJ$9i4EX#'2)ZmcM2fRqLei0l+VMR''1pK`2KqqcpMVm,1!XmpQiRK
dH&p8L(Z4-baA62dVRl+`)pbB[#PXb#2#Qk'ii#KRMbLQ,[)TPf,U!cj&#[J*+Bm
,N48-5cL$AJ(F$,ek"I$)$T)#TZQ9&hb5EAFC(el,KXrai4afm"rjF!BEmS!9I*d
0ZIN'&bK3Q%FS"#pMq4jqPR1'23UPe('',-@4BhcU0"2*!dZ`M3fj%3B2+iaP'@I
IaKKi`!kZC)KcK369E2JX(iEBm'pT'0U*j6rV%3Xp`)B[mH%eLQYHSQY#lbQQ&[)
TC3"iK%r9+UDqaDGU&&2cqG3HaG4rmUNXKYE2qGAh-SE[iZF+CfKM$&cjSF--84i
a)4YM2d*'cpP*!AmJmpFEG5LUZ2,ID#T3STLD`DFfXf-8Q8Iie,@++@k1JIF9aql
N8rS!`&%2[+KJi&%I@+kBiN%QB&&-0I#TA,DpSea)M!f[m''%$Br`B4mEAZ,$@@a
BaiFk0[bB$dIBm#SI4YR`!aU+)MDmc)GEf*!!4cY(MBB,qI"kTS)[5IQ%V0!AJ0a
Na!YX1)m2Pl(K0rP`2K[q*aqLLaVa2LXSpQ,a6kb)-E)"99FC6*P8d1Hc&e6`Y,%
"LA+a!9fjL4dJ3p#a&pr#B*`0#"%e'e!ekTek2r*Xj*)%R15*EpXj12-X*H`PPk@
`K018P#T%LC!![(C+K-J"Q*NFJ,RPT2#fDC04Mm0cBM4i2VM!Dj,q"@IcaBLh"`F
l4)!IVHC(iqJ8laVYdHPLJ6!,MCL'(MZRLGdLAC`APd@MH"($Nf)QNL%F`(+Db"A
(a!Na4hb#`A,4`#HRLIR$Bq*18L`@Y9JFaH,,f!&mASbPil-XPSY28q`m2XfaNrJ
XLCh!jrABERaq&Y2Jmd,-JFrrM[AKmaqa`rKm%Z[#Tckf!jr2BY[`Q4PVaqIl-4Q
I1E%4I$k-6H&6'+[!TcMQaqHa',bXe8K#k6BV0Lf"HrY1LT!!6J[Z,3[-"9Mh1VC
F"lIYQX$0BRlJ`m#eJCf"VB(0JG,35P%GmJ9+3JKBSLQd-P!$`#mDDK%0SC8B@N5
pH!kUZ%E-&4X$mm9Q85bf!)6d"ccSFdJ1k-"N#lJ!6*S$q3&0i,P!GH"m)!DJ-Sd
,q!,)`J%m-!q,)a3iX6L+"5Q4JJNTX3S,8Z-K,&+`1)E&15aH`i,8@)I&D5aq5S%
6LbYBN!!D,f&K`J*G$!D@B[%a&U6'UeKdB2%"&JNXDLK`BR%4LaBXPQ14a1)P,%*
B,%4NPQ$aYeJmJm9A@0b(aAFTF')a(iZEX%#AQq)1,1CKm5%@hk6!LF8M@-c!iPY
Bc-CL!4D0@2`'LeSXhX+#&,!)#e,!fmb)[Q"'p)rFL2k*'p(Gh)MqK4[4YGb)VZ&
'p!3hSJHi%Gh2M@Jc0k,IFL1kMa[4VlN42F50k'&Z4+AFL2l!MHKAh)LHi8Ed0@j
%1r9'&23LiFM2i0EZ8iq*VdXZkk%Y#X0DlUbJ$JEii"8RQ[Fi2Sf,qJNAGD0H9'J
'4#eRSYjRSTBT4"ec*L$+c!HhmN%VIYVadi-I*,4bbM%E41lLfrJfhmDMI"XPI"[
Eq6B+q19&r(+9p[,$Z,bCAIl[l2)16&VBj,qab@(q3B*0C'QMZ!PjKeZ3!(aQ+a)
i9D1VDU$kf#@1FJL*[)+%UZ8P*0$UQ+5(Mh4m6TpCNiE2k#RkH#B0(c00L4SqX0&
(A+CMBZ[,&XlFml+&[r4,(kk-$kRE0eS'9cScq')M1DRaJbp+"d39MUIT"hM9pV,
PHaCR#KI`IjhlqF,Ml-'VT@!k6"1h2!&Q-["kU+UD'HUr-N0YC)DkQ"PU!c28fFa
3ImN-G6Sce*pc3hf1'qS-EUMr`!heRlQK[XF0pFIF81Gb3lf,'qSGh&$rb!heHQk
SIq+'qYmmLQrL8A`cMq,rbk0i)irLV6b+raH2iLGC&*p!02h"VUNF5G&RKAMpU(-
EAaaaVU6&PrrS60+LYKUChKi)fF,&rT@,ICb,r3X6kq-G)3P&eb9)6-mI`5+4#N!
Q%#Yj0aC4Hj5j0e(b""YeGb)G+6K'cTqYc"'%-RS'cX%&IIiljq#1rJJ5G0I+MYU
b@C6KHfhdR+N2(EAjM01S'%(A2AhSZ-H%j$%GiV$1`KFpl4C+kSl1c4p"BRJiAKF
FJ`2B-ZTS1L48M6a4qQ`DHJ9h-Mp@(B,`Y'LZH8e4b*jbhBGa68q4Ykh(,`VQfA)
,DK2qd52TDjpSjNR6Y5+GAL64EdF#aQ2QHUTBc'ZFh[h6BLf[j"BX%MEGSS,TlBX
+CT-DU6VAZkK59U4(TXF*95-R!-NCRd9#cAQj#DMa@Q3#N!"c++Qh#!53!"meSIZ
a@)8Fr0G%+a+3!-R"1l'3!"hkK'N-0*!!A-DDm#U*"-KUdlZFZ)0ZEhKL+M`QSeA
4@828ld'd)42Fll`h`ETYL(PEhUF1lp"C6$#aGUE&[J81VSGHVFSAaRMp)IY1[0U
",L5pFZLaZLU,($+l6#iXqRAp0rkc,[V,pc1Qj*RKrhjfGqC$)&$E$!BMMq8SZZY
#G#5TLc"k))fqSbeYadqETHiUN!!iYA8#REqpkQUY`m$2"dGEkp"p8c3((Dj3jiM
IVX[[PKhSeJ8GCI'*mrRGX5*T`pr+cXj)cmjqHFFpk1$VKRY1(Xr)cNa,c655Iq2
JIURc9Ze9RJd92emTrZr#*!Y*Q*6JK*+IF2E89E+RG4lmc`I2(bq(DBLi1011cS-
,P%b90X8jaHS+E1Rmh43B[N@kkhK@9NiUZdC#UU@2@-04el)15@V@GhJ#*&C122b
6eYBkC-8JiHYf$D&bSM[(6d-*&@9(5R5)%b+*f5`GjCf4q0%a4(GP9NRmY!9DmEB
0%+q6MPkRq0(I@IcSGB[rPiIdiJ[%HSM(Um*Lk4M[U!8G+H5[524q*RT'3A5p4-m
S1#`G#aG+"3B5qhdN'TfHa%GLQ4bSD4Decdq)@VNI6S8VRcH,"DXKd!&4SV@12Q"
UaB2CTU4YPPbcBQ6JH+`R35mZQ8Z(T@5HHM%da(96NNX[&$[#XeDE4#eE,+2&VH5
DedK,3SmG@X!28GGa&SNGQE5iT[!mNYm88F(,*Q[aF+X&H(c95#Fk0)1lDT'#fFL
V1I2cB*1ZBQMITfqS16UJT+5M8G6D[5B-q-38ZS0F%'N8#hkN8DNQ'hN6D6kB4Zc
F8%SfjP-5m4SM28aPTrQF&Ue#IBGEq&&"#&#D45J9-LDMBiLFmj(-j%ERS141+jE
Pir&a5,cT-'YiKZrL%L59hel(R1iIJPPD0'""TR!%bZFG9NU-MaDMdPK*$fTKAB#
aDKp1iKPbCNT+6STm)9IZ68XI[*!!PGQIDcbB2TQ1PhP,Pa+,lL-KhN!TX(5TYPa
kiieH`lUr@c(5CY3`p5&*MYUQll+[RG`IN!!3S&a9lU#ZhpXl41edX'6aMZ"*ZBR
EU9*"eMiqGd(4Y,JS+ASC9h3,ZTKEaj@pQA8eX4cG(5#a,h8`))k5))AL5r3G$eV
A+G4HXJ+e2d5CY8cYI9cYZa4UhmAGR`eUceHSICGHlE,d%$6r"LJmpIcaP)jYmTN
,"c+cdcrD)1@V#LPCN!#835C6GmJeF18Ham2ZCNS*'lDAjN[)8PFK4Tj`#SLYGX@
T-jNT5XNX5dM0%eGT-j2@BI1ZGJiN1NGDEq0&!d!G$Ua%V8'H+!SCl(*3V`!*8'*
Lk(KAZc#UTP-A+adr'P+TQ*!!P55%!JCe1D8A-dcQqbbCEjK!J#&KQ9X'P0#j!b(
"91(AUk,N18N9*8mb9E6S95%cd(Cpe-%ZpSGYBJFkF1)SVhCT(l[8q$Hje"!&&*!
!Q,+Q2ZrQc[N+PEI(BITUMU!856'kbU!d#%SMTd"*CI+E#8hL!V)",bUlbk2#@cr
"1llP5BB-hHCTUi*fG#cS*DFSG)dE0CrM(A#28b9!PkkJ5UTdJD'+%S-1NGpYP`E
$qGdS8*'N(X"-k1+Fm1iBHC&#MelebT3B2S"(1rU9AIlaV1)Qi5FhjI+Ucjp8kkY
2-A,Ge5F1pH$3bGBk8SEXB"f0YdSL[Rlj1MDX&c,#98P&PAqp3BdCSN9#Ya+3!#&
PcfF4@P)ebP`$r3bjT+%3CLUI)8j(B+C@kXbfKJb49F@+M'(435mU(pFhrf5rqNB
l(Y+SI#&VP%-Mh1-F(RZ*FY+UKX"06$!DrrS'!BC6X5J(8KG,)+VqQ1%"Hb3J[bj
mdkU&+e"8K@PjZ*)8eG"QK@TJ@19Ic#jS$jYBr1hjKXGA#Qe54ri`UIPNVNjrC!N
8FAYX%1kcDC4-"Tdm2Y"U*S-Bk+D+"JC,kVIakQNPCq*6K3XT`&,(-Ymf-S65U#%
i,X)DJP%FJ4)$akJaL1STbJXmfR,5X&hqJ%pYelLY,ePI"F0Ap-#crP+H+1Ff!LD
C#MUP!)1#LJ9H&R$E!FK&j4BHR0GJNahFE!l`EPCeBBK*3GLb)T-PpiV@QK9&"k)
i@,q)*r[clckbh#)(&%a4-ZH@'L9ibT0*Bp-TFX146'pY6`aG4$U6LE8YedaDl#@
*#ENrc#625j8D,k6AD9'$#PA(5#&R5rN,#Lj-)DV$j5Y%0F`93YXI9hD15!KT"a$
dfcSHU25QAD+rPT+'UPS-Pa,SJ844'bN`k#m[QPRqj8Ack(*chNqq,d9$d9BbEkP
cqIEX2hma()kfD+L-YTLZ4&[%9Q"#QaMDlc2MD5N2EAddlkK4UR'Z4DR'2kY4F5E
IfdLLq"$3,0Qjc6$iqVf'`GG@9LlbjkV$LRb!G&+4riGjekPFFVkE4L+NiPP4!*Q
[UkKQKE'KLpSdP8VKVVDi4+F&TY#dJI28989ahK8@'(4HEp+#$BB9UG,&CHV+aA6
K&kY0[ElDe$cpP05*Xa,d+M'A9pA16GGAYHJQEEfV[8I(TD1V4cJH@+!f&-N5!E+
GZLPYQ9k9%@VhSX1U'GXID4GiM,ThqU(mlS`)&F2YjmMP8`iDM(9lPk+i@bFCl2D
VfS#d6Q,lYZD9)H%P%ijTp)9dE($kS956EM@4*3mS4,,LFrZB9L3,Q,Z+p#+9#Gc
e$jP99MC5GeN0!))bI3##d)aN93`[cVBIE9G8-P)PXIfNcLa(88Qdm)S$&e*&8l+
,'!QBFY"MaJHTFdF+r#8f'4d#S[(#L`dUmX&mZAdjVkKNIY8kkE+[heG19A@lXNU
3!#9N!A+0+N!ZCI'0*PbrdXb"")%',3555!DNfKJQ$Tfq9$DrSQX9VQ#m1c&b6iF
E@#"01)lPM&Z6$*ceG&kN$XbFS5[2A[YXT1UjBhP2bR!PmkC9lVD!9h4VF'"'S%3
RG!#U@pXkTYVG-kSdh5I4GHLebkGAT4EVJ[1AFeCdF5baLrEfj&HSq*pmPTUI"L"
D$N*pR[#Z#k6(S2B!A1dSDqZ"5fpdQe[AJDkQSIEjadJj$8KiP9&"B2eA5-M89QB
$mI5V3h,,+A5Iq0MLEHlTadkZ[2CC4*1AA4AY[*M`iM%pk&#1M$ae+i`ULNHEU`d
2-c8!bYb)e$P4#I3!mJP0prl!Hif#rRL"k0Bk&19N(QSjV#0cIBGYP(J$aPF9IRf
l!0($,c9ml)05BYBY2YC82XqEbS@+TM)RG5LDbKQ+TR+KYUNFP-J6%`rI1)TZ+'c
S0`PUHUcj@D#U!B,2i3GGdUAT5H8AU18Xfp''PM0c-ml)"h-cdibCUHQC'9Qrhe#
5"5ZbS"$UmK$+G2'KZZdFKRiVVk)QUBS+!lYieH9(p%8cI,4%akFp@[$$3,)GjS4
l(49rq@(&AcJJDK#l6fV5%8QL1Ub)@#49(Arc+k5M2-ZJK9qR$cVqcSXR+KHjIlC
V&4YlEX9A82GU0+b[86EIbTZFH2KkPk'#$D[Q(blCU"KX9JbZNBlqD5cmU+(L,Ri
SA04fS4Mi&3123Q`a#BKVUqp!6cjrE(jJ&Lh#Uh3Nhq!Ur!@4H(H!L09Uj`Rh8@$
[`*'q%peiD[Spq+&K"@pN*""ScL&S*AM33Z),8Ff#8SHHP##Tq8,1QHb6ampNb[E
M&l*!F#*#8fT@j['8e3-%Rp!I@,U8R3J2%"`-ZVid[1(lUfe5KIl!`[8"JakB3b,
+Dk6qbPkjQBNN1$Zd%8k*P2%31#6JpaqeU!2P[CLTH-%%h+-&r[N@+%VL-&29)Mc
@X4!2'JmMIM-bmSj`P!fJ&fY3Y+i'f$K!2!caTQd+*ePXfcFQ#qeN*qm+G3BkH(0
4jKh)QdL+K!)dK#+`'PeYjUj)CC4&b4pmacGR#pXF%U9TZk9Kh6a33q&D-M"LL*2
bCK5K`a9$%0%(9P-,b+`"RU83)S""LqSch,`dfSNlC(pq0bGU5a-cHF1GSkfGr%*
UpNjp)UKEQIQ%L2jPB5&ebLUU`LBhBp+SR#TUN3*(d3kZ2*im@I[bR%3U+$Tm3RY
P`9Dq56h,P(5mB#G(T-)!QT!!+4SDdT8+-A45'8BFJVVH9"3Pk[)+ELh"CR[6kU$
VLJSj$U`J$cLFC%B25GD5+(Ph)CTbb4"+8X8IXPC%UM#3!%J8*,aa!`R2+&B[FVH
(&EQ4*Yj*MAmedjj#d6M#-K6,09)k0SRMGZV8aNqNZ98eAUK#I+*16a#pUel"V#6
DeUmb#'S"imT%*d6pZbc4af*9fUS3f4$N`LpKC+'-&C1p($9fIf6acir+p+0H6D@
H$5)d$KZBmeI%V(q)"$)YN!$98@&Yi4NJNQY!0)a!8)R8UL9-+`(dMi3ADVJ3TJ+
ZQ[!'16qX,MqLL*chd1#6G5XJV1Nh9e'q@9%eZVfBUY&#[f+J9Jb%NR#3!+JTeh3
hA0',#h3V9V5qH5eQDC[AKJdA58dB-#`Zm'ZdcHm#9q8UE89SUY*AP9'kRPHVVrY
URJKd5XSLj!fZh4VUP,qBZIV385*-UYP%G!@"TM*"Z,b)B)mM`1CZeK)PpGH!f+[
T0PbLUUe-N!#SI(PjB+%")G8"a4B9ekJ@K9ecpfT(&aI)Ub`5p&YlqCGc&G9S)8[
%A%L91c[8SP$CdV!!pA+##YIq94CT'NhGkSJ8[9MqYX+99f5[908`Y4Gp@-jfZeD
J`+PbYYE"ARBTYMCFU4KdV5kXS(3&NA&['0UZkd*2UAaPeEaDGK')l`Q&djRmmKY
Y`UZlQ,MdEVr`YQIV$1"8P$U8ah9K"9PBC)cp6bALQ+aHY6'8&mP53Q[q)#p**EV
9!pQ+SMmm%PFG!-S2H1&"52Aq#JLS(MVH@[-+@#NVB%9Ne!dMZp)II+-mS*T0AIb
p3Th99,V%ZUjGRiddqFB&MJ3qmN[+4`k9L4kTJB"1+&Yj"pBGJCZ1EMfdcIe&3jE
)p#EFX9#V@`l9(!(KrdNj)(@*CSL@9MTq3D#VE4[m#4qM5Ne(K!5G1+SJ#(-95Ub
k@aH*9ce8hDNh%[[Z'b`MB53Y1*f89kKZePI"+0$h6ccm[ciN9jMIEN1&h2Vc15"
kEKBD,)CT%S0U$*KV9X&Q&24*j`iF-K&a%kr(CGi%CmfVF@,EhJ53!,Q5qpEU$Pl
kLYlbrbTpZZk"UpDC#kRC4"BjHG#HrD$HVf`6H49NTkFF[j!!IJE6f3E(XV$0E(e
r[6G6V0r-e[p$QdNYGc1TfXdB3#-JYR[LiFG+3C!!pG*#8jGIPiJNkYSMp2LKLrr
dVPNX*66`3'a-!'d2f+l5RjH%2pA'`4f#D)Yc6R4[+,)jClJRah8U2JcCdlKq2ee
2Lh"NmjAS*U3T"F*4KR$dGdAi`Zq#-*5lFDDNh)dcedHj'mrr1C@l3BB!j@l85-V
GU&PIjA+%rfc+A3q%pHJQk(+@BF+[C@"LT@[jTIH%AIVhl0+F-aYii@0ArkBAVNF
KSlr3p1FT,MK#IkG%D0-0%N+5cYHRZ!K(kmp4)+m2@UY@PYT+h4"f(R`N)bIl`3X
CQEPk59fTkEmhCS*aD$"9k*f"2&eX!hh)M!UeM`k[%6Xm`46hR#-1VefHYBDFpBQ
N,J[U`TQ4SEJj&cfAAiijkl[PY4aQQlKRJiUf@@FbFp06IKrQKUdRpie,&fh(Re*
4@C8F-*'80qE-6)H2mHm3U82rAekl`LhcDk0iQKPPd5(bd&%N2Q[KdSd)c$d14lm
(biR""bN+k5&[XkcSXQNS!0!'53l8r!p$`%1`5V-10rL&lBIi8lELNUMdR+bF"c0
6bT1e5P&EbK&ed'KFS5KH0(MjSfiV11"+IkL!F9JLZ8E6K#Fiak,f%M"m!L*eh((
0BS2F#fI+%5QCc`dfDBU)c*[bMTqjlF&+4C!!22(`%q2FQGfR)$f9%l5qU`aCfSX
S#XJG(d&hUDaqfA,Afb!B`)Rp`+KbqR2YLrmUPrfr'XTRhhZL-V,h&ki2XTChPGM
ZZ#IlE'CZCJUX+M8R)c0eIcS`4pPC6S&-9l6q@Dj)$Eq#`'VmS4e`iJ)!2%cQ[d*
h'L)8d"@[V-L+8a'pQU&8r*qU5@A&eLU-R[K68mY$C'Up%(Pq"D@K!3q0&+5!5*6
q2!4N6PU3!!"&48&"(Caiq,iXDJEJmX#UJe3U+ejA,1VAjBJU,dMT4D',mS-@(IM
bMUGPCfAQ1Y22CaY+Nl#SdKGKa35m$0"$1)Tl5e@m!diS6%f20q811AJm!!qB6E+
D'PJ-!1R"*GGe3@6SJU5[8eN-Y68iGMcV`H1r2j1GQi1Z`[H[%M[T8$X1SGrFR!c
d$lC+IQ-3l!0J2jKlj[`&HrSU-,ZJ34a'H$3L)%l*Em0!m'G2B1(KBRC3)C1l5JP
mCa&Z$%a@ZD,ZJDLFJqNE+%Y86[a`re8H50AV'e`AK#9EfP41)&d[8hR3S0kAZh[
H"V##2`EL)KiAL$mR`L[rX+%Zbc[ahc([a"m`K(PFKf%m@+jKL28cM!Fhc$!Hh"$
$H,!F`kJF"C[2DD1Jm'm3"BU#'!!!-!0"4%05!`"@X!p9#b`T!#TYFlqAGePA4&a
@)L+L&4(4e)aac"K(hrIGIFRcbmK-c8a"cLdB!F+#CUE2ZlX#)Tl0e"ScTh%FafR
-QXBaTk"a(+I-2,mDac`hRMXP-j!$)k6PITi&A$ahdhcrllUqll[1mehA"4XFJ34
"%!4"N!")LQ4%+pE9eIeQr92kH8H`q"9S`60JMX1FKZN+`f&#B5l$G),THl$0FbU
Qb8d)39(NbGfRFV1$4eZ5kM4$qS8Kir29ZqTN)a!pM[p5,DCI*lA620)XScCk'Ap
228!I*mh4LU3mqL$T8ffdp&YM6,5Cce4R'#A4Mr%rU)r3GdQ,Y'`TRCBN,G!HPjB
DMdCRmF9U+8e2HN0l@[Ucm94d'Ap0R@*iS`rbU@S"68ZDVCQN`FETk"IUq$hU[qR
ZT)&DTA5'KL6GVpdT2@$m-rSX(k3HTCUNZc68!q0%p$&Z981-mZJrmD(UEA4(8V"
fA'UJP+5(Y6h53mEcdI[iF(@%F5Vk1Ak[HT)H6"UTlCIQ'MR4HrNhkQiDPM4+UjG
bDAl53Zf3!$621"aYiC&U*b-m1UU12k-Qdlq51QXlT'EUNr4hEE2d4b-S1S(IVQC
3[k5rDZp)Ic2bSc2j6fTrBf2dkrahDK2p*DQ[eLMYSTj*2pGqP&iehSkq`(ZVRaX
hSfr`,p9[k6G*hE@,dLH'1cU@reIG3[p)HPp,Nb+S4p+(@ScdJl%TZTAh8P2TFY+
YHl62T!('9p%Vq6QeQl%LHK9r3[fHRNcUSLfAAMDf4Ar%rk2ZT'H61QMETDh82ZN
9l8fTSr&@p'VH93deMN4[i0I9YA3P+8aE)kfMUdQAY#qNDmEAdHYjQqSLCp*j6CF
5MIZLihLmDMH8D!Hh@96*TL9ac5,Cd23`P2i'b651$Y$MG)*Z8*e4*pH0UcY3phM
GL6SbHfS,m`*&aTMLCI,SF3G8Hr'-dEUffUaV%Nbd1BiMlKURDmm(G+fd@0GUBE*
J(S%C$D3*(3Xkam&8!M0MM-XqHNDYbfl`2*Fp`%Hll,+`"cL3!11%pA!X)A#&l&3
`(a"fR,"Mf0iCYEVQJ@5M8,F8kYSi@GGNMkkCLb8MqJkqc2,(a*9"-8%4D8%*PMp
+pUrFXCEQq!eZ5d2bRKFXYpR[2)RJ2'j4-k)X#HHD-LeIr4MM$RSRCVpP3fEbUIf
@4SYEDbfh2(GiLqe8P'"UDmU-q6(Q&,+mjjL`X!hZjjEPCG1bqc+#,*Ra&M8faYf
8UIb[3*hDbIQ0'cFY"[ISh&!YKX9M-55lKp"64(4S(V)Bc&SmUXdMV[S+(XeMk0b
M@Mca"JQX4p8-$q3,6XM"%)bSXH6"!-E*Z(3JFChB``e(aA)+pl!GBM'&'bkf&00
!X8'DS@)9lR(B28`JC`ULCiHdUQ8iikSqjRJaV9C,2mpk(KHN*RSiFR&1A1&FGD*
2*YGe#cH43&Ui+JCF',$BB99ZFL8b"M*a0Ek#dF'jUd)!0bNfJ9DjaD@CZ**BXGh
Nd)!+C5aLYhUHV@"5l6KAE)*&&5Xi3YQ5%'p4Z)AKA%iQ"'ZVA+K%eHSPXJ'BAAD
rKVLf(mDdpmY3H+(&E#PdfFf&C$&,A,JDeP%eJ9(aEcG6)I*55k%025"jS82XdX9
'l&FYKC*Q,P5G%'%QYYeH+(SU$X8HXb*B155"3a'5*16-BU6D#UZ%5f+CZ+Te+m5
!"IYiYAT9r%`+SLE@B4BL9D'DId99+-J,&FCP-G[mQS&8S[!YQM"+'b-32P&T-!)
2+!)j08C5-($0&5r11B-`&"C)+qKRX&*fB)0khLp!R2[lSNc9H#BA)UjS9#'"aNX
pJK@8khjfYYXTMXIVjI4[jPV&URDKhA@,8D@Yd&5e@5S+Xd)E[hb8YS(8#k2D&9%
*3'D$*%86'-NX-1Ue3ZL$!B'$&,0L-`X@%!XjR5TbZeX51r'E3ME!EM*FA&'F6,c
#&BIQ&bI@8H`-k9qR6DQ3!-r@866XMKHlJ2-c#T3GXP@aXU+FCmZ`I&D&h1Y9@jR
k$"h+pJX(SYVabZ#!-KD,*2US2Da,NQUh`&B-3)hVk1#0!4C96$+ji[e$e!l"*YR
%3!Q&$','CC'B,-8ZS@C)%VF`U`LaM[1-T`S[PS!1*U%0&R2k&f%B*N0MV2#3!%U
&8*G0l&G3-feJ&AM1p+M5b9'aQL1d!S1%*RSX91JKFk%q`%bL!q![p&J`X)L"m+#
La!SpLNf`LUS(0[8+1fCEi9MYf+,DX89SLB%$G5'8b4(b(0MZX!QC!'@c)0SPX4)
cM"pPGGi[6MKdaL+N#4N9kLLSP4i8ViH0&FLjcmP',LG$1Ha#$jX3LJUVaN1BL8`
5Fe)HH%+25@+Hd!3i!5(JkL@64`d6"q3"hJ0hjf%E"-8p+U-K$K3Rie#[Xah#Q"3
d#qjcXT'I#4Q(i&,m%BAP%@AJF,)G3Y4jX6c"j@),%qrIlS"U6#G(U&m4UQ*)"*V
B8Ab&LXLJf-V`mAj14Db$c%8qI+T!Zar[*2Ih9Aib$Rq2*TUq+cQSeBe[#)ITX-p
!hq@1DmS)fT!!f4VVrXSG%46eMRV&Cd3&fUbV$T[J8G([l,Jd!E[JD+r`8X5q$Q0
@,h5LIA$'V1P!Ad"r-8b`VRhr5B&@d`#$PkLDikUf+J@G)c#TJX(,4kVDMMBB0``
bUaApBp`*P[,3S#U9SFCl4ahA@L3*5VbhhQ'mYabG(6#C@1HX1Q$PI#8UqIA0%IQ
aQ3RVQp$`c!b+8"1VZq"XllLN*MHkBc-h9k'&V0XKUamkhFA!H'mQa[(SciDCUf[
,&kPrH@Ze+mSG"9+iJb*mL6%T5Y$#BFca&QKcFX6!Q(-DmQS`aS[NR2@3!(G4eGi
+9K2IkT%DNEmj)XJ5Ff[LBYM@1BhBCSITKUhTUVBe@ReLkj(afR`4krBTb"C$l2V
!F@XLI$LC!G'4k!`5!q0M`VK(JIDa'5C,elk+9V8hSHHEC`ZF3b0CJF4Rj'pZ5Yi
CC)R3mKNT3Iq2Mi*r(Fa@AG[@4h9Zcf5mL4P"QC[GMB,CRXm)[0liH#[i)m$VK1N
+rJK9fjkTfJkc,FiG83NlSb`Cp[cN`rT%N!#UI9+Jq(L4ilS[3(`m(%X-4!HdRJd
h[U1VkNa1QkMbJRHfTF!jZj+GYqA(ZRIQ0qq-L-VF(-4%'E12J581NPE$C1KDmQ)
eFAYQ9B%0d01#-Ye(Bc0MQMCRiMdS)cpcmc%)RZddCRFf3Lb1LDAKUKS4%j6CP&c
eGFm5%`VU1#S'Yr)MQ&4A8daVP$ZjN3(Ql%KMGJJdQ9@J65Z%+6*#S&$),TK`Q%B
MT(9L5fN+hU0H#BS)5[!&UCEJ0@fEBk*J0kh4B8aV4FFZ"XDdUaLMXNlV"Y2I#-'
hMj!!b`AR3lU1EGe,BYfA"-TT)mB#P00U(-B86i%fT83-M#Nj@"[IAkEXKj'-N!#
q@,XR6(6"-b'p(ZaTXdcSPeUQC)UlfSP0#6@QF1DHTL!p8a,33AUQ)$dcI&d6K2Z
iTLRpQ@[D#%$GZ"@QZH"@5+53!2K5UH06A9@V6LdcTKDa9DGQBG84k-!I6$eZK!5
hA,9'+Y#'P[KARAVF[qT-Q&i`h@&ZacRUj9"6`E0$*q*[@LClDRYMDKq(-48&0I8
RQ0l'8+`cp(M"J+(5Lh!B8iFE8i1arl8#E6V%6DmeKN+YSB#kSH%&eiC'YPaYqRj
MqR&MD+-aY2AUKLr'9mC*+q[dm*D9GAUV`jJ11*jZ&`0M1XTP1RcjG*6,p2l'd0$
UUT[BP"qcFdG86""UFA088dCXK#!ZfrmZ1SYJ4ZRDkae8Chi*fh%q)cmj#Pm1bTh
08FP"EX&Y0Gl`kYIbVdk3!0JhkSdhcKT$CaY$!3C$)a8q3Z%V&"kXm&mSr$m+IeE
K2bPm[m,rU[$h&*l$X(h`qUI`%SArA1(2+0bZm&L&2mbi[eGiXm)h+MaHiCX8[PM
K6LDa'`[2X2%ZKIp$iC@-6eEi3Y%'jJ9-+0SV,SAE92'kk@"R@3SIc-5"qh@&(f"
l6M,88`Tr'fd,K3r"qb'6Hi'Y-8rKpbUmM4dN+RbY`[qZm2N+hk,`%)AhC#hm%@`
FcG+c4a'[FlZCaPk&4l+9TLRmSX,c&(jGiGmb3HfBLNN+Id(KIe2iFDC+Sm)I8AL
D`Rp8q!Q&IkI`Ac,8'DBF9NfZ@Uq@$Di`4E(j#B@rS[!r+rb5`TFUI+$#rm9dDQ1
N[ihTp#&6U%$K45be#NXR#U1G`XmTr#f&cf4,5Nb$")9r`JSJ@q%G&'j9q%k&"a4
q91%USmKdKIGAH&H@B*6PiicZI9RDTLLmNm)(X10lQDkJrS1-1ZmUr#'@KSIC'SG
BQY-9[PIKUa5q41&SmRbXm"X+rdEK[GPL`pRr'DC+!b-0%V1G3F`k4YDV#Pr05JZ
,h@*kB1eAUd"N!k2JMbb4Gc2@,a5q8Z%[-pBYM2Vl'1(!1P[K(4Aq094Ra4-1@3a
kBPNjc@&-&LCk&5Z2"a4HVr$R&4kQm#pC!L$#T[#c#KqNe$e&A)UfG!U20&e1RAf
k9qYJFqL4Q3ep'e0+ZUkHFEcRVQ#2dp8ZjrD%ZD9GPNmrqiPl8'hEqPRlqf@-c(T
jfq+Mh5r@&0U9Gh-lljM[2EGb5Q@2L)&jB@Xqf0Grir$XpPXAPIHq%"+)MjYFhkG
j9&Qh&DqGH6pY50(9GA01rC3j)Vh$pLA(2VpCCc8d0HR`-e(c#Qjp0Zf&(cEG-qE
kKYrZq8[6`ipeI1X2YrhmacZ+cqZrh[[(S'qHI[,l0rljhpJ(PPhlqVf6IhhR`8I
rmp(5hrrQflYNQq-AKrk9[2$JJ+qQr[[$Q,Y(AeRlkI1rHrfK4ejjmlXr[IVfd('
*prebppmh$h[UL99r[[-I@qirF1Q,Mjrl@rkpMcqlFm'*,fqBVLP0lTGS&#p+Q(L
1Z3M1D"&mfD)`-6!@GF-B[Qa4"jJHaY$"UVCj"ebhj&MTq(HPV`qL#4c5SXLaC)b
,4N$QN!##a1rbQ"!XqPfkX@J%AJ@3!#pm9eE43ADjD!ikb#kr1f*mKfaXD,#U4G6
$&-&N#bH(A!EEDm`&jfY-&IR8GaH0lqa'M@A56!NjiH@De%PD,9hc)d#TVr-6JM*
SDe"%rKF4#8%4E#c%IH#BY*d6RcqHBC($q'iq1M9LB#`fBiamDV%**XHS`G@9'M5
kDd5q(+PUc6I9bmh(aLl`fL3+,'if&UFjM-AVdEm*%fE8A*j%k2RQBa0T[Na%@MY
MmA5MCQDeK'Z3!1"rH@"Y0F%cb&KDD03-IQ,#P`UIGikPpFC5015APU%2fLje'AI
4@YqANU8*aY*-ikl8LEAPcP8N2biUa[dVY"bApTY)3IJEidXR3aP!bY,jBQ!X"A3
YlB,qN!!#E8QHF9G&!r-ZeX"%Ta'Y[GDAd1bVM2`Y[i*Q5lD09E-P+,NP+,8Pjm6
!@0)"BaIkI@"k'hIYUY#-9fJ@@R!TT2AVU'5IPXI%AK1@$'cCp&K3k$!@j"9F@e$
Uff34"mB##mj3#aDFV4JE#ij!#4"U!9T"#c+-ZmDr8S4@08c%AUHai*aaedb(Ire
Z`10Y!`8X+[$4j-DSL2d@GR4*$(Dk)k+Dh$(X`(+X5QGIHBXV**fVN!#8(r1cT'!
AAQN@i1dRdL)'b-M34hjCDbcSMbj5&(P%ebjZ%ad[,PCSpR1#3hGq@qZVG2k,8pU
rKYQrKYQ)G+1,BSVXV@Y[pa)G,`p@RID,6%,(P[6BiKGB)IkFVrL+XfUU2$QH!#p
UQjm-mr$Q25qZQJcc9JSb4++P1'mV$$i8[%fLibG$JZ!!'9VSQ[qVk&T0$,'5fCM
A(YdT-'L@APJZ1RjLV'0#Z[TAm#q`)lEjCe0kIX#BAkjVhiiXd+c`k9C!SK8Zc4U
UD[NS6L[UUa99`SVkDN@eX1,9cES,,qfpI-Ze'Elqa5eAlM$QS`l14c(1lkjV2q)
p`KTGX5kFS"A1d%Sqk`k'`8Z60G+rVR8'Nrl+K1PmFD6N#b9M)9*l%fm&9T!!e)T
X`3T9V(MeXq)0b3VJYZ),Pa@9e)UFbJThDZf+C5AIiUY+lBXX[S9)md+NHH(l-1r
LFLZq!9Q$aHTHE[BL(laVF0A5AYlJj4B[&lTdpAB`9EqE9,bC@(#e-cNM+#U#$Nr
JL#b(l@0lRE%F9LEQq*m&pCSb0eZ5mr&0*5)ffCdI8@l*Y"bc["1eDfG-di@JUNm
RNkl5iQY(pG,M[mN`G%8GQr4eD@l2#[Gc+pRpBfY3&E'1qGrU`KLfbPA066(Q"M2
SRc[,BFbGAU"p!r3hTEUQ@990kqEPH*q9[2`)4ZZp2"@ad-YAUpU0%Lm2ae@2@9l
HH*pY(cPSYh'Sm$3ZKjdd0jcHDmlT9-Pcc$RKP9+ZQ4XhEYJRX[US"-IB%M(USX0
h#`0`8GLMh%cE8CFGaLJ!cLMrPmC11qm616&SPSbF2cR0A9&4r+%TdehPN!$D+KL
U94KK$+2a)LFAD--`')E[ClED0relZSj0*KA`B3lrAQ-B2K!-3j0Pf%DBH&f,akY
rI!*-YUUGR`[c2S`GTN4e1P1Bi0XR8ESDhLHk#&B!J!p$24df50IXr5[dDrm5fe9
I&3FjM"4m[NL"BdhCS@ZKP9lHeFXlU9TL$F`FQ2B`#JcFlkM2M6UZDXi1AJirj9c
ZjCG9,I1UUYQ'`-a4cpXbrfI!HciY503)5hQAk[SKK2Mj,(kqqm5lA#PlEhFjY$c
qQG&l[lJ%@k$eh[q&8CILjB2KQSf(,cSd,djIV6KpYFAT,!FZPAjQG+milHjl1Mc
V4QUG85KlLJ2Mc'2b4YFZ+cTJ+[!H,(fkl+Q5al)IbASdrA(,iGa$1A[VGcIXfII
mrT1RRM[p3Z@rcrlcc*h(Eb[rdp(I(cXK4He)6JKUhYcBY2(eM(FbmeXh4F5iBp1
fl2Va`T[E2YUq-hcX$'pIr2EQME"CEGHZGQ[rE',SpE!Vk&qkI1[FJ#j2GRZLDmI
fVlcmR`l2GRUQmlpZrf1I[rIp5rrIpI[VjerfqU((Kjrmprerp2ajleHlrqEc,k1
6h[e&Zep2rZA-hhi3HZ89bmH*XkG0Q6VpMGIqE*P4YqLla8ZA,)LF0hrKh1ZA%fp
G1YIPb3&2G"cFpH81rhPJb2h"Gi3-VER,@NIr8aUSLX1PapehC-1DYHZrA[G&kQF
V[eVqrBT9UpqkHkZI#'2Pf-U)`$@lcANqIYLRhr"Ck$mm+QAiJ`q0G)kijplcl`d
FG(Gm5aVmp,H@02MTEcidq(6@HjBjifR`"emDI$0U@-V$`amDqH#)H`II-r$Z35e
S--Q[X2TR[)LIZ(BfdCp8jqqGRXL[*@mRRaprN6pI!H%q2mRR9bI4f(p9Zid**%Z
rmUpPDR`4)-'%bTSRiCI'FM4HSdNhmE%)Q*!!6*fVU$8aZPAmA(@Lc'@8C$%&-0h
,6'-SMdC6,5fM)Ncq-P%"l[BiL,[*RUBbHST+k$(+TNFSLakPG%`0Xp"KbU9$P%0
lUCjf8`2YSAhd21fRNlLliMN8p`ZBPrY[h%Id6pbEGLFGTpZSR2k%ZF5rTf1B@)D
#LU)GP%`*&%60Y*NDUBNfdZZ83Hp3*ZAM4VY0&%%aj+CB5U-YY)YqT![d*QfMMfJ
ll85Trlm)H*XZdVGd%r2D`ULZMDl49HT'lHPC5U43ZJlX&I+M,p&PZNARD!"eS5I
"p!4eTBjJIB9HT[p3"fcT4-p3CrSAh8jrT$ldGqT,Ik(qp$[U4hqPcqP,kN8r8!r
kN!!qSIr5qr32kNNrTpld+R@Rhc#'D-bqSRIT&p51INf6kCFdNhj,(d#2+eMPBra
Qdc5D3P0T1Ve"Vp'ID3CqLqJl@Na,D3NYS%LD4r0T)Ff&jTH4JP[3qKc6G`$dl8L
$SI2,d28rp!!0SIXTQ1kJ%"T+0A3A@DP1qEm2!LTQ9cM)46V&dAedK$E3'PT,kqP
V@NGI8#Tp4L[T+eT1hp-+@N@Vk5hDfJ)%rPm%M!F"h(5PNCeXj+6c&%r$k&2k"YK
Cj%Fr6+-SKBE6Jr33M366#,U(lJAVHc53!!E4hGMb8L$`%rhY*8&!-%46hF4!i&2
Sm"l0`@p#%2J$IK-(J@qJl6$Sqc!d&[Sq#(h["3MF!fh[KVi6"3%be[%l90Zii(8
)jKS4mTDc`%8BRF2#"b,8CV$36J46(!XA4$LB,F*MJdA)GSU3!'j#X+4VE&$*!YZ
3!"l2`Q3@)PQB+m,M4eKJairhCf%@#b0%X*5bS,#`QJ@V#)IAX0#&K4!4FK0BL'C
KL3Kl-d@Slb2#lM`@cSM3B"EK4#F4T,-LT-i@i5ZfqDY")La2Cf%P#aGCk-A#)K'
q,f+"EIkqNB93&MjKJBPBY9L%0pZc`",fjZFLE'1UE#YRB6X,%5*ma%Mj%52+GNE
klBamfeRLYhGQSBF)iB`SiI8XX!),CiN2lmd#)h%i8c6+aF*P%ACdCB'TPF`1NX0
CH*Q&ReKJ*%KQ6!NQ&PJL%pL')*EX)%DDS$NX-(@$'1JdlaHKFEi)6DGCB0ZD@!%
d-H8f-Y*[c'+"-@eN6"Y[XX#+Fq0d%6+1Xj!!bJ*60)1"9`CMbQ#%IUGCK2bM,$!
JbrHM''MQpf4K#JX-D&V,@'#%Df@Jd-U@Eph+!LZUeViXX-fYM*5Y$&Jh-4*[FV2
!90R%#,H*JF8Q9V5EKSX3`BSYJS&e"#Zf#!E+-5cC-3aFBKJjBKMjh!%@'&RG$+c
GV,+j@59dX`5lql(!5101BB&9fPK'd&J,#`a3BPPLBKP)aE*+&FZ+0TDT'2XD#fa
c'L[JY!B@',R6GV#`Li9c,,"+NXE)NFDUCGS3%EB`TEH`T'jK5Gh##QP,0aBBiED
`C1m5br"G&Z&T,,ZB9pJPT'UlHXP8@bK6IjKfKE*4@LJA,SGa&mVb6CJ2d%M[@bJ
A"f!U#q8a4`[P2!b@V5Q8LrS8bL8G#Z9$f`VPh6MBh30Q4+(FF!`'!KUk&-TlbQ(
!X!I#Rdq!!I,jff&k`Xb%Q3'68LM[*b`DN!$P`NKC$Tb5jC)d@GiG,F[2pjIPrG0
Pq85B,+Y&XUaNb,,H@CE[Li0abr)4Nba[!--'E&cVKHNKbqZcB&E#,*EPVi(mZTX
XI`&"UAQbr0Pq'!Klkl)XKiq3!1@SG"J)LZSZbcXZbR*bUL`(PF%FJ3%LU%f@Qa9
ChJa"66KS4@H69CBMS'4%-ma2XKc6(JE+EZN+!q8ZG)#C,-YCjccbkAL2r#HA4rj
pZ8FqJFk*IKlCYGdMkjFpmLU#`3(9&XZ8A5c,ETKfaE+R2mb)BMP3#Y-2jV9LfE`
9jJ*-Mf*jc1aLZAC8X9c8!@C)X9a3@#`IR&%X2eeI,*H%&m[CABVP4il$3'"@AV'
FVX$-K"PH,$pH!R1j@$jm"ZBL$$EQ&X'8``3AbiH`d+%G-&MX8'HBhX9b6LA-DTJ
fQ$i`%*B$"IIQ`NJ`f,!AKhXA&m[ebf&f`8$aqMN`mi[Ph9"S0aCU5#Q@pd38bbH
4X*2BF2*p'#akLQ!@&F[23C(R)2ad'3`%RiD#,jb#k9NX9hB[PXp#mAq'&XYR`SV
P1k(Jm3DB6iVPfm``50KYqf'J4,N*"K[+"aI,4jZ,j424aE,NJVN*%e)X+dLNFK8
'a(EXJeN(JifZ!!b)k)*`9cc-Z@)jVV9B[LqY@$i#jBl-,CBhp#f@eh3VPYIQ`)$
!Dk(!HK6B&e!f&B@B#Z'IT4E,bb(mHbcqIAXB%'%&$PI"8&P!TNT!1X(d$-L"Z)!
m,LdJQ`(pjPDBQS!mCL2-r)#FY`mQ!kB(6%K!(Jh'dCm(j0S!c%fBb3&j@5h-5TM
C!EN)`Jm!F3"#6""Q'K'3!![Q"Q6[D`(ji*U!r&4U3-lU(j!!(fd,b1P6!V)&3Jl
YJ%N*b!hC!IRj8TJK!IRNdB"m#TdA"JIN5M$GD3V)+K4e()1C'C!!AHYK)%![KqN
--c)Jakd1S$,#B-14b)#m!4Xfp![)DhS(j29)8#S3Rrd%-cdJEiAL@kd"qFd9!6R
K6%"ZcS2C$Y-RJ#F!S!%VV"5kX(3G&GA6Z2dZ2Jjc@h$a"V0!H5dqSUMDbUfBY&P
i9%c(jq2%E%fY0G)9'TPeP[*bD&`C'!ZmpK4ZLZ0V[)NTG0LF3mZ+9&XTQ8mT'MI
`&3CIZ[[b2%b!cLZ)[cq8`SmhN!$&+eh2+`-R@8cdU#*N4$*QeCECRJkkq'PIM$L
IbB&1m#E14#0Z'a@ABhDcAfBSC%k!X`QFKFH[TkIUb95TaUqMR$9dZ%b0hdV2ZbQ
pc$'aG2U6dPhBk4aIYHHZa`HP5Tp4SGIES6Y&,AI48jMYQ8fVQLNhMaiY%c0ccj6
3(K2K1MmNil,Td,i3ac5fpb0$A-B3kDKPp,YTGr'$$Xh)pGVEqH#`lQ*I&KF2DBN
Um0h!Y'hV4h@m[eC'*9jk1PYeDZ@8AS*@+D8I8@eCP0kX1XXSRIIf*fde@cCGp!b
KCGXG`AKk%@qM-VccZ&3Rri#+6UR1,#V#j"A0cf5l)eMXl56dkH)0kd4e*6Q8Ck*
aakS+(LIl['%TG'p*($Y*pcPClfe,)8Y*0TQ,m-C9M8mA'k*5XkQXL!kDe&Yj915
P,"-pAdTl6AM"DP(`[IaEr*fY!LbUS1'Qk"4i1d6qcm[Nfj'6P)R!qC3*BfP4*K8
FicIiP!N2U5k6%PBQ*Da-XPQCP+*-1[L@5@&eQ9`4CE,pCR@46'C&NLf+a0'b5$S
,GH+pBChr0bb50K5*ZC&UXfPF,ZjH(ErEc#C3eB*D&j8fI$ALR9I3lrNS+Lp5"ab
RqZ98@85(q9A+EU#$1A3iPEQM`D+HZN3eVDQSTK!i4,AG`+4ih2l@e@ZI24j9i$X
8L[88RZN$Ee[2RkP6VG!TbTcfXa5[rCPFY5*H,bQEJ-VCATib8AbB+"2FHea%il`
qK9AjNLIK*3Q6R$51rH3b6XiHSDaX+M!4lYXl91UUVKJ-Y1eHfb`5rR1dm*q#E0f
mpVQJk+6iX,NdV'3ejCA3Z#+I9CUpee1ScTQ&5d@"Bm+$32M)JPXeJfPh[8,H-MU
3!#Xf(8"TqS,bA1&IPf#fADShG#l!fGi06kcc&r2J&lPpU9eXKek4$GXTEdeeiL1
&`TfpSC&NbDUR!(G@b&@[4q!aV9Qj[MJYBS4L,r(*jL*'Z+jDkL[*DhUTY4Ih8(L
jd0a5T&fJ3%P92Hf)UQc"ajmlXqPd0Zh*TPam5-UQ8Y`aUE!9-&IPXQ,[5q-(E6k
$9Tr"FTr"FCp"9V8Jh9NN8A&*PGF1aH+(5cG5FAC9$Za(AC`3C@UX4Y88R"FS,GI
#*DdS@l@jD%bf[a4aS98N@A4V#Uic0QmQ"E)G@J95Zb0B1Eq2DXe8V&BT&BjE3#S
'1-B0G,KK4K$Albdh$GH[Pq#6E+e[6DJ9lBFSI,-UcU[1bQmK+cqFRN[,5XQE4AR
(D9N@Fl[cKG)KiV@B8-C(UM&DaLHSBkB*4*IkUal`*Ppm#6UiBDK%LMGRq4lXppF
mq08d'VI$TiA6"N'+[GiR*5ZhaYQcUK&)Z'9#K+ZMFIBBPHA5SbA#[HiTTB1j9&4
#"me8T[S,!q3P"Ulq6806I3"Y2!l30Qdb*Kffi2c9TCqH92TT[r3c,D@IGS9C5Y#
-Dd'E"Rm'-LRqjbNdc"RH3*9Q1PP#hq+"E'CUb+)Q,c9ikG"&j)*dL2HP1f[Td!j
+aDL%'QVTC#e9eMUBUjM&9"AG6m4h&0EY+EkLX1lF!PX0-FEC"EDKJaNbZX!@B[Q
9YR4rdBXiXDADlIe+M,l(Ph"FCh+*Y[8B2SZ+DKRa"`R&rIlY'[cEa-L*QR#SD+Y
2R4EeVNj,hdH([1TPq*'cG+#@5K9kV)4+H9G'3ZXS[f"djiZ[8Z5[R99eGllUE*c
[dfCq6MN#X-&YIG"!E6Y0ZHRdG#kC5ZKTFj@DIMqhZ"U3!-C$$Z"P0ZE5@Vfi*IY
5r39k,+ID5H*aLY@-a0bN(k$Z+R&9lH[QLjB+Mr+"d[R4I!QCUr-XF(k-fI9'1e%
9)dZ18YjURab0(@1'YD$6X"+&LSq$6KAB#&&(cb0V0Shh4["!Z+1qUXELjDA%4AR
H#56#NDm4bmdVN5K[qD5RS5accDS8ZDI2D4b2UrBZ%h-km(*j[[JmjN019@FdSR8
60i&2FF9(PI+8kYaNL0rVP[&HeEKJN5VF2jIQifY#CNL&fYEpdXGZ%q@ED1-C5Pe
"2jC4DK(ph85TkfQYPq,b5+fPSbDkddZ9*A5b([929-UMYH)JVTE@eP,U2RVM'!9
9dXCDbUmPYapUf`'kqSTfmf,ae9MdqJ-9,(TT!2P`dEX!9+MSR40INd@[JrL86#$
KV1eiIcSP(+iBC@*8cNDk9KJ[HJ*%ha9INeQhIjA)62(jQF&[R`*R65qIZ[Er9fM
YrdHK0JJYH*(-m6@p+ZB6DIR*LZEGMTZk6U[D9pe8cBYE@Vc0-2Ell#eQ(S%9Xb(
#("01Se6JVdp2N!$&R4'+K&Zb*+GSVCAi`ADZraA"1AGXmcYmPV)FaLh`b[@5SJP
DV9irH*G1J#raANX4ZmGVT4e-eEA2d,lk+U"U"c&IjL"Q&Kdm9j'SYKEFDUM[aR-
kkJ,U`haXD$pTFThc5$3TVR%[bkYE*RbI2jqDP"khi%r1CP1fLBV18%%*M5j"bmd
K1'Ba0[(Y)E0U*+ThZYHC-MC#Y93IY+UBl6AKJ@UbPHDbUZV&V*`ZUPD+q8,M3RA
Ye#j9bmV!&(p-3jcqYEDkl'YY99p9Hr3SCSZRk0TQ60h*c3%3VRk,dI$JE*A4j1!
Rk(cLKa9[H`%[1LSPlK2'P4`4PUHcX*+&LbcdBQ'4#0mAXA#@K8B%lIY3(@$+ZTK
ZD9UKDL[kUq,Z9@h9BKdhJQ+`6h@qYCVMVPRE@ceiP-2j9M#2+P5F@ip`!hI5ESd
@dIEQ@CcChlb)j`Qmf9lBrYb&5d#3!'ar-`6pEAPLN@hP1UlrL1@hp@&KZ!JICB[
$MijKX9*9qbK$e3jB9IY(%+&pp+jZrfJf"(id&mp*f+jS"`!6fl0eqrC+5-9p'pL
j(I1GF+1LGQ#bDYpq$XcE1f2VpKj!KDZfR6PJFZj-jC&SL1lXMQdlCiPY1`IVp["
kF)B[ejhK#6cFSfMK[B'FM+FQK#rLi3%&&j6%!aUL,%"&A4BS,5T%YqqSKC3G&L&
PKd[(P5E@ABcebP9lFKNd50k(,FNZ,ZjV6`lAlFPT!KXQl-[#rL4X0-3N,aB%5$!
*%3PRG5h""6'jUKC8T'Y"k5VZ+0+#jZMf)+6H(P3$ECZcG([cIQaY2XDIFpLDEf)
+Q+djKCp`f$E[i)FG$(#@c8!Mi+S3fMKCeaT"XQAG9AY6&J3dRGDe*Ua5Z`0YQTZ
#TkN28,f"LJ22)2"X01[fM9e%lhEdTL-T'fZiT9Da[Gj"E(JGmNBhS,9YdTdCi4b
2h0!bR,Sp3fc*Z&e(Xeb`[91Ufpmj#Y`lm'1M8Imc0qTD*J!fElKUcjb"Nda!G4l
QTH@M)C+(`XSrUY[cih#5[`fpCY'lS0[b@6VbH`)h4H"'S@F&09T"CkfeAVHhZX4
`Ul#C!QF(VUrSpG4a,8Z3!(F6!rT0j6cFBGq8J,00EYfqk@A4kiAHjk)(4I,La#8
YX9a%NBi,@Q*A4*S!RSM1SL5G%Cqc!SfBMq-4iL!QLah%('F(-GYdCd`M*TmSpKJ
"J$%!TKL!VM0QVUJmGRF!@(HkERF$G*hZ0AjX"X$DE4&(AA5RZjr!DZlTi%S4b'$
G(QX'Hkb&XH1q)CFp9L3f0N+JireS!8kaR`[-Dhj--$DRQA4l@S2S(8G["hM5GSQ
K8hHQc4*UDQP$G2X@SG8@D,AP#)"U5lK)rjB`(9Hf@,HhlY`bQH1@IQh,#$(a&Ui
,d2NMjJb1`a-e,L`(6@e[%`Zp4,Li6B4[D`Aa[KAH"jr'9#d`Ahbe41GG-Dp8&ep
R&MUd'lM9`i-M$Tp6'#bQQZSfV4ZA(6C-A-C@qcVGCZm[40Q%3,Y0P+m0YF%f"$d
RDZhj%Ki1hFlEG9ZmF(+BfUME3LY&0l6,eml(c[!kN!!cqh2GpSJChNR,@U2EXMV
c1SIfD!pG5mI0dk8E9@IZ$$i2I)Hf`EP#fj`5AFYCMN&reERA`aFf+0VZSlTY0kX
XZhZJ1d,8X`CiUi0PUVh"$@dDi0HpH!&YQ)c1qkTp6cRS[@HEX$H&l35Q2Hh@FF`
@0@@S0YN0-MRPGM`+c`R`G0"YR[l!D"lF,h6JGP8V"N81#(U9kVC!2`&TJGIi3[#
D8h@Rq3,(`e@FjKlm8+fLM8'Z8!628iZjl-[3I#QkUYU+@$8Y`N61)Z3P"AK`bM+
Nkq!-G0#dH"Th'pAH9,@5F$b1#XM4m"ACA35CXkI`3`lE)mI&i"%hh`f#jH&49Y"
Np%C-AK#ZPUGE1,MXk6-",HR-GcpH!Scf1$j$i-%Ub5J15epG1h`'ZjCMTS+!!HI
K'G`S91bj45"$,LD2jk+fMck'@3["3Y0$@hAl)3'IKbi)+kV1SGkk,8H8SbeRY5M
kR$BFjI6"SMNc'9T82r[HA+$h5N$[h5(3Hp[iCSHfGl&ZUemZ%2@lK2ckIVUcIJk
VSI@!YV`dc)VS)Pc"EZ'%GL-ccS-VE-MNmabfKK3!TQe2"!VBYQFi80Sq91Tp6Pk
AT@Ml"qZfNfe#mXRh19TK*i0efbN'RkG%eUSp"jIpA$cNR9CYc`NplDIKSfbRdBC
bD+F[kYVT3DSP6l@pF%TXHS&Tpd*294Z$E,F50@X-I0"Cc-)G!erm6p5`-Ae8l8`
B1ZG8lFi,k+$8MMISYZ2-[akISGZ2Md35EM2VYYZB(VH*[%3V0qQfmP#"+1r1%)0
el8q0f)m+Hl4CS)lL8kTjT'Sl0P`!mSPXhAELP#M%%eeeQb3b2%eU4&F![%hU,)k
NJEUQSNPUlUhDP+f#4EQUfa`Xlh)&@+JAD"ID*fC!X!Z1fh91P,eV#R1),T&ekAJ
%KKP6M2A2dGQP1Z0DHALTiV`[MBIMd4e(LN68MU"%c#Y8jiDq2"aPYQ'3!'jE)ab
-YJEYR,8L+lHYAFH#@bbj&UdK-eT*kp&Q-H-HZLmZkVB[@$XSPE8T8U(51&53!-m
`XAdFDZIbGQMY('@YRfB@fJZ(pIemSHb+E(i)+Uc+AXFV`Gj(%GqFabQUc8MKN3i
ZapRNRR!MYN#Ff$T1C!dfFk%!&R-V'p3)JSlCL*U,XKXcAhIQKBL'NMBk$8q&3aB
B#"0e6hFZ@mQMi('@cFDRZc)q$'fS!l9m)9!(DR5RD34$&FaP+1pVZRB3,m-"6-8
[KBF*S'D9BDTc!*qDRd+LLTfUPShPLVHUcNFqi!Y4!E0!#`rQpMq+jh9ii((6Tk$
6'8m(!J"jS0dKY*B1S9RRb3(FC`Zrf)"QTpbU1[HGC4+H4aY-KRNH,U33,Z)Nh%J
K)2@83'$5q!X!UFUEiZe)YGeT%K,Zl)$ApAM9HGXqPL(Hj[E(bDcDP50r0h)"IHq
LIYTqRb(mlc'i!!2PGD*'%GrYe$J!''i*rJR2*m$0`@'UcA&-9%A(6"&Fkd9fiCU
Lfr54SKZh@VFGBHli5#5!JV9VeqF+a(Ud-El'$E50UQeGYS#DGEL&HLA!iK4Zp9@
ee$J(VRJ@0V[le[6$lr+-'G,+#V0maS`E(@YUDJCC3kc@J8lR9+YeL,$S[b(k`I0
JlaeiSa9-09CV-%-1[h%qe'Sp"d4mX$8Bb*!!qGEaIb%eRdj`r)hrT)DG4SB))BY
#@!baKV4M[DA9L'm@ep3m8-08'!)80,YrVY-CiR31V1!B1+AP'"[ZVK'LlkQTZFG
ZY`qT@5L#3#h`paMM[B[Yl'p`cIe1Dmd3ra+$KN,#F'G`"G2Ghfjd3X$G051`IA"
0"IVqNFlJQS&1Uj-*IGJTD"95-bhXR08j&a+GpK'-,(Hm&RTjZ"KA)9,mHraU,Q$
lr-Ym*lB0&&+Jr--#I3m8"1,qlm6S)A3IU0kj825qU4M1VHJ-HPJ`49BY9d'X`AF
XX9jBIY04943SpI3HjhZ&2GRaMNj5i`$TJV$RT0GH[ZH(5r'A,X9,H[bPlRH`[rI
$`X)'$,dFP[K(kCdVYpr6mIV!3Cqc),NlcT&fMZaicmKK`k5Y,#5IlpSP,+ccd1$
,!kjG(pMK9Y[9EVGkGlebrC1`-+PjbJp6TNM*-+%26d(i(B*d)FcU[#VY4(Jb&%q
+hICfa&hr4rqp[9H!Fdd`!rIIrVQ#h*rHm0B)l)e90lSRrAE)Dr%I$)Urd5Rq2B5
V0jq`IQbpFG9T[I($YkG'@ZIH@!AJZ2'KdhVc2IXXqf6l2#Z+1-PUA@#ecV(qf[l
TjC4c6T4IARRX3eFNj3(*eI2$)AF2Z9[km$F9REmR2[0+m+$qL9Ia8ceAVNZ6H`k
58U8DP-pD88Kr(5)p+`9*@lZFPkk*-[K@@*YGfQ*reNlq[pXNVKDT1B6C[2'KSFq
'KRCliYc,k(CGqGF"LGFPKl$V3UA88(ri-,4AD-r%kkm#r9ES*iQI*%T2I#QYq%%
0501N*-JE*fAD`SM8dfeAfS4m!!!F%8&%3e)$!#la$e80C884!$&PlN1rE@q@19r
#b`cjKT!!Nlb%1FG-XZ'40%FP,PN5jc+5X83*h(c*e'36bC)eaM6PHR!a-B4S)BB
@,*G$!k@RmIN-,&#V(S%"PX-9,cIbI+ceH$NL&+5)jECFVpM8IIjqllYN#CCblqP
prJ%ETLIP34!%3"!!SJ%Ajr%4R3i[2Pc)A&#*C)3"[[jRd`XYcXEZ&MlCl3dq6TA
mHUVmBRcKN6ZGlrhpLr83L80DQaTjGMTX@@KbqP66kA)N(6J'RMM0K&4mVKqGCk1
2FI&MQ&K9#-m5qeS83SIZB`A0k,a$qr"4,AiNa!qrV`hZ-G(0)cQ!JRjb1$Ri6PF
A0a`P&b3V+-fJ5NLNR$MFkc!1@Ai9VRLCYeil%[V[JP!"1DP'ErRJQI@T9Qjj*a"
DZcG%VN2GGhYl(4RAMqm0Y2P@1T@0HfSYmlQrqmIdYr&#pir2lqIEqjarGQL$8rh
NRLXK`dm$dCa!8pQ8&Ap99@6(jCIF[4idpk0QfB([39D`iF$GeFi+kkM4UR!jLek
6SE"IDC*"`@3CAUhaDVaL4Akm2MX3bZ@pfq1#+HJjS`5(f[5*l9D+A@&Y%m2$M)`
b!NIp$MKXSC,e1m)fe9qrBiLVTZ0lI,&!60h3T)6EI@C6IYcEq*%Fi3P23KEiCak
K+4,9X)TB@6Rr$%@Kl0fQ51pHcfTeJj+Q*KUbLK8BemCdD1lQ%5%PP3QYr,14X%9
0)'PPe3D4[)ZT*X0@-TF%)j1DB#!96KdNc2cD'k1Fhfek!b)&T[+k94QI0rV-i4j
iki2*#QSi"UHmA+ZEjB!b*b"ZYAJeFARjPhfa5@RirhMKP*jeaC0G1'IePIZZj*D
Y,S#EA+J2lqJIQa95ap[LlBEN$VVAFVAc@4mk`[*i+LRd1IqNp9UNC6hpRQP-h`V
Rp`*Xp6Qe$@QX(L5a1ZYIm*R9$HS9Npf6m2D'cGV%kFeF30&,#8MV9KiEd9af6-Y
U1a*p'Q[GjEh95T5+ArE*50beUhY6%Ah``@A%R$-%LM`d56b#Vb,U4E)[,&iDVJ3
q[rM55(&DIDNq1C6I"LHS#QE#a&Xb8m'XY[ZXb'TDMj@IX9+U-UQNcTDK-8"`C+4
(R6hb63iF9dL0)EADkiL246fQJJ0,!k%e"Eel9rekZ%*025q((%631BG(8#ZL&M9
eG8R9T$"5%4A#&GEYhaB8ABS'-0KA22MFLZF90UMXh)UVP9+,efKej[p9eZTGEd,
rH[%aE%r&aTpkfha@EkI[m(dA9&2p`l2bND+T5%DdNCD4C!85#"PF4M(8-S*8`"H
TYKGK0KUK"28"K6DLj1*S!PE3aA-jVUh3Y32IK#X!2'%N04a6Ji%fEbRdC5N#8re
cMh`)-K+%*,kf3MN3HH$A3a@Uhdb*DJja*G(!%LS3b42NTT05B'TPmej5409rAfC
cQJ%j8ffHDUp90GY[4pilmY5`ck3ZL,H'Hm0l,lGcT&29pG@#"&5Vic)T9'GT4*T
QL3%Tf8$)!k,HpVC*k3K$a9$EV#a2M,N`H042(`)2S#18%Jk'G--%PlZiQ&+JG-5
+[8CK(-N%PN!3L&&!B[`l!f0Ifr*m-XK)*K3D`%5G#B%TMhIA)CRRK*%B-2'HrRL
6ZVrAr*`@#DEbCjdMQ5DEaam'F2+#EAEH*"Vm(#k8CQ,k'ZRp4NT0@JSMprE9Q6"
N*pY-Glm5dHmQa%%*$%R%Qd`!5Yb3!%C"LJA$rpTAjqi[(U)Vhp%2F3@*2Cl!6c9
G5M8k'f(dE6!+5#6'iAk'FGP'e9q"(0lp%LEJAGT*fP`-ph)N1hQ`qmF!aPCXC1Z
1IPT-"iaNijBk(+d&Ul,L)e5Y5E@"p94UF-Y[9KLh&L+Y0,LPES9abm@9,PbRapE
i34S1pZ&JmVMcJc3kD("ZU@P!Klh3YZ89GI#$Y01Sd!D,%85CN!!3C2JF8S-lI62
HQhNSE!DkDlBYi4BNT!+m,aS,@f%iMP&DU$DQMr!X$@MZhd#JfPJI4K+VIT)8cQH
G@-L&aEdR&R,rSf#C'QbjC((Y(fbjdI,*dik8B(%pl6!IQHq(1[LeL611XF'@2CE
r@$rBdQajTqk0X3V,Ip5p-4aFq`6p(A[LcS*9EiaRTIc0ADVe+i4Mi,8"6#ZE1eL
&Rj%aZmHX@J%'cFEk`4Q@hLk[0e'k#+NYjjm8#$k$@h[MAUq9dVVB9$Njk0V90X3
6jiIB0PG6!K'#BIR@6R8Qk[9Ta)84@UMDN4P,J(fTT4[r9Cha@FKXP&BlNp(C'PG
6Jmj@E&YQ[,(EZE(j&#ShAMpkbmEhk[mrHe@,J&a,bEX68U!$3l@NF,kLchREI*1
0G@He*CA,rlM%a*Q4MQ&"*Y#h"iLXLC[cJUIX'pFXl0Til&3(*MQQ@l[3XV'CTY(
1H5S+93SSJa[2j#UZ!JJYF0Z+l'UVX20ElG&YqUNrhGZ8*'"!I"Z1k1l@YL2F9"%
RYaK9j0AbJAi-EUL+PP6XKU+B"VIFKN#DZ9DJ-CJd@`VR+"MJN!#02,Led0fIENR
K+"R$i5IB*()8$qXq+CaHE"X68T9)RA-0('eI)Z(j,edBERcr'@,6jpcRTL''!Lk
KG*qP)Nf-p(JA51P'mq**GN&CZQ#8"rG,bb!ZR$$aUAk3!"E!G456AlT5peNi!6G
0'5i$&X&QCTTUD31TqY4mhPek%k26G%KU$S#X1'8VIGc6Eb"8%K)YK6SG#BT#*jD
r&lBN%bdR%4K330Z!Uma#NPp'4Ij(k#Lfh"E0J4(CVp14Xi-BY%54lL4(2"S[-`l
2M9iNePA"BV1iX-8TDRD9$ipc-P35X(Q)dX&rI)D"S6TH6D`*&+IXcYCS%d0+HjA
V`,82N!"S!"*bFll0$2RbA@p2pHXPB5j5PdZ1mNCdZ3E$iCe4ph[5-bCK[Lq+jKZ
"4+k[G4F0i4e02$!%dp+"cM2E"0-5ApS@55jJC-,%J2L,qYX&G$5CK2JB3)$Mj2l
*ST-hXqdlL*pG@Ylb!JbU5La!k#kiB`q#aEG9@%KQUikC,4'P$fD4bH[q@PFhHZa
J&S5pa3rL+VURZl0e6d&aXTkU4$1-5"j$k-'Ri[9LHQBa$,2Spc3e"R4rK$!FLr[
aXRLN"+TKbM2kKK*'&QL[hd`3[S#D[&bU83&3@V5b+$4crmU%'h3eRhT0[Sk"+mY
q04P@0"C(BjNPrb(E4-68P9e'JQF+!&k"N!#,56mY+MVcqS@IAcS3S+90KbeTLfh
M%%L0VDBZMj*D+#hY49FjfjAYTk9,0bhlF$,Q+r-qlXZ22[Vc5ajKS#EDip1%8D&
f$Q51G$cqU6TRP@0Y*[dYbQaql@k(fRRmdNKX9F(DeqK[d@[AC0jGm+8M3m'f8+T
V,0`j812ZMeBR+b`hSqYHVKX+,)#cVZ2i*Dh`#pG5VN[T#eXT%Ljah9kE-GDpZ(Y
aVbfMa+5HharMb8(RHM$Ce,Gm6SiHL#J3i%kSCqJAYf`qk+(0KdT!Z%D9eHP%"km
Sie`b4A`A#5lcN!"i&EIC$b%(3Y-*(V,c5S4'IA*q[d)6R3$6E((5F45@GKZGi@k
R-f$UBLM@Tp@m-pI(4fpaATe-a8"HF&3D0UG9UT`3U"*%R,$-Yi(%15%kQ%K0b$L
-R4FNaV&&B$FG(6"ea-2&62c,DH!)IZchfML*BcEqe$!DPDVHSSG+6q$2)X+dL@E
lHC&SImj8rd+!dkN#T4*k4[efkVKT+$@qS3,l[#MNF4MP*QFi`jE#9CPMpLe"5Qk
TZeSF!-P#Qc2JaL#*JG%9'(3'U!RpZFj,#Am"+G0eFQM-,frJFRBYULSQeXNmeDj
L)C!!TjiBr$XB4&qPUPaCUK+-A(D'DIQk("PLrAfCBD0cq$TAG!KQ"G2'56!4%#J
630E0G9mQL"Xql8,6%Na@1BK&,a&PeHRL0djSj+iJRaa@)pCm,24pNaEMFMlDq$U
M*KQ"i4eia1P8"rU0224H(LG``"ReC`PP3TZpfETpB$!fQ6JKq$Yd%5KLrIF+@-6
B-fd!@86(3*!!+!&"!Q!CaL+E4jB)(HL2mP#VBF!KDF$R*3-qGiEp(AcdHdAH%%f
8aED5!Ld%$"YrRNqRj0#$'h3(5cE82j(#KQl3hp$IdBCH[G)0p@-MapIRBP2Rr1F
f&D*)9la`61MG!(,+M`6A9pk9rEfkHQU$0fDrjIfR8Pr9F)Z,L,YL)c,QP9`[jEH
#i6"INCqZU*80q4BA*AGeZX@1D%)kp%B@1e)9&YF)1kKc$!9R&@3)fl+-BkTJ*G(
F0`+%(,%FAK(M63D%9%SKj$$8-SdGK!TjEiIRNbJ[Ia9!mehhVJq[Ima0G@c+,2X
[(1h#N8eI"$d&%H,pq[@$lpI,Sj9#aR4U9)d43,Zee3*q3PqGdqQUZA@8MSfVp0e
%e0c9-Q1FT!kT'ZR09ir`3Tl(AkB!U'VTd'H$B6HI5C[@+*@cA46NpD8MhYTBDFQ
IL-KG1Te(+%5`@FUZ94Xb#i2hE$ECde[4P8-N5ITKN!$#!reJ,q0c&KQZJ4S+Bd'
6mS*aFbNRNKm12(5+1Cr2,4LpjAeA'H,VCVmplcAYjki#"BChYQXSG1mVCack93(
r[EpH8kSUA(&[cI@P&i8qrL)Pe95b3!d&fJ`Z0YdZJ#YP#(4#UN[Q5REJj5!#F*5
lM(QFZTVQ#ejq2m*1C(l(er`EFfK6KfaAZ"%Z@RkMZS#DejrVI"a1q&hH"9#9cGV
EQq'QI0$'!QdLmRVH*SILY8cNfq@chA'1+XDaU9EMqrAhjjrMdB4d1,jHTSpb*$$
+dE9jS&"TF9r+(SLK'aNHqqS9)3k"1UUNa-'%#PmjVKE'HA3SC4pLbalmb5XKh8%
6AP"%#&49PfH(a[QU+mA6H"jP"lMH1-3GHCpqXl#3!!00Dr-BUN!9E$iEa1mdU*F
#pG`[UQIj$e62FS3118Y8%i10FdN0*F!0FbaII`,'"ee-kNMSUPd+SC4!3BKY-Vd
UN!#)R*Fk&I,hr40q$J64mPE%0dhbHQXAJIZ10*QDmpIdkKIRXJ+8K4@hLBC+6N@
XGNS3hC&@b`h,5jXT,-pmZI)5P[IXTD-(f0',M+cH$Qa5Q6i6UG+cU'4Udm[RDA"
ZBNd"$9r%K[qrMcYF9LUX(-H41abeR")96H[0h**QYG-5+"NrQ*I(I5D[()ephmj
$!aI%Sc6M6FR%H9*p*SMqmaJe6%ST**V$HHc+pf9fh2*qmh@Zma%&4Y[LJ0LKN35
dmJIF09DlE1HA5E@,lY4h`SJ"QG9HKKjK-iJMd9Dq(f58ICIL-!4fjPT+-bjLb5)
$+C-L+5bm-LPldq&365)T"DHFQXlP%E1T)1lAV1iYm1a5cA$*lFkDQ6Q3!+lp,IB
p+BaJ1C)aekSK&T,UL+Hd0YIfH+[fr&`(81eDEqLH+jRX-bcF8j2QL!U'Sj(32Dp
YGi5$0)QkAChYEH[Er8K(iIK%jmb'STaqMqGN8Fl-6,[lJ(Y("NY-PKY-+!4CZEX
"L4+i5mRChR%Ejf8j8!29Ci8$M`I,PReBK%G-e-l6lbllG#N2#UDYA%ED-UDDMhr
SMIN#A(lJJ[TC-ec(2YX4(SMXf+Y'GML+e[RmQrDZZM!F85[[bjceAB`AYDVB$M"
bH5fc@RKX8[#CSmT3a*S9&3*`cjrEHf$2)apL8VpT#aFm!P$c5G9kqJBN4Z3Am-$
'iXI9K43m5l#"@jj%r8bSiQI0@%lA8"eNi(bp24HS#2HA!1Ih-XkEpL"'(pf#QlP
B)2#,PH5#FrI('pIJBhRDdQU%fEAHd`P`YQECSYFMIGE)8Q`1aYapfL85!M63+YH
jF(("``qH-D#G)bA"Zrfjl-Q1`J0&fKaNJUe)#qG15T!!rqVqaeiX1CQGl8NR0-@
'aF,cZI`Y%NiH5G$A8#!aK93l["*,qqlFh+,XR0%$0*+BfEpD*j9Qja6P(Xe*cc8
%ILZ5Q9p#JEaaHIb`j"KeF#3#Ph$&4b"*5%#jGY`%*k)RKNGCG!$dpE6JXTXVY,R
ape!eLaPfJ[9KQ+-RQffT8e`b5)YKNP*i68$DYh!h(i$&Q3pGFk15rJSaif+HKF3
#Q%@cYGAX`b0@A+h9X)qGiNHIZ+"GV"M60V+2FA(!X,M!*hj-6p'V#H5KDILhc&b
jZB!Gq0P9%VL)R&))K$$eV'(V#%YJl#XUe)2K98')V4"554jcP8XArE0LiAflmA,
3DcBVc'B&%bZB@+'6&6T4q)-dcf2TH88pkHhZ3VEV*`eE)k@,#%'4'*V2*p6HF3A
*SDI$jMrFbLQF0B)f-F!G@4[h6L#`2Xr[fl$K9Yi8B!+YDfrFrhV0@5YAAlr3Dep
PKY%+C6bJEA0PaF0j5Q%P@ec,&NH`@(LpaPH(T9fV1Z%)Mf6-8eNLF$q2"bEfUcb
[XS5YmQE0kc83GCK5e*UQqNAf3XDGkSDAHN#SfCdjXJ&S[er0i%)*XRpIZUdlAGZ
EFr6!cHfj4ie&$+lVHqERT[r)RTkG!hL[$1FCQ[V5JBj**2L!S-J(F*NTY@GR+*m
5QYV+EBlXK"Vj'c-@d@SemUC$+Sc1ifVBJQeUXVKf11)Dr,6#V%FX$SZ,EIMZ&*`
&DN`UU"VT)h`cRlMZhC*K#RiDbGP3-XKDGBKMT-4flMbDXAXPGmYJ@iY(3F436#L
Hl#A&NcdqJj,92Z@&i`c#SkK`j2lcV+(L`mp(VaN['iY)#XTe"N@,E#j@Y%Jp&+d
2VeHi+eJ@[$%8#ldDZK6D&h`S8XrqaL*Q[$*p-VRH92X)VSQ(#d+@Rm3i(U[apc9
)+S6Q1)qm5XYJdqe`1[SPm[lP5j184QYG+B0%Am08[kKd20)U63-Q!Q-5-M!K&NQ
ZfUY1'CShK+3KR&%6IjR(3`&-1`LQZR)IR02iV%CMhS[!D)3mN!$i4-b%DrlL-Z@
RDhirPkE#ic!GI3fpq92pfFG%dm"$[aQ5'3RYqL4iE5@9*9IcmC,+K+%b8&aCA6+
BUm*)T(KkA-IlPL4SI(*hr+TJ!2KX!"i&9bEd0U$D!)lJQKm'`"miY*jYA@LP@cI
d&X48kl'80P1m4,#2YSCYab)DAQU`l66#eV`@Y9hFXQVGlGLbDRaUG$GKbqJ"K*Z
S19S+D)Q9!Ndbj*cIkC-r(Z+3!01!Vp"$e859#irm)%B$"T5G[q`BNVejB[&9&BK
iHK%239b*U9dQ#"ra%GAZG5ql&5l4f0Rj5)P"&"'[3-aL"$,@e8`c9N-`Q%1P1aa
*N919BKI,bd2Gl-,rh&A961l)rK'%!QBT2ik4G1GaJiLQ-"'0ZJdNM'%3`je`3UK
-M)(B*CQ@K`q+cQ4+%LS3621PcR'E`lLTf,hV5%V%c$ij1lYA@h6J1Fpc"iiDHN-
)*q0&K6-Rp3mN)[E3Sl(NkS6`8$EB,kRU`rABU1h-SEf)+NC@Qa`3T%6A-9@Gh8m
N`@N1ZEDX4fq4VH-B`ZGCGf2pGK5LjQ&E100V`YCAieTlk1#&+432dY!hEdV+M-9
`-9-+%QI&,k80-$b'Hf9QCRGf85'ZN!"60-QPlTc%DI-m[Sr,jRQ)-IIfR6BBGR0
kGYbdfkKGbAlNP3K6c,$la""l*1%L%Y*0(f%GbL)Br5hFF[PQhX8&[-`mKSG"bk"
q3"pe#%d0+*md*0`%dXY+YZ)aL3M,dHc*M+)G*94r,0ciB4ZeQKSX*2`er4XQG"a
QJ8aK"m"e"UKL%lZJVh9R)25*U!Y4V`Z1CU3AG'F-MdV5(bS@Z62GQ6!$@rN%2AT
+!eVI'dF+68mSV(h4C[6&'`8E6aLR8C!!idfpYRJB2k&SpH'j0,hBe5N'*Kr&L%P
d14+Hqh`prd$(!-!*[1Yb,lG!HFbA1lNl+Z$6AC@S`59m!JVa`iM*!!&jF3mM*KZ
&UAJ#K%cLamV8C690bFa'J(IT+ih('Kf6,Mb3!1Qc*"A$!JPG252*``b%$'($265
NbZ8d95l(G8[)$CZ8L`G1(i&!2['246cKfmSYCjF3`Z!&K)'`fL8V2-")D98l#Ha
RdF$!JB8H+0#YaQ20&(b$#KMQeA3S6Bm,h3dNmeZd3$+*[#Ch[k(CD4"j'6**H*C
l9I6Lr*PbhQ2j1jj8iCDrkqJ4`5m!cNQq2jR1HlJ0V`(HKGF8Yq!9jHENjc69CH'
0QCNFiL5T5M*"L-H-T`DN-Y-T0D3I&pX[4h-1c#Idl@+#0JC!-B&q2&k'9ic5I8b
PRarSaqCcK#'9)6hriV#YVaPUAC30e6K!2,KK`Q5%(VEhK2)%1#'A3B$m&+lAf%#
rTp9%S$J#0`dq[*qJ1I"EUZKVL'j56BEQr@Xc-pNr!Mc%K[!m&TJK0Gq*@E0SM1B
9'b0af'3'39%d%0)!N!"pM)jVL1P4N5YMDeMJ(9Xj`aTLH&6N5%2ZTP58#HUVfFI
-C,QqQG6dK60p"M0jGfNcfCZ5$+eQ8l'C$-p)SB#r&lGUCZR4bCQM'4RT"fCQrZp
NcQ5lH!efj9Qdp2KNcR`$UT4H3SJZ,GQpdL@UFBqeVi%Y3@2+q&cfdCbLUbcC+5f
TfkeRl`aV1(0D1&Zd,`%aZ)#A`'-,,5eD-Z*pZaI2c13@aCml#HicmBcdT8FcCY+
A,J%6,U8GdC!!U)@E43dNH9MYk'j!H*Y-+9f@X0XGYXYPh1eCEldJ(qCf6iKpl"3
rmMa0UVe*3G#J'qP44")9$`3E2+j&M36QQ(XTMRpiJG!aFNUdr(*"2#DQDRFVQK8
IHGE*VI`Pcqej20UN4R)6NR#NDE88@0kjaU&Y[XEK#q,TXTFmUp310Gm`"4Zd5hU
C0*i5PMkcp8+da9SMNTc!8#)F&Bd8e'J[AXUZNN$P6QN"PZiX2QE,h5cYDr8dEMX
Fhaa96*(L+dSXFI"A`j!!2aM3KHRE$!@d(mdY%K%Hk+RG5D'b#1Y#)!D&-SEQ$[3
MF(E-%2jP3$XfB0!j"UGjLhk3!+9BZEA+SQqV9(aDTH+5SB,%#ce'EjF%X6LGBbc
i4-'2M&$"NN9"kRSedC*$&T*Bc')A(HZRYr'`Am49N!!ljki5`V84Z2APR$PhEhc
E`CB8&,XBbI"CPP#kq,S6Ge$!A+JEMG'"rY)"[pr38E"8X+ZA"kZ'Zl)'*!30K0D
8`E88aVpZ8AdG3'@rYm1,LPRj"d,H#2kP"F)ZNNJ!mrGDU3Y6iJ,%$K@"2C(pR)@
)Y([NKp,q-IHbRBI4SDUSM+&5-19RRd[jU`4ZPSLAQ&B$SpTSSK$*F0MFm9F8V0R
P*L[Fm4U%3jUR-ZdhD!qVIhRc8c6Lc&-AYQhKi31#Eb%2*iQX"5a&%QMPTM4'PXC
8i8P!l&C(ZLJ8m#cq9BEDq@5TJ%9$b!!4J,!"TC!!0fT-!4k-,`A+"Z06+)6LV8$
C4S!eP+5T&Z)aMZ8h$0aKia&h2aC%2)6H)8m+`EH*!)i(EqCKASCQTjUX3+K#Q58
((D3XEG)06k)l$4F'L8"&+"8kQC!!JL(*CBL&ai"Q#!Si'1TH`K[CTiDpZP86#A,
5pX)SI'2HfZ&lSQidmje$GHq8MaBqXHphYY'DZUGa&R0rF-MccZLqiphEMpXq4-h
%BapGY0@-*Q`Y@D1h2PmlqZ5Il[e`eCrrGYHCLaF[(RVrcY'lPcekl,Y0ccbH[rc
h0VYYik'k2EDV$bfh04bUXh8de$cph5mhYcae[1'0RelC#J!!4fT"4%05!`"ki""
9$@4@!4!a0Hj&rlpYcM&A'6,XBUcq-TCP%CphSBQea1#B)XZ`DUDPKR*JTE"CSV*
$2&i2(fqkJ6a[J1C3`NRTZERp%TU6UP3PchXSAdYb$0#%8JlAT$3"5K2+)5QPK()
**BD+HrrqIVmpViEdpRXrcrrhm`!EVDFS*i)J#)"!0-qALNGe1Vc%j5e1"Y!I[i$
-9E,%&a&J59Bq(8`B4L!UPD6(NT,r[k2i9#8p8,CTj[@C$k@dd[k5IG**DEr-l&%
B@AT6&C3aGFb`1EKG9rC"*'(iH[V4H5&*da@c5PUSD23C[N!F2b%S-d`c,i!&*S2
$BPB'Y1!#%-VeR2P,&&CQMh4)RSb6b(L1QSB#NC`kSFDLc+*AVcjj3S4-Ck'dkC@
+49bb"rb4BL!*e3M3#6CrTdMZ'*[+`k4-)b+m1ZC2l$FQIMmpB$Aj!`i-D*HZL0$
mBK'k(NVX$cEI8D3p'HaBi#[FJXBa%iB0f*p*0e`9mHc+CqG*A5iXB9Q[,1ZaA%6
,HKFZKNM)0B5QHP8&ml*HK$"K3qd*hH*RdKdG,aFa5CrGNHS#8pAMqV(VadTcD9$
(@@*dC(DRI0LJe"9)mR&JfCbb0I'"mp(8ZIDVm8A3)EAlN!"3VA1&qT2**$1RE5`
dU9jSDLYGfX*+PmN-8HC0CX"Lm+Q4,RaqmJ4BbC@(X+PH"+BY9`b9f9)5B$(N6&T
$885i+LZcMI8M(8a`*G%kA8-fdML[k%kDRHM5DkL2!dNXp@(3AKUdfA*3QC8TfTV
'Fd-L1IJI8YF6jXS-@KbDX+Jej3D!NX#'mi19B!'16Ci-E'SBiSN*N@UrLlGB@hN
)SXYC%bi3d$I99[+fHNV5q8*Bc!iFQ!"k[Irh`F&LZcNi+"XCr8e-U**d6-phi5,
-i(8'!I!DLFfTaX(Q0!YaUUK(@'k&QEm)ARTF%-8F-i[Yc(jY2k$9["5+Chm0E'`
6rMY%LdJJRc)UA+Dk(jKLMii)S`E4rE%k4&1)$X3N4&X4r@+X$G%K4,0MGN56L+E
(3L0!N!#@&h1$LJ0)!Jb1V5#8+9!hBNd99TS5qm'!k`0UXdT$meqp(NUC$Qhc,*!
!&f0EQ5@IqPq%*T,ZJ9TCE8L)(kUrCKTd0JekBm3+mTZ8)D2rBj[`aa`j9d9c6$q
[@#4MrT6*D,Fii!'T)4"h(p)kJD(0@Afjm4%)%F+2ej!!5(i2'Aq`P[CRlXhF#k'
R66-ZYN[VRjZU+p1X$em4E8$GrV&aSI[3c&'Y,l(r1d@(YQ'LI#QpUd8jI*%PkJY
ZRA`dNXPZ+PEeJEDQ1PAIG%9p2l[bqA"+C+B(r%rfUASd0P0MmiXDQp%i4)e$,fS
FNZTN%(%)1`&+V#99Tji+@*XmcXN4HA+2HXTp49dD*K!c5ZL"8Y)3D8C4$4ANkY`
fJ3*b+"BhS5'3!%6KR@BS-XDPFCdZrhQR!J*!b-8lXlUa181"b1*)Id5BNAJcE*2
mV2)&#mjZ6%S[Dcpb16*1Qdj$f24%9mlaaEC'3VYb*Ap',J*@Xr4bb8HZQr*RE(R
3-mdRK6#GQVLVr"PE(R'U30)X53[!F4MU2Cm5`qfXrBVS%U(-G$$A[f-8RSZ-!MN
J2TB(6RJR[`38(JiJr-HJkMri5a(UfmB)PTHd[KQ0b5ZLA53#59%-MST3iffVl4i
K"4ai2399Ehkqaile!jfBB,C0H#S3aq[K'(F$6+Ra))X)Ue-UYYU5p)MfQ*@@VJL
9&Z1m5)G)2)J,j1DN!'+9$2HK`-J*RfALclp24&PJN3If6C`kc#bdm(PPiV"lSKN
609G%JP8bUh5-'PDHPCXN0$P@Ac*$4GR'#m*(#dBXa)0QEl%D6kl'aH,"*(q!*+S
m15MC&Z6*$TV-T&,akHI2*qm6&e8pAQ0U-eihe#'m"Y3f[$,9&MK@a09f)0Yra-*
4p44H*@SfANC9qpKpN!"VcZ(9SilM&912iR9G0H0P8XF`U9FGa5ZP0Z*9Tel%B"d
UUmjl+0QZAJU$k9bXZZMc2S2CCECp9S2Yl2`SY%8EIfI`AP80p0(%8D-3TA3a2XK
&"r@U&q8,+-H0384)'Fb'SXI-G-')DXC5RE,N`P+0fV1EYp),iQZJ4p6Y0UZ(-94
@b'JU$KN$CR`F$ehRcB8+(+Y$3VGUYcP863Hd"eU)p%N-84JU0-ChjiP3U"#I"D(
lJX(mh#I0S@'CD%!)f3'$MA3ap43RM$bFHNiCVP9*("l`2[8[mS$UAr$j+r8C(M#
r1(6p5E0kr-NHcb8--q`C`5[UU@G9S!e4$#TLq9#HJ,,k6kiUhI6'@LkUjF"@KQb
SD(%jAN&!e0elF)9Zmmc`'#1FZ-CM&-P@djQB95l@recFb%9k2,J3$Ak)`Q@k(!4
ErBBUd3baqKhU['C-a%4l&F6UE3$cAI+`YBGe+jLj'4HkjDq`'RX*Lq'ibXB)a'r
*$q&pqIb6Yr55jfBZa+IPH5S2pNN)Kkc3cB'c`iV)rTHhLULdrq"f%De,rZ1q9-G
'&*hiDFB3bfHI2)`1QIXbpifY(LicpH%+0HJf4pT[[rRIq"H)M`#0Y)G09d4()$N
fRJqhQ(BpJBiISUX92`lmf2($cFmE4A`VLZDfJ!X)XJh"9-2"e$U22i%mUR5,QJ5
#Z!DLr"84[j5Ilfd533dbD(Vm0%0a3)MBZJ["1IV+IFM+ch2G4dK"XJe@cCrr%i2
04V1%$1`m(T5Zq@GFXeIZ"ME+SZ%i13Mmb6T,q!%L(8#@piQN'XFV$T5*P`J"i23
8Q*[9&Vb'++Lh89"[39!IeVe$J03Tr-j#54CE`2+G'KL["A$TAJ[UjXm5dCMHL55
0BA4mMC!!3BU3!%%GJA5MHLlcb2%M`HD0[YNqie8d4+Nj4FdSi(CcB#["UeCpCMG
e`+Y*rF[IVUSPZYF$B6QaJmhjHb9chcE9L14Ue,dqSj%Q[)R21VAN8R1qGhd40Ef
CldfCFGJq%i!mPM,&Be%0(,i-4I0c#m1FS5E`$$&iGN#p#C!!JXT4!lF(GYTCRJm
'cA36JNC*HU#CPk@N0!!'c[3CMIbC-UbIZR'I-RJ8JhF'rI0m"bB0l*rR("J"f%1
)FNp3MGVR3(6HI9b9+"XXlAirUH)c5Tp4rM3kT)'X)ipPBSSFLCBFHbCAkVJ*!%$
`6TLZUY%!@0@D1PA+,eB6@)bmJNAGI&U-iN2595'6L3PhqP)(0hV4d+LEMk9'AG@
G[[A[cYk(5Cfk3HV3L5"@(1fi9U9l*hA`6GmY"UC&+'5Ar(k&VVMDJ#`MJ4kQq'L
J`CY-@Qarr4HNKJFa%*&"!KPD6ER$NiMJHFe*"!D3!#)!#%p!8&rZ'(Uj#!'X,B-
GVfE6DaZr3MH-)V4hSK$N%,%N1Z&DS@&RNFG*DXm&d5iHD*PdU0Pj+%KT[eQP@r%
MG!Eb@+4EVL5!A4VSfkV65IiCM4P(8J-QUa-0H2cBcY4B#a@,80N'((,KFZNLZFm
X0mD$#Bi`QTP(`3bSDj%a2V)HPjXk#R%$36[%a6hB%iXiD$ZZcF-R&q61B"UD@Dm
'df6"!@*$@0NXL[5!iK3#X5K8,hEhU$A)K1q0Q[TqUMDb``lrTi"JTF@McN@kY&#
eYQX,Y4H"+a%biK@KiUNQ9-$"+R59JeAS2Ll83Y9i24`U$0H&VU+,&@,6aEjYS8X
X&XpS4%Blp%,*),Bcq3RS@jRi36m6aCd%kMZF"%Bp05cL4K"mQqGXN!!'&X8[12"
0'PLb$5a0'MLQ$#a0'PM#`0SA$4ZRB@r3S-ff3CXR$6UN$0VmiN%*kBH"#"B&@,"
ZSd5eCqFd[k1`aNSIK(X8NAq-a)%Sd!2)jVQ8[jF,GbV@@k@kd,#cD$Bf@dj4Mc-
kLE#$+N!k9J"0UaUc!TAeNZ-0LKrqH,Q)J3*)pr-@J@*X1KICKUYU(#,Mp(iJYDB
'4$q(S0r'Q@S'ZK@RH#KFXLeQc@R8I4jShSdTDLmAl3k)cKa`K1j@R"5F1M#)Td0
FEZIJX,X(f9iFJ)acSfikKV,$E3dCjeLbU6dljrkdNR5j#&H+l@&GMK,dHM3H#pE
ICQBkF$CfSKJ"CJ-9m5$@F1!F#`55kH$fd#@Jfa@-`N1&J@B&+3ap(4N&BaZMLU#
!5(895F31)m[j3clH59J%mHA-C,%PkRN3rRLJa(Q!DR3HS2lPK3j35p`(U#A1!p6
M3,$Db3G-)%'2*3'FV!QGLi8X-,V)-B0GMU#3!,Bf0SV`L!lXQVUQMRjr8c`lCpQ
@P%&U3%)K%bPR@2[Zj1aUG!0R9bp#53j@TI#J3"20,aHPc,JiEd$r$8DA)D#51A"
'*Q%Q0!qXmNX(CFA,j@!3&hkEVRK@kXJrJmqpD$`RJhcS5&$pI9%XM`%*2h2XM4"
*EJE#L'J3F5$b&#**4"l@hB5!&m`raL#)B6Ec"l0@mE-9#qp*[I-(aDREIJcd(JM
qTS&r1--cV,X'CiJ2,E-fL%"&fh!D'`ihG66TjBAPb6&"f4bV)ZEDQr6-IPkD-bD
1TlmS8!YeX`XCDk#RprliK@qZ`b$2)'JQ`%"TCl*#,1dF%`L5ca$i-d1P&3A[0PX
4[!2&Ti6)KUqRpr[425ZlFRQDTNXZ6V'P)`$m)m`F64QB86A@PC8H-b0)(,PeJlZ
!0DAL8SRm-mc`@eimeK@,+N-GD9U0T4eMAFk*')U(,`DlYLm@Sb,D&6K2KDM,mUM
)6cSUXYDMV#pi&,D1lIQ3!##Cq"R!M`%r2@#MD+6pc0LYcG"PJNRCJ!jc`D!dJ'R
B*Je38jCZ!%efTDQ(#0[)%Gd!IJcib@3b0qQlQ,P!),cLAJ,J#)V8r62VQ!'*`HU
)l&C5rqr$K`6a$3SXk3J+j!DDHN'CHJ'NN4!N@S&FI"`BJ'MeF[!J4"CQaS8PDT&
CCDa8`2@Xc'KYUK2ARD`,H%*Q!5@D+50cQ3",LYQjLCG@p'5Q@c+qL1(!D!UX-@C
f!%ABa(i%-DJce-K)%+rSL)B(f(V8**L&5@Jp+BZFGrNL!&(*E`QN!3-[U($cM)d
45Tq)aR9mEHiZi[d#V-9f*#RF1r8l$%9hqAM$aU6FE$&i%X,"N!!XhXQ#ABRh6Yp
GAN@)BU4`&$rCq$%D,dfkcS&JiLiIEq#AEp-'Y&48$4$#[FSLmedqip&*R4T,6KV
V*Lff"#9-Y8jDpJHElr**(NZf,,1),SkVBp,,LBH%3k0Q(#5f@PL1aKCGF!R(4)B
5b'mhqV8IDIGDe`55B8I!rjSrX-cK-2L'3JE[0E0'MEMC9"hZ6N#V$VPMaV'!2Bc
19R5H&`TXTFjVR*hVR#bQ'HaN1k,lHRVR22hjF"FmaH%)$Y3iJbSP`-f)N!$l4N3
I`2+FB(+'mBB)*2Xl(Vj(Ec6@pE-!J!)-56CMm)NZrjTlp1F4##f@%66dJbeMAA)
MJkl6"9GAj-ai%q+9Xpl6Z$[BEF1kDBb)MV*L!-Y'd6(2eP5%TY+MB04hI'*Cp*!
!B&iXZ0!Uimbd(jPT9Pj*(XSq9qQ+N!#"EY39h6c*a4SZZ$`ljqj5cYK%$(,@*QD
AQI&(Zh#J!BAjG0d+ZC!!1mVCSM(l`SbAXjj#JA%c0A"CYArPdX![rP2SdG4UbeS
f-a2Z5FT-3XMdXa*!VF02)hiZ!X5'&'@3!-2B%Qa$eB!N[Ha'1cSjR*mNCJdT@@X
r"rb1me`NX)T$RjNk!8I[KH0Gl-c2#5CRJ0-H(40bmYRlG$TNdi5k8qiJRAMV#l(
3C6MVGFpQ"rH-fq8"VR*"!e9S@1(a+4#0%$1GD$$5GDYFbRLX!-'X9FTi-K-9(JU
`QA"32`rC)5`9#,hS$$VQqDT[)"2CUM$Qi`GUE)cj"2ihihmE-X[0B%H'4+Z4)af
)a18&eiq"QS$SYJq"4GPk20dBGPd&Sq@Ui%JEIUciDB9LS401l0ppi@C%SP"#-HT
)C1GXUfiDrq,qfrmQEj%hL'+N$KY-1EFRGH(!U*3"%5r"+%4%Cc6b%D+1HBqZUbT
A'KPhAITr[M'"6!N-)JQZ1+@kKaS!S1'I&Fba#!q#lLRm*)M3[bV[Qc!%Sr-H$#&
C$S'Z#Hl+A6iVrlIU#9hDZ!#B-$R&NddG!6q5marlipfc)HTm169!l*rV!"H(SI"
G1i2-eqieQEm"eN4BA(ENq4PmM+fD$ZfKYKm+!5DZTT!!@ERIZU@iX%m98"%QZ9)
)%0)'I#$2KU'B*@2&B!8QFfBk!2r4X5[L!$*d"b*Aa(Nd(X#4erQid$[m'AaICYG
!J&i"K[Pe,15#@A1GQ$8)QNjQ6@MV85k+SK"HGLj!ad$b+'8%e5ffJ+4&9Lb$JP)
@"DAMJPQ[*3JLecQ)I([!X0hS6""19L8SAZ6JL)aKaL9(N4GX2#-UYGLafI-FI2J
(a0k-DK4KZD%SE@*$`"kU%hm9+M0[M*h531B4G`#4f4-)0!-P[0`CE(k`@0MT-!Q
Cd('&IC&3)LP8il1Aq*!!l@QNSL`"iES4RaIT-d8&@i),YVmlKf%fGD2523)A#BK
$!q1M")*C*qq`2#aj"`E$cd9LN@B%Q!hFbS!2T9GmprZDK,C2"RkZb[#QVh$V$Aa
S$ieeD2UNj)4V0fX1TC+m+!m)TC6pH[`SXd35U0BN)kX@4PBNI2KCh5)RXmUZXQf
@QDFGq5AT-KTAK,4TLT!!"RB+9,C3J@[1J&Ae*lGi8hE++Gk-E#)K)![)XaFrVQq
`3RdF`b&)'SE,6R&a!C'`$TH!)%3#N!!X#0R4I-j5%(VkNL`)696j'AjVCmFEURM
4GrqleH``1fU91M+138($c%Gr!MS94cJDHXXEmP)PN!#(@i6KA5Qd`bGA#RNGVZp
bKeMqD1l!23k048'R15TAqQZ'1UIP(kER#90ZM0AG3Pf16E$)maj[i8BAP#qX)(m
2660!Q+&!FKj)r(1KjUC3J@E`Irfi&d9@N@EmJmV[pX+YUBL9$G,iVFmN#C@BTRp
3'Ge,#Zfc38F4Ncj2'KmTR0"i0+K5djJdIZNAKCC0#@G93"56dfrHM2Yd1J&mC6q
'kTAL9McRC(8SeG(NN4dPZ+#md5ATXk"i-ad+K(DHP26BNVV!9lh*Y)HCSUe`TBL
C8RjR&hDX#1LGkZk*A4#9h&2P+4KD+C!!Ek"!&JY0m8!cCC+Q!A`k"rq9h#NH)LE
kBAF'A1K4r'["`0$!I@Mj[*2ArFL5+Zb0'e!G0M8dbH,*#K5DbGP!@"KL#50)dk'
B(mNbGF*"NR,3KAqBER5J-`2i%$*MQkR+)l+TDjm1*M!bJ-K8)h%9B(p2"RC0"e3
26VE!4UG$%,,'l2,Pq1Dk2hlKU1H"``rdA9DcFql*![#Kk$Ee$EFLkm[J)%)S1,0
c[QU'b$F8h9Z5MJ*!rcHYlJ((N!$#)Y'('h82K2cLCmD@bBi$B6#bH*,9TfNh&!(
-0ZElZ)*()jc4lrjA64ql+k*`'D+UD'9Gb$aqp9`,"aDpU32+8Rq-Uh8fF!C#YcJ
lCp2FP+%NR4HFL3UJI9Zbar6-'YRdj3JhfbFd'c&3'`B[E@T!C3!i&Mc098H4HDA
+S"$@f)@T+FkSK#ka#ml+($LfbjhJ4$!6'6'S(R4EiG###iNYpA$qd(RK(Q3!'Hk
j,#!ZlU$11b#',L&@d$e!4RCQ"E%,`6c+8X5NbfSp#(XV$!I-(9+[3f-@miHBf0S
pfTjjIB9mb!j#A$Z`Q6#B2Kf"@,e)l%IP[5ASU$%0a4)DX-mCJ9lc5HV"E8+&5"'
Dd@JY%dAim@RlXRSJM'2!"6h$qC4mjc9pN53ce,rNNa-3@B*-#KJpd[kSL4P1B-m
a5Q9a[JdU46RC8lD1KNNGp9+[dK&1$-K%*TNGpk8#6KKmS'MqdR%iAq4mGGF%GK3
jSS%9ihKEI(2GQ2q2Ak##0`e"!4AQ0Mh!P9!KN!#RQAU'@qZGJ*I*J,GaUJAJ(@9
NfH*`G#LJCdG8L*paPXlB14RiH*QRF5FiM#)TkTL"XPAUZ*XU'5'MRKCJi&MQqM%
UlL%$Z2%"G%TMm'-Jdr3`!6BDeJ*d#c3p%Q9rS[YR0)iJN8`pYmbF1$8L`mF*9+H
qkDY1)HYC&*2X*1E&`NJ`9SQV8[cQX3`Sa&dY'6hD2NU`[RPp`d8-ZR)&P[9EeJ,
+,UMpP)#`rM9@qr'#aB4S'cEamT6!Q(fi(4@#!Sd%`[Cq4L"J+$apr3B(V1CB'`L
Y)k,-eIPHbH2*F"SNFS!4F$,@1VQMb8`G85A-Q%P%-mP9R*P!63d@3DGGUGiX"aj
dIRCfA9HJ&B2f8R)lMrADMRelP)'ENrX!1TGQjfcB1!RF6&$kQ0Mj%!"hP!"96i"
kNkT`FYH)TLG&S,VKbj-kfbQ*6*+(J49JKFT&M#Jfc'ALbS#lBEiEF$Gm`S$lT4U
0he)FJ-XF96Ul,&#%&U[[+iAS%!NI+0`I-)d5m`c+@6r3bT,89I9pJ%XcNVe$C&f
APhGKUBkRLjdm#$*q,A!L56jT80qANh#d5aNJjl+DTm)TKCe-0#PQ&K5NkS64H%!
Q0)NBRXN#aLq(4Q9'5bm,*TK`P3C`b&H,DEJ$"03X-'!q"UZJFDP49L4#a%B'0Hf
Gr+UPAlR,CqU*a4F8Jj@i%&%*4aeA,K+'!(cFe!(408bEf)6!f)aL5#rKS*NA)0k
qcd5c@lLlGBl+MN'F(8`Sf8F869H%UqQ+k'PUB2'@-qQFGB4!FGU@FCc1"AQ,,H[
iF[V"!J4Vhf!A$9-a#J%JeQM[dCN$N3pD)JDh+B%AQ$i`m`PXaiU#di'UipH`JFV
R4amaF#*BCQVFcRUkKFiNYmcmhZJL`Fm&X[5!q6BZ2"EAAi!LB#EFk6ppjDT`kBU
"e1EAAK8pZQN3!KB'9mi`ZV2&TbL$a0Y6+XCEA$Te!Q$#K5fa2P(dfaUEDSZ@G-m
L8,@L38k@5#XR)$,VhC9b0KbCU$K[b-MEqZE%5ePF5$r$f0r"@lC2F%mNKKiREll
*M-$$DV$H91f8kNMYP1!9lC6U+e#66!R+SJ833ikiD$)I"dKFk80Mcj3J6'd86UQ
'XZe'-)5XY4i0H@M`XH1$M5QrV-R$3bK6(A,e!aEGem6!r&J'9de@9j8j"eZeJP%
*rf"+$eJVLaF!F3#S@qQ#R5B%m%$EPF)Tj90bmDUIX[F+KTP5MX2VhG@k`E$LLQL
X2Kl)r-KKR4qQDY6aYrjdHh&3MCa`Xc@C#1i,VJSL+`#51+C,Y92+hlU'9reEa8*
Qpk*K95Da0BNFMNrj@MDfjMBDM)8d0Lf`QGN`a'K8PD8b14+DMmJfqF1c$-QcM3X
)1&DKLQq`BdCM2pc$P#jIjJ$Z2S#V`M,V$F(-UN`TB+G`1IY"#l193`BX$MP5MmU
SKh!3KQXa1Ka$mhqS%CaTRmTL5"pPb9&3cMpfHjI&i9'(rhLkZmUVl(iA4JB-B1"
M9EpJ&b`r&0fUT(l3bB*hJ"9G3e'6V-MN9ppbFVkdbaeQ0"VUr4`BQH@FC"8rA1I
dM)DIk''NG@9rC4E%fUi*MXq0A'P-X$XT8&QVMB%*j9K@S*Q5KCUHk$c1MUCC%a-
@M)-#2M#aPk0!T82CP4$%Y%rP"3jG!+HBShrpVeNI3FK'G(E1TM4Nc4"eA-`D%9C
FbZ(1ZXP!5p9QNK12B3'GKhjq,`0R5IUY*+%FL#q5bCCma)CNN!#%1XSq$R)%qe0
CNGAh(TR+k[eiRIMYhZYq,Ca'T)lIlT@b(V`TXdN#pG*Kl4Q0ApX6c9Tp8i6Y2F)
F1hjCe!ZifK3PXMM,Q1)XimA4&RE@3U*F((fL2(ahpfNI,6rqZldq,eIZJ%[paA!
iejFkAE*2HkLN"iBm(,IIB8DRP!8f#M0-l29!,`TlCUq&)$IIQB'3!,5eQES9H)%
4!39H[k5YFGclm6TIEDpZ2LSXMHVHV,CViM$E-FV#UP&2(rAmJFS5A"R`035c)ab
3!0*@!'8ZbK-)!!Z3!#%SC3%XT@95d(CqD0[1$bffmd2EGZ,BcJpj1f!#P8UR5kT
dTDLUXULN&pGSeLfkr4SfYN$5bKY6(f9e')ZGQHN4,5Q#dP*#HY5HP,28j+"4pVJ
[A")CNRSNcAKbael,TKTeM5rm60f3!(5)'eeQJePZAZ-V10Fi*"hQCEI4"Lcr"CG
*+m'"Z)jIPhClM`8aiBkr+X`&*33AHcRXPN6!kP`phe"L%$G#fN1'Ar0R58Q*'!p
Pp4VHimq#NJ*a0(6UX1&crU`[JHp5U!5ZFM!EJS@T*91aF-j-@DdbQ!B5UqFR5m*
B2#i[PPSZRTFA&lXA-eef+!B+K@l%pE!%a"eHTPae,T)pc0GNN!"[G+4J*U)ZJN`
N6+K)RPjIdGQSCmkadllDjh4Elra4h([(e8rU(r"+lI@2Eaq-Y2reb&lIKT15(a1
24Iec6Q,LVd#-dMZlK6rZhIljldpYmNVa5pDGJp&iZCd61(A`MQP5!cUFM$E-bD8
15GddG%M'[3NTq+@0AUNMEpA@`CU1mM9h9ahaEGSRa6%p&p22dR5l,Kr6lA([Zfp
XAR'A9r*FeQmEV218YpeGZFHh%3VCAPqdSFJEl9!k1(5Ed-%4prijEeA&"UrN(hR
mhX'8rkrlc[VZ1MCKLc#@TGZ1bGDipr#CpqVZH&GUH0ZkBV#a!9H[q0Mh`%QTR6E
DVQ`dM'T(h5)Fp`jUHPI64PI44YFS'rhFYY%ce+&99i31VA([dYjr8'QMHYTSQm9
'cpJf+ZR@BES8prl+0hX$Ej4)lL'5Rf@5dcEpb[5%EJ1Q*q,HI6h29h!#%G(ECD+
MJRrCHX@3!!"Y'"'&q"(G,R5-a,dkh9rHSLf[SLf[S5ecThBLIrXFI&#A'YdbG+Q
*HcmkIXFl['e+J,L5!'Fi!BVB%%1(XQf0ELikD1,HqfkZLDie!FlB%Z"4h94-IK3
NQ[h2VrjGZ6*Y"4&j-j'$kkG)pPj8XN&5f*@N'09Y3FI4Z2I6Iq[lQ,DrLVE[6)T
eR"50JK-MBCpcQMU0khDJdhMFqr*VbDI@NK`0f,DGbBZ+4+9alk,1*`p3-Mc"bI"
,14RLP'#j0'Pah&YNIYfmrPh*IZNh10jH[T+2Malmqc3&K&FU`bf,He2Rcce(j"i
LFMF6Z6qLC)@MYp4HP1[cXK0!h2I6"CmAEr+"c(BLXe8KmdSLh%SQ()EF([IHeH6
iGb,[%dcHAmVNP3(@`dQ"DE[LhP#20H2[ldSVkBSVj5X556X)91h+J$[LhJdIh1X
P8Ji4+CZ9cDcM*'-R,fPPd8Qkj+DillGrrpV8M6k3!0"1*,35#6rLC+,Yf)[1dY3
0FGp6[rZ[HeQK1B'-+`NS9bU%h",h6[PHqef6#8Q)``)9B'Tqh,[i1cmi`aXL3Uj
8#,P2$Ki@K&`ApadkCler,B4X8!+G[2'TF@rh2rfdirq#N!$6iYkb[hkhP"13!+l
BB%YU*b'G#9-8p`CZKGBc)I1'3"`QT%`FMd+FZ%,'ZA(IpqX'pM!CkqdJ$T2a+h*
3I`06hr,+bDaEmLdA)Ee@4RSrr6if!GI&rq',aQR+ZVMhc$m[mP)5lkBNEP#)pfZ
Ti3qqU*qQ!3!,rrpI4$R`FM(A'$FFGKdQ`V9('elh46YS'K*LkGfMGL,'5LC'q@r
ZRJ9bR*%mr`,bdL3%M%rHfGE$`DHqPDrp8k9!q,d[fNj60X@pqarirlU*@,Z*@!f
fB,%5&rI30""Ud4rf'jP3I+@DGN1[UjF)&BqZI0ejF3$`1rmb0dJ%@%P)rcG1T'm
M%T)`m[qqr4jGZj@[r9-&dIc"5D5YFHqf$ajC3Q#cQm#Q`BRHIqrF2%"Vbemeaj`
NLXB0"ed(kGUI5b[raAPY"(RrhVpe%2*B5D$r'b9jj@[,*0J3pklIN[mY3Kj-*-p
2Mda+f,PalleIqZEG&0af8h"VF"H9YX4&S1bDN9I+&kGN@cNTf@3L!6LRIHA8E8,
-+`R8Iq-'GGmaj9)J`Z+(SMe%TKBQdrdf32HG9)L!41QVdrf4NUk0NNj[L5kLpY-
)b+p6YILiEpE##cpq!!(ZdKVD`+S*k')PTYTTk[DiVqc9QGmLC0&!*0[Y4KDqXfk
#h2l,-e1)C#e-X[YYL-+AUj!!!dRdVrCee`K0Y"'Dd&ZLL@J$$[A6SEZJH[MVi[r
Mld9)m$@8i+[FD-*haJh+ah,rr8%LA!-4E[GD#)F!GQ[`lI5I5$JN9&V0[6XQ%mk
*(SJF-Z%@ahhI9IZX6,Lm0B3H9VR4JidF!1RXj*S2+*!!04"Uf+fJ"NZ#)+!pRr(
fD3SF,4`ilTH43jbZE`[iEpaBrKL$d%JEVVm59jY&'r"EE!!J9(I(RApJ8K$"iJV
"6[,e36#2%karHIE[2f*58&,kPD3mmk@EAad8rRX'4I+13@'(S&Nkb8%M15+#Ub$
b$fhhcJ(V9YZ(c%(48ekrF,4F@PANIFVhU0$ffIXJV'kS&jG4I`6LYFS1E-b%[E6
UQZp1lpdI(ETrbVV[['[8-m1A2SUNeE[fAPVeU0m`*aA+2(hZp$3[$jc3e)Llpq6
k%UGaD-1G*qIiDY5STPAXqLMK1AjkQNqCi2hGRQ2ASTj6Z&+M-U&F[q@NHi,"jA,
aP%a-L4ad$U'e'#)BrPhaXAm-pPpD9Ei5AEh4e6rpk26m'M((Pr"H@TA`C1&+882
di@VKE2MG4bH[BASc6BGp9QF$)aYZ5RKi'p'(epQDF%Mhb@YCaj!!YHY"&K(LI0S
ZLd`(X92N$+aSN9NVDPaK'q"$l,9d)9)bl)mV@5"8"j*mlJ@U%(66[B!U34DIhYR
ZMfqViaUPimh*9j!!eVLc9)iLDBdlfm@IcJ`D2Kjh,hpE(C3M(6ihBk1,@5T3adj
CPeUGTdBpj9flZZHFVI&X1R[%#aF%rf8ekXI5X6VraQ0l['p$rETp,i*E+`FhkI'
hFS2p4EN(ljmqN!$5f%@`2qVImG%Fhm(lT`kFRGmUSRlA3F0"ARK2@5J2Bc!X6+1
&5%IdmGGcHB![B-&bJ$p0'Z"cC8(ZrQZjHlbQSmlrqf2D`rE$P)Q,54dlpdBlbVX
)kEdVaI%CT`r[`$e*Yc1IA9+f((NC,Kfqk)EAepeHBX%@Qc4"@Qmj39H2#U[%c'!
cG3#LHM"'TYIQU4F1"A5PYANIcIU[[a*$Mm#VV"1Q%dTr-kal9UKi,4%K[,iQ2(L
9#6pH5d8(AQNLMTG1Y)q`!lAH'%RXKa1"h@&PCFpE,Dj@#[c*DVr*'YX'KLJE[%U
0J''"K5e`CmaA,K)Y!GZU9@(4k"Da'81ZdNK9'a9@(p4pqLBr&+9R6D3H#HLlf!M
b4E$iiF#J'8S*U2f6A'8GUXL,F*m)b8!$*NDDh5`DS5DU%mfmU!SB`&-Qk0Je6c`
'jHrSA"(#35%kC*J'(`9l&1k`GRBN5iXj6,@cPS#*2$m$%63-SZ%*0#4GmJ+-!m&
E$P9'%B'lC1bFqm"!GP"m%%faFqN5GYPT'Xmk9*+&c5rTALV"a8'ha1f#P1UbRj3
GcP1b`hP'hrfc[XDUN5IkCLeKGe"M$BlSdUAG5YKVK@l@NZYY@P`"!41[JrI2@V+
QLY9TaML6VAYU%l0"r3ECYAL4SE!iUr[lp)UiY+iXKBKq9j1iU"Kc,!HEp&6D)X0
`@YPJ1E2a"Mq$)SUV#BRj11*kTaC4UME%M##aCUliEf&V[Vh6kH5"!CEJaq,)`3r
ieB4V3DA3VDNY2Q8Sb[,eSl*pFBQKk"Z)$Vk+5iV"A$CjLFJ4+2V0$aCLBMf8qJG
SN!!Cq(KU%%SSA1mcZQiF),-94'8QlV,"FP4a6U41-++8&6(GqcL"$2AX5JUc@1d
JFRR#d)4Y`A9D*JdcHEHbBB(ZlmZ,rDaZVRhM1LfbF6Q`-YmSB#*friJ,-#@C3dM
QHjRNK!#j5T+!ZjLqqb4Br9fXH"[m6*l'bS5ALa)R8NTJ6&[XC15he9EmA#Ber-!
,+lQkGB3F@GbZkkHK6[f3!"Y0%IA9J!X6[UiS9FIN,M$"1X*49(@TleZ4YKJXfq'
daEaN+&!ACZImGUT-VU#DbDTC,6HjKiQe3P&MCq+%f(Akm[&dC6U8Ck%8Z6'!Q$'
(C))lL("Zd`Jc!GqlCUKIbDS"0Qb5Cr*"b@%eHGMd`2FbhB1S1jA&F9EY--J3XaN
!`e@0UA[Pdlh1kmV$I8e,6QNTH9[U3MiDlU@0!-6NT+N4Q%*bEr8G9SR%TRjlK,P
h2VQZ1AKT$3+#qQSp'mbS)f+S-M'`d')MIYL#q(BR8BeXArcE*URBmT0)1QCfNh4
TR59*(dZc'15QXVMYK8MU"L8f1[2E&RR6SPiQ5K1E1PEP,QaXqEIR#+@f"6TT-%a
'GDQ&`6K-P9Z5aQ(EPQUj,FF%)a-@4KZN58BE2$#UJB!Hd$`MZlN1'91+@LD*!Dm
"10['--@jb)CpIrXDXCJYM2l##0+iID2QX*6mS"0Q-XkaBV&T221cfq@XIZZHQHT
+$5!Sp58b4p5-`i8J9R!9XeK"XL3lJ'rh'If1PTH,Q+P9!r@P`m0+P6D"DNq4&ji
k@l40FdieMYNla+UI0(f$jI5NSq1%i+@-`p9#9hjPS$)S$3#S$q,kj4`0R8DdrU8
md9#CGi@09HXUhkD'DfJic9(2ha%pbp%1+k*l-2N(P4rcj!CGj8eU5+"K)8IMYa'
GcG(f6a&p(j1E+fIbj0@kbKR8X!!0Rh)dq6bLa4c9Mb*D4CGi8lR%Dp4J3--mMMC
mK1KFMYUR)eT%NkFTNpqcV()J1GRNUV&Cba8#(@[H!L`),9FmAh-aa#k&Yqke9'K
'5-K0EJH#0m#*UVBbP9fjU048fpdRUqYGK9@RM&N`K*%bjGiD52QjJ03T"D41Gm9
8&E[59h899j+U,Ve8@$QpkVbVXNS,099YCGa3@08,YFib(SS$`mSHNi$6Er`l8fD
I((kY[lEU&"Be["KJFbM6*aK-JE0X9$'QR&"8H**,FN5Yb+#[HFZEmV)4jQL030B
dqT!!3,EXNB03"De*V2i2A`)Lk&ZRSf#F`kAZG%#rFimicGM"'0Uj"blprY5*b)R
*TL38BEpaVFUUCPC6V8e*a84X$r-PSD4bA"EPJJAMV(dmM'[3(mG2k*+)lSpk*9A
VZ`#$$j+DaC'NT*lLL&e55cMLN!$8Faba5ZTaMS3P'!a&T,A[Td,+p0UpM+J+jqA
aB'Z3!*L2PSKmlaCIk$5,+G(ADm3MhKUK2CCcKKh+5cl5RV@IT5jhbXiN!QCf`M[
FPel&K#93iBXRD[bK5)dr$JI@[FC'l@Pjf$TNacBF#e%&["V0J(MU'(l1eN#Bccr
,4M3jkrEkie*laKNi9Njrb1822G6MMm1pFTRc))"#N4X&%5S[%1I)!2mj11+KQ6k
b64c9mi3V"F*B9F5*d95,cMRL"KF68%6VM*%8PRJl64'eQ5FM`JTqkBUjULL6+rI
V1#Tjh#L,A946XL&aZp'"b3D)NFr#B)31L2a$[X)EZB(iJXTCHkThITf+-MBL3ZT
FUQTe9q@XMj9TA-%Ik19(q)"5P*@`YC93l+jV)EFI"eh4j4j%9RkcD4*-FZ@Ic%`
R-eCq90q5"l3fkC@#JDG)2("QqN362%iaC86!PH'8jCECU!S*j$Qk&TP!-(K`h9d
",H)dab+a5CH*AFP)bBblc&6)jk"k*9G9i`%5F'dHid,8,')KEGq,Zk+3!0JcfD6
4Q&aT--NZ(V%k8f(9e)!$!AXU(p0iqL9ceA[(dl%m$8'SY[KEU*V*)Plli#1QbJT
V`!TR%C!!%KhHN`SVV0NhiD!9dRMkmF!#K4!NB!V"MP6#h[dEUF[ZqkcmHSc02I8
V!4IE+8G([`B,k$T%hI4d3BLPU@%j)d2(pp*9c*aKHFiA'q8X!P9"4L8$RS"%e-2
P[KfLF'6bNLZ!DdlVIK[SF"SZl`L`%cS1S-*5hS"$hN"3G*RCa5&e`LR13r@1L`C
5%%IeF"$VT'Y`*4)BM4&kpm"XfUUL`GN0&@&N"f[V-raS"rIQcjPU+aS#iilDUQe
Fc"PmBm+&*5)Y1diX8B6Uj4#SZDT2BG@fl[1SR+QhIClJKd8df3LBYXA4K8Xh8ND
Nd8CkKfcqRVI)h9b2@,MDYjPUUkB(D!!d6XIflGNhMFe14#S[d$"*E%@VC#Q6#)a
fHT!!`d$kB5*`NJhlE,mY'rKCpSYqd6dcFB)hd1e)D@%H)J3h6KL*)%G1,%1!'M)
824T"pCXj#hd,[A$ahX[r9qc02lh6KmcQ$(B6DbKQNed3%,6Z6qk14`Fi$1qLZaA
G[3Yp%Dh'LJ03K2!"NiF$8e',)@HqK1U!9G2`LPC0[3,cRa9@[#)9$USik1$YBmZ
S,"0j!!(%l`*K1$N3fCDG8fHNE8)XCDI,lK-+#HGF19&K4kE'Cl%i9A'1j`HiI0)
r[[dfNQXQ*TAM*`q!)K#TCJ&3Y(G[DkUYX&YfPRTJ5,jBkS04[Um3B-'e#PFDJ*!
!q3QZjD,"P!-`8"!66[@2,rX&2ZSaT!G$HTSiih8m1qH4kFS34JbKaa#Rf#hArDJ
"S(A1fJ83!&[*T6pXFqZh&D0TGT[6#5&FC)kIaE1"FL!VL`"-XJ"%m!!-![M(q6A
V@CibSGTN[6TJQUF1"(US-N5F'!aaBM#NX'"9X[BYr,JPKHh@b)mFNE2Gb"JdrdH
TQKQ)*l33R1G14+bb16SmQU1bSZ9f(Dj9Jb$e(&IRN4XZeHClVjJV@Sc0cUAM2Pj
`2VDNb@-a41IY!L#MmDrp#cYd-QN'M@eGX9%%J4Yi,-TP+411(b'`H!T%(!!-0di
B3NQV$R1&I%6,UT[K(KrAEDp&"pff%48L,@HPmD#E(m"pF-)&1LdFY@3$E$*aB4l
-k!)lKi[5'pNj$ed'-[E&r!k2X8E6ei6!1fX*LKip4fbCFJDNBjb48-M[1ClZ($j
Y"lXP1JheTq5+%808%E0P8J((VNhN1JmA-kjS'Rl4K"Cj!N"T,KPJ'T0G5)H#-(&
A@j&JJ@VjI+lUL5Ui-,l#9H3j8l3QLpfBr@P8+54#%ikb!6,,!SNcD%iM&%qB+a,
1M'*XiP"k'JT'XhHIKGQ"M5cBaUM5-N!HV##Z0SJXc#mZPB0)%8dAQ3Rp-SQN%`C
bc+'"USN33U6K#R#60Y4c*[2jU6`XXVkGcS%4-%0)4SM56dH93I(i)DV'@[f5ZEM
hbYA3pBVcH"NVcMATA3&UZUpIb)B&j)MRT")jTM48)r+&)KLkDZ+LcF-9b$flJQC
H3K$Y$-5[A2@mAA'1`3)1d!d)cLQBjh+K!1C0fkRb*kkdI#1U1Y3@QqCI$48%DQK
kbZQHV)$'D8ccJAL,Z#ZF&q-bQ$4em'ECqAIe!8T`SEE4!(KdQ8`31QTYC'L9bE#
d4bD$HNiQJkTP-UMC6!B''@Tm4Yk`qKH&!+H95+l5F!k2"#04"dpIqCkE'+%0U&K
M5Bc,&HF!D[1S@V2HQ94`Cje!S0p%NCAZX%M%Y4!+"Zeq)U%FQbF5#XHkL"3L0%U
"Y%@jC1AbfCbPCP+8hFKLpNBC"i&&bda#GZH&QIp2B4bK'"9NTV&lV0-aPNa$0)*
KXC!!X`018bSKS",GA##[#lMiSiJm'@L%XfiG9A&j*a"&iI0F)*TX"(DF'fJ*$DI
TS!iFIQX(e*(mHXFBPaF4Y#lLTa%*GGl%jV-N4!FL"L6H22bmKZZcJhX*[CJjC-8
aRBTCXMDkh&(PFPR1bp9H9GYdQr"UdHhJ,(U0q$SMF-pFQ+2M"hTPjb6B1-dQZ4T
()Sb2(CRT[('RmbdG-"BiLQeN"ZTiQl(%+ceT1fVldRD#PA3[)j+RVU)SM1!6Jcc
e2J[L%%+Fa2j%VKi6D-03l6#Sd1`%6'cM88fABQDK(QcK#$RQ4aL&X,Q6Qi0`(KH
bJ2qRX#cJac,"+)i%6*Kq&%RN)LCT$Blj-LU$)Y1SLj!!@B,pZU2m!CHr!A,qMbJ
'#M+aYH2B@Nd`-X0)dbr)#"%XTYTeAj6G-V0cl)mLf1h03K#l+h1L@G3Z#DKi#&A
9@Q'SXK1SQE-'8FP$KGqb3")#5VMB$!'NX0MX+Ua)Z@U,!d&ldFQBR5D""i$JqZK
,KbY,R!ZS0R3BL`QCIDDq+JZ6ii)V)$Q0LL(4NSKN-S2Ge)2#"QB%`'T"CI`fVY*
XB`GfHG#FP!fB3*JM3bQ'c(jQ+09@R(F@#L$'%3BISfRbB$bP+`+fBS(k$rpcJe(
!61+a*d!"2qL9Q9a8jERM`*LYbM1bfIMIb$m[(DT))9MhmX1YJ%"@)G[Sq&&PaAR
0)5R*%H-36A&q-PZLa1+"-"ZG&3EC-$#5S(Q%RcM5pA-rR*'lZ'S6&eQG@bJDldF
PLTBL!U!K9![j%1kR'lAlE01UY(e83104)ea!%dY`BhhRE2-0[kB$kPNaK-$a*SU
j@rkriF%[0'%(J'J(Q2k0X+$8k&c8qRLjEeP5i1&M0-b-4RZIjlIdf+iDARL`N4i
)k,a8$9e+MmHEP"2M(X'R8`SLk,XV`#de1&A-,!BdXN[aT!)iCFlMM%H#(CM"i#e
`XP*KLU8VVB$0Ak)b#k*b%G%"%d"T"6!G-B+%+P13!#d-T%5!+"K0,$8iNGc5VCB
)EZPL*iU%%*!!C05fG&(-pR#[TEpNY"G$PDLP[a`4&P1EPF``)$d3'P(reVId9BK
@3djNYA5Kma#q9P-lQ4#2%L0@(p$,D"c&[CC34MY2!TQ#5+E'XDk$f#cFEf9%IAJ
LSQE8[XK)6#lKYal%CLBME41Z'SM6YH08RI3G,,dDi-N,Ai4%$eY84H#Kir,3RK`
&HF%XcY)b4Pj,bpD'[+BG9j!!9jB*%`2CVUUd)D$30NCHD8*"AKFPG'IN*@mXEBJ
ADM26*%CJ5mYN"*D@U$fFTX%8)5-`G,R!,1)rPbYALJ!8(Vk"`RNbUb)P5-arNX'
!+UUR'He14J`qPdeJ`Y`lJ3P6m!*-Q!+C#G2SFE0KFKEb4TP)LhI+9`TpZ(CQ6-k
#r$-rQ4Q6Xe"QaNaQJ+3)`*iA%bBAd'!jm8p-KiM8E168c+B&hFbB4LFcTM(M%,C
96QDEFeUi5J-8I,SJ3)a0`(am")'*!a3V!b!DE,DI8B`)&CMf"GJmE0`TkV,5b`D
#!%cGY&IbJ-`QJ1(6'f9#U"mcJ+)DD5Q$%icBEkSGAQU3!![PP&)S,l!9bUdhhB9
bDkjF++m9M*(FJEJBKL'2Z5m-`#m'GNY`IRT8[U,BLZSmd9GkPRj5HhMTT`b'#+$
&360AI@#'aY*2)+EP3@PG@4%*M(1"$r*CE`K8Zcf%LJ2KmBlRHZ'BRlbPcqaEd&Z
ia!MQeB*$K8[NUBrAZp#4`C10JeA8"0T`e!#1bXD%'J`rJ%N(N!"*[TjaD!,i9F[
J*pA1qKJQqDSjfH6N`Z0h5Yd*'Gi13%%&X0$`a!4G2XmL35-N"SUP9JX(%ca5SP9
Klc&$LXd*LXe)N!!4r&c#TaB4k35V))mmKdUI!)NLCY[JFBe2$,CTZNCBp98P`8$
E@rGAh%"#cm#'EJaqjQ4Ub8T2IZLLA6qLNV$TXjKH,Nm(k1kKSDj(@#92V&ifm-D
9rZeqd3K&UemmJ3ipLMUlYS+#8rHrmi-piHk`3VGijNY4(cHi!Yhr,U01'K)X1P3
#SkSph68hZVK)Lk$5C`a9RlQKqa8f4`qKDV'LUS'j+fE5b"F8@jKC"B8Ec2E&,L,
"2kdY(*c1fH6"cI5BXM*Pm1hG6lS+haM!6lB"NF%J*QZ0@8%21X,%HFX`+R6TC@H
H`AqQKkL@+ZC[PR9ADlVJQU"R8e98Z4Q0%1d,P'@l['@R52pi'EBecQ55k$'4'3M
38#lN"L+XmND90EjiUda@0-$NZMX*p(Xj#4aXH-K@08M*)#F9TSR$`V9#bG5#*@H
e-326L0NklYRZC*reHrM"[)',LQVGBk&BVhh$+#[,@4N14Uj&Kq2TXFf@V""N2QX
VqK%`EL$V8&PKaL1VNC6GAdHJ-I0QZUf)hT!!YiMU5NPNhr98L3i-VmH(,!EU!-0
Ml#Q!XeL)aj-Z6%6%qkpjBme4Jr53!*J*XfZc!GlAAS2a#jlS'K5IF#4UZ&!J&SV
hmCSYCX)!dqcAd&4BB"S8#fmpLSS6#b98B0BYJr$D&JhYm!k-KpQJaUqPMKfq!A0
B03j&3ml&J80BJ+U&&5ALelILdA'DLQ-H2LLQXr*P)!,,9!X(mT,8!BrarU5ZDbd
EQ2fri`Ci)KMJb3F,a-fe,&kcf#J[99BBN!$FKPY!16a0UUd`2$JSEre04+VpH,$
jE0VLrcE%!+!DkVSQ96aV"PYJRYYm&bXP1B$b8'2MDYH("H*M&169m[69RGaJMm"
iHc@,Ve#p)iVXChU!MGPjZ*QRZ`*0ikH6ZKf$rm'9NH%kU1+a[J-3UJVAC3mH'Hh
LBN5HbLidmf'3!1$$(L-4+b-LULFh$pr,(Cf,f6Nlac2"LV-`)@Dl-LB-b&FGBXH
J*!m3"kSL`TM&aj1kX(S269aX3fKVP"RjNcUC,)%&'TlC0P8r8$%HaJbQT#NLKQ1
0K!af!fL3!$A$4`mUj4+bJk-0AK$RAFi(lRB*bbBZBT!!"$QK5h#IK*QC%$1"6eQ
JQN)Cd6Z0h"%UNZL4!1L1V4U!M2h(+@ZUA(SG4#iq))S%2NA4#bmQ&Y5-k`,$8%T
rVcJ,,hha+EaFa59i29Km$N9&9V&9GST55,YCAR#k4e(JJBY8IS'BMN1RJPee5R'
!+RcMA,(e*EK&&CpM0Ebc`@KkiH-Q1er4dRIAFSJmfIB!!cBD"B,&RBjj8+(@9Jc
!C&15cErDQ0!`P()l*Rp#X6!JN`'(Mp*e$KDAm&%[&BLTaDH#$A`F(c8Q&Q!Td2K
`RjJU'BKJl*DiT2KaHB[b9@c%M&1MeFf#aY"rXpKZVHfBMj9YI"IEI3MZDkmkJAF
`Gf*#)@KPB'"+$2FfR82EKP1'IbP2IFJj0*%ZJX"EG%QIlqhR`[3Kfd(9N`r#!#X
YVKUfAG9NF9@Va98Pja$X#YQkPZ[+3pU'8BE&&F1@9ab0L'Z&MiljJ@CZh[#B$K9
'P1cq)XlZ+jX`@@c#5JjiL`Cc,3ca,C&G%#J6e8m)eq'+L!(m910(HKL#[c$3kaT
3-9b*!8Sh$89!L3YTH6SMD2c-a-rl$l140a1p2XDV38`&ZbPK,p6ThKL)C3)BM9#
(e4CICh8B9f*,Zd05E5SaldlI5qBhXYdU08`p$h9DEI%"9UGGkYlL(FL,K0MBh"E
I5kih"QKJ,9La%-cHb(`*,b3$"$@!i6Ib35D!B3N(J,KCIBK"NJ-r4,pL&MF!b$e
%mS[dm(9-*rA&)rE#GP&m[0!Il'#9S4"k2%bI4#!mLVhi%,VG-'Uqr5lGUlQ,M1c
NC*C4Lia@C04%4)q)`BIc2Km9QqQ96k5pNi1%M+Cq-12&D%T"4RU`8ip6--)JX9'
!bJm*'!m6HYM%`+2qVIMF-i68#%Q3!)"&$fh#UcX,9c3E'HR#J%Ah#39%"cQ,B4p
'YUA91EK6G(0HQ%8i'+`l!m#b$qka9DNZXp`Ze0)3k3LiRQ29CF9cM2*aJ+-l-K%
a1pPHR%%D*rEEma[`N`pfS`%1RXpH+D`FUJcakbYTB$*1"pYX%cX1Z3UlXr#cf9A
CABfIHbeCE`%SiIr#4Y4V[Xi[Z"+(hNk"a@F[&2l+%MCl+aY$UI0)(4pdF[9hJ-I
l1ir"k*Ai@@Re0McZTlPZR$rB8!Xb%,j)4ml*@k')ae$Br3l8Q@5@eE2md2hGlf6
ZbGa$IrT!cLjKdJkApX03e+jjP!%eITL,ac'9%,Xm%'J0STTE3+m"#a@2GYKVK,M
I4'DU0mc06'GhT[lf*M,lk%F@qCpH)`HR((m9XrK-*f@4I`J%qFDl2HV,lm*J1Kl
2$9-`-(kK&X&jQ-h2c'-(UTq9&LEPbaY$G4jPQ!+kH!FZAPZ*UhT'2c`Q6qEK#j-
4T30[X()G1SbL3`pYY,B5!1&*ITL,5dQQBp`"`Pf4Fq[BFPPrEIGQ0%p6-YfId+B
6Y1P1E2UBXZN1fR3(XC!!F)NlhV0YZd1jeRC6,T2bPK($peJ-$hE)2m9Sq0j*Jlq
BS(6K1klbi*AVL+6b&Sj`4TNb35*YSd`@MeEHVXF%F,m-`$d(`#Z"-QiB)(i+JKP
BQSE#CihiJ9R%Cc2a8`+$1X['@!#"HpQIPr0%%pL0JA'!Rk(A$'4MJ&Zm,eCMUB!
fmZ-%p4281fIG#P,mk3#9cqp!X@mS0PNB#5YP!`r14mm$JCdI*YFL&8G9T!a&q9K
LCM6!e8iN!(L$#)5)IPE+eF`6qk"3+&2B8$'TpSeF&1HPeFGV#pr)eC90G%NL"h8
B8JjBSH"G$j8"'(#r@ac8FHCH6*rNh*6$PAh"Z#Kpm"SE"H)$EX9Tf0)*`jDb%BE
P1dDGV,!N6fF'@')I4rNKm#q`'4a`Fbp-UL'5%Rp%Xl6r`5P`+(0%pm+F)"YQ,aX
HJJ'Dp6"*#kE*leJ"US-QLi($6PPi"-,[a#$1B502Amr1H4k2LH#+#'j$&VJS'"C
I5B1TTF+[3#5X(!)`i0&%D@H*X@NRTbXl6p0@9[)MP4aZ9e8PB46ep3*+(,kQdHc
LeifeNPJ[%b0fZBRq2)APQjeN"E-kpL'fK-I"PVPCPQrN$XmM-,F#c%r'r*,(Q#6
LH2,hTS4VPV"rMare&BCCcKVm`4[5)hdL!6338SE`ra%['%EDb#4BIJ!-A[Y%!T!
!maSFG1iC)1G-MqbXDq'Fk8GeMbMF8C,G$ecTkpl*6TMGfk!+FR6IaFJ%epmq"U)
bU0`c25[G`S'!a!TRm&8HRJ9Kmjj2m'GJR,"ma"SE!DEMEFl#Nbj`-@ALKpHB-SE
,aZU%!kBqmHGi)#-Y2FQE6m#JV#4U(Z2(R)@*JETGZ4!8S*D2B80K&)ke%(KBLDM
0LNX*K-1r`m@YLBGS)BE)N!#01'cqAH@18!p0GhG)QmB&d`Lamj[kK1`i34fj%Vb
`)`0m+ZJ!5'[PaahD"1Qbff%CEIbIFaPY+#+e&NEDTRF9cRT@BFJNPD$2TT[iMdf
`Fb!H@`f6j+9-9YG#1FK9R,pPK&[(H9fTXF3*E[fVhB#'S*cXla-D"0GV-X!Y1qm
'1$6QkGDMZCa"G'a3Q-F!TXjJcFUTla3pZ0$''&G34q'(R&@PJ+eIHm#Q)$N%&9X
c"mZ[[YEI)bi#K66,%bV12lJ35aV,bLK#!-5DZr0IBN$EJJppp`S8kKX2SRKKGV-
c#9mml58)5LqHf13KJiP*FU%E(rl2kQSbf-9rFXCimXR"YV%ZMFF59"8MSc"C59f
B"HVRD6%b1U5VBK#ID$$8fFPd,CB-mN-erFlXUB9"p6IP3)$%QiZISZ!iJ'%DSP-
j1BhPT1#GUaL2[$(iVe#9'1dSNAUdZLfa8rDU,alXbp"YL!f3!'[I+%er%e1r4e-
MmS)ba"r3m!Se1#!-r!(QaDm&3c!9jMIU%cJHMb!U%Rc"0[P36"rPk9$2j@R'P`j
1$*!!l&l-K!X@r1,RF%Gi4$2H88[ND%PNJ%4@@k1H'P@CS*C"VFN$CqBNh"$jmBe
K@`FZrVL,i#j'jE',#V(bb43j'h#NbMS)BU0Xb!i4$9I5334+H&BJT%PGXK2L&Rb
m6fLkMIl8(ARTHTL9Fd25$qVU9rVT6cl*4a+Qf23XV[(C-'IpYl"l'2fT,!Sia(U
j16Cmr4*HraRNDN&EfHL5r%HCD-BEV$40NUqfG"d$"$Z)bN$&!5iB'V``aJmfJ#&
Y,TJJA-jQC[2-KhMSAe6rkM2qE(,3iT083@1AlIJB*F[LT[&Dr*1EiJjU'T!!LE$
d("ej9*l)K'"NL@4db-aCeimeicriMCa)-TQ@4UL,A5EHdKEqT-2Vq''`3!EjM#,
6XU51Glm2pafqFT`QA*!!"bME,RFYfb&IS@b$[2QbI)f(e9#@IdU*daL8E2JA5M*
#iNrId0LFT'@c[dfb8DaQfIRjDE2'&J5$BS*j-+VQ'"e`+RQ8rcIY9Y&ebaq''M`
bi4'L-bpB2'L6(Q!!-)dc!S!Dpf1MLjeEjBThGCk"[-`1C#"lkhYKpJ#Q-fFQC+0
r3*AXS0`@l"hS3-QLIE#S,jmHJY#,4ea0B+Z6Sh"bJJ(`AVI#a5fXe8ZZ$-jJbNB
+aCYMF`PXm3I)-!XG+V2&E'U*b6`BP2mm&c`dHV'ZP2mm'2lMB1#qYcJIaUhK)&U
'acI$e$9AG(`Q[ILKa!PXm$`"3bNC8iTbiJ`@`fPfR0%A!1-(a6AiE&3q9p'RK-F
4&iJf+40SAZ)Q9i!EBL&AaS+HkY#SK`P9I)@(MmdJ)i++Q,"d%cD56Hl9A`a`%Yq
%LfA)H"iUhNeFR3Q!"'1(5cFamdQpJU4YidpZcXljVh`i(i+953CkYb&iEm82c+Z
PEH)(jH1MP)-mP(DECTjRi('"d8HI6L5+2aC$5#B4Df-A5(,f@YEpc`kiqm(a4J5
f+G0@%$P@"(90c1Ei&L-h(M`BiZ*A*K92`-rc6P3*TiARhFDI@J9-Z#9ap'+)cRD
aDqCcr2#!d%RqmeXL(RV)!cq3!#SZ6V)GdifSA$mK#+!iS)T4"H*p%0L4e8G+P*H
c"[VCUA`Q*GN3+@-i3I#Sj18,q)rRQ9LSN!$49(rhri"!F"hCC#M-qGAN'(b1XK%
rGdiFc%4'QMk&a6m!!$'*384$8J-!@#)293eQ4K%3)H2ZBIpY[jDUp1E[ZVkjRZE
aZDkVHUUfHN(c4(C50`EXbJ+pELDcXmLIapEbN!#1kjZjK4$#&HhRPae`bSb)6Sm
i&`i6Dj,a21YN(VF3AXr#HS4`HJ-MK19CKp'!J5EG*1pm-alVlprIrrGe(5#rZb6
[*5mr!"9hAL6c)$)L%L(a!"%L"PpjA5CM-Ic)[QB"T*JF`#BKL'Dc"i'6c+,ccC`
$Xa5a9),[cI[c[JNMq2[1JSchF2@f@SBmSY%MV8-I'AUlS891h!iA+Q+ahrf#&3q
#ZABef[bF%Ha[peYmAbq54K$KDeJaN!!kh8!@KB&iB5#&-`LN#hcT#5Ca[TcDLS#
`Y,p&PZ+)j*JiA%EHX6lRH+0r`$m!X2eKIa`rPp@YcA%SLmTS8&TmBc$4bZ+r"R`
@jJ1aC!5Xi(+BF1PN%LCX`R6h`f`39H0PhZ`TrQYEK)YPD*95!c)i2A(84bha-5i
qSKVa4cmbid!D,El@SbjPd5mPY`)JVK1A3b!U,dV90%+rlm`TajGE(0dTKMf$XaI
9A9I%!pV[1c2+!jhk!pTdb9'Ak4'AmA%bSXU6+QLIY-LH$4fqCRA#d'`YXKR"G$0
!j"""ah8)XHTm'@2q8C[$Eb5,YDNP'I8rl'P@DkRiSlDPZlB"1@iCYm&`Uia3IaF
!JM![3a$RSq8K%XK$aXE"ELqJaSb!'PQXU%"r"jEDXcd-4JarbJErSF96BJ49!LP
6eX'PTBXCK56`8S4aGS4`9ZIj`[+YhC0"6PdJr2iXGhHrj3QRX4a+X0@C9hZ-C&X
l312PbL-AP8HL@"VBHhmdf0pPK"`@`,VRESI8RBpqT'S&lIRlNdPPJ9mX1,[,5!T
BR`bdKJf8`mK#6QS`3lZY[E(GGi90&JP%V5Lbki[Z5)0P`@INT0PfJSST*qeY*`V
ji4`(%pR)T-3dPCJQaA4bZ3Y!`Q3!PqD``mUJb4J-pXr[NkUlCH3V#"*Gc-M`LY2
6SG6T@-bA0+L`!5fH3#UV"`cT`mE'hDbDDV`jDGejSV$NAEl6BL`4X-E`PVE6!ZL
NlU+mV!&5X[,&2fY48dX[aHVm@CF%qHPHeVe3kpDDZPPB50eShML++'b)EZE&*P,
1Dc)-!`SiZRQKQC8S"m8%pl2idN($dU1,#lR+p!)6"F3Ea04+dlTYX(j@LC-46-h
%G%*-*k9H@1YH9!UV+SGLqLbV6bE$A54imFM$LZ#P[%k&j'-"qHbMSGeIc-DKlZA
`2"I$kaCe'e8LkP0(3lc",*)Hp-#RiJ'hqIXe5)53!-#fcI0@QXjYYf$6V5aH'&k
hNFqC(LpIKS$aQh-j'4DJi*3QCGX*hTKrhLF+mb(9RmP*`j-d8QdG,'ie*1"#,[K
*A,`2PH6LRM64T9PeKRQ+9")%p``-"f!5S*A0"e""EjU*9J'@2,V3lh+9-LMb[5F
5"9le*bTQG)E++ec-5U(bKc&4U"kp+KF6PAD2,Vr4!U2(jDDZZ3*5'b`%Ef!UJQ,
BT!Lj%Y9[a4'SIL'[BR%KrdZV[MbYiT6@q-T1THU,k4#eRKKJQ1F99K3S#SL5SHI
D$'ehjNkIRj1Q8,dlj`,M(qeZTq#(QD&l'53FP-#RbPK##NMMlZ,[m'Kq*0V%!9M
iZPGMjXQj0"II&Z6LmTrcf#p&hR[BNlN8a8r&T5"qA1UeUbLBCcC1KNLY3&baVf(
6pSa8Hipp9AeDHEAbf&H9+j4AaV'[[ZT@AS9SDimklU3kH)ZqF!-#UAq4-DqK$9A
$T,`B#V0cB3Z$b1CNkELYX@1kY+$Y[Qp-!HLbEHdXh-Zp'kXDHcG@kHp#p@qP+CX
2)$5BmL[cLa$Km%B@,LYc!Sac""i2X&VeM+K&9ePSfQ5!b"+,-i@UhZ9Y&k6kfX&
HVhY&HCdrf1Z[EP*HHipj$3Kfmi,b-N6XaU2-@+4AhK5*2NI"94L9CPH,Y-mm#`+
L(%j#+'Gb1FL1F*+1#*m"YJ0-6"$kJBm2BC*P9MPP@f+3!0i6PZh3DRL*#HLp%G4
6H)2Z%T61FK9FaV[S!2F"8k&M'&0pij2K56[)pEZbp96$eamA'dJi5k`!i64KdRC
KHPLX&8A4RA-`f@A'2,V4LZblNX0r'bS4jXSJK!Cm*Dd+)6%cdYm"B$$+(FU`U%L
Sd,3G2qD[ld&&D'mK26reYf'V%[cC+A&G`dNfjpP"`VZd1EUH!rZPcC%2-DRk``%
NY@!1N60r11#cdl&@1VE9D(G,[2#KNp8!8+dec[H1)m#f,mK)9UJiN@B5RFaUMRH
)&!8RJ"cM[ce`@jMDIm8KA['U1!"c+Lh@b-$BY&D5QBf6bGf&mIR8Xi)C1U+N(Pj
QaVVbrpj(XE'Lk1le)J3ac"rMFkT&FUkbFL%dpe+X@Kh("j-rh!l09FE@UBYk8F`
@Y"Bf'(&iFA*[I5LrAFlC`+"@4r2"@#KIMPY9*lTJCCSBAZFLYKM,QcMFi)+f%,%
P9LR5+[mArbrb2rJ[HXar3H8r$Im&m*pq80D#&*)PZ-q`E)EceF2i3p"#MF++*&K
3',6'K[`2Ka4$V[Q(3`Fej"fFfQ9$rLmX1KQj-GbU*1RU8MKmZjbZi-N2B`[ErZ%
3(VJiM'2Q)UPf+F[PY-'6[idY@%1@@#`MLj22elHeKl$!b9fKVRH+M8CD!(&T&b1
ULfr$NQkMkNa+Q!RI"X'H!$4AEM@eN!"UdD4b'e#YUCDrKUA&kKDdLb%eH6(+DB,
BZPKG43!X6)J#f[['J1L'FMZEh5-fGKla1+PcVD61jD,1jD21GCNkPj3A31iD`GM
r'fm6ZZhrpCmhcP2iA9G$UG(rhbq9G$-VMlaT@[#SH#64AEcLN8FipIl#hBEB*C5
eY1fTVDSN9j!!bH8`M'6d$I4B6Ub'ZE-6BH0LQD!#-DP`iQUcI!2aQ&3RH"*KaBp
*9"BqNaE`F",@Y,I)MpQ")hS[*"Q#X)*XF)+5EiEja9*%iPJq2%Q(4p@S)bjHdC*
)mFGlerZ5GJ*QiRMY*39ZRN2ke$UBmL8b%8B`PlU8qYR$CArj[591kP)&MYRk&bl
(BM+U)[(iK6`Q)AH%*h2[bZJL#R$$J-HVT1-"2R`AB5f5qAM*6-k@FjbLrQjHKX$
ZQ6i1qbU2B-UhJS$3GYjR0Z1-4%!CM,h2C#r,kD!r[-@Jm3S8LYf)%qba$#kF)$i
a@q%QZe*i8Tb8BlG1I$b!`rrJNp&U1,$m!H6-B2)'NQB(J8VbFDU-lJ@Tfc%CI2i
qJ"QEFHmCK8Ai*bEL%f-5VTdE!Iir(-F4A"5!22GX)bCh+K+@pV(B)ebJEHH+)U6
%bcM!`T&r`*rhXrC8(Z%9-l6NY-,1-0Z#2jYKJ6JX9q8c)5@d6Jf(SNZ,3P$,pki
RKm(e91#M91$Ab(MJk%FG6-Upe0eNT*8k(`!)!!hZV,hiMaUA3"jp@AY[[VMDYJ5
#hMD$JaN#["KppA2%S0ihlRdAiIL`RF%j!(PKB`BIY%8'-R)iC))1m@EYMRaaa(+
`3kU'(&)ep""CSQp%[TLqNH,)N!"$kSBF8RI-)@[dMFJEk4XTMJijT(E))E9$$P'
(lB1N&5rbF,h5q"!@L@GQdF,*jYeVGp`(M*NK`i6EbhX)4Ga4r%49!iDR`8#X3df
RmMRGG&KN0L'bLEhV2GDCTB,FdVle[[2HddZakQ%lILVlmiZ@e"JE-%,Upf!k*A!
L[3R6+'Gh6rcCKcqV!3[Zir3A-j'aI@$I$R'B","P$ZTU(iaU1daj(fkfrjL6C(#
[4,KE$rCK'F,Qe3DkDfc&lMGlcc8a('K6NkPEV-"mq6-5F0m+0FF+T*G$P6h-V2@
0Jeb9-3RVRH,1hRFHRqhZ&,Q$PQ!c+cEJk'PCZ9rCqM8%IdCahRE1paSZ[U+4ArI
UhB%2KbYI91m3e!h!J+e%FH[G3)%ESUN"T6-NKi2lPP"d'R8#"0GIEHC1J#*Z[8S
*dmd0)`m'1abk[L8G"K+TH+i#!+q6Pf9KUZqmFmVP9hYaZGFR3iA3mrI*e+m2GZH
*#Hl1'3R3i#D8`RmR1!iG!%AifHq#Y!+fYH2&59q5!+b6Eje'Q[Bd%N4GaRaMem)
hq#8kfKJ@R8!401('Lm)ki@M2)$N-)'`Ehek-[2UP1cJb1jb9VfiD(Xl,aL9N*!K
kGrPAaKRQGjh2cQqcc(A$c2F!E$K4Q(+Gamf"a3SC'`9XSMBA!XrIjih0CE0b`m#
XYKJF!d65J-XZ61J[rHkXp'de3LM`HR&*d0F"GQr+E0bp#B5kK!Ne!IMP$"Vc!lK
jFA5M@P%)A)NFrT*)5#"*"rI%3S!qe2%(+1B`Jaqic!hX3(+#JBV*BXVqlSDZ"CY
5`$AFrH!3a4HSS8GDBLp+kHKDKUe1beKf8'69fh8iPTAepr,9C8AbVA[9*D2"XH"
P160@A8ANe5`1fQ$%eEAi8m-"PR(qN4,*#Rh!1hlNX$4KSLi5%-30JbjR-Y#RQlC
Za'9mif)c,i&k(i$STMbc)#k'"`BI+epkUEV5E4Srr10pF&H'bA'3!)2`,iR1ja*
"A+`FS!$$UUdjk5R`!RC&GrfTfr4Zjf9'#!5"&eZ&Qf49DZ3"6('+KF2NB@Z65(f
LfQHVpd`'RT'6"+)Z[mj'#+aNV(S[QcDU@5j#5F-&`-"U(kXZBf)b&FPV!)5d,Ch
Sr!1+-p[ipml'cXIbB1h(i8)*SrEB#@D+q$JN6,RMaR1m153%aj9!@S3e$L)J)d3
iI%4'h%3m,K,TZ&+mN3M+$B5Ijcc&a4rMTkJi54qlLTIc4pA049jG"9E`Te*@ekQ
2*cj%kF0)iS0'(kB5(m,dS5,a)8)IFQ-"0316EUNZ8BfaJ$[+)PHE-Bh30*9M"Za
hBKQUlDmZFh5E-"*I%9+mC38(L2cM4Q",*ic1pH[l8LV+G!FAIX&djmQ8,46ZcRr
B-4PNTUqYBe+LD3&8F0Y*J+6a8`e2cE+Dc8PIXa(Rp,D6QF-G2fCAQZe(hS!Dl5)
efRaCkX`'h'[#["'2A,H*0L4P,864bXV4Nk4Yr`fkFVN)dB93)H`b&[D8c'YZk`Z
*08eX!b5fF4,E9"Slh8YLkb1ah5@a&C23(#5dZb3dP86@UcS5`MU9%00!3N!V%k,
**S45J&#mLP"k%N)a%d)*#D%iUCXpDS-$HkB3k'rIF!Z1IGfH9S1+b,YabemHIbR
@HrbETQakidJpLQ(HDI&hq5C5YpJCGPSFmcIi*19DBk2$`YdH$A5d+e*dCE@8SA0
5hKHi%`N)$DU"fF@`Sf2&VGX[8U!6U5kj2D&!,S!S[P,MHS!MV!$p0#Cb`U8E$MP
`@f19mh`R!p$BiPKecHPcYR1@PZTDTb9ULGA'BVLTFeT!E[)kZH%YU9C5'I'$GIq
K`$5j%*0$'#Xe#JlXF)+[BbGilhCQPa6&&dChBq'1NA$$*0BCp6)FjC&D))GeFPV
J#Ved+R09JH"'M2--lL3H5!P'4(BUN!"Ga9%2!-+50m9Vj4$V`5lbmRlp)TliGr#
CLXlqkl1a+P3Ia"#J+KHaR3'YPbfZ"`3!#B$`Y`3(TU9@6#,(h1Am5%PiKVr0iNL
jG2J9c!!*#a$6j,cB-'!VrQJeHNme&DkUdD+(#'BE"-`iL%*6)c3a+5ASc,3a22B
PbA&Y+38G&qPeN4iXa8B8f0D!-PE6i5RmM-P-X38X60%NdX-Eeq,5fdieI(l%p3!
+3'UlS&,ZFPHQ(k[(04C8j`SEYpcA'HD#LI4MGKB**%lS!J`HF,CIM(c5c5iSFT[
KmQFLDhc4rJZ1@fL3!14Fe6lp-a(i)m''$fMZma$!X88i9cdmmlDiq'0p-%eHc'T
J"%dMVXP94Y)cJ3FJ`-G@ZYK&If(QEDLm%CKe-6i@k10Y2$)DDF'(C[S`Lq)CjB5
DMddM`mZVEG`GBL0hpXZ(U%(23hd2q+A"Kf9NkDQ'9mrbj@-ME1UmHFmBMXh)RP-
0LcEabRY0pKMrK!H3!'V#6r,ACf910Z-R+a(mmI%ri*[N$rJ&(N)(dcrET3mrBAR
@$k2h653fQ($aMhhVc[l)'T!!EAEd'h%RL@b[TTX*ZYQAiC[QliX(i[6a3)&[5Kq
KMdXPFK8qYY%$aI3!Urm4)[[EH8TXEMNpi+-(pSL&N4E")Z#&9l#mG&1JQaVPS3m
9Ck-4pdh45)TZcY)0i2jSQ-4D+TL@a[B&1aQE+5##2KJ)8XT1,,,j6Fm!')V9c!D
MH2BCmH*mfcNQ3!D!mpL"YJZiXCpUf,pG)8BbXXq`-aaVf%%QhXm`8AVraaI!&Rq
,a,ZFMm1I0KajM4d0%5kXaH)H@Zb'k5r$KEIM`Xl#I,5G`38'MJ!1f(N5PCk8!#B
%d)#(bbNCY)H1,M[9F,L8`9ldiLj5(F9FG65Hm,,5ZMh,m#q+M"fApKQZ,$X(e@3
Y)-6Ai)#d`aeA9+5SHLXhUM,Xk$3Vi!6aIP2(N5B1)*5+(AATNM9$,Me!KS-d[@I
PPFK9M4FBTV5!FNN8@Q+KF)(HA)6&c6Rj[B(B-MVJYci00bT5$J!CBXXm[FUQ*NJ
Kf!(LV$M5a%R)f'SR9bRqibDU92a+T+6qF$ffbJr'H4,EJdIUP%HUa%H)@da-46@
BZ*4FYepF(&0H01)I4GG+)6N`bPhVkE8Me,@8VTk#8"HiHcjpIH3"EQi2G[@RVp#
R@G(4Rli*p[*CS6DHIQhN!4089%VeK)QFrPCY9PJ9UTbrb5I)l%j5D%P54$"AE$r
%5LM015XVQYH-lfiQ0hmNZLD+M'AYXm0--KZlI+1MmHHk'YURScID#i%YpcQFJJ+
)JjJ&RZrN)1ql+!MCkIK!JKaSep)D-jL+Qr3%0eMMC!0BT`Uhd@#CRF[-EqmZ-PE
Jf0IEQGK6%*'4RHbdlV1+CQI%*,(,#P,8j1KK%3h4`QN0MNbML*+rc[BIh+-0K00
HdJDJLP0rrb@T2I+'-9pN01+5Irm'$JN2TMHYeXbJJdLF%N!6cfK)A#RX3fbB'AB
dV'290HXrk4Y'YkZLK-[M)&mQ1c,pp!`r9*!![X,-r)r3'%&'m!0J$$rVC&$PG+2
'A9abUM0CN!$qGTpeF[lB5e9cBR5#5D$9HSb$3,KLM*2mR'CepL,KC#rihDf2f-i
J1G4[i36pD($[Ae("2BALVJ8$fPN)l,l23%3fhRKk`Fj*bmE6dbPkU"B22DA1)J3
-([i5&ElCH2TfUE(aF$dA1GmZQ%C!19SqGf[[Ai%8$MkHiF0Qf3fT4PP#RkBR`$c
H3P1('PULm@8JY+Gm-RB*NeV2V"(BV3Z9`EUkU)9EIhQ5839`9ZpQ3j`Np`CfTc9
JHGhLl)9,CafC"%bZB$**MVE6BT-$q+L&$k#Q0IDh!%RqVMa@4F99K`URBPmhZ#'
)51GAT6&Z"12Rf*%IE"l%ld44CiS!jf4JE$+,MM-QFj41Vf%A(fB,@9JJ!*9`1'Y
f4`lPlrjN)$$H2Ii6&$Q6Hp1"*)e`h5*hXNUp@4""J+eJNbIqic+Jp0U#k,E*JTi
%2N'Ar"SE&l0SSQ'(c1RXfUQ'hGFTE5jp+M1jB,jlM(RZf&kcm4bFKCMmY),X!*,
Z[m!92A+5YJpS'edqTaU'[GI5f,(!"#VAfb*c#0TVHdqUZM09d[%'Ja`)f9Ib9R`
&e8`FD6lIbFFU&di0ARLfR"Jfh9PJ$j[V'!S6"CQlM),%JaP$&#DRjQqK+2I3CkI
"$NdS6QT`c1abH+P%Xc1CKFT[CT@IlKS%80+V&bme"bLc5JDqYbM*GM6HZFF1)$F
Z8#-YJ[TJC0Ji*p3+qHbmJ'$Kl"4La6@+"[%q*cNaf8NJZa#bl,SB9C4T)DH,T5&
1c8"-GTmlkPK8)91)8r@fF60KT4(&(M3RCH9iRpe`6M9XfDQ3!2A(ZF-FZB##3#)
KNeHG9$aQ@hIMVGY#MIp#(HH22fa5YF8IrUBEQka5#Vf9#Xe-#$b9%%ila)fAMLE
a5'1,6%h,kKe$!T3k4Bd8CZiY-M-mQQfI#@)bCVCr$f%b8-D`RNCJ"bk2!j9YjS3
)!f6$`R%fdYE13D[X+H40K[#MF(`6UGAI)BPIjFG(MrM`+$k8i+%J"&@ARDF,@[3
8#$Q9PT,+-0PCbpp1$G6KC-EZ94@IqTSAdFaHHShlrPl2*89`MkX1GJBlKkk+iNk
GND95G6R2pjjIqDNCafAqACJ$'m-RYpJ%0PKmKF9ZjD!lRT`ib*-b4f@%+Qj4V61
!CG@iNJ#k$b0"!fki(pElHhd&'+&*E)IG(9fdd%(8J%ad@X90*6V%1DPH-AjZb*L
"-XPHPQ4D+mMJF`DT$j!!r9D3!2e@JjZI`C@qf$cb&c$kHL-2KT1"V8eUNJ,)H[c
CT,J0@D&!'V(e(P6e2@bYKa`)0(F@@e$am4p4+0Y3q1bUjX6"ll-#SqkP01FRaG8
M&"FB9ar)ciaZX-V!!qANY$!@fi3rpAV5(qc(2k)*5b1(K1KkpUZQiJJlQS2,"%#
,QYKl!#qh`d9e6k`F$VUlBQAXTKXV`FZABc9JKj)+)bBM9BEGB@Qm06Z!ier'Rrh
iXiZ(22JPPbiCFZP&[M3UZ*e)bm[0k%l@XGKl'c6IK$m)-cU`!Cma@6ecakpjV"X
dMhdii,JMQLk!29hfh@9`9T)`T4V2-2mdBVNR!i!l%UYK0bUJ%fp"3I"NE"Z@#LG
D@JVB%k"EfGjaEQbV-P0EhJ[3-fXHr%'iL*I"Q,E6aEc+a9lf@!qfS4N"R#lM8)@
EM[)P),jF)Dih3BZcJ"F(!rIBqj2,53Q9%a--S2,hCrA336*lA3FeXe`S+A@!c-p
%`iBbd5!6+X+C8$JU[pB["'EB(+cDR1dhSSPIQ@mr0Y3+0@3P-Q-N9*!!!49N#"8
8U`*"i6#U%XelDK`R#rB0YkEPZJq(++,eZNZ9mB4XcE$c#SFjkiP8Vk(ZXUP)G*G
f8SlY`qm+Td)m8#mB*466qmD8dPe@(+3l,+2Z))2IJ&,*+PfL8CA"$kR46FYP55c
3DJEHfEa-miUd5X9P"%'*V[C3M29#jF9@&2*aU$FP!GSM'V)5I&-JD'k83,PAe$i
kqK-)G,9kGbB)eIS*rUa@rEUD$*j59(iAZJ*)fA5TlTS5h(E-+cEaeH*!0D&@Jmc
bIq+K,Z(SJQKDIXm'fI+ACf-Y`Zf3!!Y+8Edr`F1V`AUecK`(%@[4L4K#B$"35&a
F0q$!$UBhMpHr8*S$l)2MR2Q)$HPE$3d@pQdB@'L&3e#SF@$D2JVB"Sd%DJqea0C
cBU$"-YKB2hE),hfD[prh-l$*F-YCbF89DFKl3ZjS3plh'LGjB(a"5NdGS)pJV@)
(RZI%l3'B3BUh`QNVmIP)#i%#YUa*DKXTa$24V#!k5c$a0[me%"XTpjh4Q1hLC21
9)&,0B@lmcNe0p51G$+RZ)`G,9%Qi@'ka2'TMU"G-Aak,3[ma%Q[cK9pTK9Z'6@8
fG4QF!(k#5ZhN"SG`ebYAYcQRHUG@YK+TqANDU4&*$bBfi9F#G-!fKCbFb$"%h`B
ed!Chr9*e&@drJ1h(HA0S2Y4b*ST1cc#%cArF9q#Q!Kil2QhL6fHLa-6q0VC'6G(
d)8aP*+@SKBd*T6#MJpj3!ie3R&P5#cC5#lC6$ErV8paCem#a(3U531d,SQ0`1P&
QeG1+HYLBTKc%4Ar"&j@[Ni,B+03$#`A+`FBK[mb#LFaQ,EmjMJVX8K5%SCYa[q@
&&)A-r)i2+S'kq%!GTD5&k0ClU$-2CIc+-#b(93GSq'MU(,+58k*VKMDGYeT*GCL
N1P)+f2GCJ(dq![Xq*d,RRlSC`J3jDZ"dTQH!`Z-"J[YHb349Cd&6i$lHX!li14@
QdJVfVph4`H!H3YFG"`Ih)MjfNLf+f0Spi55"e0)q#-la8$'mNBma!"!$IdKZ23&
ff@8)GdFVU48r`IXA4A*IEQ*9GI9GqDRLNTG5!'ml%dS-FZ%N5!LX2K[!**+Fhm`
`SFa`8i#@2m[#ZVbbX1K2[S`Ch(r6X(!-#erjXbhm5Ufb8(%h*4Jk$F$)("c!d!5
!BE@Q!aL!`T5QAM6ib#LTNcBZ3JMEcJkDibr*F'`2#-2PM*m(eVJX1@61"2Xle$%
%[-G[6f3#r4fMfR0GMQi%Vce)KYjA%U24aZ1ccEQ!SiYIlrdVrG@bMZP2M-$K6RE
AcXih(Pq3!-(Vh0%EMdr,S+A!#K1*!$53!*KJK3Ne)B-h@Ch5i%ZRS1$,&8@&S@,
81#RlFRA-r`5'%FZ`'UC$Dj8M5j3$kj3$kh$J$[83&&Bj+KAAMf,fL#j#UM,kZZL
kZR[jEJY8khD`J"C+RfK3I@!Bj[LKi"l,5KQpJcDl`HJ!@Sm&P#C$1&3%2FT'Nrj
qMibZj3eL5p5J60P5&EDdPpe('`F@RX-N#E+amjL0+5SmUK"FU1A`d+e&GY(@JV3
e'c8Q!J0-`UX%DE&"Y'EEp8,qSX`&plic4(bKrSkF9YlYk0Vl$X3A1R`r!99!I*a
5jpGlhp&I08"mKG!9M5%0!NNJ`-JKJNNJ`)LYcfr%EiE"2Zr!YPb$Mc)XTP4TKe+
mF9'*U3Vb'%bK+VbSPDS5TDUX(PV)&F(SD4Rchr'aB5I4"qcU'&Gf$YAEF!FEQF&
'iSehX*&&)3T"2X@J*PKJpGpLYapHp1Mr[LJcrViTeCTQM+FA`Q3iTfI$MQiMhYL
pX*Gri"K3`N$Fc55RAaJZ9braKd5&3ZRQ-U4#`V%`JZUX6'ce1$ICTDfLb13lSMM
%9[A&[''hA8$cLN[GSqVMF**SF`Ff@-!JD$!EEX#l(HQe1+I+e!SH)#`ECc"ZcS+
`*rSM1*4K%X3NL%N!%`f6-#B"6$lq%EZ3!+%K"5BE'5M%8#hL8Z9$3c4b@,FU+DS
8QJYSB'UdR(eXIYNYc`48-pb`M&8BqZQ@clQLQci"fM-fm@"3[RL"!6mB,,DGG-F
f@!D(EV+Q`8PS20!`dF#!NC(2Z0cQpfeAi"TJ-YK9"HDaB16AIiHCCDF,#@TrV&+
(2q"HGeNN'3TqGC%G4H81JL)CJ$cYiQ'p@T@N-EN([pV*Jfbipaba'@%mA1p12@)
$D3,jfXU2h1-"qP)G%%&JHJ8F3C[eK'(eCMl-CfF9#00!#)F803"@$(G9RRil23i
a9"8Faeq9&m$B[H+1c$&BAqXG,dVpr#0h&J2b)4caM[FK)FShF"E%Db-SAKMG-hR
$J@6Y"@k)J5'rF0Mk8519eVLLMJYVT@L)0A&&'LNZ8!cjG`F0DpDHD[LMA3cHc39
i@+M$je"P&l-*1cX,5f$[Nll(S5D6[Uq4dUab2J'#$bMGL!pBIQaa@-#Q9CN-l6!
S8rN-TaXKk-Pj$%,hRR$rb3E'EBFYY&8AKq"YRBAmXhKBTK$qiEMeISBC21,Q1dK
i6MK`3B-r3D%KED%09N8d"@#Rc#G@BZ0McM`2`BAM(IV4[&Q2eSmIfVDGUM!"eLB
PB0rNjVi(D8d@+hAS'Pdi$SD)'@af-d'U!)'`4)8!*&H[%N#bViF*,EdDSmSfiq9
DmC+KZA"D3mM"3DiB9%Sr(MI@Qh&8-!2hP%SZEX2-@05H5EjSUh)dNXA9imTP,bU
Ae9mLX9'G8ekq0NRE5Ea%3i4U8hNjJdi&3Ab[,h-e!A4@A()AZlQVE@6h,a12Y9,
D1F3#3RH"D$%iB*h8IX"*k6!"MJPA9C%J6Up-SSKmI3r5#U@[ld%L4Ac3)UD&A-Q
aa%+ZPT'ijBV%HIZY0`TAP@eM',@0Ke`2"JXDD5N'MF0S%XS-B8TY*YM(0C0r1Lq
Y-`"a10L&#$l$l%[I!leaK,PS#*2MaB+C0-&-pX)m(QGeiQFeb8TYPI*UTG[jGpl
#Z,(FPrV0JeG@4)fjUq-I)B(1U38TRc6kM@A-pL+K#eDVjdP+-iH0qjPq6Mhc)%)
p,e,LZ&)NkGN9jY-e'0!4$+K["S&)VI%FrrpPGJhjp)q9)4mrp4YA*k8q!15RGrP
fjQdF9L8'2H5&EifMfYT-MPK"X*@E5rS`4+'4p!QJq8@eedJ+9F-GT+PckM)Rmk6
a(AE0m(ZRi'+4JKS"#iG2D&)M'K"0SR',Zj8RR#`MpdZN@pLK!@+jhXHT-DlSD56
'`(JMNDmCjpGrRN@R9$H(Y&Z3!!Y2Z"FBRh%pd"0I`KL+j,2h)KrLc`fhI$BIqI1
CGb0VIiPJY`R"8XUlP-3,4`6F&0(J6I9Jlre)6cr%(Ac,hEi("a&l'BZG54'fHkc
JpjaU#&rL4Ye(#Ii6DYMqbGpj-q0'kQ$#Mh3B[56mY56b%b4`$-"TIBN%AL@ki*G
A+-+H0FlV3c9kYaZpr`5"4pD3!-"4E&rq@N,JI1[6"IlP-!Qm"U"jM6[rGej[lqI
(i5J32RT$F"&RFqbGJAX"J0"H1"(dX+LUGY,JSQAFi&Sa$#N2F4MXc+06AG&92TU
U*%b%PdHqJ3V"V+`'15L8HA[[(Bkm4bD$@a#[&$D6Mk`b6*l)3h#eTK35IIjJjPP
R,j0GZ%5XQNb#C&9LHF[Naq,'AIac'fiJXXeYR%JZ5*J9,[DM@MBVhbJ5EcFM,HK
DB0M5!pAr!kHNEcm3c3S"8qlS%dB)NQC-N4&@#4(mU2lJ4NJ+5F"LbceaCcm4-iG
KFM13!)fImfK&$kRC8`fK@4$5&0J!"bI2AZddHJ@"iBC%22MRjLGKG2hV2mq*+Qi
%c`DRAkJ[l8,-!1'JH+'ARH44(A'KYA5K9c#BE#9h9e`)&Bem!aGb((-K'cTd2b@
e3mC0fB1KK([jXTNAZ#b$UC)'D5&h1%T3J0JrT%,P"*TJ!)*C@mA-fZ!!Skf*)ED
BJ3UY&N2CqN,%'Zd53p,b$lUJ&5+Y)dD+iFFkGdiiF@6khGHqEe1("d0k2(!2'qM
'!!-8d$16CTL("5Y9Ul"5ea0X9-e30ZT+4%eKD1*ZMmPXRD1$$%&Yl*MGVdqRmcb
S+c&06@#DjK5QU@53!%e#4aZm+6%%!pDK-%Y0#@DTpQ$-%KG'%3T$bc"VK'l!`pc
f##@1caZBa93qDr4jR3M&Bh93NCX!Hm"mdMVEcP6hTE2IqKF!p0e-bMaK0BAQPbR
kQ9"$4CcmDX%`"2+Q&3)d!Di*H-9#4cb#edeC6@'MUJEC+$6q60+J#P2%l*`Q&Uh
k)#aDYI-mZa##8D[f0&1$a6$FEk'D)K0#ZHZX',UHNpJ[hND5'6#a%B1'@MCb`Q%
03fDhHkbTGQ5"(d*+119*i6MK)MIUHU!3!K5&h8P1&5LF@"9ZQlP,TK8e!dPJiD1
V@3d&&fJ`fk5RQ)S5LRhGV#K)MmVN1Q94LY#L&+'ILP$M)[322&%aTbQX)*4,@e-
Kcd(c-FbJ09&JD3bKh-m-BHZ3!#%,1"cLVSd"D8p@A-8@hd%haED831Ydfi9-hM@
&`B46l)cXrU-2(#Z[ZQ-!@U'5hrc&iY9a"V`lR`QmqEVq`6G#B"32Y@,bB0%&#hI
'M""[2[(B(*5+Ih,qc3[m#81*4pq-iG-2#P+SHRSSMLB,%0e2UaKFJpTM044EP[G
Sci6HI,hK0#D"0fqN(D!0TSae&crr'aKN0ibPSrMcT`P@cH5"([L"Ef-iepJkA16
&`P831AER@3G'TrSh'+E@)LFVTUpF1M[c,"kkL$qAhE,qmaMFPYa)+,P`!QQTLl%
2!EVFQ1%"'cm,CrQ98"NAN!#kZS`%eh,2R(8H!lDFprS"KD0"`[SaIJ`-M@9Y#SN
F0)MleEA(&f,ViF6D-RhfGP&XMBmKHKSDfB1ZcS0CUFl%BfELX4!r"UF%ZK#''%S
FkYP*Ld&Jc![Z4`963G[F4Jr2XFYYV"@2Ei-k-e!Y%*F)6'01MRrN!EYXMZMU9Jb
6UkYE[*S43`PM`3P5jL%Q*kaJ%d-&mdYhiL85fml2*"EedBZ`)$4(,9ZT[rie1rG
TD3Z0Y)AKSaC'Kba-Zk!X59ZB1RDK2$4NBFUCD"*(VcF0H@fQ(AXKl9Ml8FGH'V,
32RJX$pfqI,ha'Ai4T5kSIc)bq*!!'(b%b9N"+@MiI-iAB9$FE$b9Mm$*`H9hY'r
SQ+lGd$'V'FRd`8GiB'L`KZm4-mcJ361aLSd)62,%!ViVLTZ'JPEJK2$LPCJbE,%
B2T@JqGKM2)"XC1Y["0-"&XG81[hLe@FddF9j3(%Q&!!G3PGLH,`HC+#%KJr"82$
$bb*C35`QYJX53J2ahT6Q#"SrJKQUm[jahjm+0aEZ$)S#KFUF+)2+K0)*ARYl#![
+&q6YLiZLLbibkl6Z*&a1-BQ8%lXRAM@lXm3)c[*"5I0YVaM'lB@1NVX%qlRZ6*r
#L!D[$4iR9lPG4&KGB2G5a"`EE`m*M)ikm)3B3"6X%LVXl8I!FAVY')D9ldG66LJ
[GSEPJc5aYGSAh0UF#)2@%AY2i)M,Dh(RD5XD!TAPj-+$kNGV1,#&D'l-j08F"bE
-4&IZdLXN,iKLNUrKU0J+9TaiQ)FRKU)ddi0@BACZ%deK+XN&YV*JUMe%90))b1B
2qKldYa1jDIIY63pLf!L*dHahBT!!H+KU2`m$,cEde4+#)H3[HIMcLBHI6(qB'C6
54A*TaZ96A5,B,,Kik2IrR2l9l$-9dU,mF`3!`34*@RQ9ADBLC`Al3)0iFbSe15S
J3[cM"K4f9*hkiT2,FPH0d0ZPQA%K"PlUd3GF'U2`"SDC-S8Kmi&HN`IC`(!E8dB
ShAK6QC%(K40&cZprC+6Z@Uj8fMSbHEL1Dqiq(PElVXA@iFaR!2ZfRAJf,jSSdC6
qD4#DQKb@dY413$42VCMDDGU+UC@Q"UDY0(9LDY!dJkQ6TMP--c60BTUMk6C-Xc4
Ga(3E65X`AD4T(Y-+QJjJQUIT1+B$0*h#G*bQ,NbRD0U,UBZQICMfdR3%cQIH6)#
D#mPre6+"JBjR"k5*2hEmXH*2+riB4Q!)H8k5'(h&[a*LG(j'BH5[Xe(J(bZiS+X
EABP@AdS-DF604,Ll(*KFVTY(N!#66+N#f!3`jIS,',p@Qrj#*qZV,deI)E+q&Rr
@-&RRd0*6M0XfhT!!1i,KiElic@EH",p#pql5&rr,YflrkZM&[PRH8M8hq'Y$pik
#j+k0KFJe)%8$iKTSkP(VrRLYbS6@0iH2"K+Kf`kfc"dlq$)Smb"#p3kNZ)UFHH(
+rl'E$*3KNMD[SpMjmlq)-`JqU'"VkE'Z%B)+ULemLHVVD",h$M-Ae8e,0!aQG4G
IVTU6`FhrFEEkHQb%,[mD[dBB[i"$km@KDmF%UmM$i-0T28%J5-%JDDi6#UABETb
4cPkP!AAGD"`$'LhfXI0RTFjJZLa%2+E@1`G$I*!!)`L,P4@Bb`Y3kJbKDYM-5#%
`9C(Pd8e1EchT[5G8,"5L`T*(+X4`2lkSijEbQGAN5i1INGj)'Vd1K%4mL8&QFX9
T6j`ZQ%SMFJG%S6M1FM&9Ab,Q5PE[C9H#S5RLUpBa-@4cA!`EJN4Zmq(l'I[@MX)
p9TI'3)k(!fY'+S@GP6&%$D@ccR,JiHMQ4aUkTXXDZQEC(ER(k&Cp4Lm2m,1X`lF
iUVQ0jbbF'R5E',*ZbJMU4D9XXj**"JVTMY3S"A95A,3!jZ[Cie,l!Lk$KUcFS#A
*!"5&16e'&aH$3@l2k@Q'Uq5dbPhcdVACiM3&bd!K('KK)"mb@9c[&e"E!3`%A#3
kTV80(EI&!fjkB#JMMhm'C&)CBPc,+BRbmF34*M%*MUeI`XK"lmVCaRBi!2Z0i1(
1iQYYjr6U+JI&`9VGNl-kf"JU*[1[dp9!D)%qr$XI$S*Qe`ND3fS`3a9"qI9-RJ0
i#[CFSqb@9)R%PmQ"Tc%2#"iLBXK`jYjMpf3BIj!!P(N-a3CRN!#`*d0Z8QaB*JC
hUZ!`MC-lkcBcV*14Mf(JITKDKqm8,CV!SZ44LaMHj8@IT#fD`++H)[14Md"#5!d
kkP%B'rY[-@-4ZhP9$"L*#JG@8CMjlk+kJFB4)[9[ILjpq#3a1+NZb2mF+XJ5AC!
!d4X-&C!!)%X83BE5"4Qp4!mF)mMSDb4)J%l4@5()k&6L#(Y#N!#Fd%VTJRbeXpJ
m9T!!d@B5C%S(%E82KJT5Zj%3C)N#aBL89Ne#Q1&AK6$0Si4TKaNf1GN%TJV2mIp
NDKN#IP0)h2C!11C-(Mpa%T4p$JEJ'4dUU2qmp+qrBN&9PUB*bJj"i4rUSQA0I#b
@aJqbP-cLUf9T5jYTU8C,VFT5qe&,33jTk3GT5kfm9"kLT6h+dZD$,,e05peT5hY
SD4-YE9@@@Sme5#`9fje,@pU+TAGTBHN,,rbIG-R0e@N,5l'`&("kLrJR4K,'(0D
0Z9ShCMDK*p1019T'aP`be*M&!#8&JZZ-B'+B4`(YE980B3k!G(Uf@llG$VEdkpJ
#"d%KmFM3`8HZ,M,Spf3R35fMc"SrH9d*NeV"l%Bpc3#%H!#UX,N-QSbJG4$F2(q
D3CMmj#N#ZeVGKJK52#bB)!8G'KeRlD-J4TiN&Vq5rc%Y@3pieqmk2aDrc1(F[",
1R8FcpP[6YFYZq9k$)i+fiCE204VXlBD#$a3&GpHl,%-k6*'cp`G3m$aN)MXTZ-l
R0UVaQAYcl9qiaqk$c'c5NGh6qr&3ThKS$X'Bi`+P(c8aH!TYEJh#Q,$(j"668h%
%"J2m33p&#0!*ddZNUc#FA!86#FmSGbh$"5GMHi*PecqCkCr`-b9BqDG5+!a0J@f
VG##""aR$ba#&b3!#Q6Pj+U3)3FSr*c&)q5'!,(,-J`&Icm"aK3VEFUUK0N0,lEc
`Q`1F$"'AUah&m3hr[*0HTr62rea1RcY%8%k,,26TPE42-cLQGdM9HSG8DiT"D#j
L'Zj-*!H6iKpL!P3Mi@c[ArrI1%5Ji90jdAFSj4BfiQ)S-iCMdZ#&)-(@eQBma)1
p!JJH`lmU`5Nk(,TqG("!0Rk`q+HfFm8pcpIcJ$R4FqbrFXRFmUB&`b*,NcqJH6&
F(j'@&#j,U8&JR2ra)fkiJSr(31C45c!QCE(*rpc*`9kcP46h(2dDA9(b2iI(cIj
L-6D5Plr1S6i$S4PP-CSQ5Dq@YM@)AeU21BD(58f*VJYS!!NbFM-ad8J%$B!*VTL
!1EFMhF50(dX''`1R$m-&!!!M'd&%3e)$!&IL$e80CN3#%#(LlP6[`8P1[0SVZCJ
V`qJR15mAJKa0VH05US$'R#FpVQ!TilVa&1j1M2cq&T!!8XI0R!%YBpfZ'MIMGM*
C0jY*%aX-BXE3@qYDif3F3qeTV10BQf%FkY"8$68(*D,`prpqlrIGGm$KQI6CCjp
jIJ!GCMiN%4![%!!3%!!385q9LEpSDX)ImD0A+*!!dQ%9$PbA,1b4[-EAP+`aC6H
q&NN-HY*%(BLQc$'cjC2P,j9CH`'FXb0&RmfI'"(YTNe@K")E&dF54hV!!N&Di'F
A1Q`H@0QiDk"-"+IX%'@[k@m'9MBYTS(ETXE0b*61Z'MV[Mf')Q+[lL5&IILd!Y1
Q3`L(@NA(eb-8,1SdjAlf'T!!#5$I!-*Z1Y&f,P,da53HD,pGHAl5TH[#Mc&Z#K@
pNfBfQqV%HA4`'8fD2A--J9X81d,2CSipGr@G00DT3qQN9cTj)SP)+6VeS*0KB&j
Ed16q4K0lHU2XkAEekGahdMTH%CfN$1[YGp)LLAe[Fa(S`Y"lQ$+$+qSpr%c(XXA
D$mF-"9fRiqG%*2&JR[90I',LR`AT!cp3iU*fA!+LY(%c"[CJiP&-E1-6pq"RGb6
4[S-qk"*k9[Y40d,"h6R#%eNUGHKFbDFQTPDc+j2UI2[lQjSB1X3@G(ND@k#E9XB
@10$*D@b"BhS2XJ9YiP@fS1e4%I5"q'@`H+bai'5rF-8MI,'%&+bEF+UPBrSS2QM
B2DB,lSFDV$I8BpXM5dq0G3!jAP4j2QQS'(r-A@NciQeTY0db+,XZY-mm-p5-!Sf
%&R-#r)QCXLFQh'25d6J$jE-&Y[Al9Hc)a+irB!L`p,F[l0rR@i)YH*NB3C)AT54
Rp29&kp+M5FQSLaBYqPC+0286jeU)cN[CD@F2jQ4S'I*+5dY*2TXFA56fIJ%2p9k
apNT"CYe*kc#1YFI3BKcAVS!*[B6%8!$-kE-1mm9f($)B3K@BCDH",lCNMQNK`aR
M'@FScM'KK1+)rE$C,C'%f13'Zp+8Q!IXAa6V-JTqiEb0,PcT51m'Dkq%%q@Bb8f
"GU"LEXlJ)U)`1!,'&Ic+P#2mf("%G'XKS)B4BV,6!9+58h1bG9Tk9MBq$k3RCkA
fDGRD-5hhE0fCP*`689&6+AcJB*BZ*re-0$8e+e8CLQEVNLmUBj+U+1LVK(PPDKX
e`[QJAG%&*jmh1dL&X@%VA,@N(2GB&DTU95ia,%&PX&KB#2$!MG144%'f9LMG`Ke
jGI`b!N"fI-50TVPAKB88%[G+ch9mRIiR05NXD[-3#"F("jj%Z(ahTA#!6*i1G`C
P+Q9)[k%&@h-XV645+-K$al!1!qd!mL4!eK@)LF-k4+#8Cpd%GF1!Kcmr+KdXCY$
'Y9T6lLm@+X1QT#-#ReZ*BH)MFKDUHH$i6)#Qh(Fqa35[!@U$%+LU"Z+L+AG1+6i
14)VQV'@++!lGISGASfD`cMXR6,Na%cjZiSU)dZ@2i(#51U(c,0la!E$C"[C8Kdh
(@G34Mll8e$6263q6UhKJH@"aGmZ,8*b`i)m$'Aj*C3'&!B,8cG"5-kZG)Z&9Jp0
k!XLNaP[jb&*LqpMEB2Y#c[B93$4,E1rV9GKHkRkYQ3+9PeD51a61L##BIp6)VT*
%b(b+#B8p**!!C4(V8e"f@8K!N!!lp12IIF(FTBAL3M5MBZ&#VKrA2&c)2I8,ZE@
AVT!!-L3HqSH(cCe@5mIA1F[8,5#J1862LGRS[$Sqf[%q'eL2$cV@3@)"%aIb@+V
#*04C#bNZLmYR8b"fNY$fpCe05STQCfK*@5PDeS&N,FZXTCl0eNAp&PR-1T0P2X0
R+5+Ej&1bLi5hQe`bAbZqPY'&T3HQ#kT!0c9+f8P9(6+L%3&3K`aJbCL6!ab(QVN
aC#i2D*2"J!63P)cPi1aD$A"@S'BX#FURP%(Qi!*LLekiZ@R`3d-,$rR3iJ&qh9C
TB43EQc2(-VSfe'jXMXk$SQNB"9&6EZ#l6V%cFE'$1$CcF(kI(N-iZak95d"1ieS
FdE6a+'!N`8mEr6m"N!!*SN"abia`eJpbKB*KRDcIGSHVD*f6pGY#USTipfZe"!j
"U,@1f)P!!@"+0)k-1K4e8iCFlT5@A%afXiRh8$MIl9BcSff82lA$Q4PYrG@HZKG
SRK*+aN#)CR,%bp[S`-)AP!00SdN&PPF8B!R5cB0TUkeGr"*"E%rLTS*-&@"b%9&
"CkLC1ZMD`3CH--%9'`"+4%'[G-$ZS4AhVYdP3P5kDYP(e#e65&1N*Fpq!eMLGHG
&&cP,''mUeI[YmDC5)M9dlGbNSPla0r`8`1+(I2K+@,"pF#m('kjfX&HUEA@ijPC
ap(`RiU,#c$F4EJNT"3aE0Nk0*KdmQakY#6QH01LSr`'jZ$`a3J,Jj'9@TIdQE*@
fbmmUEC9I9CS,iVJ'i!d'2LHh$#aIYTUUYaG0`NY!F"(#pJk8Z'5,#mTL8)J3,9#
`d0K(*rZ)X)papQ&J(hUBqS`ePCMU,-Lq,ejM6de9'jLJDJ@XY!E-YCX1$R"jL)X
SM!,+ml(pFl53!!S'XI--I*iL"Q3N0(8F*"+*Nc`-Q$-@b)hQCUAq4-[*eJC58k,
C1HR1U!k)`Vjk4QYQD8e5@DRb1dL&-$ccJY!ci2PTq0#cMbRf-8%I(6UU&(qI6m3
"9Ale%JLEBA5Q9L)R40,aI&GZ9j)hhj9e!G[Ej953!-qS+#Jf6DDJG8i&q6TY&46
6m1a@'""UZ['Nip[iaGZNLcI*,VE`LdX`BC!!A9b#RdUCiKYP&k2MCc[Si[c&3XX
5iQCe0B3!bV1bdhaIrJBBSF)k40N1G4R86rhSd*TlM!%fbaKJ)kXZ%jmT$"$MK86
R36E*$N)G"b8'!32F3#9A4bV0B@@Ll1L2YFX(Xp)rd-+3!2if'Da-LpEPT#46,5L
E@r98reJZ*cXR@Hb9b4V[bjc0(S$ITiRd0dJK!Bre1A'5''VdQ(X-aR2(-(!-aFI
l80#QSllZji6f9dX`U1'R$`9D0iUcRC'P)`*Ch!F6+T'd[h[Y0hHJN!$a$4(K*+2
H90I84)C0M6XK6"lkS0$%R6ZXB%V$Up'e[@-'24C*2*HC1BD+BIHf'CI"4)eEC%b
dPM+[%8cheGP5jM@#14YM-ZCFim`mhT%UJkh5aEHhFN,9+#fR5Sh#1p)N3V8Bc01
#ic1d$i6qDmef-9PVVSJIBYd54J'b3,42("(H'fUhHhCTSZ-6)(rf8A"a8p2N,8`
Xr-Y$68+D1MSGKjBH0[#(4G-%1aJT-k'pH@T-0FAbY3eCER5pD6rHHmAcTCPIF(a
Yq+RJ-kXIp2kKrBmkrh,V!Qe4piZ'ZFEhp3q02MGeHm3kmDY(IRlRpbIrl-Krk[Y
YrlH2l4mFk0Khk*-,ljSZKDlfI#Fbj[lQq15jEqAp+222crqr8rrhf62aXjI6-k*
QhF@F`amFc-h15[V[U5R*"p*qA2H6%hpap,qprFHZZkr@0YqlqIf@2lRedq[rjBI
ripV5kFr2q*m2r21drrU$Irh`lpllrr2rckIrqq0rI1hVVlbeq"Y[&#ejThKK`Db
Arf(MkrRI6Ib(EGrEr*mhr@EA4l[rrV'rfI(AfaqZr0fUA`5@VAKKhFmfr1hDIe[
cbcfrI[bI5[rPrPqeIQlR[jGpqHQ[V&qqmY'+Vflj,&CHq-@5PqBec*l6f#6*39B
DDV!$f9V'!9l!YJNhl*fYRHBjSe*Je4%D&AI!d$Fik%Ld[qdH5a2NU2B*AJa+@"-
+Dj+BEdR9(aD'U4ZKHm5f+,kZEEI8#@rRj-d&)*FBUb2F0,iBPG'S'1mjM*XZK1k
H'M0lZ0-'3M04i"iE!9*lNk0$SEYQaqeh1D#,8BGI$EV(%#+pN3m$cc4I2(Zm&XC
2VPcc#G'1Kl3ENrGJE**h'JpfZ-H-p1#3!1c"IFi(*`)JDILejX9T)R66,*UQR)$
YUr2C!XSBf5f4m%UBZQ%q6(Z11)XV$B&)iJm)2+f)5q'@KPDSY!r!)kL%($Qa4dA
kGZT1)Mj+a6B2!JNRN38R-C`2aPp,#`Kj1lTfbLBlN!"930&%3jGl$02k-0#(D5p
M@L@kffR!#A+mSZCJ1`eDE!G6M`IZ'Q''j,#N$K6I*GH1H69P3QS+'G3Q(Gr)+kb
0[-*Uq&3'E"B6X'QSM#5@Aj1!68-PIYk3!!'Ea8jJ`cYk1E""%980p$NL5ppGfG$
klPFXG[e99%DCXX0j)dXRA6rDG%Jm-bMZF"0Njm4JC#P#9f3U)ar'&$d&K5bb3@`
4caTX,`kK-+'E3H`0a$L1YbQ5H(3kI4"EM#6BS@Ri3`S"Vlj2fFSZ`103SfDV4U2
JQ9i8-r0!`)L1e$9I9UeZiqVD&NQX[mc8Y3dr(mZUe4dbGD(M9jlQkZ,Xm0!TKU$
-IS`YL&e@X!ABc6Z6,F#+$`BTM!jfj5CIf9R*fPQe5Y38X"(03)`b0ASfGfr!Bpr
i2LhpBM6pJj3$Z9TZ6NVZfH6dLlmP1Mm*e@l'fH5c@Nk+aLT[2dJi%-TV'1Rplf&
*lc)r5HqBAk6hI!$!5ZZ3!*'+q$b3!%j%q*8,)#%,L"6ZEZ'NpMlKB15c296V(M-
6LEDU"QQ%D[2Tpdbj$5f-p)0arjHfXNaFCd[k2@fN6!3"&T2),NCfJj!!i'4ATHc
bh3Vjph5(M2`,b"KNMbhjpqAYP,K!)EYak#!2VjKH[!K,B3mY*#2K%p(8,#dV&D5
BlQab6PT8Zhc!E)kQFUU+++81[SjQA-T'GNjbMT!!afkVc0",Br,FV8'%eA0hAem
pSkG$pZXTd``Y%!c+kKD*Z$rq+52ZHqXMlVNj-#IZ89%ilVHJ5JKZG&dHlMk-SF0
3eY#R)h-2NpVd3&'RDme@!C5G"mm34QD#lL""6fVL)Zl4@IjfX3JU34hR)8-B0Jp
cJlqEY#$h@&*62$L*"6f(#X[MF%JQd[)MGQSX511S%l*,1Q5AC#!"8M"4Qf(8KUl
GXe)icF1,q$C(e)X(-)@1b%0YI)1T@[(GU1A6NIK-9+#phFH(edkkc21k"l!&ccq
MqpTDHUaaJfE*"0&PFCTrjaB,595,[a419)YRqLHUaHeqLHU1qN69rXM!mK@Q*b1
U1f1fSRSmQBR6"PY4hAR8Ee&p6"(9RG2#L'UTVDMZe15L+KG4E#4iqU)kaL&[2E,
kq4"@qHe1DC82RkDiVM"9&pHZ@rk*+m64`B@e@DIA,0GUVF6UGPYfKq!kN!$8L)Z
[2-M+Mm'CTfN*U4K*Cbc1#V`HNE9cFAX94e'%&!iK%YUD"b2Qe21$T@Ym@Jphc(K
XMdC%@r`)Z5Kj*`4NiU2GKhR'qb'5mSe!H)a-$(mH9Jc[q#Q'Jhk*B3A%X)35IaK
Ci0KB@bF-9cYJYKeUeThA,,!`"8@03'p*NJmKhK)LH#")4E&@ATMV*B14qbf[Zq*
GdLFj6VJi&-8HjedXVdXQi#AhAFjVc!NN'TXY,*QhaTXpcI4%lR91TS(XKGRh9A*
+HEabGm)LU00L8618Za--HSY&DbYYJHQljp*[p'fcQYZD#GcU*hSX#jXA(E*Bp![
8+8M@TQGZ#A),'DBX&Qba@q[*E((miG+QlVD&Gp[ZdR5kXRZL8mab'F4NXrRq3ae
dNIk-M0dBZ2T#-4h$G*')rpM6%!&'C0!Rc"`-$,K`dHr35q'r'JkY#p6GS%j#`#D
)!TYAaaPeq1R--54G#[&(%N0,*-(k3LS6V2TGB)h@)3SP)aZDT)-qp5'U-jp5RD'
#kD8%!e,9C&49&))Jk$Vaai'JZJeBISUEqP"b*"QVpM"@rI1`V(VH6eBeqm1U$CU
YmQIHN5QrBQ$j#i1+mPmBp&[j2G6GS%j5P6q6&b`B%*&R3@qHP!9IUUJU#i4686`
M9%@ZPM-4"I0j'&pD&(*A"Hmi[&,@8CB4`aYN'C!!bM,JMm0QJ-[2$,MZ9`E819A
((4&Jq"Gf'9VQFRHY&XSFFfjI9I"@UC1N0-'9GQUXIT99!piH'I"Q5UM@a9%G[20
MJ4A@"IGq,1SN(F[HA0@a&Y4mq%NF6A*EVaX-llEQK#%(`TMJ'HA%)DC0)HQh(J'
,HkL!C+%32BK6FPAUHTpT2L,'DcIHLjEUKc5,-qN2Cj&TM%Aq-5b,[1BRLa6ia5)
lC*R"(,5ampKi!6PbhH'bSS"P49(Xh0iBK"1k5aIP#)Z`S0K[dBlVfXDA+Q!2"LZ
0NU$i&%IcIEKjKb6Q!$LF&bNU0r*NX3hNp#T[j`%AMbiT6B!J,*3'THf92c)1"CX
[)$M9`Gh[K!`bj%ae#'3M%PN@PEH&"*%jZTP1YaeGM8I[Fa1Q)Ce(Q45EIBSC+r%
$D9VSe*KaJ8`j9CLkP"raap4&d*'QR)cPi)aPbRdG3BAbQdEZ`#aR"LlP*cDkh'-
CAXQ-S$bC$@FEN!!3'H6f-3#`QE+J1(q`r#+kpI)*PrQ%K1LZH3'44H4%p0KP4cP
5ce(bk!K4Q09S3q-ZUc6SCLjF@S3-*M+HJ+YA)rGZq5%bNX&KKVNTQ5)@h*!!6!+
PjFF-,CQf4Ld`#D(+Ad0Qmd[bp!*L"IGqqNNbVH(2m#hV0,l&+KiC*h1!lC5&@Jm
U"350eSc5NPpcA9BYH&M@p$L6M",V5`aTC!*5ISUljrAND*F'ZSHQ8qC`ahIjHjQ
5@84#E1"NjT4c8SCQdk@SI"UjF2X&lck6$L&R+e+qRS%A#JR$`!6J-4lKahj[kF1
DrEkVY)AqApm5D'Pe'BPd@ihMHY4(L$66Fm2(UdZh9jq`p!d#Yh+P@cPB*-F+a0D
aX",%llA-PX`r@9KT,Y3ZkFp80`,@-m#(i`8"pS3[aVG9E"3*1"JZpe*4Z"KQ@aR
-`-#hKaI2@Td'"VkGFJ1$mXA8p-H+HdJF1,X!#VZF*bPXD@@pQp83$V"mVS@#!FX
fkHhD)925+C!!Q438p$e'Ph)`h+YrIV`fmcS!EZ%[FCLim%9ZBdT6$-&Z1jN'`pP
I-6@Xp5#*3da[[ppFHThqAhppE8YVF`LQ`HDfSljY))JcZ[EFh(McmMbBq(6aJhe
-$@X`Khf3!)SrfVZQT"jKI42&p3,e!%KQSGhiTNXrQ'42Z,#mU9N#YA6S4Fpl"!P
3S0Qj2'Hcc,0CCYSXcpXX6pNXRj8YhE8EVdH[afI+RqA9cdS8hbcjY4N'$8SN-Pp
5*#Q40Y)[6%Pf')22+H29b[G"B!eEhq3ERmj$il``B,LTK0h6SYbB%'imQ&!QfpS
#2"&6!+Z(J`%R8hDpU)%KjcNCNPHFQeR&qA$BLV25ciTcV9m9CePe8Z&Rr9@6#Pk
99+#L$#CeSbLcP8"DZRI")f5Z+A1E!'#G'SZ@b3Y8XXffXXeq0HaQYrLjf8Dr0PZ
L'2XKQDiR&Hk)d+[TlGMbZ8"aTaKR4E$HA`QIA45r'YeCMF56`'DL2'eJqCS%#)I
&h*66J4plH"+$GqA%ARP'955'+AGKVk51K3q'8mG#VhrU@'M`4afc[6)b%K9T4E*
#6TSZ@M"3EKKBrNZh9*5a1'MKEQ&,Hld&QL28DDlD'CpfUI"#em9Q5i4@qFDU#bp
1SYILF6,5!V8B8Z&5(jE#Gd1failY$09b3$E-`LA5Y+05T546p`46plI$U[ZBRqS
1qDAZ6(SBUVRP$$#L#JG"&BXlYd!"V2*YdU(&ZAV9I)FZ-E4`)L$%Tb6H0+Y,*)e
CiDeDaG*952"`Q%pq1h0X[m!#PHf@NSN&+X,-%$"hfp)iS9ERM5X9-J*)1[iY*,%
9E)&L*)`2d!J'L[MLda&8N@Mk"+jf%*YEeTeFF'j-Kc"RidTCQ21mBNU`$'6qR'R
lKjJa!CbK,hUj14b&1XrCQK-XSf3p@rH20-k6$YZeR3Hrb15d9b%mdXpQNdFU#iD
QQMRR)!pYAX!(6-!`GKT"c1qF6EF0DN)*MjqZ%U#!,@LUKbqXrI[aRr3(L28R&h#
eP-V8NUqS*I#KM9U3!)5rZde9bdCEY35i!4!PC'&U,j68cUpr[-Ee#"N(MURAPh#
$L-5LMpAVAjCGMmkrf-@8ALJTr3D40)NjaI8S24hafq4S0E9,Sdp%mH'cp)PI6SB
,XNc&"LdRH3!a@4%)5ai*"&5kjZ3#0U32lF[N,%h'h+TkHa5R`+T54Edm+)Q%%GS
&9Ed4@mI!UJa5,kY12089HM!VKEC,IY"U1bI8%pciHQAM5-ET3,"d9(LZi5"'3Fe
l(16*F8%mcXj+8e3ae-0"!lR+HC&R5bQBc1hCer4[A"RVCFT`+dk-hke6P8&ZM*@
4a))q94Q(E"dC[mXNC9"!GaN13Kq+3T!!caN5*HE8!3eq[P6!Jj!!-*[RBFLMNN+
8EEIP9G[f6NQdE$BmVQbiXVAkKVH'`QfimU*m`pc9S,,!Me0c)%V5RU80mk%RYZ%
YDQ@6m,Qj8IS&cU$e''G@GXSF@c"@@INKFciGXfAJKcrQQj!!'NVbb%hcE$PflqC
jeBr,+qXm9PQRKkfX-rbXV*2mUUcVP+#2YN5UQQY8`c2$NmJDEckUq&SHM%TN"%F
,U[4KBL*@[Dq@6d#cAQh+`!5CqQcLclYN&a`ejFk1NjY#ZUcT@6Fl2JDZ%a)Q9,N
,dA4Gdb%CkN0T'J,"Z3YI)3H4$2N'3lCKJFBRQM`+%UUBB+TSF@kEAe2RSl"bQd)
-Ldd$brG-XD35`IT*B1V!JV#2lB8%hXBbqUr$C[4f2c0kJemC2Ff'[2IbC%mmH3D
)LJ#12Td&Flff58'UEA#kXX%hQrHb`IYXJiq'h@#&RaZFlGF'Ae%25`DQGM,,aJH
#I-aTf5BEES2E33)-R5MfPr%ND4,+SU+1!,9+KV+VU(0![5a$1948%P!ri'`QS63
9G4dSP``eU+,!USeQLH%ibU@LN!#)Y,'(LjJ2$E1@-[Gm+h1dP0%(&$#rRUa#Dc8
UQ8cAp+P,HQj+AG+aYUT,1Vj$AG)ffp3Pe$%RTLkKYMNlH6#1#+-pM!LIU0G*YS@
jK%G&QGQ#+Vp9GIPibHAM)HGBlfAK-dlmYUdVdS!NZ"TD-mJ8Pm94mB!S&T9L*e,
cVNjU3S1@T3J%(CT,66'Ld99qTI$GiBR$YT-"Vdr2N@dUdXZ45cM5Nq4M9l5KQZY
d(Z+FLa$F!,J-U#1bicP4Ui!kjd5jRDLAJ8TbSP)GJEXUFKU3!0GP5%e&(JAU&4P
U8%9G"QUh%p9&#P+HUejj(9-UVlq2b`cRCFE*`QeEHHfQ`0"@+A18DL[P*lQAX`k
'XI$qcVN,hmR+L"lXkp0&r6$dGJCH14$81'(T3G#UPE*H'd,LY&&4+JqB%KZ(`0E
2bUX3CKE!-ldecIF-08PF"J1"8Zl#pTQli04[M6[iXXeXeiB#,K!8V4ZidFfFkmk
ZH(k(e%fhU30-!61%9PX$)dB1!@'QUQba+&@D9l3*kqB@f#@!9["-1)"@X0SrJ&E
3l4G!fe3MDDkI&6)UFXFLlTBlRDQU3GI`T#[9pbp[c4f3!%)q-'!HeLb6c6#Uk*5
CBb"3%DMGi**3)+YDjm+!5+jDQHT'Q1Tq'eCerAkUcZ5AkXTiSL#qD94CHa3R*Ii
%U5&G-QqKK$aShXlcZ4DVB)Nh&-1N06@)A!M1,K%Qi8lF9X"qdk)Nh&("(&6PG)r
@-")k$`ZPXG5-D#S6-pZ"dc%-fLTYPKN'6D1XcUc#a8H0I2ES!9`FU&`mF2,CZmQ
akTZmLkcfG*HK1-)AjTM6B8EK(1dKi3Qm*4`[BTS'9`fTFD!#!Hb(K'2C08)A[b@
#k5-GEi'd4iIZKp4Vfl@Rd"aQLp(&,rPAISAdb%kR5if(ZMbKfPaH$@jm49Kb9B'
8-G8jaP4R`c,9C6qC+YXITTTMNN*D[qjeKV6UFchrZVHUJ,,U2Npdc82R(L)Q`cR
1#Ff-ZeUV)V8iH908[Si4$H4'fL%rAVL&drQT9ZXdH4HVeS[+9e9TqP*#aKC8U'-
(f1QQ4Ta,@+'4KYDSfD@BC4590kT0"("#MBDPN!"#B4pVfTX@)qiaYS6j8k'H#Ti
5LTjK5d*CZ$2BUc0aTc-0G5)$(8l"i`NYbKM5XCH,1XhjDZ)%E2q8QM(+F489Xf-
q+cYbTXf4af92PGJm09MMb$e9(2R#ALkb2I)ZfC(ANh0EF9h`T"[Ni&h2,kQ3!)c
'bUN4pI@%+,bMAKjML"*T8GM,$Lc%BME8VENAVJ$!2m%5XFeQ8qKBUpR8fHV8S'k
+$5J61m0fpTMAmF3(8Z2S-A+$YMdQ1db'G"Mc9MD`ZXC"28KXFPlHC)HLKY$c4"+
cDa9&a'5+U*!!+D*#YLhE)hTee'cDE(8,20'dk3-+K4BHVYRG[+,MHF29c&Yc3h#
jhDV[B2cCSj0NVLFGi98%SLUF5EY&CSeNpR(&p5SPfQE2Tm&X!0AEA$H"&elN35L
l-'RmHEiJ`DB'(MAP%!H4&[$clI5MjQ5&kQ!fjIik,MA!8*K[1NJZDmN"8&KJ$'A
qp(ddp'(m+9@Pj2BZI)-VISq8)B@[%@Z6f6#C&r-1mhQ(Y8bpVb&4beDfq)(LP#q
F`BCqb-a"P-aSS36[jN#F&`AQV,G*l#dC%)GNrda#Sj)ef-!TA[#RE-Ph0TmJH&"
"ZmUfXpQC`GT9+5aJ2&-[Z'A'*Y6%"8rUcaQD'L#K)CC*TGKDR$,5kQ"CZ&Xf3@)
VKijFNJif+$(K&5NFAhKiFRU0#9jc`2B*q4&4rCeJ&HRh`eDN,Aj@T$2mUNL6@%@
DYTH+0-frLR4Afm$baiFTb6+)eE``eHQSdJR%8CicqI*(A98C66HY84)3m#B`,(c
+P&&3iQ!N!ckUA%E',9RC*haI,Z*%j3dC5CP(b`fZHJM,N!"#@,lq5KM#-Y1@X(a
p3L%XkCpd31)lPU3JA#,G#fG6NTp-3PfT-8$DGKSPejMU+1jA2LcX`miq21c$`6k
#l-2,2MVGYCjDER#m-BfE[-+-ST,)a@qkH22YpZ)Pe25b+-!%29a)51j+8mH,28)
GmY8BDUXa0&4Mb&*Mk%D0SDiD3fmU3c#q320[8G&d-4kXH6LiqA(`k%i-6(4F5r0
4dm#LT'Np6-JQU*2fmrlCJH,qfHqMk@qp-RLRAf"3216UYk"`bJHl$fQrkVF%5,'
(&VRklD-+iK-Jl!&5p#G!H+B8a!8J2!&5r!8J(#-+iPdJ(!(+L(H"#-*-CJ+Z$8+
"GB!-"LKc,J(TjFJ5KL`"dKZJ$#0N*prfqP`d4a[IbM['@-FB1[)YmBj3!-[@05a
ETja+dT1D*Q#5RpFpi4%[eREbJI(L(N9Ykc#3!+H4m4%kR%"6Gr`+0``U+6&T"a+
6GNZ*3f26P35Rj5ZF58CMC-3b6!pU0mE[i5($8m9(N!"1JDie6Z"`cIRd6$%PQPH
5PA)`0jq"ZD+`B'k*Rf!Zi4HBZfB,TVjh#L"SPapJDPG0-,8jIVTJD[20[B1TJ%X
1TJ+ZUX(8V$Er`&6"VG-$8j-(XhlmC-"83q[r'M$9d2SI0jKUD$dp-093pUF"6$@
8R4kB3R,S#P+%8@+6LIH6m1r"@0LRR5GBT%m26pT(R`lKB*p"RX#3!$kp`XXq1dA
RZeq"H#P2I-`Bja(+"QUdJC*kkp'%3d1&&@#10ap@K(ph"`018%M!)VU+0jTQi4d
#4T!!JkacB*3-)YP%rC!!m3E!QS2)5r2M018S*Bb'HF5MfG,6-'XeXH6i"%)TkIa
k!J39dh!P-S!pXCeIbam!S1iD[iN$'kKC#I9)`5JV82,VM9UAXlN)"NJIBi$dKE#
!G*fIJ,68,d#DAp-NE9RA`2*r5MDdr&jUYLkX-4TeNN"SS+6+!!SMc@A0PUdfMR-
MFM38aaZENM9F9VK(D[KYf8VKX5@QT@[3A"`lD-'f"8U5%RP6F8YXhBHm%6dP#Ca
(Gd*T1K*QY1fXkDpDAMcN$9,YYAKBCp[`Pel34XL)e-V0P3[d#b3c-RBNeR`9Ejk
6#N+@m-hA!8)I1*K-DG)eeKLPV2A**pCS9-&kaPB[K@@VHIkaeDbZUYNUG([@JfB
(1P*@hLI%V!FcaaLc"3!L(pahD&r1*pmEq0R!4`2I'Y`dm,9p(`kQ$Ajrm29p'`E
[$@B0*R9F(2blJG&p(hHNG(`mF&+`r`#3!bXE384$8J-!DEX393YNQ3"CEC2[eQk
8@TCQ$00EKVb-@ZUFfj!!a4L1`0Y0TGDaP@l)3NKDYlAGG0I6XqY6#)G9Gcd-Vir
0H3`B$M''L"M8"A91)Y+)0a(a"m-B%'*!"%')HRYbFc`lBZccrIr[fq[ETTY!cVP
rpc8G9MBN$a%3%!!3%!!3%#(Zhp8V8Bm(Ia69&(+NK"ACT5,IK)[F8U9XfXGFC"$
q-p4,VKN6'DE0NQ!L0LR%K&(4mZK`%-l"Qr6eKa4RI@c`6M%KTFdp#J6%020d0A$
#((2hUA5hA2*ikQdT+cbHZkDaQrmBTN'1&M*QqBIbT$M(`[SDaCHb3P%qSeZ[kGE
*EYd3$B6DY"M#,XiN+8jd!c!m!2k0h9k@BlGrGIVUp*bbID9TkIEm)qRD[GPF[+b
[ReXISk2X!K-P-PLMA1fHS0KN*pDYJR,k6mplKq#`(DG8K[2JYYEK9M`BjfQ0(PE
-I$PA-#UDNq*8!N+&VG(-P5IVbF9'KfU$80hU4UHPL4#TkSAeC[B5LMdl%-H2ZGj
kc&dl&G%4Sfd%r['`'dYTmQkP,Dr6@0D*(c0qE2MaiUFI2clm0%AX36XGpHA5M0)
+MKV!@@A(TXPG)iCqmMI9c6SJ5E3"C5Fd66Sih*9'#4d&$,`b3L,0Z`iS6X9*5"A
RUSC#c4c!A#&F+qcf)qQQG4[X)DfQ*bdh)dGE&XK*PEirp#Hl[6LYm%LaePkD'EB
r*)qrqV3pS64$KHpG$E6[$I8mAV`P`06(kLhZJe1IeD5%,BH%UHI#MIKc1AK`kVN
39,RA"FFm4h3NHXJppD6SETKqcIM"k91l,bkCfKh0A1k,2UFS4ij*bTGe0a!fP85
0&dbADpbFkAM1G"bBMJq0ePZ-'%i3hGlTec`*KT2!F")B4SMK,eEl-9a1$)1h4`M
4r`EIC`0$U,I"IA$YFjV+D1EDBTVfh(!dmc&kI)'86$FYJ%dZ+jZece%e`C5rmLP
IQUBmMmFY&8lj+jY5FLY0+6'ETUc(ipQ+TT6F+NdTj&11dj6$UaKC*@8djFp['8`
TP+Cm`kFmDjS#XNVd&8ljKNeCH6G0@GPLQJ+b9MC90'APhA`clZ$bKY$dj3eZ&lC
m1bmZ@9j(S1*U(k0Tlfl"akF)'0D2CbX[,PN6Sq2kIebqfI#M'T-l-jIAh4&9kYM
$QKJpL,K4cmD@3R3l#A%,BR9&9),Z1TFdC6-0`c)"!T'9CIpLI"a$3,"q2$2qiT+
e36UQrmFem``rUM%C*!3B1I5`0XM)@4[XLK`qC4i0!lJ#j'b(%p&-PIa0Zlf3!%6
,eAkLT@i("-lHE&-e-R8*La-!CS4#Xk$16h'"-L8+--LhbcHc@a,rH+`6[qdX9mb
GT4#S(G,(TrK(Tr((0E'L(jG[0[k)3@2Sq0m(+0F'jGXempLYa#C3G,NeBiUbAKZ
XJ)4jaKm"T#Ke2IlG$UqL",#bUJ%-3MkLFACXF@ahebJMUV--J69eEL8TMVmiK8j
T"1+BGb'14pcB)&64Lcb)rSLmS'YIBA&DZYBNqrk!p8S,lCV5BQeqVXDqAjD"GBA
P4e,Y1DP(5R25mGR1ZN%Q!JRKNA)PXJEZ*98,)q4)2PX`l''E80*bIdjr,U0`V&E
VkZMAbdHrHi2IdDprK8F[V*!!QX,(jqL6ABd(-r@d4B6PSZ9+NjmCB'6Xm)@LTCR
jZDCMe6h%9NV25G8HbC`mP1AZFM[Vl&#pdp#9jlUZ6GIQd05ai"RBAka`mbrAp3G
M!05'5EE-i[VdmV6pQ8FbRKYE2NJHm4#Mh)`bEDUQ1'hr@$)#3KC5&dU1i2UjU0S
"9'aG5JF#TB8f`H1"'ZCYaf+1@15!BSlr+6CefKXXXNKdhCcl#KDA$a(12e*i3(1
NY(KX'1dh-ESf,A[XBE(re9E1VZ["@#YRec`$KF@e8Dh*eY&`949V)Q+&0Yb++KE
EmU+Y1K*`f4k(M43V"-A#pP5l@(A9UX)KUU"BAE-TP3r"JMbqTAj8mA8mJNf5+,E
ac&P`%K6RUCGkYMUFkUABp[@Q95)dk1rF+Bk)cP3aDlI@1DRDdB+0`PMRLqd,%Pb
DaChU'a'bh,Mj*8a'L190fhZf#@clIr+)iLYVTpX3"J5MhP'!ieh(f4H8-jEka2U
B"-"p+4e"*4!ApT5i9,B%-!Me%CZ-,d@R(1LjVMqF(Xl0b4JV0HSK2@,(pKNIfiC
MQbGlE(2R#0*`ZMlfCKcFE$Uf!+CQ(0T@eN+6F@Jc2l$AG04+1QS51fTlF#4diHb
SdB(er-!mpF"elH&dPABX$mbV$DSIdLZ3!))iM9G$Q#MD!q'dp,(Kb&lm@82c5`d
0RheTB@e'CPUCYZLL"fM40-eBeIeLJhAq6-c+5P-RXhaALLfDj`h6[kA$[F1cA&4
9+d"hK*3F5A%fE&p#3+UJl,fZS2)f+IB(K')HPK#D"lGEPGY,Yr&FZ4Y'YlrVk,r
CFSZIBQpA2SqcpAJmISUpZMD+2CQZZfIrC"5lbXFfipKcb69J2ID0qTXNa6BGqhU
6FYYS%JjYhQkJfYZKf[b`81hi#pZ09AY6E94lBXC+V9@lDik2RfTh[HMBUABVG`J
!`DT1kXJ$`dR$P(ME18b)$ja,1XFFGHSPmmVjR`#p4VKRTJI6m+mkKlP"c$peE%#
LlmhdJBl&AX"3N!#-C'8V62%kQ!LYl%2'!RVJ`Gh,`5Mb+d96"pL8dR&@i@%8(i,
"BflY8IB45pTF-(9qj9+Nk@GJPc+J68kJe9Tme!jNpehQIl+Y),X[qp8%QD,mSFB
!C,bkq)2X6l8'f@3U5Uh9dJ"NTaM)M!&QS'#E*(!jkD%LF&Q"pAqK9QQ2PeVpNMB
dG+3#5%q$-&d8'YDC"led'cm-Cr%&Z)rAL`P",e,5G-TT6IR"FUA1ma6rFm+0V6T
91cB-RN*5!L8VF1F&A!X*P9ja,jm3ibQpLab+FYA"[Ci*iYjlbjA6RKq%N9,@AZh
j`4lA[@V2'dMcI!--*K#$SeXrMm2`,'`GM40lq2"*d["*I2KP$,q-iH1-KZm4%m3
!A%@RUmhh"MaAlXh`A2%mLA5E*bR*fDeScSSIim@2`SfFdBrfZ!jql-R`lKB6$JD
`T4[Jbec!Y!ZHCq!'Ri-29hZQB6ZNf[--Rc*YN`XE%Gl"CqJI$c(#e*8!P3A-rBh
YR99+SaJ2`%3m,r!r``$2-0,QI`R3rMI!H$m!pB*R$D9Q@&8#(9NI0l6lB'M(Ff$
pYf0%M+I$e*M&Lb"l[%6fH*!!IG'6#V,M1B(,3Gjb5X&$#RC&T29+MRNX$cIAJNM
m[8Gac#N5ZbPlA,HUPG2FXA''[hUC[hKjMdYddr)`*(rThBeA9h[HiJ0qc!(b&Kr
fB`i3!"k+NNmQThV*ZhZ`'Ebe%j9Th9*f5aX+5F1dJ4l0[$q2d2AchK!F&C+,ZJf
h2$fG(KGlD4"la-"05G`PLYYa!0Y@caKbQaji#`2JC,aI0"fdk@##*jZMFED%aTG
!j%ZTLIVG51%CaH&(068JC2Dej8U$jh9XmEdqa*f)f04U&ipK+ie5DE*0LMXLEe#
jpQQ+Fp2,ZkU(%`[@Ub4k*%'pe#TklP[kbNA2UbfHdaj(mFc5S,-EE4DP%5lB[Ke
,2De*&k"8VD48#$NV@H%1)Mak30'Cc,2qP!iIdL5KNKBFS4pK6(Z#5p@#Rl`%R[#
*,E(Y&m%)bHX`%-XkXE8AmCk*ZU*k8Mqik%k%A0MUSUfc&U4rE09H485SqLJeAM,
XEXl05#m[eH5-TE[1Nd9+3#JRCdAdU)'M)X[UU,!L-AQH#BNj3(UP&@QdkBLMY[2
*mkb6BEa@qRFa5@b",GC"k'CZ-5&jVjp$T1U(+Z)1B9ZVTcJ+F8`ET5@kIkT%90k
`Mi5%iJXfNTM3f-+HL)Zf"#'SaqZ!9"4qB!6l8MTd-X&'MTZ`9cm+SGET2J4ADj1
lVpM(JKM*h4Sc-6b1P%L)2S6HKjMMYFcVGT(i8eN(R3kE1EY6iNlD5VJ6&FedDcE
GfJDa@!5QrDkpLT-9JJ'`l!DQH0A"9@9$A%iD-3+Mea")`3U!9'2K`$DlZe9HpfL
'-C!!llG9Sh")[mD*Pa%1a&2ZdH)cIN!dRV#'",[5MiS6Sjq[A5V4dANB46)10q,
&f93clf,1L!F3L2e4-Emjl'Jj215`JMJ9l)GH81UGBQ)R&r21MIA+C&!bD-5f#QL
4@H@[U9BL6a1,T$L6Q#ie#&bUMU+a#eXQbHNII+2lqS0(dG&[eZ6"mDi-288GZ@,
6p%Xh*&bF52bfi@8qYJeZ8HR3f@`QFF"%%$Vr"EccAm"&NFFd[!k-+cf8%2+493d
`I+1N#*1-+NXM''bN4,jl-j6[H1EcU4X`5)qIUr$cGrbXNQlQ3``4%4XNYVD8$R5
6lq(R*Ykjhd6GJD3)*%M0+(b"Sc@q$Y0S[ZI[Y,e"+Fa&a#J(3106M2c'l%'i$E(
FPi0h)Zh!3L+F"YrXib6HaBfF4k'Nq%2TU5"q!86qA5%b&@D4d4!X9fbG1rr@@rN
LdM5S#eK8ReFrP`i%iQIKjLjqN!"%[f2mP`q19Dq6MS$Zi",)MjH1iA-85i+8*cV
m@f[B`ih'Mf")hJ85'q9Ahjh'dcQZ"a',1MkT0JrH@IqT62kP6IaP*a')p&pAL&`
3[m-3+N6Q0iJG$5RKfmNe`3Y2BS!1Kh*8Fa$f&`&JI`8%9SFSc@mf'Gi`*fe)Ki*
KqVIH&HpT[[3I6Q$rh&SPrYA3[9le1J&I+YpLLU3KYDNH6N!BKkUBj#KajX0K`,H
@FK2'NI-!,VmmHZNGT3G@@&+dX#'Z5d@FZV@L!eAYZ&c9D'109l3fTQL@M5EA66Z
j*1N4U0Gjk'8*VfMSD14`a%jT6"raD[C4NU5UPMB`G(Sf5kiP*j!!G!%r0i4E-1b
#TK+!hm`0efGKI'lfP!$d*IMiE$L'BX&)qNqe%1Y%*eMI`)hPKPdN`0a[,rAFJ-H
(-(@BLKbML1Q`BN2PHG[c(T(jq`c2Hai2VfV[JB`BVk`6+2$aUqCA5G8mb8MF9hZ
Z3P8I3#V!N!#mbFL2YS%IEB0mY+%5,2Ir2E-ikh&J%TD+q6k!RacTCTBN"XC*bhT
j"AS*2crMa2fXBM%`p"QBcr)m`)'R0`*H(hkZim$Vim$6Fq"0![$dR[%!hRKmR#3
"lcSMi&eR!,cV*1#j*1#jZ212`2D!",B()&l@i3M(CI9I[)m,`+X#FF9lVB!*+U5
5!-VCLLTqimRE,Al92LYK)0ci*A96XB`[ZAKDaL[a-SLQM5E40-HkJ!i,&(5p`1N
QjqejrN[)BNfhN`6E`4fHhh%8,C)+3FcK3SdA[2(mVYiQ)@L4(i,qka3*Z%p"CXh
AXQ$695MBRZA&80R58a"!hK@)B`H#8,V%dEI+#(h2ifFM4prc((fV12V'!(fVN!"
#6@R(5-k9d,I4#(dE$G#h88,IB3PpKdhSZdY#hefBGX*3H(P1'!Q[IEPM*lQbjC3
aCR#6b'!EpP"F[ZfaNX3&#Z9jhh8dq@pH-&9418QS'@eVA5UbX9CEmrm*Q4ceNPQ
$R@iN+AH4&-F"f83"6kh6mCk`LJJXXjN&Q46@hFB6"#A(RSlIk*!!e8cN!'Pb`'R
``@c`JF)Z*+3UCP0SFJm,6D3"FRKbMd&i-Yp+&V'%iPFFSQcf(rKlK#R'D6bZRSV
#dBR$A`T(rf6IZf2NS[,r4+Jj-AI$@)5DVZ1Q821G9cA8I,q+S@BYNN+q*k(QL('
S+D8d29kKjNLY3meABF[RF3JeIfF3DSiBKjS5%)dRE#S5DPBl'K"UE[F,0A9bU1Q
rjIHQkhXDH)kmSX$ceGiZQq)AH)j`JhL6aN`T06$06YSb2"k%R'HN'l1)&a!p9!b
GKC4K'-E[UkV4K@aL(fAK4)BB0b+[Sd#1-h4+Nbja)f8p*Uhh-e"l*5@CBK#'pN+
`YPd,eI,F`+GZ`D$94Q(SPc`%4B&CbF$CiKI!r48rrq5'`Mm0$&!Nf,1$0Sk$#IU
2b35L%N!Dpl!M0,iJKD)&KU%S*h0a"D(S$HJ5&XGA244G20&3p(SFiEKdP$11$(m
$L!MQ4P[[iab-eK8*4KZk#%E29NKLeq&SJF'%@SDMNdreNX24l8A$d4L4aX,0Vf&
@mBek(T!!0Sc5JkN581-"93p,*dZ239Jk)S@PNYSj'db"U6GH#N`EG*k&H(@@9cm
)3,q`G$f[H1Z66)TV@FV0mdfbH9iNjH%#GaQa-(8l%)+05L!e#mEk*XmDU%m-#f6
aSVq8r%"&M"BBQH`,H&Uje@c(kejXpVbYPlClM)*@&(hkb2-1(H'K$-mlRSAB1(N
("+E`L[d%PRM#6b6-Vc"NR5q&V"'rN!"e#crf&ZZaKeT4V6rah-HC6c-+@QG*35[
Gh#F*M@Pq3G&[m,1##id94B4'Zm4q$&lI&h8K8A)@"qrU,X(EKjpe8L",i&h0`6X
&i&hYH9d#la3Uh'N#lcSMm+iV!YjeIZ!e#'XISQ#D!$X,JQT4"8(YI!5ed3U#@Pr
&)U6afFQ%Y38'BDe9c&88eRDe4'#X!Y[&Y3jXccLUZa#6(aQ(YPi[4qYLSr#fMU2
ibbj4r$aeAe+`5bMqNU2iCD$i5mqE%STIaXqE*K6h'U'iY`L+Hre3E"$k!X@,23Z
[T6mR$)9N,F,HLDE$'i@p)ccXCGeiM5R`G6BBK,hE&4+4&2D5k'bS6GJlX9$%+1a
pi(X5pMk`B5*KlmJV#AYjQ-6#hRFHYl$hrDU([42GK$81HaI#U&JS(qADBXkq)4I
&$c4(#V8jFK'i`TcR`PVLBEI6K`V$,cp@ecr,#KFBXJ*4X&F,Xh-3KL1TTfZ149M
HXR9L,2G2R+9,$Ql30+-0D4I(`JY,A#L9I4R#lKj+3U!8"5VBVelbB6ie2XJ6&*C
aGpFFpC,lIaRfK&aZRfBaU[V,)CG"NX)FPU6!ELP"!G0i3aSpQ#UD[6GUN!!#mH%
8[J!@V1'&ccj2V8p%ZS,,P+lJJj!!mE,LG&4B2SK#1%J-QBdN"TFZ!HNL,YATX%8
rfQNj[[ZNDjYD3A0Uf`5SD+ALj%CH!@rZ3fE3YJhUbT0Yd2!H$kfSmDN,pG4%ci9
k(K+9E8GLc#LDY)53!(jhq[dlpbNNa#$-BpA[eRr+#J)CTij!3GHaY"')f`IGdkH
18l@%m%H0`Rik-aQUeL0%STcmAPk)UJ50(f4&8#`3"m#IcS06*p%Kd-J4#Z"0(5q
kNDM2#m$DPh%6!dIE48HVNBifM6Thdp(k)%TYBMYrpHE"c+N6d!e$U(YHjidZ)25
!m(fcUb4QIX3)#&V$6+%+$VQ+(9)A#rDCa(#KFAR82rh"P-Z!8TPGHjZNlkH2&*-
ZjU5PFKI8em@&XSlk[c-9E@A0E[%Qf%*"Vmjb1a@'5f4&XaB,*328ECGe"N0"K-)
hIB#NDb"A6'cV3i"VBH&e'5qL,MHEjBT$@`5P,fKIY31B5%9b'+UTHrV+,%dX0(h
PRN1C+rHXc!SHA*NP(JX')MY&5aC%2*,L,61(%ELE)f%c'UUK*Q5Y4BiMV-La9lh
NRfFL[%Y3,jRC&"N@Mp9iJaGe&`hCei"pCD+BQ296aDNp@jdBHKV-P2T2TH+qHYi
4jl%&hpCAQj%SpE%ZJ+,"`B3R&+I'+BiiKMUf"+1kR5Mqfmi+#NZL'%AK2Sr$YK%
DZKA2FD+2L3%UBKIj&a$Z0UR$AVZpYU*5"LB%H(ND5RQPSY4Z%6!@'"fd!'!XQ!J
BXiU!d3Bh&(IKMA5LH4%V#2eB!i3&rmFJI,mS#+[B493-5803VM)km#U!FYABJh,
R$AkJp'-08+lkR`c+r@-*bYSA)jqCC#e'[[,S+bp'2[-AeQ,N+l1V8)`mLaTITLB
38*Mk'Fe4fB%pq0E&*5ZRbDjY-L+$EYi*'$L`X3a2)m`B3b+8PZR#k@hNd1E&XCp
4B`&6X`@&a8I55EEDr8!Y&jTX*F!DGj,qUTDL4e([Q%ckqd%d(G6+8VGRjXX'5""
#2TSj-eqDFSDk#Z2M&5'l8bl`qHqC4`jSl9e6+$Fp5P8S+$8Q"j1T2p*6FU&-GdY
l2HqLpbD*lSi21XhcAU0r5erE1$aVprGG2LAqh0VeRmGT&r!N5ECaXEdX$GREGN-
*f80&1HKrjY4mU)'piD@+-iqN(c!LK6A`d)j$YUcF8"JjV2K!'%La-9,18R"SdIH
j8Ha%N`F52Y(1iP9$fMJ"!HQ&4c)UTU+,j4PaBdH%ULJ4rbS6NC'@8hXUH"1fAmI
"bA8QQ+DF@[Y*@A"IqhDRl9LMSR8f@"bmf(X[LVX[+liqbk`dI,r1a8Qi3G`C(mF
EV-eeGB+%R,6FF"J9[!*FX*@UZY$5L5f%k("b#d'm`@'R5e1mR@NS9,5q,1Ee49f
Rp6pCVedNMZM)$AF('1d[,G0Q9+JjKI6rIX9IA@R$JY39KP!rN!"eGZhk-YrYPP[
1`2R2K'NG3Lcpf[@"11eX)`AGKD8bMU5Q@J2D)NTD'#MND,KGJC1abGE6U*6ebm#
B8pc3B&CSbi#+9F2-0)F4U#PS4Vl#J4Cji((p-F@R9$JSchK3Nh*'mHCpLeYb`lB
lSlZMIkR'9KBeGFm@mLE5UdT&MfBm`d254kFm4Gq0cml*N!!NQNMrV-)"AU1M08b
'N@!dd#'4F8QC8X8TJY(!Xri$H92-,QPS$%aGE$"[jKNhEc*TTRQZ!J55NN$*R'4
@GJlINDDdd-2XNrc"V*MIK5+LX0H6LKN0VbqC@8E"rZ!fG0FlS"URMF0XL@XK&8(
VSX,QIeeXd($%D9SX-JcAVNePJaZ0'4F[)b#,UI+BUGY9J`[qMIbB9Xq@R$QS1+L
N2P45hGRfk'Md!bR"bN29e'Y4,rPM-EBp'j!!aYlBl`T409dJlZ31K-N*Jd,5HDT
G99hQNBNY8j%Sm&[Qd`BXSF05G4!+N3kiD2fl&AaZ`1G+-TXLMFmVUhHA1Cp[M#3
'TbTLC+T5QDUipi"6Gmh39`0KmaTA)9,pijXl3k'6lG03f1*aH!MXIRC!1mE4B[`
aY2[C2GUPhM`FIKi1Ic81RjCV`TqK+GDc0e6+4%Z)rN+qK#34mkNAi)K!C4Y`F"%
(EqSdilB5YlSDml`Vp'rTP4Z'C`e8*aU!SkPcUU+6`$('"!j&15FQK*V*%5Tq&Gq
"CY!HpdF1S(-1VrpR$U)j"#)cJHJdQ38CNiF3k8L)LrS!),AIZ(*4%S-8iSa"*6Z
+30%GL'09jmI'pGD3!29HrdTUa'LHHXQMPk[!U0$+L!Vl!ePQmIGCEF9j9&`5kEQ
m!B$Q6*bZe'TbPq*r!e&NTSG(U3J-#4ZGm@URVlCrV-h3TX*#Ui$m#YK%UXLQd"J
)e%`GDci,U3ENH(A#9E-9Phm)KDPal[YKSMVj0XYKUH%X9j,F"*&$&m9P,Tc-M4*
Nc@c0CFeX'EK4CNY&Rkb0Dqhh%kZ[IZ0DJ5lHb8%0JJ0b!G*@+"VeQm[F+@*#K,C
ah5)9*XD,VKa(iNlHH*KNk,ZqSTj(PI(UZ&5JkS3Cl[U8ZK$hB*[X()HjrlP9AH1
U!9b%+c-G8J-A204FV%M&GAa5ibkLR`iEJN4@K$QbLDYMc49kEAfh)*D#m"LZQQ0
dpL*VB#*D*ZiB4FMMlX%dIkFS%U6ZN9bLD*jUpQUV5a30keAUqVBG3aMXR$PX$6Z
hZ@'@1b2&#2C40%jPMM3RR8XBeE5DM,YpaJklUqZbYB8%l8"2YJNe9Kc3Ci**U!H
heJ!BfdRBI*!!3V%S(VUMcr('rD3`&)%QECVfDr*i),J!(fk8(Ql%``h5``eiq)I
dm!mmc*FHjZ2Klp,$hr&`PI4`&4kZN4kZ`F-mk@%H(Zk6(Zl$`bcTB4BH(T!!(Kk
SAG$qQ-mSD0HrmU$pXEZ0J[Ee%`RDFfQcN!$!Ule%E&IH,hriDPdJ,L9hi%Kq@QU
1SX$PFVpQZhYk`Hbd-`Ri)aiXQ$d6"H0@cKEK[%&$M2LBm5"2m*RJRVjL'C)!-PF
X5fNEa%0p2A-VKi**B0QR29`+MQ#jBJia@c&(2,KL$M%VQ#-c@c%R!ilY&IG`0[G
`0[FmH8p+EVIG,NfAc#-[8Z$l`aEA+"c9YPhB[YVA'R3(cJI1Na#XMi9Rpil#(FZ
GXI&KHL5(GVK96aYGcjUhNM#LP`NC9%b4'8j[$%)M$d"NCd#-j"EQd'+RpL&B%L[
VP3JQ2k(B)MRQV8%hA&EQMLdm25`hXM1lpChQ'SXZXD5l,"+")a`I6YCB#R$"'*e
Pl5FD'kU2DAK*YhDqD'RV6Je!c0Q3!+l#bBKIKHC)q!,E3#$)Ll(`0Mj'R5+EHTQ
4PjkEcqmB+'i'H6iB,Ne%42LlIfN@Gllp353D[ZX[EE[3i,*%p-JrpEmk9qPfce$
Y%d0hPT2j63kafhBUYMY$j16'V6Pb(XZfdl*IadH'63m2NXUJfD,cGf)3IQcK9M'
NE`XU@8mSjN,RYKlD(2XFi$[(##`Zc@$%+@IN-$1eG90(H'Kh4pLjqbG)[Z&%"8G
Zd[rUI1A1jGGTR-%R&G[b[fR-Jmf$B)V'Jj'UFeXT*a0rF'XM9hS5QZ@j`"E*cC!
!PZ&Q3$d3fqLDLNQii*Uifce9mD+T,HIZ0YcfUfaBZJf2@6iNQpbfflFe*IGNJJ4
%Beacjb@CJ0AeLZk&9Yfl'rV#3rSq1CJ,+XmlecG(G[lcVq'&HMJEFGNLLra5Td$
9mY#8akHb`U'*#c6YJ5f"Tr'+S6M-'bc9UFkLm8XEDcEM0JM4A34@0feFFiGLlQ8
6FHRKBNRK@mi!M%e33M(Xe(GSmQZf)58f%H64*Gaf!$6KP0cJMYpX#RrkPqC`+i&
lijj0VY&Q$'R@a!khEZPBX1I1[ZK@F@pPi)[hi25%d@%&XJkh)J6jE50dX4['6QE
EE#)R8jZUdYV4T()f3bj!j3@#qi(1jSL#p!*pj3iX1%-6BJ3`B[5lGc-bR(F#p2c
@$19FlU2N0qGZh!6M9i)Nh8qK!ZXd3i-RZNDq)6%CfX-jc#5$`'K&bQ$QLYE10['
VfhBScM[`!'A!(r'e3cY@Y$TLp+IcY6YfN!#*f#HT$c@q%L4h#*SMl4aCmBPQU2Q
pP8Y@Y'UF0&am8@AZE'B-"i(b`@Ca4p"1,T*ZN`*50`9"C-XE946[piG'2CjPLQd
8+B"+@4iZmG")&f%Lp'Y@SH1089)0R-dmf3NE49`a3QAXjRLUb0fLl29P@J"(h'r
2YeEf"LVd!`4rCq2S*PH`-4`SFC80C3IimI2SX)iB@qliXU5iB"61pVP-6*&`+i%
KNqmc,GZ,TJ2Q"Z!`1q6'a!D),HGD1[S#QB@9B-E!H#VFm6X$`qc&Ek4Z(!l`e,4
-HcDXVA"D@R%k*jNU92pAjeQ9`B866%+AL@VG6UM%#536Y$2"6"H2JrSd2qZ5Qmb
PG'i*3"2BM@BM&iKBqU8bl@3@2d@,L`M1)RFLb)8be#Z9e08me[5f2K+p-`$cT6e
T9'I"LlT1*dXLU94U&#Je8Pj&*,V!#(-prarc"m6%""FZP,1lX"b#p!2GHCJq6Th
leEN0p"9dDkFj@SaCKrTSb3+ApK(GH5)leFD5Cp9,9Qap'i9hB(`&!-kT5J2V'%l
Z,6eFN6MchDb$bbaEZBK$1ja*-%)+6ZDhLKCrKX&SdV!ZkQl6()mHrXi8H[AYCmE
)rabZ49aLcrfViFUS(XPdiR&F-X[Xi&fTTr8V&p+5lZR&aLH5Kfa3NRGP9hV5F2!
F0iIMG6#MU@%bdCddc"Lqj)mi6HPKECN9GCa`dC!!F(6j6EmkCdLq$Z4A4RF")*A
RX+&MeSM"H&*m96me,Lb4BU0210#F`41$-aJ*[cC8(MmLH+8fDr+SXZ,iadTFq6C
@-Aje$YX18MAlpM08-`cScZ5m*'Fa1@lJBVUH!5h)J*EJ$l5JSV0`YLhe%T'I$3D
)X84`NZ65lG1NDLPpJLS1`&(CF+P4VmI"jN49dQ$()b$#MHSlJ[6Z&TA8Q04R#d(
QQD%$#fp"-mX())@F)#N'9eL,LN6C#-bA06b3!-SpMbL&YhL*-c"aaJ&[[*6AV`R
,S@`2,3F@mqA#K'$#fQ,J6%JJ8cJHmBT$#AY3J6[EIfpV9"l@j,@[3P*X$!maM4-
2$iGHBd-d9h'A'l3AZDJj$"m3I4#"f[3Z'FBi`iFj`iFj`jJa`rqd-Xa*-f*("X0
YD**3LH#2L#3NRH,66i16"`P*q15$ScVhLThkZE!G#6dDEDU4`3R8-Q"mMNBkXZ$
fS@*pZii5)cJBScapVNCTUUF'k#kP`%3+$j93JKqDJdFBUB0D1S1iFBqUj+*-Z8L
`d+(*,amZ&QY4%M9HQ3PI*J5M8'%$Ve$mH+6-L#LIb8@)j5*)Tf[5QB-)aP5KA6f
+VN+'3pMF-L48)%,&Z85Q!ANq+hQQBbZbDPk@N5j64#5*"#Bk+P6YBBh0UN6Sp$f
i'"FQ)P8#VYK(jU)#0"DJQ%jiRaiT*JqDUCN866Y2RRqB@-J6`TB59qCf,ddb*bK
r011DL[1'DT6E&I0ZI+6A(!80!+rP@aFFSUI0[aFEf@3f8+(,m*TC8-#2X5l)Nf`
dH8M'dfPUF"NlPmCQAGVKC42j*jXa-3Q%4!!E@m)4Z'#pl2-jZafYLpR*cF!0!J$
"($f-KZKCGcAEMD6Y6(,E4JLFa!4+h',-5+li2eqF41k[h!%01"BbN!"#&(SjSZR
L"ITh#*`l65"fZNHYS#9Pdr#N)ZdT"M#%M%1TqcB4J&qN!MLUQf%qMUT1)F`ENX&
K+SE",pIV"cB4,MS*m8Pa-JT8&5%TMj!!1-[mYF)14XU)0'Y4dbN[mr0b!N0&Nif
"kZf6@Ce9`+c"E9(PK@-&VUS`iJp)kMFK"@hFq5(&9L&5USf3!0*[)Q5U-KI-kT@
j$M6PJK#@GcRfNB#%([!ZY#SmKB)b'AiU,`&8&TrB0UB+GbbP$GHp2%ULHI!NUUN
6$Fl%m3f+*PPd!ke19'5TX@$'TP[$jE44bMd@jS6pBM86`a991[C+VQ3*#T(&2M+
%fR"09kh0Z++`&emV6'5Cd0l#"XR6qD8dT)AJR*-D[-PI`iXR$@8VNd-BBm%B3P6
j'1VBjfi0PbTdc%4blTl'F6D9BTNGGBff)46+bi1i(d,9hDBmM-$ZMN2#&j9K6`d
kiIjY)"@S%,FT2[U!i#(5m4JFmpZ8ZSh$Q'c4iM*lCiDq(MJj)$E5N!"ZZbC(5cf
@)MXTmU2NT"L3!,kE4#b-+#YB!F3m!M9%Pl3m%iJbU$3kJm2lM!l[0i8,(Pa+8!*
H9+IFb,X8UXLU-KPThbUU*-EF4j8LcqC8,*Up-!Yp5+2aPF9`mBZkJUQ+Vp$-31T
SS*GYI9!e',T)db1aif[$%,VBK$'U(ARX84)@af!`l8-A48dJ4*(J!1-C$S"Q,Kk
mA4m$5FffAHL%C%5bc`!ZPCT5*&2+"K"lB4c@XiYYj'pJJ3i"QifVCi0XFQ8Vqa`
G0@m+NX`VE5BDp19Gc#Nb"rUC@AZfAVNl,-*-KUXdE+PjmGM!"PGPSXVfmS#i)r5
DGc4K3,-)RGPCd4)9"S915ij[jT0S1XYbhl"VGlHVa[R)&3b[%hFN[BB%c#Vr!G[
e,pbqSHpqQKicI9`8YQaaSG,'T-Al0)Z`3AUBLb,N"KFMC-h%%G58*V2J8"6Z-HT
#i38Y6E2$"M8jY[CaTaC8)c-[R&IL5Z1LKB)G5Mp5,rQLi@dp'C@k3'3Nh,K#VaS
DE!ihVY9MiCLQKDX8&cam5N`6Smd!FZI"'@a*1FQkEhSj!(Fi54-bpf$+62mLLZB
*'JNPERUSCYd),R*$c9MCh%*m('e[!r&44cXGiVYk(1)HFKTq%FeZ*%-3*NTKZ9D
+3G)SjjH,ABj`l33BC9L!UMKGL)%*a2TfS,ZI,k',Z&$Sj#6[PU8,&2-Jf'j(3e9
P9TjG-1@Xq'IP&'2&Lr1D',eKYqp2,B@PEq*%$6br)CZqTXqS1XiIRH)'EITckAE
*ULH6FFVY(*Ad@6,*kA-%33)A$H9Fi$U*EEJ"hU$%f@CHd+8"2cT(TAY2@XZ3!%l
j8%P%)#SUL3k[HdqacI6*Ub4f$MRb8N&`UNGXT'T"f4G@daH%fATGA@k,B22TkIe
3X-,`FiD6d#J!AJr6kd`8p&,iIaH%R[&A$3YIAIR2FkX(K%pQ,IMC!Q(,Sr5IfRh
AA8+UqMCebV([U`qTXj)[*#mAi[%cjQRe6jI1QL'N#LI96VAPXH5X+fUhm)C`6I)
cqYi[2K3bK,m,1A15e`SpDN8Hf+lqG(Ebe-[UR`Y6K'A*,bGrmq%h(`PKiBr55'(
Cdm+Xj-[*%i36kj+rQ5HX6,iXr#pq9J[Pdi6IMKH5a`XPR,D2Ir$JqDI(MAYkF-Z
9`EL"+pd$3N!S%cjqqYGA[K&q[5#j3qKEX--Mi&*abN2U(d`6hRrd8H&r(hhdihY
Q#+-cK1GR#*-H%jDH'1J@hTJKV&FApLa,[LdjIh#r-&Ypp0M"j1mNIcAiTYV@,*`
EI($DmVd6fS5r6#[TX3Yad`6DY"S[1!!5HlHkM,%9hRpVdD)[m#2m1eiFZ9#`iN,
"FRA+B*[`@h@Hm0)9B8!pmkRAe@ZZ##GAR4$1G3JG"6p8(def*,mP("EqCHPJBQp
b6R,cB&Rh0m,,dSK[IUM15IjPmT[#EiA8TB-e(bBA*JqS0h,+mM(1mF-RKHR#%R@
Mm%2K'Z(idbGA#"H&`Cl9VkZr&Ei8TJirqFePSHI#clU&eaHTAlc5*hamcB3([KR
6*rcN"m,&mGhMZfHF(bGd,jmf45KF1H2e'5H&Lr1&Mhrpia-[#4GI%ljpjMG#GSI
`c+rlIR5ZHmaj!*!$'!!!*)J!!&Hi!*!$#!#3!b!!!$mm!!HTm!#3!`TB`!"G`!!
!AF!!N!3Z399c-J#3"306C@Fb"h0PCfePER46C@Fc"h0PCfePER46C@Fd"h0PCfe
PER3!!"TZ!*!$!AB!6R&+JfBL3Hd!)#!m2c`!!#)mUI!!!8T"CJ4+3'F+5%")35#
!)8%!"%+R3IVrcY$m!3![##mm!!!CELm$B3!#V&52Cd"#1!TH3UF[2%4"9%%r2!6
9U"p`!4(!#Pj+RfFB6R%`2+P`TdC$qJ!U)SK"qJ!J-$bTF+C(5S0R"(!"6R91l3!
L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[rf5KpQ%NMRi1""q[rU80"1ZJ@Z60m("bm
krpj1G@"b38a"4%4$69!!!`#30&"b3@e)jf$`G&#I`Lp)!#!J6b*8-@N!&!!B)8!
!*$&m!!%!,0+4)8%!,U!#hm*-h`m'6R9+1!THC``J+J!)C``J3#!3C`B[1[q%6R9
)jam'3IVrRR!-)LS!"-+i!aTKT'B!!6j)H[q16VS(EPK2X(Vr@QB!!3kK'Li)##S
!3!!%C`BJH!+QS"XX+J!%+LS!#"JU!!5Ae*A8)$Vr9U%H2cJ#)'B!!1a86ba))$V
r4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IVr1##!5S9Q"+%LB!3J4D!RCJ!!Y#T))!j



3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S![#m95(Vr!LmkrZ)[1[lL,cVqbLmkrXS


[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#YJ"#"0S#-J6U!I)%HJ'c(I!L"JB#"1S"m
J4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%fJD3)!!"q!!5"0S'V9e0I83IVqGNU3!'F
)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8cIB2KJ!2kq2`!J6U!I)%HJ'c(I!L$9e0I
8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!!51F!1#KZ!!a(q[iU4IVq+L!8X**Y"#!
5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!%-$crf8cI(!"1ANje6PErb%MR(MJQ,J!
)+#i!$#KZ!"""q[fk,8Mre%)ZrmLK'Le)rma96kJF-"mk!!a&!!"[A%KZrq``"90
&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()
"(`'TQb"Zrr"+N!"R%&92,`LTTM!I5-"b"-#"Cm3[,[r`UD0J["!Z!"4R#PP2,VJ
#TL"IS"Xr2+$m6VS%KP42,8$rd%U!C`!"RLm!6VS$ePK25J"R#R!"(8!!&Nlk!KK
)E[rN5'lri%KZrpK1ZJ9U6qm!$#!Zrq#K(Le)rp`J#'F!!@3J,[rNS4iY52rS)!K
R!!&8,blrj#m)6VS&Z&"2)!0Q!!#Q@8m[2%024%9#CkJI)"mY32r`5S"R!!#1)%!
L8()Bdm%[#8kk",4B6h)$X%&QGL!0)%"`+0(!,8Mrp#*Zrr!N8A!BeF!Y5[ri,`T
1ZJ5k@%mY32rm)'lrm+!T8%SQE[r8*dS!+&P2,blrm%kk&F`J(h,Sd)&4J#G!!#a
96dKkrM)[,[rd5'lrr#m-,`3[,[rF,blri#mZrqK1ZJV'9%m[,[r`UD-NE[r8*@l
rd!!-*@lrh!!3*@lri!!8*@lrk!!B2cbKQ%kk!eC86bC!2cbSRdkk!dT86b)!)!Z
`J@B%F!"J!R!")!!P3!!F*83!)#9-!#4)H[[-2cbJr$mmS2a1ZJ,i9%mI!%kk&9)

r2+'B6VS$$&425S"R"(!"S*JJI!!!!9S`%%M!i)"b"V#"CJa"qJ#Z)R`!!!-m)SJ
GI!!"rmJJE[r-S"Y96kJF-"mk!!a&!!"[G%KZrq``"90&2`#S$e92,blrl+J0-"m
m!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()"(`'TQe92,blrm+QQ-"p



)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"96bm+UDB`(dM!FJ6!J@HU,`UTSf#N%#l
rb"e!!"C-haai6PiJAdr[!!j1d%j@rra)j`!`3Llrr$mmS2a1ZJ)X9%mN3%U!Ce`
[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cbJr$mmS2a1ZJ(H9%mI!%kk&$JJ5b"S!"#
J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD`J@B+F!!JI!!!!c`JJ"em!!(rr"!Zrra
-h``!6Pj1G8j@rqK)jami@8qTG5!I+J")E[rSU(3J$5"!)""bKY#",8$rr#"!A%K
$l[rX)YJLf&P2,ca%394"2c`%eDQJ)"mS3#"!*&!b+J!)NQS!"$`"0#S!"T4U!!)
q!MBZrr*)`cJZrqj)a*D%1!&)a*D%DJ*5Jq+$282rpMBZrr")`cJZrqa)a*D%1!*
)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrSb,[rddN)p3Iri@8p#TdKZrr4)HJ"QFJ%
I!A)"2`&brbm"3LG#TkN6)"mQ3#m!U(-'K3#3!hJ[$#",F"$4`#m)U2CC6kPe)"q

`K@3#B2496kPd%"pQ!Q$fF2mr!%*R)"qJ-Lm,U43[$+QM,blrk+Kc60mFq%jH6R8
!!J!!6PB!!%MR!$!NEJ!))!SQ3#"!)LJ!!Jb"38a"4'B@)LJ!"Jb"4%008'B+-#J
!#R)$X%&R"(!!B!*`!8cI$!"1ANje,`TC6cmmU'j`!4m!6VS5H#"I*%KC6cmmUQj
`!4m!6VS5CL*I)%Uab@B'-$`#!'!%-$`%!#4I6R919J!!,`-f,J!)-!0)`!+!!!!
)!%U!E`4`!@!#F!!Q(djH6R919[rm51FF!$BZ!!Jr!dkkrma86ae!rrab!E!"CK!
#3`Ir6VVrJ,"$EJ4`!'!S@8mr2+LIF!%I!%kk%I!J(bS!@8mr!amZrra1ZK(J)"m
S!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!i,J!)*'i!#L"+)"!Q3#"!-K!-38&%CLJ
b+!!#$%&$8QBH0J4brlC"CaSJ+!!%FKMLU!+!!*!$rc)$5-'`J@F%F!"J!R!"(8!


!$NcI$"K1AL"IA%p1d%j@!!"96dKZ!!K`rcm!6VVrNK!ICa)JEJ!))#J!"()BiUJ
#3!$rB!*`rdjH6R919J!!98p)EJ!)F2mr!%kkrf33(fF3)'i!##!S!!3#J!$rN!0


J!R$r6Pj1G8j@!!")jaJi*Qi!##KZ!!`J5c#m!`&`!#4-*)!Q2!!!!56ANJD5!!!


#5!D5!*!$)#Jm!*!$J0Q5fC)S2!!!"*!!fC,ANYQ5"T)!N!0m"T)!!)!!F!!NEJ!
3*)!'NJ#3!b3'NJ#3!b!'NJ#3!dJ'NJ#3!cj#3%cI("K1ANje6PErj%MR(cJQEJ!
)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R!,8crm(")fF!Y62rdF$lC`#!-N!#,X)9


M"R"P6[S!XN*!2J"#3$e!rq3f"h!NYN"N5(!%YN"N"(!!B!a`!$!$@B"U!PD!j)"
i!$J$,86rq0LZrqJN4"5!)#lrq0#!d+lrm#"!-+lrj(!"&"*b!")#if$4E[rN8NG
JX%*!2J"`!6`!0JG`(lC!C%4`!EC!C!4`!'!-F!!`!e1!DJ*5J1+!H!!i!be%rrc
BV[rX*%38J#!Zrrc3J0#Zrr3J3$#'F!%8%R)!%J,MB0a!8NGJY%*!60mFq%jH6R9
19[r`51FI1#4Z!!JQEJ!-1Li!%#KZ!"*#3$`!-J9`!$!"d)!d"R)!-J+`J@m83N!
d"R)!-J,5JG+-)%%`J&*'B0T#3$`!F!)p32rb0JDf4@3!!,K#3$i!3N!p32r`F!!
`!q@!d)SJ3#!3,8$rp$)'F!!`!G#,)%!B%(B!&J5f4f-!!))`,[rfFJ(!3G&Zrr"
`!$!$8i!d"h)!-J+`J@mq1#lrm(B!0J3Y3rrmeS2@M#"$5P"Q%L!Zrrc3J0#-)%!
`V[rb9'lrmM)Zrr"`!$!"d)$3M#"!-"!p32r`B"B`"G"!d%Bd,[r`FJ!b!Y+"dS`
J36#!8NFJ,[rdiSJY32rdB!$rE&*'B!$r4%cI(2K1ANje6PErr%MR($!NEJ!)0Li
!$#CZ!!ib!h!!-!(QJ$J!-!0b"m""1J"`!#e!rr`d"()!-J,5LL""%K"`!"!"0!9
b!$)#iU"b!F#"dDlrr#)ZrrcMLG+,)%%b%(!!-!%Y32rm8N8`"A))X%&Q"N*!1J"
54$)Z!"*`!$!"d)#`V[rmB`*JUK!Zrrm5,J!6dJ'3!!&-h``i6Pj1G8j@rra)jam
J*'i!#$JZ!!`k,J!1-J4`!$!"jS!m!$)%G!I#3Mi"GJ!f!0D+)%-3%(3!&!!Y3[r
mF!!`!63&FJ!b!Y#"jS"b!V#"C`ab!E#"Cb"+J'FdB$)d"R)!-J*8JG++)%%5%(!
!%!&b%11SJDlrr$3'FJ!b!P+"dSSJ34)3F!!3!H')JDlrr#!Zrr`d"h)!-J,LU#e
!rra`rh)J0J9d!$3$NS,LU-"Zrrj-h`6i6Pj1G8j@rpK)jami*Qi!##KZ!!iJ2!!
!!564VJ!5)$`!!!*)dDi!%L!Z!")Y32rXFL$6VJ!5)Li!%Le"rr!N2!#3!i$9VJ!
5*#i!%Le#rr3N5aJ5GJ!@"#e$rrMQJhS(aN953ce$rp`Q,[riiS0k!mC&9%-p3rr
QGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[rLH!(VC&0%286ri#SZrrKq!FU(C`Kk!$S
%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!5,`!r!e*+,`T1Z[mk6qm!$ZG!d@lrj#m
Z!")[,[r`2`-[,[rX6VS,#%r[!!i[,[rd2`-[,[rX,blrm%kkr+a2l`!13N!p32r










B-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkrBj2l`!-%J!J#R!
!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y1Z[h`8%mp32r
D-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*ZrpK`!$!"d)`J3%)3B!$rHM!ZrpU`E[r
JCJ!!P$!Zrq*R1L4!2blrk#mZrr3r,[rN,`Y1Z[d'6qm!$")!)!T`!"!"28$rfR3
!0!$8V[rX)%)3%()!%J$6E[rNB"`r,[rQ2blrj#m,6VVpD&"228$rfM!ZrqE4E[r
N9QlrfM!ZrpT6E[rD5N"R!2m!1#lrf(B!0J3Y3rrm8i2@M#"$%"!L,[rmdS`J34#
!8Qlrf'$1%#lrhG!ZrpXd,[rB8Qlrf()!-J,5M#""%)"J!2kq-Llrj(!!-!&HJ1D

!60mFq%jH6R919[q-51FI1#CZ!!JU,J!-+'i!%#`Z!"3Y5rr)F#6A`#e,rq"`)0I
!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0HZrj3J2!!!!NM4V[q8F#$4V[q8+$`!N!1
!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDlrP#eZrj6rZ0HZrj3YE[q8rlcCV[q8,@l
rP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDlrP#!Zrj53!)b`K@-+F'8p3!!S6[S'HR!
!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#eZrk6rN!!YI!!!J!$rk%KZrqJ[,[qN)'i
!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e
)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLi
NE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S
&`#"Zrj!!8UlrN!!3%"e!rk"b!")!dN&636e"rp!`,[r3d%!p32r5)'i!(#!3d+i
!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%kkqr*2l`!1-J!J#R!!-!(4V[q3!#m-,bl
rY$mm!53[,[qi6VS(ZNr[!!i[,[qm2c`"*#mZrlJ[,[qd6VVjA%r[!!iN3#m-,bl
rZ$mZrp![,[q3!%kkqk"2l`!1-J!J#R!!-!(4V[q3!#m-,blrY$mZrp![,[qi6VS
(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VVj#Nr[!!j`!#i!3N!p32q-,@i!)2qX)'l
rV,(Zrl"N!!5S3N!p32qB$'i#52qBC!!!`M!ZriaQ!!#-*'lrN!"55VAZrkKMD#"
Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!
!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[r
dC!T`Cce!!#K1qJ4#)'lrN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)
ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+),J"6E[q-B!$r1!4Z!NMrQ!aZ!3$rQ'3
3)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$JZrjKf!$B%,82rq0D$eUlrc#"$-"!p32q
D)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkK
MD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"
Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#
`V[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q3!")3F!!3!63Zriab!$)#ikL1J&"Zria
J!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrQL!(jUJZ!*PZria#3$e!rjJ`,[qBX'l
rdQ3!!-)`,[q-CJ!!M#4Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(
Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLiNE[qNeHlrl#e
+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S#@#"Zrj!!8Ul
rN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&ZrjJb,[qBF!!`!G#!d+lre#"!-"!p32q



B)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$JZrjKf!$B%,82rr0D$eUlrj#"$-"!p32q
H)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkK
MD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"
Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#
`V[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q3!")3F!!3!63Zriab!$)#ikL1J&"Zria







J!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrRL!(jUJZ!*PZri`JE[qX-LlrRR!!-!'
4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'lrV&+Zrk`3J#"Zrj45V[q8%"!JE[qX8Ul
rV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!`,[qD8flrQNT!C`$lhL"Zrj45V[q8%"!
JE[qX8UlrV"#!B0a@E[qD)'i!'0('-LlrRR!!-!%LE[qXNqi!)*!!LC(!,8MrP$!
ZrjTR*L"Z!"M4aV(Zrj4M'L"Zrj45V[q8%"!JE[qX8UlrV"#!8flrQQ$8,@i!)2q

8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!3)'lrV&+Zrk`3J'$F)'lrV,(Zrl"R#("
R28!!+'!8)'lrV*(Z!#!LEJ!F)SK#3$e!!#K-haci6PiJAdr[!#"1d!"`2!!q)!!
!H#!q-#!Q*L"i)$`p-c)!!$T$Efe`FQ9cFfP[EMT%C@0[EA"bCA0cD@pZ-$-`-5j
M!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4PBfpYF(*PFh0
TEfi`-c!a,Q-!!%j@rqK)jami2Li!##KZ!!`f,J!+F!!`!cJ(FJ!b"*!!JA)"X)&


[!!'d286rk$e$rqT5E[rS-#lrk,"Z!!TN(()!-J$5M#""%"!d"h)!-J,5M#""%K#
`!@3#B0C6E[rU-#lrkV"(Baab!$)!dS`J34!30!Gb!$)#dS`J34)3X!&M!Q$B-#l
rk,"ZrqTP!Q"b1#lrk(B!0J3Y3rr`eS`N3a)5F!!3!6e!rq`k,[rUH!!i"5e%rr6
BM#C%%"-8J"DZrqdJ,[r`d)$3VJ!3)%!`%$e!rq`L,[rddS(5VJ!3)%%b%#3Zrr$
8JY5Z!"!J3M#")Llrp0+"dUi!%#""-)"J!2mb-#lrkV"(CJC54f!!r`3i"hB!0J3
Y3rrieS`N3a)5F!!3!6e!rq`m,[rUHJ!k"Le&rrcDM#C&%"-8J"DZrqdJ,[rid)$





3VJ!3)%!`%$e!rq`L,[rmdS(5VJ!3)%%b%#3ZrrM8JY5Z!"!J3M#")Llrr0+"dUi
!%#""-)!J,[rm)Llrq*!!J63Z!!Tb!$)#*#lrr&+#NS+`J@`H,bi!%#m-2`Br"%k
krPa2l`!--#lrkP*!2J"J!2jF,bi!%#m-2bi!#M!ZrqT53$m!6VVq0Nr[!!`pE[r

U!!TJ!2ii60mFq%jH6R919[rN51FI1#4Z!!Jk,J!-*Qi!$LKZ!")Y62r`)$`!!!%
NfF!Y62rd3N!m!$B'YN9N,(J!1!-Y42rif)SJ4"!3)Llrq0+Zrr!J34#!)#lrq0#
!d+lrp#"!-)054Q$1,blrp#mZrr!r"8*R6VVpXNr[!!a#3$`!0JDf4@35F!!`!p#



Zrr!J3%S3CJ454Q$SF!!Y32rN0JDf4@3!!+K+3fFb)#lrj(J!1!-Y42rmf+lrm#"

%&""b!")#*Llrr&1$eUlrm#"$&K"d!"3$NS,MU#e!rq3d"R)!-J,5V[r`)%%5%(!
!%!%q!#eZrq6rl(!!,8$rk$!(8dG+3'FJ)#lrk11))Llrl(3"`S+!J5e!rqJJ,[r
XiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)3F!!`!H@!d)XJ3##ZrqK54P+Zrq4J!2p
860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*I%Km`(dS"C`5R4Q!#SdBZL%l4)Pm5(c!


I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!&!*!'!3!!!Bp*!!'153!!"'`"'h`i"$B
!N!-F!p)!&%4*9%`!$3#U38a59!!+!9*69&)J!!%"eP"cCA3!!!(Z4%a24`!#!IT
69&)M!!!#(P"*3e3!!!)UGQ9bF`!"!MCMD@0Z!!!#6NP$6di!!!*D5801)`!%!QC
'8N9'!!3#SN*14%`!!3,H399c-J!!![CKGA0d!!%$!QPME$J!!!-D3dp%43!(!bC
%394"!!!$KP0*@N8!!!15DfPZC!!!!jj'C@&d!!!$UJ3"rrmJ!*!)KIrr*!!!J!%
6ZY3!Krrr!*!$eJ#3"BErrb3!!5B"("1J!)$rr`!!!DF!N!@errmJ!!)&!*!&J[r



r!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!$!3#3"!)!rrm!!!2C!*!%!J(rr`!!""F
!N!3%5`!S"!!5i!%6ZX!%Vrrr!!!6-!#3"!%(!$3J!"0Z!*!%"!(rrb!!"'-!N!@
#rrmJ!!4c!*!&KIrr*!!%J`%6ZX`!Krrr)!!%N`#3"BErrb3!"+-"%lSS!)$rrb!
!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#3"!)!rrmJ!!6P!*!%!J(rrb!!"28!N!3
%Vrrr!!!8(!#3"!)!N!-J!!8&!*!%!J%!"b!!"48!N!@!rrm!!!8K!*!%!qMrrb!
!#9J!N!3%5`!3"!!4#J%F%U!""`!F)!!4)`#3"B$rr`!!#A3!N!3$k2rr!!!*Y!#
3"3,rrb!!%0S!N!8"rrmJ!"$i!*!%"%[rr`3!%6m"%lVm"%[rr`3!%Q8"'c1B!)$
rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!!@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!
&J2rr!!!C3!#3"B(rr`!!'8X!N!@#rrm!!"P@!*!&Jrrr!!!CB3#3"B6rr`!!'@`
!N!3"!2rr!!!CG`#3"B$rr`!!'CF!N!G!!!!Cc`#3"B6rr`!!'I-!N!G2!!!Cp`#
3"B6rr`!!'P)!N!8"!&iF!"j@!4Ym9!!#!'JF!*!!(`%6ZHJ!!`"b(!#X0!%F%NJ
!"!"m(!$cSJ%E-iJ!"3#'(!%P,`%5mj`!"J#3!"`"5%i"($M8!!$rrbJ"Ffd!N!8
(rrm!!A2*!*!'rrmS!'!B!*!%rj!%!!&cL3#3"B$rr`!"FjF!N!Err`!"MMX!N!3


'F(*[EA"d#-3JFh9QCQPi#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"
%DA0V#d9iDA0dD@jR)&"A$NphEQ9b)(*PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90
PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9ZG#!c#90PCfePER3J03P6C@GYC@jd)$B
*8f9RE@9ZG#!f8%3:
Changes to mac/tclMacResource.r.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1993-94 Lockheed Missle & Space Company
 * Copyright (c) 1994-97 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacResource.r,v 1.4 1999/08/16 00:09:30 jingham Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1993-94 Lockheed Missle & Space Company
 * Copyright (c) 1994-97 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacResource.r,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include <Types.r>
#include <SysTypes.r>

/*
 * The folowing include and defines help construct
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

#if (TCL_RELEASE_LEVEL == 2)
#   define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
#else
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif

resource 'vers' (1) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham © Scriptics Inc."
};

resource 'vers' (2) {
	TCL_MAJOR_VERSION, MINOR_VERSION,
	RELEASE_LEVEL, 0x00, verUS,
	TCL_PATCH_LEVEL,
	"Simple Tcl Shell " TCL_PATCH_LEVEL " © 1996 - 1999"
};


/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use
 * Tcl to define the behavior of the application without having to
 * require some predetermined file structure - all needed Tcl "files"







<
<
<
<
<
<
<
<
<
<
<
<
<
<







36
37
38
39
40
41
42














43
44
45
46
47
48
49

#if (TCL_RELEASE_LEVEL == 2)
#   define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
#else
#   define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif
















/* 
 * The mechanisim below loads Tcl source into the resource fork of the
 * application.  The example below creates a TEXT resource named
 * "Init" from the file "init.tcl".  This allows applications to use
 * Tcl to define the behavior of the application without having to
 * require some predetermined file structure - all needed Tcl "files"
79
80
81
82
83
84
85


86
87

88
89
90
















 * documentation for futher information about the env variable.
 *
 * A good example of something you may want to set is: "TCL_LIBRARY=My
 * disk:etc."
 */
 
resource 'STR#' (128, "Tcl Environment Variables") {


	{	"SCHEDULE_NAME=Agent Controller Schedule",
		"SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"

	};
};
























>
>
|

>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 * documentation for futher information about the env variable.
 *
 * A good example of something you may want to set is: "TCL_LIBRARY=My
 * disk:etc."
 */
 
resource 'STR#' (128, "Tcl Environment Variables") {
	{	
		/*		
		"SCHEDULE_NAME=Agent Controller Schedule",
		"SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"
		*/
	};
};

data 'alis' (1000, "Library Folder") {
	$"0000 0000 00BA 0002 0001 012F 0000 0000"            /* .....†...../.... */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0000 0000 985C FB00 4244 0000 0000"            /* ......ò\š.BD.... */
	$"0002 1328 5375 7070 6F72 7420 4C69 6272"            /* ...(Support Libr */
	$"6172 6965 7329 0000 0000 0000 0000 0000"            /* aries).......... */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
	$"0000 0076 8504 B617 A796 003D 0027 025B"            /* ...vÖ..ßñ.=.'.[ */
	$"01E4 0001 0001 0000 0000 0000 0000 0000"            /* .”.............. */
	$"0000 0000 0000 0000 0001 2F00 0002 0015"            /* ........../..... */
	$"2F3A 2853 7570 706F 7274 204C 6962 7261"            /* /:(Support Libra */
	$"7269 6573 2900 FFFF 0000"                           /* ries)... */
};


Deleted mac/tclMacShLib.exp.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
AddrToName
AddrToStr
BuildAFPVolMountInfo
BumpDate
ChangeCreatorType
ChangeFDFlags
CheckObjectLock
CheckVolLock
ClearHasBeenInited
ClearHasCustomIcon
ClearIsInvisible
ClearIsStationery
ClearNameLocked
CloseResolver
ConfigureMemory
CopyDirectoryAccess
CopyFileMgrAttributes
CopyFork
CreateFileIDRef
DTCopyComment
DTGetIcon
DTOpen
DTSetComment
DeleteDirectory
DeleteDirectoryContents
DeleteFileIDRef
DetermineVRefNum
DirectoryCopy
EnumCache
##EnvStr
ExchangeFiles
FSMakeFSSpecCompat
FSReadNoCache
FSWriteNoCache
FSWriteVerify
FSpBumpDate
FSpCatMoveCompat
FSpChangeCreatorType
FSpChangeFDFlags
FSpCheckObjectLock
FSpClearHasBeenInited
FSpClearHasCustomIcon
FSpClearIsInvisible
FSpClearIsStationery
FSpClearNameLocked
FSpCopyDirectoryAccess
FSpCopyFile
FSpCopyFileMgrAttributes
FSpCreateCompat
FSpCreateFileIDRef
FSpCreateMinimum
FSpCreateResFileCompat
FSpDTCopyComment
FSpDTSetComment
FSpDeleteCompat
FSpDirCreateCompat
FSpDirectoryCopy
FSpExchangeFilesCompat
FSpFileCopy
FSpFilteredDirectoryCopy
FSpFindFolder
FSpGetDInfo
FSpGetDefaultDir
FSpGetDirAccess
FSpGetDirectoryID
FSpGetFInfoCompat
FSpGetFLockCompat
FSpGetFileLocation
FSpGetFileSize
FSpGetForeignPrivs
FSpGetFullPath
FSpGetIOACUser
FSpLocationFromFullPath
FSpLocationFromPath
FSpMoveRename
FSpMoveRenameCompat
FSpOpenAware
FSpOpenDFCompat
FSpOpenRFAware
FSpOpenRFCompat
FSpOpenResFileCompat
FSpPathFromLocation
FSpRenameCompat
FSpResolveFileIDRef
FSpRstFLockCompat
FSpSetDInfo
FSpSetDefaultDir
FSpSetDirAccess
FSpSetFInfoCompat
FSpSetFLockCompat
FSpSetForeignPrivs
FSpSetHasCustomIcon
FSpSetIsInvisible
FSpSetIsStationery
FSpSetNameLocked
FSpShare
FSpUnshare
FileCopy
FilteredDirectoryCopy
FindDrive
FlushFile
FreeAllMemory
GetCPanelFolder
GetCatInfoNoName
GetDInfo
GetDirItems
GetDirName
GetDirectoryID
GetDiskBlocks
GetDriverName
GetFileLocation
GetFileSize
GetFilenameFromPathname
GetForeignPrivs
GetFullPath
GetGlobalMouse
GetIOACUser
GetObjectLocation
GetParentID
GetSystemFolder
GetTempBuffer
GetTrapType
GetUGEntries
GetUGEntry
GetVolMountInfo
GetVolMountInfoSize
GetVolumeInfoNoName
HCopyFile
HCreateMinimum
HGetDirAccess
HGetLogInInfo
HGetVInfo
HGetVolParms
HInfo
HMapID
HMapName
HMoveRename
HMoveRenameCompat
HOpenAware
HOpenRFAware
hypotd
HSetDirAccess
InstallConsole
LocationFromFullPath
LockRange
MXInfo
NumToolboxTraps
OnLine
OpenOurRF
OpenResolver
PBXGetVolInfoSync
ReadCharsFromConsole
RemoveConsole
ResolveFileIDRef
RestoreDefault
RetrieveAFPVolMountInfo
SIOUXBigRect
SIOUXCantSaveAlert
SIOUXDoAboutBox
SIOUXDoContentClick
SIOUXDoEditClear
SIOUXDoEditCopy
SIOUXDoEditCut
SIOUXDoEditPaste
SIOUXDoEditSelectAll
SIOUXDoMenuChoice
SIOUXDoPageSetup
SIOUXDoPrintText
SIOUXDoSaveText
SIOUXDragRect
SIOUXDrawGrowBox
SIOUXHandleOneEvent
SIOUXIsAppWindow
SIOUXMyGrowWindow
SIOUXQuitting
SIOUXSetTitle
SIOUXSettings
SIOUXSetupMenus
SIOUXSetupTextWindow
SIOUXState
SIOUXTextWindow
SIOUXUpdateMenuItems
SIOUXUpdateScrollbar
SIOUXUpdateStatusLine
SIOUXUpdateWindow
SIOUXUseWaitNextEvent
SIOUXYesNoCancelAlert
SIOUXisinrange
SIOUXselstart
SearchFolderForDNRP
SetDInfo
SetDefault
SetForeignPrivs
SetHasCustomIcon
SetIsInvisible
SetIsStationery
SetNameLocked
Share
StrToAddr
TclAccess
TclAllocateFreeObjects
TclChdir
TclCleanupByteCode
TclCleanupCommand
TclCompileBreakCmd
TclCompileCatchCmd
TclCompileContinueCmd
TclCompileDollarVar
TclCompileExpr
TclCompileExprCmd
TclCompileForCmd
TclCompileForeachCmd
TclCompileIfCmd
TclCompileIncrCmd
TclCompileQuotes
TclCompileSetCmd
TclCompileString
TclCompileWhileCmd
TclCopyAndCollapse
TclCopyChannel
TclCreateAuxData
TclCreateExecEnv
TclDate_TclDates
TclDate_TclDatev
TclDateact
TclDatechar
TclDatechk
TclDatedebug
TclDatedef
TclDateerrflag
TclDateexca
TclDatelval
TclDatenerrs
TclDatepact
TclDateparse
TclDatepgo
TclDateps
TclDatepv
TclDater1
TclDater2
TclDates
TclDatestate
TclDatetmp
TclDatev
TclDateval
TclDeleteCompiledLocalVars
TclDeleteExecEnv
TclDeleteVars
TclDoGlob
TclEmitForwardJump
TclExecuteByteCode
TclExpandCodeArray
TclExpandJumpFixupArray
TclExprFloatError
TclFileAttrsCmd
TclFileCopyCmd
TclFileDeleteCmd
TclFileMakeDirsCmd
TclFileRenameCmd
TclFindElement
TclFindProc
TclFixupForwardJump
TclFormatInt
TclFreeCompileEnv
TclFreeJumpFixupArray
TclFreeObj
TclFreePackageInfo
TclGetCwd
TclGetDate
TclGetDefaultStdChannel
TclGetElementOfIndexedArray
TclGetEnv
TclGetExceptionRangeForPc
TclGetExtension
TclGetFrame
TclGetIndexedScalar
TclGetIntForIndex
TclGetLoadedPackages
TclGetLong
TclGetNamespaceForQualName
TclGetOpenMode
TclGetOriginalCommand
TclGetRegError
TclGetSrcInfoForPc
TclGetUserHome
TclGlobalInvoke
TclGuessPackageName
TclHasSockets
TclHideUnsafeCommands
TclInExit
TclIncrElementOfIndexedArray
TclIncrIndexedScalar
TclIncrVar2
TclInitByteCodeObj
TclInitCompileEnv
TclInitJumpFixupArray
TclInitNamespaces
TclInterpInit
TclInvoke
TclInvokeObjectCommand
TclInvokeStringCommand
TclIsProc
TclLoadFile
TclLooksLikeInt
TclLookupVar
TclpAccess
TclMacCreateEnv
TclMacExitHandler
TclMacFOpenHack
TclMacInitExitToShell
TclMacInstallExitToShellPatch
TclMacOSErrorToPosixError
TclMacReadlink
TclMacRemoveTimer
TclMacStartTimer
TclpStat
TclMacTimerExpired
TclMatchFiles
TclNeedSpace
TclObjIndexForString
TclObjInterpProc
TclObjInvoke
TclObjInvokeGlobal
TclPlatformExit
TclPlatformInit
TclPreventAliasLoop
TclPrintByteCodeObj
TclPrintInstruction
TclPrintSource
TclRegComp
TclRegError
TclRegExec
TclRenameCommand
TclResetShadowedCmdRefs
TclServiceIdle
TclSetElementOfIndexedArray
TclSetEnv
TclSetIndexedScalar
TclSetupEnv
TclSockGetPort
TclStat
TclTeardownNamespace
TclTestChannelCmd
TclTestChannelEventCmd
TclUnsetEnv
TclUpdateReturnInfo
TclWordEnd
Tcl_AddErrorInfo
Tcl_AddObjErrorInfo
Tcl_AfterCmd
Tcl_Alloc
Tcl_AllowExceptions
Tcl_AppendAllObjTypes
Tcl_AppendElement
Tcl_AppendObjCmd
Tcl_AppendResult
Tcl_AppendStringsToObj
Tcl_AppendToObj
Tcl_ArrayObjCmd
Tcl_AsyncCreate
Tcl_AsyncDelete
Tcl_AsyncInvoke
Tcl_AsyncMark
Tcl_AsyncReady
Tcl_BackgroundError
Tcl_Backslash
Tcl_BeepObjCmd
Tcl_BinaryObjCmd
Tcl_BreakCmd
Tcl_CallWhenDeleted
Tcl_CancelIdleCall
Tcl_CaseObjCmd
Tcl_CatchObjCmd
Tcl_ClockObjCmd
Tcl_Close
Tcl_CommandComplete
Tcl_Concat
Tcl_ConcatObj
Tcl_ConcatObjCmd
Tcl_ContinueCmd
Tcl_ConvertCountedElement
Tcl_ConvertElement
Tcl_ConvertToType
Tcl_CreateAlias
Tcl_CreateAliasObj
Tcl_CreateChannel
Tcl_CreateChannelHandler
Tcl_CreateCloseHandler
Tcl_CreateCommand
Tcl_CreateEventSource
Tcl_CreateExitHandler
Tcl_CreateInterp
Tcl_CreateMathFunc
Tcl_CreateNamespace
Tcl_CreateObjCommand
Tcl_CreateSlave
Tcl_CreateTimerHandler
Tcl_CreateTrace
Tcl_DStringAppend
Tcl_DStringAppendElement
Tcl_DStringEndSublist
Tcl_DStringFree
Tcl_DStringGetResult
Tcl_DStringInit
Tcl_DStringResult
Tcl_DStringSetLength
Tcl_DStringStartSublist
Tcl_DbCkalloc
Tcl_DbCkfree
Tcl_DbCkrealloc
Tcl_DbDecrRefCount
Tcl_DbIsShared
Tcl_DbIncrRefCount
Tcl_DbNewBooleanObj
Tcl_DbNewDoubleObj
Tcl_DbNewListObj
Tcl_DbNewLongObj
Tcl_DbNewObj
Tcl_DbNewStringObj
Tcl_DeleteAssocData
Tcl_DeleteChannelHandler
Tcl_DeleteCloseHandler
Tcl_DeleteCommand
Tcl_DeleteCommandFromToken
Tcl_DeleteEventSource
Tcl_DeleteEvents
Tcl_DeleteExitHandler
Tcl_DeleteHashEntry
Tcl_DeleteHashTable
Tcl_DeleteInterp
Tcl_DeleteNamespace
Tcl_DeleteTimerHandler
Tcl_DeleteTrace
Tcl_DoOneEvent
Tcl_DoWhenIdle
Tcl_DontCallWhenDeleted
Tcl_DumpActiveMemory
Tcl_DuplicateObj
Tcl_EchoCmd
Tcl_Eof
Tcl_ErrnoId
Tcl_ErrnoMsg
Tcl_ErrorObjCmd
Tcl_Eval
Tcl_EvalFile
Tcl_EvalObj
Tcl_EvalObjCmd
Tcl_EventuallyFree
Tcl_ExecCmd
Tcl_Exit
Tcl_ExitObjCmd
Tcl_ExposeCommand
Tcl_ExprBoolean
Tcl_ExprBooleanObj
Tcl_ExprDouble
Tcl_ExprDoubleObj
Tcl_ExprLong
Tcl_ExprLongObj
Tcl_ExprObjCmd
Tcl_ExprString
Tcl_FconfigureCmd
Tcl_FcopyObjCmd
Tcl_FileEventCmd
Tcl_FileObjCmd
Tcl_Finalize
Tcl_FindCommand
Tcl_FindExecutable
Tcl_FindNamespace
Tcl_FindNamespaceVar
Tcl_FirstHashEntry
Tcl_Flush
Tcl_FlushObjCmd
Tcl_ForCmd
Tcl_ForeachObjCmd
Tcl_ForgetImport
Tcl_FormatCmd
Tcl_Free
Tcl_FreeResult
Tcl_GetAlias
Tcl_GetAliasObj
Tcl_GetAssocData
Tcl_GetBoolean
Tcl_GetBooleanFromObj
Tcl_GetChannel
Tcl_GetChannelBufferSize
Tcl_GetChannelHandle
Tcl_GetChannelInstanceData
Tcl_GetChannelMode
Tcl_GetChannelName
Tcl_GetChannelOption
Tcl_GetChannelType
Tcl_GetCommandFromObj
Tcl_GetCommandFullName
Tcl_GetCommandInfo
Tcl_GetCommandName
Tcl_GetCurrentNamespace
Tcl_GetDouble
Tcl_GetDoubleFromObj
Tcl_GetErrno
Tcl_GetGlobalNamespace
Tcl_GetHostName
Tcl_GetIndexFromObj
Tcl_GetInt
Tcl_GetIntFromObj
Tcl_GetInterpPath
Tcl_GetLongFromObj
Tcl_GetMaster
Tcl_GetOSTypeFromObj
Tcl_GetObjResult
Tcl_GetObjType
Tcl_GetPathType
Tcl_GetServiceMode
Tcl_GetSlave
Tcl_GetStdChannel
Tcl_GetStringFromObj
Tcl_GetStringResult
Tcl_GetVar
Tcl_GetVar2
Tcl_GetVariableFullName
Tcl_Gets
Tcl_GetsObj
Tcl_GetsObjCmd
Tcl_GlobCmd
Tcl_GlobalEval
Tcl_GlobalEvalObj
Tcl_GlobalObjCmd
Tcl_HashStats
Tcl_HideCommand
Tcl_IfCmd
Tcl_Import
Tcl_IncrCmd
Tcl_InfoObjCmd
Tcl_Init
Tcl_InitHashTable
Tcl_InitMemory
Tcl_InputBlocked
Tcl_InputBuffered
Tcl_InterpDeleted
Tcl_InterpObjCmd
Tcl_IsSafe
Tcl_JoinObjCmd
Tcl_JoinPath
Tcl_LappendObjCmd
Tcl_LindexObjCmd
Tcl_LinkVar
Tcl_LinsertObjCmd
Tcl_ListObjAppendElement
Tcl_ListObjAppendList
Tcl_ListObjCmd
Tcl_ListObjGetElements
Tcl_ListObjIndex
Tcl_ListObjLength
Tcl_ListObjReplace
Tcl_LlengthObjCmd
Tcl_LoadCmd
Tcl_LrangeObjCmd
Tcl_LreplaceObjCmd
Tcl_LsCmd
Tcl_LsearchObjCmd
Tcl_LsortObjCmd
Tcl_MacConvertTextResource
Tcl_MacEvalResource
Tcl_MacFindResource
Tcl_MacSetEventProc
Tcl_MacSourceObjCmd
Tcl_Main
Tcl_MakeSafe
Tcl_MakeTcpClientChannel
Tcl_Merge
Tcl_NamespaceObjCmd
Tcl_NewBooleanObj
Tcl_NewDoubleObj
Tcl_NewIntObj
Tcl_NewListObj
Tcl_NewLongObj
Tcl_NewOSTypeObj
Tcl_NewObj
Tcl_NewStringObj
Tcl_NextHashEntry
Tcl_NotifyChannel
Tcl_ObjGetVar2
Tcl_ObjSetVar2
Tcl_OpenCmd
Tcl_OpenFileChannel
Tcl_OpenTcpClient
Tcl_OpenTcpServer
Tcl_PackageCmd
Tcl_ParseVar
Tcl_PidObjCmd
Tcl_PkgProvide
Tcl_PkgRequire
Tcl_PopCallFrame
Tcl_PosixError
Tcl_Preserve
Tcl_PrintDouble
Tcl_ProcObjCmd
Tcl_PushCallFrame
Tcl_PutEnv
Tcl_PutsObjCmd
Tcl_PwdCmd
Tcl_QueueEvent
Tcl_Read
Tcl_ReadObjCmd
Tcl_Realloc
Tcl_RecordAndEval
Tcl_RegExpCompile
Tcl_RegExpExec
Tcl_RegExpMatch
Tcl_RegExpRange
Tcl_RegexpCmd
Tcl_RegisterChannel
Tcl_RegisterObjType
Tcl_RegsubCmd
Tcl_Release
Tcl_RenameObjCmd
Tcl_ResetResult
Tcl_ResourceObjCmd
Tcl_ReturnObjCmd
Tcl_ScanCmd
Tcl_ScanCountedElement
Tcl_ScanElement
Tcl_Seek
Tcl_SeekCmd
Tcl_ServiceAll
Tcl_ServiceEvent
Tcl_SetAssocData
Tcl_SetBooleanObj
Tcl_SetChannelBufferSize
Tcl_SetChannelOption
Tcl_SetCmd
Tcl_SetCommandInfo
Tcl_SetDoubleObj
Tcl_SetErrno
Tcl_SetErrorCode
Tcl_SetIntObj
Tcl_SetListObj
Tcl_SetLongObj
Tcl_SetMaxBlockTime
Tcl_SetOSTypeObj
Tcl_SetObjErrorCode
Tcl_SetObjLength
Tcl_SetObjResult
Tcl_SetPanicProc
Tcl_SetRecursionLimit
Tcl_SetResult
Tcl_SetServiceMode
Tcl_SetStdChannel
Tcl_SetStringObj
Tcl_SetTimer
Tcl_SetVar
Tcl_SetVar2
Tcl_SignalId
Tcl_SignalMsg
Tcl_Sleep
Tcl_SocketCmd
Tcl_SourceObjCmd
Tcl_SourceRCFile
Tcl_SplitList
Tcl_SplitPath
Tcl_StaticPackage
Tcl_StringMatch
Tcl_StringObjCmd
Tcl_SubstCmd
Tcl_SwitchObjCmd
Tcl_Tell
Tcl_TellCmd
Tcl_TimeObjCmd
Tcl_TraceCmd
Tcl_TraceVar
Tcl_TraceVar2
Tcl_TranslateFileName
Tcl_Ungets
Tcl_UnlinkVar
Tcl_UnregisterChannel
Tcl_UnsetObjCmd
Tcl_UnsetVar
Tcl_UnsetVar2
Tcl_UntraceVar
Tcl_UntraceVar2
Tcl_UpVar
Tcl_UpVar2
Tcl_UpdateCmd
Tcl_UpdateLinkedVar
Tcl_UplevelObjCmd
Tcl_UpvarObjCmd
Tcl_ValidateAllMemory
Tcl_VarEval
Tcl_VarTraceInfo
Tcl_VarTraceInfo2
Tcl_VariableObjCmd
Tcl_VwaitCmd
Tcl_WaitForEvent
Tcl_WaitPid
Tcl_WhileCmd
Tcl_Write
Tcl_WrongNumArgs
TclpAlloc
TclpCopyDirectory
TclpCopyFile
TclpCreateDirectory
TclpDeleteFile
TclpFree
TclpGetClicks
TclpGetDate
TclpGetSeconds
TclpGetTime
TclpGetTimeZone
TclpListVolumes
TclpRealloc
TclpRemoveDirectory
TclpRenameFile
TrapExists
TruncPString
UnlockRange
UnmountAndEject
Unshare
VolumeMount
WriteCharsToConsole
XGetVInfo
_Ctype
_Stderr
_Stoul
abort
abs
acosf
appMemory
asctime
asinf
atan
atan2
atan2_d_dd
atan2_d_pdpd
atan2_r_prpr
atan2_r_rr
atan2f
atan_d_d
atan_d_pd
atan_r_pr
atan_r_r
atanf
atexit
atof
atoi
atol
bsearch
builtinFuncTable
calloc
ccommand
ceilf
chdir
clearerr
clock
close
closeUPP
completeUPP
cos
cos_d_d
cos_d_pd
cos_r_pr
cos_r_r
cosf
coshf
creat
ctime
cuserid
difftime
div
environ
errno
exec
exit
exp
exp_d_d
exp_d_pd
exp_r_pr
exp_r_r
expf
fabsf
fclose
fcntl
fdopen
feof
ferror
fflush
fgetc
fgetpos
fgets
fileno
floorf
fmodf
fopen
fprintf
fputc
fputs
fread
free
freopen
frexpf
fscanf
fseek
fsetpos
fstat
ftell
fwrite
getStdChannelsProc
getc
getchar
getcwd
getenv
getlogin
gets
gmtime
instructionTable
isalnum
isalpha
isatty
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
labs
ldexpf
ldiv
localeconv
localtime
log
log10
log10_d_d
log10_d_pd
log10f
log_d_d
log_d_pd
logf
longjmp
lseek
malloc
mblen
mbstowcs
mbtowc
memchr
memcmp
memcpy
memmove
memset
mkdir
mktime
open
panic
panicProc
perror
pow
power_d_dd
powf
printf
putc
putchar
puts
qsort
raise
rand
read
realloc
remove
rename
resultUPP
rewind
rmdir
scanf
setbuf
setlocale
setvbuf
signal
sin
sin_d_d
sin_d_pd
sin_r_pr
sin_r_r
sinf
sinhf
sleep
sprintf
sqrt
sqrt_d_d
sqrt_d_pd
sqrt_r_pr
sqrt_r_r
sqrtf
srand
sscanf
stat
strcasecmp
strcat
strchr
strcmp
strcoll
strcpy
strcspn
strerror
strftime
strlen
strncasecmp
strncat
strncmp
strncpy
strpbrk
strrchr
strspn
strstr
strtod
strtok
strtol
strtoul
strxfrm
system
systemMemory
tanf
tanhf
tclBooleanType
tclByteCodeType
tclCmdNameType
tclDoubleType
tclDummyLinkVarPtr
tclExecutableName
tclFreeObjList
tclIndexType
tclIntType
tclListType
tclMemDumpFileName
tclNsNameType
tclPlatform
tclStringType
tclTraceCompile
tclTraceExec
tclTypeTable
tcl_MathInProgress
tclpFileAttrProcs
tclpFileAttrStrings
tell
time
tmpfile
tmpnam
tolower
toupper
ttyname
uname
ungetc
unlink
utime
utimes
vfprintf
vprintf
vsprintf
wcstombs
wctob
wctomb
write
#DTGetAPPL
#DTGetComment
#FSpDTGetAPPL
#FSpDTGetComment
#TclMacInitializeFragment
#TclMacTerminateFragment
#_Aldata
#_Assert
#_Atcount
#_Atfuns
#_Clocale
#_Closreg
#_Costate
#_Daysto
#_Dbl
#_Defloc
#_Environ
#_Environ1
#_Fgpos
#_Files
#_Flt
#_Fopen
#_Foprep
#_Fread
#_Freeloc
#_Frprep
#_Fspos
#_Fwprep
#_Fwrite
#_Genld
#_Gentime
#_Getdst
#_Getfld
#_Getfloat
#_Getint
#_Getloc
#_Getmem
#_Getstr
#_Gettime
#_Getzone
#_Isdst
#_Ldbl
#_Ldtob
#_Litob
#_Locale
#_Locsum
#_Loctab
#_Locterm
#_Locvar
#_MWERKS_Atcount
#_MWERKS_Atfuns
#_Makeloc
#_Makestab
#_Makewct
#_Mbcurmax
#_Mbstate
#_Mbtowc
#_Nnl
#_PJP_C_Copyright
#_Printf
#_Putfld
#_Putstr
#_Puttxt
#_Randseed
#_Readloc
#_Scanf
#_Setloc
#_Skip
#_Stdin
#_Stdout
#_Stod
#_Stof
#_Stoflt
#_Stold
#_Strerror
#_Strftime
#_Strxfrm
#_Times
#_Tolower
#_Toupper
#_Ttotm
#_WCostate
#_Wcstate
#_Wctob
#_Wctomb
#_Wctrans
#_Wctype
#__CheckForSystem7
#__RemoveConsoleHandler__
#__aborting
#__ctopstring
#__cvt_fp2unsigned
#__getcreator
#__gettype
#__initialize
#__myraise
#__ptmf_null
#__ptr_glue
#__system7present
#__terminate
#__ttyname
#_atexit
#_exit
#_fcreator
#_ftype
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to mac/tclMacSock.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclMacSock.c
 *
 *	Channel drivers for Macintosh sockets.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacSock.c,v 1.7 2000/04/24 06:43:29 jingham Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <AddressXlation.h>
#include <Aliases.h>










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclMacSock.c
 *
 *	Channel drivers for Macintosh sockets.
 *
 * Copyright (c) 1996-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacSock.c,v 1.7.2.2 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <AddressXlation.h>
#include <Aliases.h>
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    int port;			   /* The port we are connected to. */
    int flags;			   /* Bit field comprised of the flags
				    * described below.  */
    int checkMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by an asynchronous
				    * event handler. */
    int watchMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by Tcl_WatchFile. */
    Tcl_TcpAcceptProc *acceptProc; /* Proc to call on accept. */
    ClientData acceptProcData;	   /* The data for the accept proc. */
    wdsEntry dataSegment[2];       /* List of buffers to be written async. */
    rdsEntry rdsarray[5+1];	   /* Array used when cleaning out recieve 
				    * buffers on a closing socket. */
    Tcl_Channel channel;	   /* Channel associated with this socket. */
    int writeBufferSize;           /* Size of buffer to hold data for







|







71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    int port;			   /* The port we are connected to. */
    int flags;			   /* Bit field comprised of the flags
				    * described below.  */
    int checkMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by an asynchronous
				    * event handler. */
    int watchMask;		   /* OR'ed combination of TCL_READABLE and
				    * TCL_WRITABLE as set by TcpWatch. */
    Tcl_TcpAcceptProc *acceptProc; /* Proc to call on accept. */
    ClientData acceptProcData;	   /* The data for the accept proc. */
    wdsEntry dataSegment[2];       /* List of buffers to be written async. */
    rdsEntry rdsarray[5+1];	   /* Array used when cleaning out recieve 
				    * buffers on a closing socket. */
    Tcl_Channel channel;	   /* Channel associated with this socket. */
    int writeBufferSize;           /* Size of buffer to hold data for
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",			/* Type name. */
    TcpBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    TcpClose,			/* Close proc. */
    TcpInput,			/* Input proc. */
    TcpOutput,			/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */







|







192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",			/* Type name. */
    (Tcl_ChannelTypeVersion)TcpBlockMode,		/* Set blocking or
                                 * non-blocking mode.*/
    TcpClose,			/* Close proc. */
    TcpInput,			/* Input proc. */
    TcpOutput,			/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
Changes to mac/tclMacThrd.c.
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
    if (stackSize == TCL_THREAD_STACK_DEFAULT) {
        stackSize = TCL_MAC_THRD_DEFAULT_STACK;
    }

#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
    {
        ThreadEntryProcPtr entryProc;
        entryProc = NewThreadEntryProc(proc);
        
        NewThread(kCooperativeThread, entryProc, (void *) clientData, 
            stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
    }
#else
    NewThread(kCooperativeThread, proc, (void *) clientData, 
        stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);







|







120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
    if (stackSize == TCL_THREAD_STACK_DEFAULT) {
        stackSize = TCL_MAC_THRD_DEFAULT_STACK;
    }

#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
    {
        ThreadEntryProcPtr entryProc;
        entryProc = NewThreadEntryUPP(proc);
        
        NewThread(kCooperativeThread, entryProc, (void *) clientData, 
            stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
    }
#else
    NewThread(kCooperativeThread, proc, (void *) clientData, 
        stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
Changes to mac/tclMacUnix.c.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUnix.c,v 1.3 1999/04/16 00:47:22 stanton Exp $
 */

#include <Files.h>
#include <Strings.h>
#include <TextUtils.h>
#include <Finder.h>
#include <FSpCompat.h>







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUnix.c,v 1.3.12.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include <Files.h>
#include <Strings.h>
#include <TextUtils.h>
#include <Finder.h>
#include <FSpCompat.h>
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
    	Tcl_ResetResult(interp);
    	return TCL_ERROR;
    }

    resultObjPtr = Tcl_GetObjResult(interp);
    Tcl_IncrRefCount(resultObjPtr);
    if (Tcl_ListObjGetElements(interp, resultObjPtr, &objc, &objv) != TCL_OK) {
    	Tcl_DecrRefCount(resultObjPtr);
    	return TCL_ERROR;
    }

    Tcl_ResetResult(interp);

    /*







|







202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
    	Tcl_ResetResult(interp);
    	return TCL_ERROR;
    }

    resultObjPtr = Tcl_GetObjResult(interp);
    Tcl_IncrRefCount(resultObjPtr);
    if (Tcl_ListObjGetElements(interp, resultObjPtr, &objc, (Tcl_Obj ***)&objv) != TCL_OK) {
    	Tcl_DecrRefCount(resultObjPtr);
    	return TCL_ERROR;
    }

    Tcl_ResetResult(interp);

    /*
Changes to mac/tclMacUtil.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacUtil.c --
 *
 *  This contains utility functions used to help with
 *  implementing Macintosh specific portions of the Tcl port.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUtil.c,v 1.4 2000/04/17 01:52:56 jingham Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclMacInt.h"
#include "tclMath.h"
#include "tclMacPort.h"












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMacUtil.c --
 *
 *  This contains utility functions used to help with
 *  implementing Macintosh specific portions of the Tcl port.
 *
 * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMacUtil.c,v 1.4.2.1 2001/04/04 21:22:19 hobbs Exp $
 */

#include "tcl.h"
#include "tclInt.h"
#include "tclMacInt.h"
#include "tclMath.h"
#include "tclMacPort.h"
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */
 
#if defined(THINK_C) || defined(__MWERKS__)
double hypotd(double x, double y);

double
hypotd(
    double x,		/* X value */
    double y)		/* Y value */
{







|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */
 
#if defined(THINK_C)
double hypotd(double x, double y);

double
hypotd(
    double x,		/* X value */
    double y)		/* Y value */
{
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445



















    return err;
}

/*
 *----------------------------------------------------------------------
 *
 * GetGlobalMouse --
 *
 *	This procedure obtains the current mouse position in global
 *	coordinates.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

void
GetGlobalMouse(
    Point *mouse)		/* Mouse position. */
{
    EventRecord event;
    
    OSEventAvail(0, &event);
    *mouse = event.where;
}

























|














|







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463

    return err;
}

/*
 *----------------------------------------------------------------------
 *
 * GetGlobalMouseTcl --
 *
 *	This procedure obtains the current mouse position in global
 *	coordinates.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

void
GetGlobalMouseTcl(
    Point *mouse)		/* Mouse position. */
{
    EventRecord event;
    
    OSEventAvail(0, &event);
    *mouse = event.where;
}

pascal OSErr	FSpGetDirectoryIDTcl (CONST FSSpec * spec, 
				long * theDirID, Boolean * isDirectory)
{
	return(FSpGetDirectoryID(spec, theDirID, isDirectory));
}

pascal short	FSpOpenResFileCompatTcl (CONST FSSpec * spec, SignedByte permission)
{
	return(FSpOpenResFileCompat(spec,permission));
}

pascal void	FSpCreateResFileCompatTcl (
				CONST FSSpec * spec, OSType creator, 
				OSType fileType, ScriptCode scriptTag)
{
	FSpCreateResFileCompat (spec,creator,fileType,scriptTag);
}
Added mac/tcltkMacBuildSupport.sea.hqx.








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
(This file must be converted with BinHex 4.0)
:'(4ME(4V6@&M3R9TE'46GA"`Eh*d,R0PB3""8&"-BA9cG#%!!!%41J!"NlA2`e0
dG@CQ5A3J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S
[,hH3!bjKE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!"%6S!N!0b!!%!N!0
bqh30TD95CA0PFRCPC+@P!+@3"!%!!$d!3,5KD[qh'$r`!*!0$4A`!*!$d`!+5%X
!!4"R!"08Bf`[9'XJ4QpXC'9b!!!$X!#I!$X#13)b!F$rN!3"$[rm!&R,3!!!J!#
3"!-%L+@3"!%!!%3!3,BJ!3+h'#Jr!*!$FJ!!J,B!N!0b!"3)93!!!6X!##TV!!"
rH`!%+&"bEcBJ3R9TE'3J8h9`F'pbG#N!!,16!)8!,`+M!MB"`!&!!)%$$[rirr$
,4!!!J!#3"k@3"!%!!%%!%,B4*!Dh'"8A!*!$d`!!&&S!N!26!"'M)3!!0"-!!"(
%!*!%$`"#G@PXC'PZCb"0B@08Bfa8D`!"-BY849K83eG*43!!rj!%!*!+J!#3#3'
D!*!$k!#3"!m!3X(8T5mNI+IfD!VL20iHrJ63rlBYUTaK0b4ST-icL,Cb*Xq!EJ2
C-5d'f19IHNm$-YRY0eq3!%"q"%&CZ2+(kI`j-M2a0rFX+fVZ6Jp8(%kTFX0[d6,
bV3PeU99AFF5L@%DHPXYFXTF3&-%hMI224pj!)aj)-@8i0FTpL$lbdS@A"mR@QR'
,NHAmcR,DY4a)"i11#"qhl-UDq9RcX5CX"aQU)q**0k1Db%Z2%C1JrFYi)[AAHX&
IcTi*J'$-hfA9q9deRFQ0Q1c+8YjdbU-ri-T%GGGcJ+I!VpZfY!Z",jVEEHEAZK*
N,J"#`G6!fa05l1!E-BbSe2lUk3B$6KYQ"'DMi6%EG,E+cilQFDAiMpc46Mr'SB)
'afT[c,K8TFI4eHqikm!lLK8(qI6l4iE!qNf8ULJ3N[VkeGUIfM"+-+BFNS!&9UF
*(#kBUQVGedj!j%XiSMFH(0HflRj!QC6b!FVSU(HGXp3A113hV(5#KEpF`M"K[5A
ZC0PeE&(2aS8)0"XKAXMa5m%T[T!!XJ$$qC!!P8`S4#B*,B3B$XAcY,f$*IQ0f!-
SGT!!IHTIk3qblNmM-l8ZkLh6d&Zf-)'`J@)dhAjC$TB'GQ1D61%RF`E$TdjMX6I
lq[5YdI$di+pRPHpB0jRb-&YF4E)de#Xj*+S5hDX4`2FZ8Z1)m'(2hDSIl66$mYf
*P`0AFJS*EF5KrI(&,L"-LcQS"@"aL9Zd88QSpK9ViK3K,aEq*ji@0TB-426D@A-
YM*JQ%Pb)X@2&k5EdS[rIfPF)N!#ILDjq"cVM1kN"5!JX(X(["I$fL2V`&Z4YM2I
bR&aZj8)3rF3pPpQ-@db!Z9dC&Chd$TQ!KJ"%["4F6,dA+LMqKRHQ&d&l0ILdjJS
J0mbNE+(BDfCYlX&*#p%1"L"%1c3#UVBffH&bPe0c6K6%pJYb%dRUN!#lN!#P9Kc
k91b*BZJUTK(!!8T%%mdlTqm)"b%e9C,2c1K@a)a88V5UEj!!r!3"VPphmKbl-`f
#!"fXk,j6AL'TrS#rNb*8&8bK9piVj+4d6!V6NdhH+-X3@@#imD8HaN)($HU*E3#
XSZQhi2&eek$#b)`IFp"EPdKkDk@6FLJjQ+T2SalaY(+GrLDe$JGKlqe&5bdeb)q
Qij&G"8"a,6M1FX@J`!*0(18Z[aG+(m'(J[[rf++p`4p(9'TEI$iNJrim04U66(%
QB-q`$T!!DVYJ3!!8bXCPCAYGlGH!8C@+S[Cqp$eK8r+bG8AbZR(h'I34[aq,lpa
G$'+[ZUT1HY"BS-kV)3T5mpIYl059ALR,'I[S&frTK-b,%8pRVCHQMX0EhEZU)qY
%Me8#Cm2Nh$QLp'I4pKiECL4j#&i6!$VJh3H5'lJMPD-Abda$+kLH"`r`$#+&iRX
hA2c1!'HR",prm)+!Qa8Cdd-cJ%+A6!CKGFZ!+PTMQf@GD0aTU+SM%hmYVB'F"S$
![I'&prQ%TfjdZ(*BYE9M-'QXDpS"YhR`iK4dl9eVZJr20TF8rI*#Hf*!NTLXl6-
%KiiHGccR&)[(+X$q+!ir@VZaDcH%JfmY(LZfNI*'pJ#6`I!+HjJejMVj(MXEcck
)fppEYF1+ra0*)'9#RlKU1cmGP@-+5)9Qb!lqEm(99$hmlc&ZH@XpfL%iJ5`[2DI
N#E`p@d8)T6Q6I(dGp@0*NCGXqFC-fq89#-rfmTUjNdYkZ*[8N!$@@fcK`&lG0,Y
TGfZ-@0[L*1jK5,6[UMI"VVAL6f&HfL%SjkdrN9+DC"9jc98c(b5J,9(XYS*ifFV
UQDVk,-J-YDJ[kHYSRd6)MaKH$9%NJ%HFZP,TBHN4qZ,Lq0ee$!jiSB'Cd*9Dl8k
`*K9Y9YY3p6jr-b%N@%jfBZUiC)X1E$%1ISPQbC`IFfUG9qb##$QkCPH9B&Zd9P[
c3fTG53ZPDhXM(1-1%mGaEP$Dim,#*%9SHm2Z-a'V'hj#@BD`J"&BA3'06QT+mbY
IEhjdb#2mqHGckiHjrE!+!'V6IQXafZ0FF(jp-G8FMF4qpqGbPeAJ+SaFI0KFIkq
JX6FX*LdS)1dM!TV[U"F1R9DjHI43YGDr6F&"&K8DC3l4RHLE[@G")A5hb&T*T54
NQYM!HhG5J$ILGZckEq65GrQr"d[brUZ#-8R8e"jeAQ#h$Zme$'N1XBV2+C`ImC6
XT-+&B+-%cJ1-4i!BZIY[I*R*(LVr5VaZda4TRBePAJKcSJ*-#Upj6S0l5U@SemC
a%BH!,(%6k&Aj"@I*,d&)2h+I0"Diq9!0-4@66V[NE6B+"lR!i-'5NFUAI@GFG1r
00-[JSN1`@AAe8M$`6G3QD&eQ18*Ee`R$YbZ@D'rlcb5(8d&D@`+8KR(Yp*[j6kL
c*#R-#mGZ6Y32b@!6MeN!9#G#bLqU@4B$$rb9Hi(++hY,A5NGhjH46"GXFQXd2Ca
UP*T$DqIkd$HP),)kAB*V3MT8kI&L0YbE0DeA"ZMP1S@FYBH@&V'pUD`L$#5YbC9
kXl[IE""4$ejh0pliViqjq1Pk3&!@e9p9qZK1Q1m(H0%)36)+YAIaTpXRef)6h+A
4PQ6R`1[XS99[Dmdmqm%5jNXJIlHaPqejXEchT@2KGM0")LFcTUD,qi"mh%BKLcB
2!"!Vkpa,P9cQS2SkeL0eC2a*a0("4%*,k5VJ,lBZ++BHQ+CM66[Df%A'$E*@H+H
K&rNZ$hIk8@6UicFj"Mr1rp*M&6NI!'Nfr#BB&0(F&%!+jrqN1"EH-Vm'VKR[,HN
F*q4+T`iS&dM4U4(ZU2'ZE"-+hj0RF``0Br210D4"Nq'0SJ*HIjU2![$m!PHrcj'
ehp(r15dIS%EIj,2D`q$N-@%CVMmM2"j@ajrQmGSK#ihfC5&C&[D,cEXSMi$NL#@
[EkJMX[(SHki#Q(XcTE36NaNPf!i'm61(j!GNl'B!e@GYrIEHcVDj6h'Z1S@,Bd#
qeAIp1`SfrGFklASa"E)eM`06Q0J$VQ%2e+,ZH1Sh&G`T#e"M1BJKH[95Bb9M[I`
Zb6fb"5G6T0SUdi5LMYPAQ[cAAqN+X-flm5EQ@V$Pl)L3!'iqlYFka3ed+b6Thlj
+dkL"F'-#!UE&ma2ICKq2E)r+,BB*p+rLhi1eMYlfY6DS!c#J!)MeJ$0ibrrYK(E
#Dj!!Rd%lEip1@PEZ,pLRV9pH0[L[9aZTB)Qj!pP-KR4Cq-L-U*bBa86D8hDSk"E
HbAk*+*1X!9M35AA1-8b*8[K[a4i%$I5F1(J`-#`pE0H40+18B&cLP26G9Qm[*0(
[p4CiRmA$XHdk-P!Hl0F#&3))9JFDZK6RDeY080&,**!!@hMXi9QP0Hm%)S@LYc"
Yfd(Qq!Q&ZjPXEbV6kN[ml[j45Q8YA6#mU(1Ip`Q#LMEa50M4E["ZiYlqrE2Lpf,
*i"f"h@8L`q4DmA%00+kYR4k5[+R3fH2#d3-R)bZ"TRcaXe3SbJ@N(*d4!hCadLM
rhBU1Tk[k+RVhLI'q*9C$"R!-BfTKZX!b!4L!VB+FIjd,S(-kH+fNHmMNjT`@bMd
Hrb$jhGik3,EBCVU,$aLbhT1'fmYbB9dH%4*1T,qQb0PDrkS55R!#!$CmaE6+lU`
`TQD65%D8BS99CrNVVr[HHME-JGiEf+(Yc@m6"m60EUJ0+&f#`A%#fa+cJlG6XHh
#Nqp20l"dC,prArRre5k08TBC,+(PU'6jNDXrX%r1a`2HaI)jiarlS[kXb5pK')m
YfR%A120J`K`SNM-'m$L'#4MYYk%k&I5c50XbY2!'L,YJM-5aRRk1[mmYmmC%(aS
lD$&ADT!!j!B"iI8M'6%"$61B*"T$F9S-FJIj0F-G%Ijc3$4"j#VP(p*aJK-%KMi
1*$L[,lI(556"+10"bC%2eAViDM#CM"kk"j!!c1%(PV0'pppS`d+1"hdkLcLN,5j
0pRIjr3e&4i-2VlR-N!"aLdU''dh$XS4alQ%c-*Z6Z!T%jbJ9V@r9X!4&fH)l"D'
Tj46)`XjSJZM-IPI6EQ@KE6[p8+I+5qjL8m0I2"RNZaSlSZcdfSk@ACS9l0qRP6[
*(+SlG`2-3MM6e#9jKMMBm(30*9c63HG#r@(5-TX+hVD3!)CiUakJe[GrNRfNhdT
aGLCUJi,FGXYFpRN6m[)km,0df25828LR$fm)k4-q8AYdp-ri9,"5T[IKX10I`Yq
Qm3BXHME@Qj&R-"Q$pk6b8Ui#1pV'4DTDh0kBepFQp"NPeh0jaKaiSDB$#8'ACJj
fAAe'M&-`*bpiQ@lS-YL$C9T$K`Y`Z5FYHZ"E[k"bQSFSQjJ%VVe&*D$NBS"$-EK
kAD06hm-frHXU)bi`h-A-q6q6Kd#!&%pfQIh[818X)SKeCk-1QD1aFP)qh1[SaHH
mR0TIF-0,2[PMi+%),ec*!!b"N!"*@r5#m)J&SK)Ge06bA08ZAl!9b3+Qjp0dDP,
ACqKDCMb-`19#qqjm[$R!348+@$Bi4&K%iqMr2e33!jB(-82hNF3YAkh0f!aA#6k
YL&pK!CX+l152k@HBKHTm!9A81D'bAe#!+4'Vh9aHKXkZeZ4YV(J6JkS9+U"rHlP
Z1B33i`P$f!d0@'j1Iq"rP$Fi@[L(#`hQfaZ$mAZNkFDF(e$dH9+cJU@'&1k'(Dc
fm(5bD#9mdmKR1YApiC956"290Z8AHE0R0NT5-BI6mDVYBQ25B2qL'*`pJRNPkqb
-I52F,*%2'!16ib"YG-ld%Lp5!("b[*S6p(a3a3-CB*IY4(DFrK$Q564cNQ5+9([
JUN99FFfQ6rVr"[VB$j)CKfhiaHE6m1*YCZYr,!YFSMI%mr5k4NQK49TmYQV-jeR
+0$$E([FmCY@M,l1jP5KKE+%k(KiC@ThaUqJ@L-I,ed*%0CCQ+"aaa6I#NqqlLR,
U*4pk3'HAN`UfE![rJ`BK`4rLeCT22hBfTfNNaE8fF+1#hpR&ZRL,)RBC`@QSS51
kS64p!A"e)1pBJ30-ffj3e#&p(9d%2DT4VqE6b@SKc4B9*AFb4Gm!F652(69rd*j
-q*!!RS-KGh,@`@+iaL&1X0d$"dJX0!Lm*X&XV[&aQha5'aB95SlH3p)AUPTcaIm
ei-9bNFk@JKiSkjFq0XQiJFibrKcU5VXUQ!`jGdJ11""DQ'P!cBjM8cHj-Zh6V%5
8JAP4N6(Q$d*k@bH,3V6efdpH&C)UeIr0'$[G*8"Q"Kap['ZUTZ0B,B'6GfElkNU
GL-l0`@-Y5LXGl"VdbEh,0ajhpqkKB4f!E3`4e1eJ2bVHfQ4#XlHmracc`9MeEdZ
%MXk*G&#8JZ$F*m6lbdjZ(QDUamBfUSF'9[IR[&#Hb5,)fb8i1X,4ElH*Ra2iamF
ClTZ(['5QZk[DG5'1m[L6SSSA[5Gb21lGH&+T@Pdm(k3`NZcM0+pq&)mrS)!!Hb#
h+Fh*Y#pm1H'U2-K54!$*HbbFbaLQjrJPk@CfdbG'S%eVD1#2[FeV40"!eV@p+YF
khdN1[6+',B4(+r&G)2lc6,#IdFadM#I`TTN"NqM$"KHl3'f5,6C`Q5,QCHiaAYJ
chh0`LEcP6#ZZ)A-*$cK$I(5iT%d1Y[U8LYh9$f+V'TN26Qp),UMARShlbd`*Y'3
8&mD,M@I+KY2QVj[ViR9A#4TEY!hmbN)#$if@$c9EjmR0cEST&M'%2,jAQZmFbiN
j++SM%#dJ&QacLc!h@QbGB"%'M1X3Ibl`(93&UD5EU"Rc$1Q3!"*!kbG2dSV$4+0
,2UQBN`!25-U@*Fh`mi*aPS1IDN"2@JZZk`cPfAYkSZMFI$`$i'L0U$9ZSXUB4X+
V%m%6YdHpP*Y6h-VcId!Pr4R-f$0q)MA)lpK`CpNaNUjdXQ#Rq'NG`dpaVk(D3k#
dRE845q@XVEr+E4Jm9Sr24d`5ej+cB*)5Id2cVF+mQmqHmEa5[VjcZpVZ,2TG)j8
mI!FHbR9rj0(8'MVQ*2BKTc3QDjAS+L*hT6MB&!cNj[8[+(LGI&E$4`+SMr"LREf
M*Qr!cFG6A!KpXkc,`0bA&&*(KDj-N!!GT@1%iM51G'+8`MP%HAC!m@5,aA9-al6
jJT5[Di%MH6B*[QMG%L!l)![)e*J3k0j,l1#[-i@TJ6+e81-N8E1A9IU3!$0F32p
)Y4H0qrHIjQ5)1f$[`T!!5dij(q`b*2B@)la+*j+,mEb`Nm#c1N,kr9rl`P2lhXc
6U[Llqq6L3HJ[&eTFdEmlcbXh5bq*,rUfN!!ZZl#&$ZFXIZ3[I9#,'C@leLBh""h
549RKrhlB8(NGV6j)-h'ECLd(H'+Z@349V#d2TYL6Kq"S(L-r4qV5B'c9KMBaZIe
cF(#-9HRZj*p@5Na-'R$@e-(9ijPV*Lf+XNK*b)CQadGr8(`N$E8+5TD5Q&$b8U1
J,3JN64I#B)83&&)mD"dG)5$)5lQeLh*I`F6GGpkl-jJH$aQMPF"dLT1eCJ1eY*c
(pNYf9qTPH%)*pGI8!+@3"!%!!$m!%,BJ"!bh'"3c!!!"1`!!'48!N!26!!qHIJ!
!"a`!!!1I!*!%$`"$9b"3FQmf)'0SB@jRCA-!!IAj9%9B9%0A588!!2q3"!#3#S!
!N!N"QJ#3!kX!N!32!%,"e-qA86ACe@bPCNZbK1CcE,LC2i3rm@k''#TXf-IG,d1
UYIT)3r1I0@,jHqY4mp)`CR1@#)c)qb9TmBf!*Y-FA5JhlBXVIaQS2`Hj&KME4$(
"K(I12hVhfecX"MLL6'C5pi%`iZpE-3FfL##H$DaHB2qi-8h!lcBP*VFH4-2'qAa
[#p!0MqFC+8#H$fdAc`))UKbMQA[Hm`%r&4Hr0!)R%id`!#c[al5(!%,"e4#Fe3G
e%hK30hE['[YC4A2R3+G4'(0A9@Z1JKFUE90FD0aJCieK5RSh4Y,A)lC`G6@Tm$%
5k*MqG#%[B%Dl40bV'*K&Y"8r%6q0Z$`i(X*TF(qa)J*U65bRF2iC3#K-Nme(1+)
ECI@YESB6H3j%%i&9h!LQa+KiGP[99%bTZC!!1Sp3heZk+($1'66+T8CJVmII#C4
FDABB(ZSe[b1dMUV,K")h"a[G%0@DUVa,ZSRBiEN+"EidqCFTe8jZY$`-X4Zj@R)
cX,TNUGp6AEbFA(C$,aH9-`'A(c8EU`iFm@4Y*'0YG%ClZleM$6QAG&XTCN[#RG*
c*2(riRT!D4N+NBEV8*q6f4K8BNAfbHfajALdM2FpG%3ElT%"+k2@edDCYUhrd0%
V%i3-02'%B1hYaP6j5j1VkkH58Al5S!!X-)Be)X-+*GrpCB(PQM"#diCY!EfB4IR
JC895FmhRBaSVCqM@fc5*5,e3@1rd%$,p-k(HC(DPeF9M1h2q,+BBAcXmb`JpB!D
X@K1DKHS`P5&i8'b@UaLJ"CiQ0!iR%b$bN!!Kka@-a)4'"BIlEkCN)-!q6+l*%VV
KXT@%#!r!cX2S*0Xh(l9GlV(S)1BCb[ESMj'%"Zfpkj-q9GIeCel`5H4BF((,CRf
9&,(4PJXACGrYG3jMkd+0&m)!$IDC+[h9RD0&)VCMApKaYG*Gp,b3!$J`iUiEGmZ
FprcZbB9Dfh[)H"Gib1!EViQJ3ch*+`G&)PP3%l0(2-dFa$BdPdHb2lFcRCX)``k
+kjQpDLI5&0TJ@fe`B&#f[A%[0$@l8Ji(reDHT3Z([(,Tq5H0'hYbRbZ&FN[Q,J8
Sqd3ecHe93b`MHS44,6YYb#C#!`3KN!"I5a8(G*6HH$ZmY%,Y*f(09kHN&HDMGGQ
KG1mU`ZMECfiK#@DiaP,ShI%+4V$MT#'[`5mrN3CUR6DYc2qR-4qep4!b)4JCH'f
CNeC3j#UJS$X`%`)6q"Gd0)3b&9Y3-1+bidZV@0H+lZPCJ,Z,m#`HL",'2Rikiie
b(5BTH`YCbcXj[$Uk9@%AS)1i2MmJEH)I&(H0hXfG'$T4A*hT%H%BiU-X#-Xe&kh
`PI61,M*+G#*pUDTf8U(GAf!q`N(bK)Xc58CeN@LA29CY0FI2[m-rhIVm[fH@R!(
63@(L26p$E6m9ZL-24hbcB%k50McfMHR2hReeZ)U#8(ST5cY2jpML!'Tafi2,'#D
pS5(,#*AleSYeb3#PN!3"!!!r!%#d6(DpY`Y4k`!!&&S!!(BJ!*!$d`!26NB!!"P
i!!ICb3!!A+J!"de[FQ9'D@aPFb!a,M8Z-3!!1Ud!S!)`!XS$SJ(!rj!%!alrr2r
bbd3!!)!!N!HPN!3"!!!e!!#h!2CaY`$fF3!!'48!!"Rm!!!C&3!&@M)!N!j*Bfp
Z$3!"Z%KTBfpZ68&$8d!!N!q!!*!*!4i!N!-G!*!%$`"#`G5I66Y4QLC-XLL#I[0
id6aLSH3I'-#V81EJ!+@3"!%!!$d!%,9j5)QeI4Y3!!!CH!!!(bX!!"N9!!e9$J!
!#GF!!!09!*!%$`"0Eh*P4QPXCA-ZCAK`!!%eq&4&@&4$9dP&!!$rN!3!N!U!!*!
*!CS!!!&V!*!%$`"#`G5+FbDmfpl-A2J+m9VJ)2h"&*)F*b'Ff6'aAaD*bSC'dZC
6H@BC!VKk4hfECk[!-kFd4TMrEli58LAU!p+mhU#6S4Z9h*Dk$)E4Iibj$pZ0+Mf
ZlD[U$%bA$BbR5LQQ[&,*AQdZjAjkdTIm[p-Lp+qk$-)LZ4QBE61dJ+C0CC)e,6A
iN8",j@!pii-mf9QP5dhPU4,JMj6Y@TIIHGb%PKdl[#lGJ,f3!-cBVhcM"jNaQ[b
F,5HV#0MpZKlNMXp&UMqVe6jm2@iGQ@HH&22K-K2J+dDF)YV([Kr+Dj%k'MSc'Ti
bl'N6G0rD@)6KfhZd$i34j-bkXS0X)5*R)1MM#X8l!M8+L)Yb3C64!!,D8"8,Q(@
9L&+)TR4lTkK3-#3+84#q3"j+XL6q9Z3rC&ae'Ja3m#iI"D%bQ)XTPkSZRD)1ImH
)RekeiLL[5'4A`cB"@bXHR&I"6FE"PLH)*PJP"%)%HZH9+R8LlIG!3X(8hC5Z1SU
feJYkk[H8!d*rLMc%d&BRlY%mUHF*PkL#Dp[(EphbCLGA)mhj*(2*XL3-[Nf4kE,
H@b`U)6@h,9ED'KYZdFrc8XX3lZ9HFEkM9-,EjjQePQdS4(MZTdFY%m!4fK2"P9l
,l,4fGMph%,aRD%0C'l$H2bf0qZ@m9alk+bD+A-6d2kTkml9HaI)GpE"Irlkj"3F
h&32[4)d8r$$%bE[lR(8,0*3[%YbS+fKBTIAhA*H,cU#K-3,KPKhS2LJlI3Dj6I-
!14"lGN2icXVS0Np),J'Ie[pVbNL+pVf*89ilI!GU+3$a0ZZVTH&Qk"r9UQ'h$eB
kpb!JG-bj5pZL4!Hd3j-UQYVHY-!k@q9PM[K*hYbZmjjJ"mbBehSR+(NqeRLH(k)
Ik@kH%)Zm-%T$!9KmTEXilF!HJeCZ%KG&,[dMh+k[DTRdjC,NeE6""%mQCHQ)`Uc
&pJ#NZD+JC9P%Rm@e3Z@U@l4Da`8i$j)3)eV@jKS8CZ2r06a(SE@qRjflX%C,AZA
JA3'L%UE-kJZJp[hZI)-$$a#,!)k1-@NeN@UA,8U*62,pJ"513KbR$Lh!r9lGU86
kp[@c&26R&&1*$!UXTK)l@'pGMX03Nb'bAFZ%Ik"dZCBHk`ae)3e$&VBld2rASR"
ANhH3!$[bEC4!@23%cpk3!+)0GJdUJYHi#B"XKAHI&B)MZNDCAF%9FYCY8mBKNDR
J"eB$GR`mDU%")N)Y3AB"2H4q3*TS!8l3HIe`Sa1kC*DeDB0Zb@V-iZQE1lDdVVJ
r!$)qPKjF&SKbKeVMplUkYX4VBe9E-Vl+8UKZ'0@FUN3j-[klkF!41H-T0)$+)p5
'$j&+mDdjdC!!UfaZ2&1fPGeq8dCdREF9hI&I#3#ADbhdXFd1f[![bdA3-*S892$
-NEIT-BRX8B(2q2A$[`N`BH&k05C%m-i&JMLZcH&aQY+M39ahpe1X%SI[@N(5SF+
'[pR)G0PimGK&iK@pBZ4JZK@XkEmQq96XV5hYF%BT4bcX*A(b1P[Pa1"EF,S8*mM
$#)dFUKLeT82kEIRR1Aj6S,6G9UbF`CR3`d)YqM&+39QiP8B6J6CNr,DE85QYKYE
QA@2B((#H,YjKaDq)ik#R1L(@r!r*-B1E6X%HJ@@YB+@3"!%!!$d!!,F%NCHh",H
3!!!!'I`!!'`P!!!C&3!0P1B!"lj`!!"-Q3#3"!m!6@pbC8CTE'9c,QeMF!!!mUa
069"b3eG*43!!XH#ai!#3#S!!N!G#`G5m(BkF1YTr8-$(lcLF'JB@B*9aKf[hH%-
%Z9SEId80JPA`RDIrD#%'$[85$9$LaMZLMK3*`)YV-B(N+e84F5jm0MA@3bTF8$D
*'A"*6&"k)F66+H4aEReKRM#(6j(XQXQC9%0)(GQ21Cca+KBR50,BY)&[@3J`DeT
T0j!!&5Ei32+`'Rd*dINrRfd,*iK(RL'B*m[0iR#emk*3VCYMYTTfGi+H5+eIbmH
&b@3KZd9L8VqjKA#05*BCl[HG`V(FNEM-[@b4"QbE36%6l,(1f)#AD&6pG)*A`rC
j8rUHG,GJ)jU1Ef9d[!V8EG&-[leM,F6d@#QQJael4r'FTl-#kh&`JZHV*3B*C$e
'ZLYYcie,jdb+CJCkh'HQlj0'j6,ci'0VhmXA&cHC4,j)ZJUeVRX@YKUHdSr++0p
(jMB*"+dC!HLh#4r)95(S-Jl)T8dNrcXS3fLeNdZpC,h5dF,JV5EU1J'r'rb1c)@
c,e(`jIhC[83Dj@J2,U$KLb@E19$8"*mlB`N8CT!!!iCC&pE"hPkTqUkepVL#!6p
k"-43%2-Q,LG2$ZQcLcfJ1U0(b8RD%rR`XbRY"4D&b,`E!N,5U-L!fQBN,A!"Lcj
!8#C,3VL%BiXJGYlBQ53Cjff$TDd)C5@U$JaZi#HZFr59$IBYY)@#4-0K$IMU$mm
cJfkD+M#[0IVA@JZppHA[L-NX&&*Gc8'+ld+,ZqY5+5%)D[V'HrTN!-0N30%3SIX
$d8p#VY@KVED&k0hc$))Ab'l2hr+h,6ECajHF4JVA52LjJkdP(RhHLC6NQ[90q'h
E)$I9i&"+VlZ"``TbAXqm*BSdcJJPA$Rq1JNcB8Kc"BHZ,a'5Y,j3kQkFY'mm@[b
)I02le)j)JdU*+D[M-Vf)6UQEZ!FlAXjRU6-9(RCFkcYeYkX4i'qReAj@["CFm(S
qIKmaHLNd0abK@!`E0pGF-%*P9q@M`dQpTQ`iH)+b9KJjH3*)aYljAEeUZ4SKq6E
*X$@M"q#*'B#aAR',$b'HcJp"Bq(R,6`jFEScFcQc,4QckZLT[V'[h3firD"dRiX
f!bV6P*U@BE4[J$'HkQr*,pL2&5iXkUCpiUYe`NM[GkBHbbT401C2Ei3Fm08QcQH
qpi"34YU&6,lFQ,X#UJE&0Pld-5[`rC6AA'RC'6hi9[)e`$*h0a4lNSL#6*3YbB4
',qM6H,9+RMV@%*DTIY52BFXLGC!![1%RAj[beX#ELIYQU+)D`cp,JFd9##cl"eh
j1mNYdV)aFMYjaRR5[Am1IMTp5M,5K@cR[l+jmN(48i"UBdNVIRl[bL$i05I,j1q
&lVIT8M'4C@B(dQ%!E`jAl3aE1+@*+[0M6l$9TYNe$"5)M#FcAC@ZE*!!A0BERdi
S8S9jdFfJGpSccr&IQ39"%AFMh#"1(rMr1-J3Zd,JAZdNUmjc5CN5)6+FIdq9-EL
mPBp,KEU(4TL!j1(-!XG92LB"DN$qaF$H(D#`D[C3Ml[V"dj1lZG`Q3J+iZS!%TQ
Z+4TD@2IpCCb'b*K[E,N-rS'-UVIJ2a+Y*`a0S%G)`Fba)eJRqVEU`(kIjNb,%KV
cSXDJfSRX#JqcYF5%aUVMPlGj[R*QH0I+(3!MP%ARh'9pj*pYCLU$#Q1UqTFf8MS
+*2a-iHaM&JA8h2j%[kSYfjRm5rEUpKf8e#l,*BQ8lj(SY$Q,#$c(%4GL*J!aCQ*
Y5Qr&@AK92HK,4#1$MbF9+1RD(K,ji3"&6DqeZkmKf*i$`1aSFZC3,fkMFTMb,`K
ejbQ8GVJUhq@R`TrLkNcJldYrK8VHB&*kHh*M*"(c@&Z'(M-dCL)60qcYb6*VL&M
B[5+JGB!"6H5%49#-&rG3T@2lFN6T',$FM0ICjBBmYmjl(!`4lFhA-rI#Ui$-&KK
@Rh-bF#+J9Jari#phE#BdbZ1-VEeHD31%a%&"l2B&(ciGr%*3MlU3!#4&%T`cGKb
96VH)B66)P&lAab[[)M0Q0NaA(M3R$,T88aX(1)[4)laCSeHdm#qIXAFGE[J1AM)
VA"'-2C'Ia"UXprq8YNAjIB,bqlq4d*QVXL!%h$KfXpeGU'4kNQcUrVE3[l0L#Dq
S3c-r)p1hFIh-YK&d"G@Eh,B[*TSP-NHFrMBml`r`N!"$+BcD$U+SHd#pIMMGb1+
#iHHrKLRqck!br"'E8X0@#4+M"`KfhMK64XdY1VjbRq#,e'-&!Q!Fd9-*0l6jBmY
4amk08hcV,YU%L6J#JbE"$DD'p#+-,[RG1rJZN!!rf![-F521f,19!aP1JeCLGbC
&#i2*R[AbiFi8G+kH"5bjBRkCGJcH*`U2+`E6BRr29#jr316J)pJ'h3%h2bRUr-`
Ee1qGEHpI0j08aaeXiUSN12+A'@e50q#e`'1pX`#KKAVKS[ImVS51'6hjc!hMrlZ
R2+X$pbN&&HRlQaGX0Dm53m)`q#H05l$@A,J,)cm!)H,aDY&#Mq52J&AQq0QPESc
!jGajQQaa!cI2EBIEY2mMR4iH(eVTbq#"bqj"paNVfJa*RBqQEF')%dI)Q55RFL`
hG,Idjckp6Dljbp$bBKfH2$STa6JG6,kPd8%Gcfl-EDV,*BQ(NYaj',Hh!'b9i#m
lY2T[1SlD)E&qQY1SZeFQ`&AG2LT(AC(UZd91@AVcN!#GUCVIpb&a[blkRC!!%-*
krhUhe"1ZciAp&K4Fm%H"$Ai8"Zc8c&k*-(a!L6D)r"k9[@6Lh2!p%$*l@P&-VhR
*S0qq#0ViK6NqY"SZTak8J&#Pd[K!&%Xq&CN4DT1D-rU&(MUjJceKkdbK`%A6ep(
[J61'4a0%d&4*RJeNRNUhrVf+FQPIXh+K4m@MUrk*BF0lqREYaQ1%(e'$q)hA+QX
+P,PYK@hRZ%TNTRV[GTq5K-[6)UKfMh6FeP4G@BI$(Aq9`DB4$N6TI`!cX&(#''d
FhYV02U3SAQi!ZU(TUHr4DR$)eM$2FN,*r%QpBS"48LQa4(K!&BRX&A[a@hBA`21
ZPHAPEEp5Z'phe+@Fm$RQ&`Vq)`64YSGN62G1L25YMQDCrC@PekGrPp0bidE)Tqh
mQqh22SANdSlRq"+M[@f(VVDbe"RKUV'YCX6b"G!m1+-9-#H&LFq)-"HlECelhDP
81$Q0PpdD#mR4Cj&p4$+m+Z`4`UZplEKTGDmVIpN+RU(XK3I+k5E9H+[9PN*!Q,T
`CCL+fq!mP&mb#3b4F92mZZNSaZ,cBCc!+2A)qK,616j6rKA@l6%T'mae[9`cqJc
jZ6eUmRZ"GqBeB,3%I)#'V,cA*ed4l$NTK-VHU(@lK#58+J883ACcQimZ,E$HG%l
1GpS(SpBBkJUM)3lX*3!(h+EkH%ZRTKJpSUb4F81l[rAc9rba%X4Y44Cp','&M"M
--Td*)iD$*0b0AV-3Gk[dQL[YD6%RekH$%*1cY688(BY&e1l`pb(eJTT-P',#d&Q
YYkVXaN,1Qf!B$EL,[INf%AL14P*9F`a#ED"ZjMB1"r0-FfP-6jjB8Bq`(-Q`k84
VQ,rB(YYCej-TEZH(m+3qLa)3@`fd-k8i!ZcNf6Y"QlV,lH01"N-mSP+X[LqTmYf
S!d*%G$b1q3KPS`f[h+[i'-@ip$0`kf2FG'eHFHD[qk@&Q5Q4*S(P@LM-H0E*d8%
9LXEK(`eAXU,`B9YlM#UmGCUr[k!5Pr)(XbRB9Z$-,4cU2$H"P94T8c1)%@D#Vik
f[MZai1YDM9B3fE$+h"dM[YR(h#APS-XEc8E4K"XrBfN)&b(E0Ip(TbrrH%e'UiV
U"3cQNG5-H+6D`Jm35CA*2'8T&RfYar9!lc&KqPd#Y9T@ra,DN`ZEl'&PF&b!cSI
bk3DjPV-D#KV,4J*QSlNUdDB*cI9cbTr3bS`!USBPp%ScITMC"Ld`9jF#IS%MR6#
`b3aZmmUGDr`!b-HdIb1LUB"CF0J@f0"5$pe2Ff@I'Z)kD#6@cfrrIGGi!()D3PC
@4q3'(5Aq$!aQ(XIhLJd-$F,'Q*A6#d(3dILIN3H4*THZaY+Pl%G+a,4,dX6E[cS
G`305ej!!6@C[Qr[Jk56QF(JlGa4Q9B[0cf,Mfc6`N!#@bD-F-[I0,3I$29r"Pl+
,53Hh%5QadQCJ`bQDh`CcjFH1SZECAhFITbT2ZRhe[-'iV&cHNX``6SScc3E2%Vb
4heRZR[!jTPq1-`)8N!#FSp[rL6pR+I)93HHMNNP#f,3l)2b8APmQb4Yj(,mlXa"
eH2f-c2SrHVX0G,D5dZ"Xkj!!-HdVc0l8"@KkSR96rrbi&Y8&0jbL&Q@lBNcAPR'
@J6#-3k!'%D9hARG+9prN`UEIeY(SdKb+i`Y)r"LTiAXqGQGY$Kj!+J[U-V*N)8&
hE,b@BmE)!DM-lcfGik)9V#2a,PH8cl8Up0*NLq(IeJh`G'Y6Y$)ZP%10Pjbhmid
&+U'D1ZVpH'XmkmVPSLlGDiGf6STdmD0k@hdYm@`GX(mc1m)iMU8jPk*cPFJJLHe
FB9[0b(9%h[@'Y[m@X[8K-mp([dLB'ZlD*iHrlJi1d"C1'RMiS8%)A8C$barMHHm
dDfXUDS!bT0"(4)@hrA`I`m3ilUPqG5q5l[SjHlBJ!8+qGjSFJES*bSm$`#`#j[`
aX-I@Blb53+IRS$frf+[3)!83H,$)r5fjREU5el!M'!L8HV!)qc2Qe$cS5)NbQK4
P"FD'EmZ&FcPMfVL-d+)[SGrSVF)CKB$$i#!M"ATi&D[c!8Ci`66-lJ")*Ke"ZKb
+C4+KZ#m$DVJ%2lGb#R,T`p*+eNVUM2l*`lGeJ!'kb$$KH@23jNPH#KCrPX'XC45
lr5UQLD-+Hl@IrbAX*6c%ECq((L62,0RcT&9-!S0I!DRE3"@`UaB'pIX5mT68%ZR
1D(eRGC!!+"iVBHe`j@(h@iM)9*e),TR#VLVS"FcJcUD4&%Sde5F"D[9a1&rLBTE
JfBBZNX!,[L@l'&fBfL,Xk)K,lCeI[a+lY4dbmd9Rf1cV5R)+4F)AY!ZrmhqcEPG
,ZAp$(*RGVALRf1&Vd'1CmqbEGmB5NdZQlJPi4U%I3TjR2dE58d9mml)R-YK0U-M
4CNHk!TcdLGKaH2@c(d*fA#9ikc9`Ze+clLY(m6T!Q%pIaEI`AD"QZaa`YdRS4aV
A6+cT%X-lmSFlh)MDAPTNqMA&K(HabkB&+@NB8ml*Fi2U+hGUXX6NXC+`RY1b-3Z
ql&I3V[`qJ!#CT8!plR6dPUDh4V,[`'(4Cr,XXrR+J!H9(Z!0e+cc53LC`BXj!rr
ddk(LT9*&p$qA"N,S$Q!!$55G2ckDc%681U$UQ$JFC&`B1XZKlmj%&dDbJ,8%"1V
!6B5GT#)4B*XXck9XR8h@QchBe)pI"dQ*NFrek0YDeH(j9&FQ-kT`QImU92rQf69
K(kc066@3!)T#YCZQ4@&3UVTU2-+epMdd`$,&N!"$#JRP!B'8b4[(3XB)2GE-X3m
QL%iHc,E5'AEF*@CLJ-P!FF4QS'fm4&cP)kIeceDLaLmjVK)UYd6)*2[UDL*(IjJ
H'ET8l*ee9qmXBLJ*d1)hMJDN++2@a)jT#Jf@[JI'(2p(9BZ`#D3cY[15D8(VJcE
c55!b[Z0%&QKP"Ni"ZhEHUPPBcXDUG0a5"A!H@ep"@q480&e*HA'e-@V2TTF1U$D
G%0&#Q8kL9#q)B#b`Qkj#AEG8mR9AAecaaA$A%Ym(H&fR"p*k"&*09L6q#5,`Mch
0'hd8305"$r`&er$Zr*CXL%J85!`)6bBUT(%r($KaJkPS*RU(#BKS-8fKG5p9@,F
8NTp3PdPfEFmq[@eRIHUmf`pqNhekc%jQ$$9#Vb+3!,8eDNJXRIA(mDV-&l4pc&"
)@*qh5$*,8Z(#BSrml[ad!mHh`D01$fI-2+A[VSYQG9ljR-%TcQIfp6+ZHUmkTK6
A&bDP+"l)L-M[&IMcS&mMAeClFNBYp+J&GLaYKRMfC*+jC#F89JIb4$"%CU#ki6!
+rFd4r&Lm(kaPc-f#m'*936a-GAUHE2*!H`TB244(ImrBH%92HGF%8K$ETGH3!#h
b6f3M$['pIam!0L+b!1dQFImqJ'qej&,M)*5QIY5&@pr0He+*02G4acbQ@M'SraD
)99[MVGAU,ZL@C-mKiQM#XG39f-'NUA$EXGcMb-Yjf)b1LQb,pSMpJUe#1&Tlb"I
,i*Ul5a0P33GX[@l8PS2qK&`hGX'NBq*0m(S8rS)`*!`2[qYVjqLBafE(RQXq[!h
YE4E4@L8c'c(I(*GbNh,K9NJ'I+Sd0Ph151Q'q@E4KALT0$-H3"2EhP!08hP63&P
0dm%0,MdbLFH`QCRM(*)qhH&hkNr%'KdBKY28M-iNN5X9$iZM"9,ikkIApdG9"#5
piC-a)NeG$J'"21m+QRNlKb`N&"`06NI[4$N[5G4T+EJmXRZFRE)S[X+V4PFJaT@
KqVSDRlP@3BBF4ik)FerA%`TcU#dBN6rFU3'YTJi8lJ8G4a@ci5STN!#AE9@N5`X
blZRP&p5S$rhU1$%)BF()Xq+L!kr5"[p#c3XJlfD6JS"rRaBcB(@qda"-0i[E[TJ
!JjaaP`SDXkDBmZ+"#GXBEBX[fN4R$'`qkKE-02-MV,)Y3MM96Ha6XLd,6S!Lh,8
HZYm`X5Ka"XYUB@[#Ya3rbmHB+#%`k%hq'9#Yc*Nr4BpA8Db3!*V&pH1fPT!!UqG
1Z+bDqlQe+qX0CMTZVDC%mU,M6mh'GpE%Iq)4iK(eaNThA+CV4P@Ai)ik"SDAe-e
DqqGFmeB@$H44*FrmAAQ1kCJ"hH)Y)*ENYKTFJalX(00PKQiBV&$jiaA%d*bNcm$
I5r($l$0hTKDCBY%9)L4f)HL6'N`hdmpa)RQm4VGT%b4TjDrjYTZ'a%1V*l8#+*L
'4DcHmhbq%hV(0[#bqJIH3@BcXkQ+'Xa0X5ZfLlb`(DIhZbQYET!!iP3YU8Nj$G(
iNj&"B[HDkV!$PDIDFl-Rc+P,,RV#ZcpkLq#aMqhX&DP-H*V6b&q8P0Xh)ebpkaR
6VR"1Vrdpf$c9S(2d"qJX+AqX0526kN#i6i52qZXcb&"U8SL,)d"`)Xq$0bqqSX1
ES+FG#d-6Ha-`Ra%p"q9!8RS-U`P35DHPPIk5Vf#P6mB`fpXR-AeU$EdXkV'"+U6
*%I,HG%4'@&VhfQ!ip$Q!#qNPJY@kT4kNPAi,A[bGN`p$'QrNM2Ghk3mjf&iTAVr
,YCiEX0,552Q0daNe'KQ*pah!#2+93rA$abT6FV"$30(6N!$a@3GL(b#iQ2!&K,2
bUi[rA4[r"R&HT&'caPQED'l#BR&UMRp-PU[2iKH-!#a40jZ0l2BFkjXACeY4I-h
bSDHLbR&YC[AbYH3AcHbL6`IAL44&DrS"MLpi%$aa6b6V+Y-D*aI+RU!c6EbGF$j
*%B*I&d4hpT!!'+[Y-'1d%jS096LZSXY$e*Rj3df@LY'A($0&I)DA%&J[CPi4&*V
rZJ("A(@Y"%+,+-G,N`#I%(@U24B23i(d,P[#r0hXR[D3!#r8M-FZr&Sa58p5lcV
jf+QDNm6X+a5Q`G,SL'T*FC8#f,Ul#Nr6Z3Ab0a%T2Zm`%PZ5"eB09Eda6bMbR[B
(p3fk("#43X(@A!(+[aVJQl`XdU'+!8Y&I,b9rGk'9CQ(SFI&MNBk[h(j-Aq$h$S
XH(H`GZdGK#Sh8JfFM(,dFHMGjm%NJIl5Kra20Fck*Bl1AlrX&!VNF"@4bc@`d@"
V&M(&5JkQGL*QNFH5d"+C1MM$iGmE*KZNJB[$i,45,aUQJd1cAQ"R0dcdpk20+E!
aFYF61ZZAJ@["9GAmr2ZJMF#mjIG$#$dcX[!5%cPhGeILXT-eUf+!35L6A+@l*R'
*HL8$UE-0KX$ClD#2e0'#GiB3QT(m)m@'a`,!K#TPYL"N(R*b"ma8C)F"@pkBqU0
%4jVq8BIjSUI"jbI*f0950hpA5R"S(PVi4XGCU-'YUKXd#jIRIk"0E&9i[1mCbe3
beLdH8"TDZ)0lXk'Q)B%!PGd`%m$DP@efTLAaAC&rK!B`5+d*"!iX0*!!P)e8("!
)"%VZq"lI*j[kS*VNBl,e#ER1QjqSj%1V'#64&8Xm0,qpTS*i6C[DHNYX4UN'rG-
@6e0V@Ic"3",86*Cmr8-$49dYjG)hpFb[j#ZXZ,HqP`1b8G+`UbPT*A!AZKX''`p
0KCK"-hA,G*YmTEje8@8kKGV8!N,A(d48l3MfCq9VN!"EEj9!5XlH@Ge(Rph"Lbj
D-J`XCBeV34FBV--P@S9GCfEAK!(IV0C!QAr&mR8$5#*8NMJhXCH2%KClGj!!hYA
KJdLF%`KBf9C2mjf"pdf3!-QcG@!U3!+aA`P4D$5*kBmrbLQ128`M(kN@pT(`L8l
!M`@6KKdG4p4XHAK,)!,ld'Y+$dfK""r*9a0LI59GFm9VVDEl9ahmb&QVYVkRQSU
%"&p55G@LmM(DT`Lq5PrV)-V2`8R2Y)K0XL+c!"BqpZkYFppB-QGk"#`dPr,Jkje
ZAhKTL*i'LMK)Qa1Q,KUVcYZ3!,$aK)8CP!FqYqrSqS118eBN#&,`KChPMB)`d)$
liQV68Hrr4Pic1lZIQP!92H#ra--*ePbrjl[qlUEM+k5pM68H(-%JAdm"&cVahKd
fk%`IBASQ5I'd@KM+c--KM'ZrUc8)B$1@c`e5J$[V,@'0M#&Jem"qj)Ecr5IIdHS
L+mXY,4UFTaDbU25&K3J+8p'!@JAXcc&XYQ53!"N4S)`Hf!0!C"D+1MZS)RAR$jJ
5fYiCAQqrii-*Zrb[E1bkNfa%E##'Z@R*Gk8*1YheZmm,FZ!$(3(%aLmACPe&#9T
'mf+'DrNfmS0FXL%2jPUAS(4c+3!"`NkD(!fe5m6(M2`$$V1Pp0LrTd"MAbm%`88
05'1d2@8"(fmdBj3jkF!EhrR3(Nd13K!)@p1iEElYF'k@m%R$bjV$"J&!+-TaaCa
lZH8V)L$bCYC4H[T8%p`p@BFaeX1K-N&mbpp##pJ#a`f`CP"h#j!!D$(a#*)D2eZ
U64YL,,NApC4DYFYjS5j"$Jb@m41D[+R$8JMViZV'AZK)&BL4FPPkSf#-R$EI6Xa
qNf"+1p-VYD"fYVAC-QBG)Z(K-RQH"8p6d)RQ9LTJ3-01NIkhaq413jc4DGP(e-1
p#&ZECqJlN!!Cd[,82FGTj1+BN!#Q`iL&pb%Y6q%j2PeJqXI@Ak*4(h*S,cNBD-`
`jSq9I&Y,4)dQ!rRaC)1NCRqPL3IXEYp8jpQrq9JTURVL*Ud,[%pUekL1ZBDTEMp
)'*-f-diK"*HCKjH!4RE%b(8$fYJU+1e)JqK2[&Q*[iFr[(IQNEJ3LVSSr(i#H9#
LSEif0M*dRmHD!M"PDYKq@qU3!"LUYccD1Jj$"FdaAH1-DYY-C1qZPUN&d,EQmk+
51SC#@Zphc*!!#A6Y*#23j@+BHb3VUqqF,*V*K&GlkE"AJh!MH2#GDVT8K%C*f@6
[[3Kp@R5X3F!br#ZZ"TY$8&X)b2j1!mq(UrTIK3k6rG-l,b'6@"H[1PNY,`l$l`5
",0*2EYUJ+)IK1)9[%k`,4i9Np#8LNc8pSLF-Cd2A+q1fPK0mEFmqF@KFRm(pf$8
P4h*)4Yh)9fE-2G*kJ6lAe%@XT"BPAla6UA8aV*)T*$r["H5`@&-,BArfr4h@"S'
@X&*kQDj6q8!'09ReQ@$,XKH04P*ZI4RNIP5A2qehd%KprG93lU28UYflb'ZKL*d
*BG@qIhIErTJYib&Sf+F8b-PcT2LqGLk6L5HrAVeRqAD419j8&VBl,lH'U-iV[bh
-#dL,&563rpVf#Nd5+8kL&#S)FePQmm[-,3HPjJcY6RHYrGcPVk"k$SLTHA3kear
*p1l-#NQT)bj,S)VUY`%4@-KV*a2e3!TV2U,R!2i85rM01er1+QFYfm5SUBZNh!Y
(Z1VN(hXY9Kjp5m5H-2Y@(aA0,4J9H6pSFHF802R$4"qdB`l3Z)P,BfHlY8e!cY$
P[9QVB(,+(i0Z`EVG3AIPT8-a1h&UBZd)eTSU!&kbKA60+Y20``1k"ELkQPUMALY
-UYJp9YR6ai%S#RK$QaAI(Fl4mKiK%(5b-"imHINVi4lTeff&-6K-GFi#J0r))Hm
HA-T+f62bA@D-h-Z3!"BcfL(*3dS-GS6G2d3XphF[QiSm9k$*2k%``M&"-$#`#UV
YJ%k,'hhA9!$4rP"mHK@SCS+ZlX@kIa%F9Mm3rG')28P9-@S4NQL[&*[M'MjqBL#
@jRZl4elphH29(D5qE+XJ@eT'&b!58PqYl4)92!(C[V([VHIANXrJ&9LZdl'e8e(
JT'$Y392[q9jf*KM-+P5rP&-hJ3DCX(jiA%cHQ*F`rS[3""b3!(KV3b-eEU,9m!L
X5p'V[F4Zh,!Se9j'm"*219%@T&NQ)9a@`ba$IjFC`#8,`dKb"LS9#jYEIBCpC&c
9$6TY`Vi983`3$!@P4FLB+N$T%UKjNV%U6C)q'm&B6cfqi*!!d8kcIq8bei2EVBV
5$!lPL[!f*rk1"aidUh@E+2qZeKICK#VQY)`"2DG36arS$R!AdY1$F-*D'qVeEj!
!JBN1*aq+RYCj+IGE)pSiMU8NR'IS3NkZiq1VLAN"+PUq$B%+JdVJAhj6RN2JmYN
N4l5EU%DU'6!p*p&hpDehKY%,iTi[!+L5NcSMd`[,h,@&3b+ZL24f1,QPXr13!)[
*5%PmaHR%kJ4Lr&)ZcA@cKrA,S+YC4a"be#B#3TN8SD%I%mmTaFDriic%Fj92pDm
Qb`i0A%SAlE"CmTjchJJc"ZP&"4@&0c19EDYHS1b9P$!#Rm0j2$DZ44p9*4Yp8Y3
HQ4mL83bbR24AQA(YATN@CS[q,`GErAGq-SD!cX#)a9Bpl)kKEN"Y3[XIV96QJIE
mc,5N)VAR[225i"*qXTr1p-,aVA4(PYGeZlKFFqXdm"`(Pr+'BMA)0YVI48lQ[qD
M,mi0I5XrhAIb!l[[T,rr2FEHKV&$52j!*k-D2mjlMp$ij)4I2Mk,04@%D&(2Hfh
@Z*hRa26("d(rmSmm+Eeq'$$%kZGk!MGePfD%YZKXr-1[SL%L9J[$h*Bi#4PY3#"
eS6E1M2L[MJ!#V4l'I[&18JVRB8T[IjI`IfBI5FL*l5`(KZ-3-TEdTCAYpEfh#*B
#NM!q`Jc',eSiBPmlQ+Cdc,Pp+j)XDUlQ&UU%Z"2G2qZE,&mc$k!b(+"&dlHG$FB
eTIKRR3!IJI26bSl6m3[!QR'LaYh",me0D1!&-mZQ#Ur%1`'peRle8%5p+Qj[SK#
Tqq#X2(E$JcU)5`ZLhBN-PRbf$kISQd*a4NcF"!aZKJ-',5ET0)8,YbTTBQ(6*&3
2HU0Bi3hMX#5I1@fP@"j'b1R'(#V[KT-!@eNjGSVHBid"$@2FU8[0U@8JJEAIi`J
KG$QF(k*GL1[qEDm&D5(Ef3a%2Cbk`5cNc0IbRBTeRj@[,NH3!&!e&32QX!@dN!!
d&bd1p(@5360fC%X6lI+QGa-q5j!!&3Y!BFpR`GNc2B9rE!Drk'Ml(+&qfCdNm`'
CUl4(pQ1fPUm,E$kSIPSTEUe*)K'6Z&XbEN89aVR"-Jm0'+RiLD3UYLmk-XLR[4e
M",6U"lAL+EpAX+P9B23%q`Cq-HHAT-d*'kibP(%rcCaJ(Ek(*d`+hP1L4mY3V$H
EPpqi5h3NDJY*3Ak,%kUDb'H3!(%$-CKT2*6Nf(AkEk"aJ`l-i!T#L-l@RpFe$S+
IaRIhFjr,+bV4bV"V4!G&1)kE)9d#iC(Vm5L5fHmmPi%N[K+l`8paK+2fFa"Uf8[
6Pk!-H#i&S`690pP`D0Imd#MB,5#3!&R[3KraS9Xcf0'aA`S!5dUUr!50bb(QdYp
Cp'[lXCShlASpmYmj1rb$M!N[EJ!JK$%CDm8kqYE"&43G(Sd$6!2356iL9B)93,j
JlILLX6$Y'V@m4ViVPrDBT`)r[ihkTMTrdNl(cq'A`VTU52L"(ir,LJ6c'1GQZ0"
%D(kpY`$j!f$(qMV%($8p,FX'*K`M,6'`4"eS+,GJEfRP#a3`PXHMUE$lcBeaq#Y
,DLc6l,jGA`@#0%c@E*60NHF8D0UMRR4P'VRSaXINF1*i4HlDTM"%EK!arXecalq
A#F3EJc0RI-b8rF'r+Fl0["$P8B-ZMRqBR9-,3956DXd3-[Jb)0,@V)35a8bHPJG
GDadapdEf2#XX-T6I"rVa[3AC(ICAqU`SZr&hd&,1iD#QQ[TqfkQ5MpZefie@HSA
f0aYTU3C9ccRmr1!f1EI9,"MP(&qAMAbSAr"#V@A96j,5%iF")@J6p`F0&NUaV2h
K2#H[D-PMGXbVc&25haVe2K5FHRl4%+IN#lcDEN4[TdEq"442BlD4!ccQTlJbS05
bc#UXA&K4cE-BC@$$pS%9iNPX!KE"m8PL0"I6UUfVpDKdM+'CVr%K"GLjGI[I+14
!00bq9Ld4Xil&*%QP9Cq'hf5rhJhE13MUK+!+Xl$Y,cDGEEqj(M*`A![`dK-54V%
'YlK6BHbQNKLf[82l&0b*8(BM"V2a9JE&F8X@N!$b$R2c-0VKj!rGV3k,eeAY&RM
#BXMYa`$UV$1KI9I(M,$5darjJLefAUI468r58IAKSQ#E[350IL$k*D0eFm+F+mJ
kB-JbD*("1"29"(X@Kl1UbGBaa"5TZ'%+Zk!C!aV[k%HZ9%hcHKAK4J#[8I`0BHc
cle3hN44Z"EhZ*Ejh#EJ8X9mTG#R6ZV+%`#XYpFi&a-p+%QG`Q5Q3!!HLkrVkC3)
EAe+k*,ilV`dZkLL9!hRqX34#`E#IE99Q+kJpUR$*@(li(X'laq'+ZY0RU#4+4+Y
B%jEGGdPUq!kETm,YGPmU1$lDJr8L-a(pakPH*"[6YrTJBf2G'F2Ie)"A1fm4Xj@
b#K1h(SS+K[QEaRY8aFd6q8dheYMib5iqicGH$Nj)FrAfl4J2+MVqFBZ%Je!&@JV
6'+aiN!"`q9qpmZS9MQNE%cpbbKYJ-X(RHK'1`89HQm@QMKL4RZZZUY"Ye$Z9L*B
fZ1mMC6%l2dbVc-bX3ZkdkQl+jiQ8`EcQY#GdSfpbi+iE&QBTMPjrZ-HY@-9TfS`
!,`,kr+AB%Gi""feE$*[ZH@ecB)K,I$C@6!0p`UBj3&MIF)9dFBQ"HV(GYhX!IEG
1Y8qJp-53!"a&kmQ&MHV"qI$Xk0[Q'$&E@H&BF00V%1maBZdmY'ZhI9d+P1rb[c#
3!,9@I#4XK6FC'mID*0&"-D3YJXLRSb`[1,8A['KCkTfa,lqUTJEX`Nbf[d`dZI(
$#kLfQEc9"5C30@CI02'1*C+KE[6AqGX4pITki&D+ZNCBY!5--mL3!$%SaF8+V[Z
*FBALhracD65aG[bQElpfV-i0JiHr3l1#&#Xa#bl54amfSc!V[aqVhaGkfa&Ml!c
H"Mq"E+5Q88[NbhjX9al2!!'8hBARmXE`Q@jG+IHj3YY+a#ie$9hCpE&*08l`3@L
S+*24Yl8Xi&aAFXcrj'iH)[I'P6bdA-Q*,R8bAUr1NfZUU(BXTm5RhkTNeB&@4l(
9B`dGLI"5rK-k4prB'mcNBQe1ZCjAe8B'M$!3P5l#Gr'LXY6dJ6IAkHLU!2Sdm5*
9AriJU[`e!ci@KD&dfYae3ii14B8[iU$SHl%Tp[QQ`ePHSb3S`9XL2)pK$S""c[C
mLpJ5`*Xj([c#iY%ET4PqSI`SaBfmKh(2jHCC'!414"2mX)CTLlV5+H3r#,jmZV-
V#DKbh$+P)RP*FZlTPQA$reCFCm'J&3kqIReH[U-FR"dQL6'X2j,)-PE[6FRc*%M
)URpB1f,IG5%)$43LC0YMh"q(@e`IBbjAa)Md5Pa"`l8R$9$6cF4#*dh0,5Sl%(#
L5Hr3j3%5[%Ld6r&$NXBIiqc$Ckf'GSY&mjR`cKCb91hhXKmYIZG3Hhb64+Q@V[@
P2eTHeL,lM@IQc`ZYfD#%1%e"$Fk`Z1ZmIif1lPP4+c8baq02PP'#5lB"Ml"Yq!f
)YZa@5iRQ@Jr0$Gik1iY&`lLG!a2H0i9RmN`!`'4MbE'1k0(Pj(1`!HZ%rR%ZFF&
j0(lGSDdD0,Qp-p2()EGKSj-`G&)'dCbI#(j#pirXQ1KFmA4Ie4"b`JX&T6)m%`m
h1*!!2Cd#!eY[-[LNqP2DXJZc85,EJ'1,p8SYU5i"lmj[i!4H,*b+qbKFXqNh'-)
Nr(@(*mQibHq%Nc*@8fi3Gb`k!i")dbbaq!F%Jj)`G`)ka@LKV#,j2`r(k3Lq[N[
lAp!rM+8410@NXSQ23qE6iYA4T0KPjM29cLSb)9)H&f"J@3@)NK*XIEKY!q20%k%
KHr#6l9Q(J#&qaQfqf-E*Tjdm3[P2r3D@*96$&r8SFH[bT5kHHS,,,IL9$YG&%eH
EP"lFl(E9lBh!hN)j@cTMMK[mB0h(#pZ2[IN%("S2HI("0iQ3!0N%YZ)444iQAq'
YE``9pqL5e5&1SiCQ9531X@haq&+K*L@BJiJhmhpqkF`cbF-klqA@%6a"ClQ!T+Z
U)fZjD`HSX0rPSJl5fJ-%TT9V3L!26AkV3f-E2U&@1-#1E+Qa,ddj&IfGkD&*Cia
&'Qk`$qF$6B(6UGDQZdI)"2H1SSeX((SCGSKcre'e%ml"hi0HPb9'l[(,KSHN&LI
dU,SpE%FEP4"iZ8#i[0XG`HU%-(a##0j48G%C119!C%bM&q2@jjV028UcrJG3ENN
Bj!QNf$1RLB'HT,CKf6R0fRcA-#mqLZ,!J!liB4ZRa9eKGK*lI3-iK*J[NK@X)6j
E"aH4$Gdpp["IDHMbYf'8%H422r'#(TEikPR#&QRK,"ZFl`3`Y6IY,d8%2d0k"XY
@k0@[d2f4qe-)A"fjIE@&bA-RrGVfBTl&B)lL5)i+1DY0`Kk3!%BhZRXIqN"0&5[
V5NPpKLBRZG)p3HI)43P#q!La%#M5FQ0FkUm(eQihY*SYK)QRh!XQM65df,"V8TF
+T1Cpf`9blQ1Ie@3M6DMpUDkKej3XiNjl@NdT8AQZRCjc6rq&)[+i[DM3EfkGKLI
QdMKp,ZrGUk#&P9D'AF+i0A$R#(c*ffN8&$5RcdaGCD)*bG%mc1&l,4PNQaTQe&0
l$+hG)#NQ0A4RArkhmhS4Le%VjBf4c(+pRL3f8QKQ4Q"GqIB*YMjlhA3r'mGQ8L&
fU`TY"BC'6Q`4m!bId8j'TN16a+)bQhB9b"CRVlJaXFJH993@a!rTQ(1JH[Vbc@N
G$2[%ZU9d#FE)(**QcXrRYPIk28FD6+jB%fh*YS,39jfSC(ejmBefB-R(+&G%$+b
'ZkRr&+4$l-D3!&CmpS0+S5)$fQ`,'le1AC4fY'6@P(l#)cc[e99&1ILi0V(3H[M
L+d8mh%`1YD'RQjpRFFfhqT*GCUfaKV[RY`dA4I4!k$XBrI'4ij+ePCf''kbYaQa
F6`R*+&@T2Jd+Y8f'MPrRlKR)Ac3F+Nr23l'09*l+acl1f3*c(PUHfaaRE`HL@-1
Y8#YkR&r[DE8@RH,RCcYV9f,m6LMQP'KLC@@`DNDp'rB[P6Z,reK3*Q'"iik@5'0
fk-2,#I5)US6hhcETXq8Fr9P)KAf+@(pT`kIlA+8Qk&%dE9'#HRM5qA)'K+#9!K!
VeKc'4Y&XCeaD9XH"0E#I,--G&U!)G412Dk8qC-K'MT%@3d"lLJE!3"3jMH,XZFH
l5DMPNP#Hb8$fi`5,,%8+0hU#ddhGk%8a#AHQ[kE((1$jLj3c*EhjI!d"EJad2J3
l2I,J%%E3#Ba0j"S80%k&eUjEkABUf$KBD"MD@dD$5Gk2(a"aUYp!#N,p4(hXSV$
([EmANSk9hpkhR+*8lmlDZ`d`,4IlCh-Kf%rIVVcDJh,4JRUDPK'j(SCZJjiG(q8
YZR40R65"-(E5"@q+a"!HFqXP"[V4EMJT%Lp&8a,UHiK%(k'!bfUQR8a,S`Nq!D2
"emIT9eJfSq(*aI'*[hjRAhbE8kJH[&,fbh,Lf11I9m8mV6BP,)%[Kp'B$SFSVE[
-b*4,GhHG!GB,$fd2Vq16UMXCEm8drAm`*qdPS2B$3*0,DMf98l"(((Up"XPRK9l
G36J(dGMRhNR&!f(H*ASM(lX`&K91S3caG@R1Vb!'e`qP8qDaaSGYeB3drlQd2+,
6(HKAGdr2`mZ5DdZGGQfPQNB*@)h"M[YEl'20J")S1+$KIfT2Je%FB(Hb,klrQRI
KiX,RpX-rDR!TBIKrBNBjU-c&2h!$(b`[L$VSDd9jB'@"8+kIVYH2mVmjHZM"S5r
-fFC"qLT362JBM&ir9+m0UchL8mLVcGISJTUl'4C0rqp9Y4eRCbk)j(p82B@!S46
k@3SQBAPl3lB4RA+*Z93VME"56M0rY%B$eX`YG6E@H#G9105rp8%PN!!`[D*D$!Q
P8V$3i"SV'H%e8q*EQBdk&b8QIT@3!)!9K0#)8iA0i1#Mcm#,Kb#J#1(ZGp'kjeU
NL2VVQhAXLpM62L"*D3#TNc@a)kp"rNTjSZI604F(Za29mI4'+lA**6@#ZrU'Y,M
djj*$95"[5mc)',[qYV&+p60961MXdA&9T8r@2eUEikI21G@#*3d!M2G*m[*c%Y"
[QR%PAQ+Fm!4Y3`JFVC4V&[Ad,B-#Tb"f)bMJ&+UGP`a8Xh'hG"NrjE9XZM5LbQH
BKX58R*VGl1,k6JK#%TQIRQAqe'q%!0a`U4'`E#%*'FqR)bA!K+F2$KC!rVNQVG0
RX0*TQPY!q2%$8c1KhC4`M$j"&MFa9NDA9TRrJBp3%DqKI5(!bklD3j&UN!"*Q*6
bBjb$+Z-[LeiAG,#kp`9a$G!KDb)AA,+D+MT8UC!!J)SVI3XS,('Gmja8-NGR`XY
+SKb,,mF8CJm-NGRJXlElSa%2[194@DPqBlNi2+X[Yai1`aSpV(iRmPe2UqVN200
`#pbYHM635Sh($DqlB5h4Yi`X3LrH8IYljZ18mK*rjljkiJD#mj%VD0UY(Ll*"16
b[c0YIj&FXD4mlE6lP4`eG%'Pk!`[R#lAa2H-LK)[qJaKE-,)IVmiJUKbcE3jM4K
&(r'p93`#NamU&HfKI&f&N!#H2[0`#1J6G5QSR2aG(hP`!(Di@#2kcZLAF![#HS6
M'8+-8kZMDL9"R!4kq4%NUrh2DPqBU*X6*bE[`!)5XRM)Qh+C[JS*4,'",J84CQK
pZj*f0H0(+"D@XH*C&VB)-26ZJapIZr@I'J3+@DbbR`6cFC4T[[q(2F+#KpTj&hS
PNAmI#'DiYpiX2YCN['3E5IfV$a%#&JmNlK)PGhKB`4hYi6mDiMfJprA(1IJZK'+
CA639$RYiJ,Y65BZcf39ID1@%h'@JEL$kA,Pr"IeK%DZT8A"ME`Fc5K$3T%H@)$D
Yqb#b938SS*Ta8[XHj$HNEGd4bC-iJc85&DmZrT-Z'DTVI('P3ZL-"-f$HA,EZeT
h,#f-[CYkS"#PZh-*RE%ALVj2jcc(D`8Q3PHK5L0ClqI2Y[lq8+`QMXY@4-elZGF
XH"-m-6ki@`IU-(#Y)T`VdZj+ajlYIfYKSDII4ql(hh*4,HPlUCl!KTJH"iB%Gcc
CE4lHrV!QkJ4mchX+$1jK&8T@LZrNmHKBMhQp$,E)i5'm+G1E,3j*qG!rZPffYj1
B*mR&&%!TM!DC50Xe'GQqTE2R,qa!faBLYJT5i+-kH$(j-Ba!GfS2X`e!ah1XQJ%
XVH)1d2($4#G26pT`S+UU1*N"$!&A'4IQcPQMGcI)ArZhS%f5l#T0L`&#@kM9"'T
Z9GbEY"*&3eGGU4UF-'$*5k#UM*(m1'kG!,AUDaE%e&j!&kfTU1R)IihR(J[S`a3
F)fr#f)ME9!QQ8QY*-PrHaeLCMKfS%McimHABLAY$`bTPMcFpCEEKp1j*lpf63N)
rU%BZ@p8%m3CJ4i83m`+j,PLd%(p$e(0Y)0LI$45XGmP'*8jfZEZTJ&-c`PRKTeQ
iIjHTih3#YN#P$4)Pi5+"rIcd3LHLLiRY!k`GSiq[8F98Sf&!5Am51Dp6Ah5&ebf
q#2mc*2C-4i[jRqJ#&k`h`QKTi%!SGiee1S+R!FIrQj!!aBqKf44EJQRpqaR3FFQ
@#Q@f2rhCTG(TaYU8Y2)hpiEic0HVaR+kT(`dflY61HhZ)&YEM4PRhF!*k5%ASDJ
)lNB#Y6iQ4fj$Tf#S!llN"N6)S+9D2)b,&5YldAb6q-bVk833q,,4DiMc8l,TN6Y
@iCAS*@1pPlfGl3di9JJrGa6100DVpDIMQ!T4"2N+`[r#ZY%1Tl"A"Cm%*j!!(T0
%6a,$@L1TQj,kpYI,qGh8PSHYfE*Ihr4J%!R((cjfj%f!BXIL$p(3!33p6BGSj5J
""RXZ8MQ5bE8I+*!!9be8-LIETbFXI0M'0M$9Y+TH(&EQrc[+CG@SZR!kNZB'YZl
MES'+C%i@4fml&jQTi1m536f'S(H$I'1(C+D+ld*GTd8IQp%XGi)hcT2q0abVT'X
F6pQa'8(!DkZ[E5r,1qfc0fiNkPVNVPRG6@[lDaJ"1F0GRiE+`cpabG0RHlVC&eD
+)m-T`cpD88VQaRGHh%pD"H!BVHiLVM0*bGbhi%2Pr!+BAkjd+3`H)0*q@1-'TJ-
S6-kDfUc%p$4F&4CQlPj65Uep@jekp0jbU["YM8V,c`@PcXh3N5UH&iDB++[3$ha
GcDHaeIc@!'Y8ZQ(14-[E(fmbZ&N!D$iVY6PGZ0lI`(BHE[jbl#rNPI9HQpJm2!l
L1)T"aG3F@GA#G&8-E'1P!ACb-I1)e-&e4XSElfMX*4rTXhE%4NFBJ'ARh45+GkY
Z,a$,C'1D0TYBcJBfE+Um-#h%4rQTH)Php2U!05lLL&,'YUJ49,9F0NLfh-JDX5*
a#U+Jm8i,"H@M1RQSD@#pj1ANdDMcKSiM#(922@d'9#64R@qCG@``Xa8j[mmf%9!
E$f`bmJp'6+-,$SAad6@fiaDJ+"9I1"i,P-pqqkeU@P#UV*U`0-Ir-0$-U!LecVN
JCqQI2*K*"P(5L,j&8L+f&Nc"cYE!+r[ZM5AVS$Ye[i#Al(b9!djA$MlUlJ3Ea[N
iLCQ8$qEV'k1Tp('m,i0YLc8)DPNqiS&Z*)hZ28,&-3L-#$mkcF+GBTPHXNdaEF+
iKN8)Y[jYMYhj(KKbN!$H452C)*ZPT3309k!aSi6!"SDh5)`f',0r@&F3hhK(qMl
SfP,DA&`e6[4QLhe1il$lVU"SEZ"X#%fqCEN5,%hG#M"0'0CCJDc4&`EIfi+IRUF
dp%)!1e`)lmI6''P&5PX0Fa-*HE0(FM'9i22K@2l-&G9N$*T08HM&S*f&UcpFrk(
pX$#CPA'9e'VBU,UTX!Gm)mamJIPl3Ul6`r8fH#VBeiE9iqNVe$)GKZ&,))i*Y1M
9j9ZTLiXKN3*dF2+LqKkKX"R1)jBPT[$-d%56+-6b8U'$ZI31"'CX9p31p1dB[hK
BThfCD#5q4cISd$G8l(bXVD&9p!Cl42[Z5@#6m90Q'i6ejeUDJ0@*YLQKHj[D!A3
3[Y1%`A-d%cR&58DiNJ3ZBHMbDUi3XV*bGX6AifdCjN'dYK!T8kS5MF0RM*6V-pm
r+G&FK63b@Y-lT64ArShrf'#81cP')JLfMAIafYm'bhS!3(pq'*cY,Y&GJUqj@U#
YUHicMhBBL@#r2mTr5`b$kEih6A$TCl[ea5N0`TXSK&G4lD$[IZr)FDEkEmiJ1bC
Dcj!!!XlH`Rf%dQE*k#h@d"[QF(YjV[@YT*N3[+!$'qk8`!pDfcp3#Y*$0[jF-!S
iC[r'GA$8l3%-L1UFXirU%X1C&$cmXXiT9rN4`)#IcP8D-Heq14*PjBfFPPEd@TC
[[bIaG5NVF)G36V-da@14UhU'KHZU"h8eXZi6``ApHmfA,P8PlQ+l'`r#S*DYR9M
b)a"YfN(L)2f2k36VNa3QZc+aC5LqQ*)RH!L&%LUM3h,N-&X3*36@H`0-5[bI8IN
SjG-MPi[E9Xj6'f4*[+A0i"BTClB"QBB#jAaJhYTD0(`N8-jK0B1ArhB%l*NDiLl
iZr+!b*jTIZ+rNFjCAI5dThIk1I8!4"),@T2fVCrNCQ&`YXCBa3*mbq%[YkBk"Kh
4V*!![&cH1VY[iq"F9PMHNUVYL!M,j6MFTRbi4K'JZB-#EdG&aERVU&8PQ%&j8K#
$3Fd"mF(QN!"rQU3beQM2M-VGf)fd!3+@@8FADa00,)B&JaLSk8mi0K#%HV59D'E
@)@mJTT4YlJPa9-Qd6F3L0m*`4LPba*!!a)@)j)V'6[E0"Ej,(bF+UjZ'P&TPMee
SEK-cCF3e0YXY@d0`Y($&$b+895YaGh!F5QrId3HGQc[*%eLCGF4ZU&*Q3`0B$9Z
&L%[EfMk@4-ITNjSf"00kqpJ(Bk0'Hj9%BG8hr*SKY#,"V&'RG-96&dQJ38S-eXb
3!!p'q4I$amjCVJiAFKh@Z1N4"ZX(E-c04Al&G)*fpCA)I9C)0R0,$&GUABNUHeV
L+GB*@6)X5,kr(T5SdN@$)Hf6VF`,8aF$LQkCMREUYYAE2C!!Y4S44#r3q%K[I3A
6DhCXq-b!JDbr%[IISBJi90Bb*i[5`Nj4*fl(kKf19RY2'(`ZmJJRZFA6&EFq)rm
4GK1m"e*,(&ELFXS6FP!a6,'CY2IeA$Z-dGl1Pj6U-08'4$S&RbDImXpG84XJ)SH
"T+4M4NfVPJ'+34F*rY0C-9"5ekmG9DNd%"mXBD1!Ue$PINK'KY$,+",r8JQmQDX
a!&IDR&@JVE8aF,3Jc'd@Kd0(IX0Cd[!IK0D2l[ZZGr#QSc!8"qhSYU)MklREI4R
Be8B'B'%F!"PNqK[4q*GfKK#lMTTMV#Ne0j!!$#d9-&3JIdE4rr*$8AqPbc!kaT6
GRNR%jUU6PLNJUL5TSi&HcbE!Ge00iI1cL$r982UYV!ReISQ$Gmd(e-l&#GF(+'I
[kR($bUq8Z)*p9(b%rf-paB"-`'4!je8IRh*j!)3K&c9&[JVp3+),(9+r'p[GdEF
SbfYU3Z%FH*TBK"*aSLJE1N(0F-XQ#b@1C0%fM2&cHl2reYC)Mm$F&KPB8FrE`4Z
P`jf"'CQ5acPUq@5j,BqqDcLVQm"-0a3pb3ZFmGE#41M)L)k$HI%a9XCaK4'%+[e
%rfSQrF@r3p`mADm"!CA@b(41jNKr!,%bS!a#SB9"T3p3,+f*-FA**-hFTY(ZbHB
jfijh(T'`e-N&#ilTX"Emi+Yqr998MM)(%m80BI2c4#DNTq1LV#"2IK)mP9jCFMM
XSR,c2iV3jVTR#fK[&q(ZS1l8LjBFH''UVUe)2k&iZ(C*b2k[eC`df'L6I!k#VIi
Ti!e4qc8aVJKrB`BIbhkYCadd(RCB@H66'[0cUE8%U$Njd"NqL9Pm9NQGBRcqe84
-K[Jj5Q2DbPA!P5Z8AN6'P#rJh-d![#G&$S1Nb+E9'-6-h[e(21r2'NJh@JRkkKJ
BCfR!Vd5SYr[FX,P`eifHKl*EL"pi*Q9jM6lrj`%jZ4)DU"3LB6Pi`TYm`-PF21m
UqS9d141Ucad@JKHaM,0*Ub'%rUiV&AjaRf,3lkV8iP%$BGV$Vm148%eP#I[1103
cMVMFPTae*bcM8JEId5ei[0R-55T-i+&K1l9'A'@B!`MPU5&Y-J@ERV(6$SlH"R8
B0#3meV-biUM@acT-`1Ib$jMZXM!1qF(9(qN40p,0$ULH)SlJ1Ychr-B5FXM$F9l
qNN,hSp(##0'4k*2"qbAr&(Q+Q2U&h8fA3U%ZN!"V`fe#FS0d*6iNJk9"29[,jMM
Cb2p3lb)3Vp6j6hd$URJBY`1QXhU`C)cQcrY,4S5'hI(`iXeEdGXZ+a`GFM#-UR[
fPPQ2[4XX`KEN9ihp0Nl*8!%[i%+-5UX`Za8K-c*JR4mrc(i[2T5ZXLKa*A6NcBG
&'GZH#[KDqph!ICYd!,%#MH$4GH#k#KADJ+@kq`6j+8B[j%T+i&YDV4GSBKDHRZK
MPGY6rV60@PPjDZ@iFK1d*2%T)QDk)L9a6*Q5hKN5DJ3+H#)U8+2h03-%+4@cHh6
a&qjblK`Z)%1'AiVHmG"q@'"RMID"XZ&KA9bpVRC%SJ'NjE9'8rHIET[@8q@eiRj
0dLEpHBYZ$))KaXK3%c3dNJ@3!0K)U3CdiIS(,lh#kSkmqZUA(59*(l$AM8'%!XT
G(&hf90l`++ZdrlD&,9Z,P+V!IFM2'*0IpYIfakPlCm1)Li+3!!K*H&9GNSI2NU%
[T3LY-BpRJr9)YDL$9&kU4'cYp0`(Xh0d"JLKpC2-S4#0FdDimh&IH'H[Zi0*&k&
Y%"P8(fTL&Ha)"V)@,[$3,&ahQk&'ZGDaU)4KT*CA*NUI@5jd@I,hmY,3Ur'AZZa
V8khkYfd8Xl"EUN@lHI2Z#`-9[Cd"Bl4R,RJe5*mTp"*`M8JZCeP3i0D9L9iJZZB
r&jG'&1$ZUD9qdMa'KSN1D(0p$@6f49QJ3`GfmI1,er+PCcMf-"lPj22!Y168M0G
M3pcm3"Y)qUXbl8ZE6#AE,Nj8BAhJ*@9L0)%JFmQFI!TQ6&*PXH3*9a0N0$J@*UH
ZeEQc4fL18d!j8!j@+6apV%LTST@#Qp5$N6'HH'!5PfaZPEf9q4@"kBeG!4L6@bj
&hL0pU1I'eV3qL)e[U[CXrk"U1Fm(HYbd)*h9X9aR-VSiiaZNNA1aY9J(T[2`XB`
B-0f%J)Q!E1d)"k#Ra4Y#0#rK+#$jjS'))mIbP&EH$"*%GZ0YeVLh"L5rp4'NphS
X6C5LRDaFA&iX-,9L'LmLFLQjKk@@@Pr"48ATJSmk-I`!dN9'pdj!"qVpZ`L08Ym
VQ&5C$cNlH!N)UMbqJBBZM6e@L[d[A`!H%PQbN!$jTREdKaE3KEkZX"LmRFQK3CE
I`&j-Sr8,%5eamJejV+Jb&`""!l9d`U&3#5b*`Pr$Ar0BkP#+!J'ThK*Cf,'MVTD
`""c@`S4)de[$`ErR-m-e"0L9f+*,K$lEReejjfk)ELNL!qeGDTB$6(GRFLhk5GH
RTm"UTIB[32#"a'aNlTqSQde+TYB%J2lm)1dj6ll3qGXZE`D`NFZmaBQFYe2Z2aD
Qb!X'UHT'[D9aTMCFf`e$BDhI#1bc4Y"qSraRU"kY&5eNifS8'C0f4HNr2!hf0CQ
HahMJ5'h*B*'8B*VT6%8IlmC31"F&$&$Z!XcSjT!!1LPh+Z@&lVYS&BUJYJjAB1!
mEV96'#-"9*heH8kNQcir8klcG%JZ#!4ICcr5@[fE-`&"fZ-bVm8*LM&96C%E!,T
G+&'Hp#ASIRrHZr1CZkrRYq['eMp$&T)qm&X6(G%S6-XFpTS,[1LEch)VKZZ(DUr
C"THmEh*bm0F[)LDA'aid1*!!Zlq`LPB[@SH8[$Bdai,fcT!!L9&DVh2'%DX%UDL
UfLDbaIBH2G'L9fGQjd&"&dGX,c[,p2eki-bGTr1h%A(h)cY@CU0pEZ[[#CpX0Xa
rG$'8p8'Q4BDL@#M9Ym*j(133H#%%QQ+MrT&42+ibbh2+RFTX$KhQ`A1f!5N!eSQ
Q991eIRCVemRp#',Q[eAbeYfk+8QLi[dkbDi&!kV9Fj2ACeP`8@r)UD#R)8AY#"I
+0p!pJ2,fp'+PFkVEI#GhJ9"SN8h1,$)klNrD5T1UT9i)@i#h+%,P2)cqfXX1Ypj
)U-Gqd&F%rASMP%Qc6GK$2HPHJJMGm4hKS-E&QrL#T3%R%+&f@a3Q4miG%$@4N!"
N,VRLQ4YP'bD438pFN8cfdVY"pF"pHB*#!UZXK,V*-4@LfDXQJ$(-l(e%rBTMk-6
5,q'GM[-$mb8)k5kTba0IeYfc+`b%M*lCF,hqmVFjj[XFCMJX9h)@6$H+H(%lfkG
Dq+`,@`V1)6MbU9pPeRV"A&$[IJP@cccVV&YXD6Gp4q9KXdm#(#NID"$BV'4Y0L#
LVC!!PdY8UR"Fh(V#lJl'%%`QAC,Ec4X`cC,pY#R51[R*cAT'4600ZTjMM"8"b'm
q*Rr`IBfNe)&e[T5US3+q,bF#UM'f[0(T@CaRLaf"r$-95V&%@EjN59hY)K4G&4#
TC25'EQ+P,&Xc"+V[ee[Z'5&qME(NaGmR#2iM#UZA(Rj6Yp!h1qB1VKbCic"A*Pl
kE4c3,HlKe"Eb(mX5mqNB@)&-Qk[0)9DUX,KYIepU$PKl2*`X88K6XdGKZC)PHPh
&MiFA*#fJL",@CaK8#k5cYTlCKMBaJ,9CEI&*P"(f,e%8(Qch3)I)*,aN#r0-&ej
@UAdH,4Pcb'P%61Z1kQG5TJ(GH,!Y[88(5lXIcm8P$c'*D31B4hIppG'@RfZcScQ
Y-f,+!DqhB10kLFPX0TV"U@U0J6qI5[eCB9B@YbIFAPPdV69X2I4JjK`+CT!!DaK
l#iRZ+'C-1FYEMlIET$A!L-J@qKA#CP[HQr'0jNm,M+294lDV0`LZXL&Y,N*+FNL
!U*aS"(NLrH90C0Hr(")lhXK[aHU(GFcECc2DP41-ZFc3!hIK8m9j8'ae'V)Q',T
*F&imC3r0&YBmRV[1*&K5f6@CiJNAel)bN!"plLlAm"5B"qK%jXlJ%XL2eDF211C
4R3B!CKr2YESG+B"3J+&()dJDII-BA#""dm-ZGdl[@FEqQB*'P8,&EKA,(%$$-6r
aQ6$ECU40)M9EJe)*VAGNJSd&dNre'1d(65CNNem,5)Hp,TM9)Fd*b6bDrRP&+G6
C(q508N[HdL&3m*Rq8,le%Ge&p8l1S1+U0cr1qUlrHk3BChfH,45ir0bLB@aPmIb
MAIDLj0NlemlU(r9*PGbR!I&M%[F+6'rSPc'6@A9-T@,0PXIT1h0E@eIP@FhUKLG
jaT5FHejK*1-R&'jd3pN5`3(S$,jXhhH1f4eh(#2k0MNJAfA[LebJFjS2mCaKA#&
TCk"%`mL"(cr&jVV$l[U)(j`[A@r@$YCIJNF29!(h14%[P0@63epB4@Ja"JI0dET
*@ZilBKEL%cKiX@&'EdN$"5+5bJ-BF'EbcAlrB+,,'BjTA4R'2RXXN53dTR8hCfd
,Rpk-ImaSm(ZXj3LIfAj'P6lch,0jJ28@)6EJVb2TJZFL(fmiHE[qNrr[jVc+C3F
PK84Z,*T6G5A@HS9*C)b!m'Eda&c[#,RNXD+XlcRa#1+e8BH9IX*4Kf*IVaJGVpR
Fp`khpd$QC5-'%5U@ek)2&AXb`ANDimIGPrqiK$50YS39fi'PX(#dU(bC2U%CHQa
1Uib"ldVZDJep3aH0#$H-*K)VChIQ8A@J39%KCFjT6lE9B6G05MHA%+jK)%JHK-@
Qm(@DA)jRj!-2bE+kGKZUC&N&iJJaphaQ(hc+QZ4LlNZjYXe`S)ML5m%AL)4TH@@
M4*fhXCaD2,cj-B%J#)9el%fX!HEZ+MfXk5qUd,dUcqR@d*l4E1cal"VSRkkTRrF
6YR@B15pZTMA6KjSE66E&U)AJY!GRLPQCR'JU`3!2U*`['95iJM@[62kMBBTeB1&
SHlA@#jk#80K6$F*H9rd`Q3dX%k[YGIcq3**03!PR4iKU'6!pfpL1iEXFerANpdh
h2a6cH)IHdkY"Lbi,"4*0Q,#Y!)6+EbL[JJYEbLIApl&a,aY8j@'cpR8c0`-"j13
TYC3c5cl5C@ATJA-F3V$#FEPFcA9ae`cq$elG@Z8G*RN+KaXlqfl"lcfUb0X6aNZ
`VM**CV1EN!$m9DCCIZC&8b2QFXQf@lUJqXpa-C(iJ9`AI!'e&SpaKUI00%Vi"[K
cLfrGl3Q[,Y4i&(Fb#"(iKKFFk3EKSf5SY!DX9#N-Gd!`SV`cc4m!"rYT+GdlTpa
-IN8Pfjj-`mUGUcS9J2bl2LSlp+1A[ed5CcCARV@m4eRZi$X$hJVEk5N"N!!&4Zr
mM6S,09H0dkdJ"+mr'-cFYYHIleJU2U%)b1PU3P1Hj2Al8Y"(EXQ$X``FRM6XUNJ
MBi2bFr)'iC*F`+R0NQSie2H)[UI39T!!BZf0kBd-FjI%DaRl#6p&cLNUFj)AJA,
3fb$HRPHD((iB'F2Pp-pG6+hGP4F1&5T%b@`baDELFb5&(12Rh`Qhq&+!'S1l6DY
BX*B*[F"pUeV9EcN*@3ScBc2'hB++R#K[#(4"$fa0Cik"NS1+`Hk`4h22CVNm)%5
3!%F$fm645K2Y1IcG[GcIVpfjbfjH,M(p03(3'(BB4$BHCUSLrPq41hIC[f642fH
DYDkJRjjmNIBbUi%6Le*Ca6dPq&kN#0A92f`45`TL*hDK&+b,Lrlr1!0C%223HRc
`ZTmkcK@1-%L-2%rVj@NeHMXj!%"+T0Pe5(@@h+FfQ,Y$Rde4jY1IJqH#YKf)BjR
b1cYR$D-(9pfh`r"2a1V&pi%4V4P*j4XF$eQ'Z6KN#'L&A9)YYCI)Q#AbB[L+1r$
QP+8@RL%,jBr(p&XSQD5&LH`dIfBZM%bT*U3(VAb[Y)NBIRZ+N!!L[BDMQrJm*hC
$[4bMR9qDP2KC!,B5C5PVBX-!6XIE'80f+ki&%f9pir-JrY8$TT-EUqRT`#PF`55
DBLbbq2L@#qZk!S50r$0mZ0Ic6k',()[-TTIV2YCC$3$r6+3h`+@3"!%!!$i!!,B
E`R'h")c#!!!I+`!!EK`!!"N9!!jCU3#3$Ne[FQ9'D@aPFbjbFh*M!!''f&*68N0
%Eh9R!!$rN!3!N!U!!*!*!F8!!!'(!*!%$`"#`G8(%kET#Kj)d"X[(CU81hmG*$H
j&2YF*[ak4Rfb800jijq0BYGS5AVUk6-!prTfVU[,fGl'J8-JJ,!EiJdX$md29%a
)AZKdc5iPA'R#Zh4T#P"G%lIQS,B*LK"0D3XGer9&)+Ea,$QV@QBUFL)Zk@kRD-%
4Q%+V`b5KTHlH0-rmF8&CdBjqd-4UR`lVN!$(VhC&DPq!Am'FkX92i#klZjR[M#D
04d9'2Kb8+*SDpY93-fLfGAekNC!!YS)lZS'hYfSV%'CAVQrh`kUam%ZRL%'!q@#
Z)!4j%adfY%(-lQXU@jjMQV![P(X&fX%4$mQ$3k99$%[p@DS%%&ai4b@50b2jC5C
lcVS@JqX)&l[INPRb6p-*YpYAR`4*9qYD@6i0hJ1VhC%N23,&*NCpimaJZ4!1Xh!
JNb6LA1a3JD`I$)$LQHpZF2JiPZK""&&DSl(crLAE4ceP1#B"KL,K[r5YGG-*f+X
1YQiPPk!Kre[VE@c#b)I18kc+9`QKGprlULMRK640MDc24J5PN!3"!!""!"#eH8L
*Y`5c*`!!E#8!!()5!!!C&3!4IlS!!!EJ!!!#&`#3"!m!6@pbC8CTE'9c3f&bBQp
Z,Q-!!@%F9%9B9%0A588!!,(rXIm!N!U!!*!*!CS!!!&X!*!%$`"#`G5qFmEdFN$
GmUIG!)L#"Xf'1h"4%KY#*ZZYq"E&HfLVNVP4HXC,aRQ5P6fADT%[%$dGi+j,[d@
G948S'"j$C&NbV&ZHZAMQlD"e8q0+Qk)eAmBm$Va)qV,5&+SpEb12j*9&rKIY*i3
lbq5IB2RcTF(81,qHIhaM6%L'l8541m$+C6&,[,k9!HNiVU*+LDQE#JcCQ*D`[F6
I5NPNY-R3Rke2$Rh2$3I4&),F%6mU,3,+Q#`*#N)apA4d5SR9#[34eiZrm0@3!"A
*CXf+%P1r1eahdD!39J'c2-EmchN"F$fN`MH@m%5m@IkLZE[*&%EBB#l&cq4eI2A
QrSKJJ-eC$"4YJk$RAJ9Q)PPm'V&dbXbP[2,61,,-DVB6i`PX9rCTQjr``9`GhGr
G5qk5D#j$8#KFMZaeeQTF9BaY1Ph)S)QkM*&b6-QcVGdh5rUY$0peG-[T,!B!d'8
@+XfRX!["FN25cMC*L,@QZi@F3%,"e-he9jh`$*bJFENri,HQ#ja1!"T(5NV4+q[
VaFRYq#+U4($K0jQh9jjkDDYi%CEaV,kT4(J8eFcrmMPf1!9m8L%*PQ#lN[I%($`
%8Je,C1'D3U-289daYHRr#HY)p0F`#c2RLc$e9`LjY2A1`Nd56K%l[223%6IN)#K
J2I5BS9*iFKl9P0F`IV+rjYa`r6kqaQK4M9K0S$mmP+jXaH-8ci*i-hrE5h!Vj4R
T!V+`a@alETb)hZq"'QITcHljLFled'G6[#iab#8&5(Kp$bQ$C`m[#j22#qbiLm`
iYqDQplGCj!HN2fFFjf95KP4DE-SH@IFiN!")JB'h6AQhY2Z`J#A8rD"T#@C'PN@
SJ6*45*)pL)16hdD(F4$T-'rSh`K!E)'A&f6ZPm)1qaYJEBk`md$ZKV[j"YMcQiH
R$Yd*ZcYmN!$ZiP'1el)`D-"@Z%5f"Ae9Tp1M%1r#KrBZE"'#)Bl0YhNm#NmB8e@
Z5Nap08d@2MM*V'5%@#3E+IpKHD0MfmmAR1kc5`+`q@NaGAXViq6EmS%jThdYp+q
4$aCjN!$Ij-E4'Rp#*)R'I1P3j9DrQhAM"RFk,8JeQaM1*$TU+!Nl4V&VJ9Sd3pX
)q5iRmiYA8Kfj&3h1(*XK44#BF'Jr@2,Aa25KDKkFD#q"bEK%&,MI*UHHAKCS'TD
kFD!N8b2%jERh9BmZL`-Be6lT`44TliS%brPki!#PN!3"!!"$!"#eH8L*Y`5cSJ!
!EK`!!(3i!!!C&3!68+`!N!1Y!*!$53#3"!m!6@pbC8CTE'9c3f&bBQpZ,Q9iF!!
"T8P849K83eG*43!!XHqal`#3#S!!N!N"QJ!!!@J!N!32!%,"e+8[*()C!kAbTpd
!L))'d8a2$T)*Nfq6,kV,#qIXFE%H'I86IkFCcdTFX"C)a8PCDRX%V+0QE"h@Pa!
f4#eH$l@!bcUM5qQN'emXr([Ij(-mV&Z,a$rm!M3%pTk1dE&Xd4pJ)@e(B(D1U#p
c)qb%9iK5aV-XEL"bN3F"JYNpNCDTUMH5[jTpihBJdV-`HP94UkTJUI6k$3SJ,Je
G"IZ"mP"j52Ip'NCT,Z45bl0GpNQ[GNCC[39jV5KVcd,DI+58ZC2*Bp#2PP`X(#p
h#X``+,f`3KUMGCeYZYpRN!$[j$G+h'*R`82U9k[(,Jplc`2QY9D(qDD[+iAdqGd
l$D(dGmchEX(449ZpDDPJp$#'pJPq(F6@f%K9lhDALqNSMe`L9KSZ+bqPSi[Hb3(
ldT+YE(32kA%058p8XQMI*6M#iiqU-JJC$HpFj6l)D%)4#A'YhLHffF'A%`,8q2D
F"Xjf,2bl#bb3!(V83X(8FUE)AQQE9f6'#RMaZL&GX2kN[Yeq,d(d$FZBpbT"[hF
R*CQj30cJ@aeM!&2-m`3RM,3m4Zj6L($1QL4!P(Gq*KUVh1R*5+@3"!%!!%F!%,9
NM1kh",BX!!"b%J!!GI!!!"N9!"Gm)3#3!kS!N!1&!*!%$`"0Eh*P4QPXCA0$BA*
LEfj3FQ9QDAJZD!!"p2K849K83eG*43!!rj!%!*!+J!#3#3'D!*!$ZJ#3"!m!3X(
8ZU1&L(TM-mLkEVjK'@%m[NR)Z4k'abkE6,,Y`QNl)dV%&6-Q4qdEE"[ceCfIV`r
[rX`E4q*`9[i%PMmY#q+#5pr'b@Bi8@DhK!kKlSV!B!VA0((9%l&(YGNh1e+0[V-
C%0N2iR8fM%M!Id$fmbAY$9Hkk%c*a-lMRh'8E[cfXmS#-HG&I&Gr2,pCrH@5TrQ
0qfi``N&"[28U5,@F#(jq@E#pcCCXlVKJh`l3MFCQTIaUm[ZKZEe!3X(8LR0T,Xf
Np,5XLi*8Q6*T19cKEaM-HIiBG1,9TBSR42PUF'H&"l8XY3C2m+%@5JiR%91l5C,
RJ@+T'FR%'-C(Yri[B3D*lbk89T[SRL%`TSD5B90Zr)kdA68FT(q94Zf'k-P&Z)m
DbkE6EX[5S8H+X@QFNc((+lZK%lXb[@T%R59kJ+@3"!%!!$!!3!#3#R3i!*!''48
!!1SGrj!%!*!+TC!%!3!!33"!YL!"+,F,86B!!"N9!!#!KJ#3!p-!%D2b!!"fK3!
!%Mm!!!S"!!G5G@jdD@eP)%aTBR*KFQPPF`!!$`3"E!&Q!XB$6J(!rj!%!Klrq2r
`bd!!!)!!N!HPN!3"!!"'!!#h",PYY`5jE3!!GL!!!(I[!!"f)!!@l-J!N!j0Eh*
P4QPXCA0$9bj$BA*LEfiZ4%a-!!(`2R0SE')rN!5!!2q3"!#3#S!!N!N#Q`#3!r)
!N!32!%,"e4JL31qBrh$r#$T2`[2FIqd3c1i$f"@[UcNk@4h1R&44J`Q(d!*QVh'
3!'+Bk-X[UKK()ijF)85AQd2U3kIGi-II@cNiLp"fa4@bk9iHN!$68*KjhH!CcU,
5h"PHk(daDXh#@Y)@5GTM[-2!)B(BrSQ8U)kB99Y+cdA3@hLK*G0I5)c5*k91`C1
r0GbUqFXBZb6d)RKjeAPS)c3mmT1@Q`BIb)qJ1N*-bQEP%#$64E,+2TQZBpiEVJ@
2jiGeCQlMhX+PCSi#IMkP2,UMN``SjapR%A!49N#AMU5Z6b#HC`pp@jT9kV5!Bce
l9cL+@p[4N!!!TC!%!3!!4J!!Y`5jEEF%Z@d!!(D&!!"j@J!!GL!!&Jq@!*!16@p
bC8CTE'9c3eFZ3dC00MKV,N4-6!!"-#jcD'aL2j!%J!$rN!3!N!U!!*!*!TX!N!2
c!*!%$`"#`G8B)N$[Q2p`r`Jk6m,ch(rXiqHeT`&IMcLacXLrZHNQLf&JSD8q*1N
Z$`GMGU!e4+&#pDk+aaUX8h[j[BDfb`CE#%e0kfFDQMHEHTab2'A(8@LF3m+$RKr
U+3cYd'X+1HGZA!Zb+)2dqS@LYYZ*f[#K0FME)XI"kffT!!Z6`dP(rbf44(CqSGi
*0El2Xk#MmV#2@-EZX5If3mID!521lT0aBP58e6[!60,K-3G&'eD[qR4c18KMA#*
ammbI)+I'eR6r15c'ccT&Mp2C8P$CE'B%0-EBj`-1D((RM9+a@EC6TBl8S+L$lEN
&b+@cl6D41F#PN!3"!!"$!!#h",PYY`5jE3!!Gqm!!(Um!!"f)!!63*`!N!j0Eh*
P4QPXCA0$9bj38%-Z4%a-!!%Pi(0SE')rN!5!!2q3"!#3#S!!N!N#P!#3!qd!N!3
2!%,"e4JL31pUj6$r##`TiIRZ2rCJef`-qcJRFKlGa@rQ+JFl#Y26RdYHcImU"!m
3XFAhb*MMqrZEel*$BKem#&ZU0EcdF1e$)FK"8b#ZqF3Yq*VEN!#fiCH"-e3kb(!
IeA1"q5QTKr2+c0eCFqrVCZAQ'VJ[Nlemc4q+hU*qX5%#3$BEZ[XUa`jdQ#E3SC6
b*D[Qb#DLhZ-DYrJNS*YSFS82ajB+,U83&(Be$ppbqPd6B1MNU-)U#0j*G`@4TRh
3c$iND`h,$C-YdJ[5Zhc"b%R0c1-TS!kJ`ll`$(Ml'4G"&5Q8m!6Xj['m)J#ATS#
PN!3"!!"!!!#fm6)HY[%b(J!!H9S!!(`6!!"f)!!3iam!N!j08d`J3bj$4Ndf1%X
Z4%a-!!%[8h0SE'*MCQeRJ!$rN!3!N!U!!*!*!SN!N!2P!*!%$`"#`G6U30B3p+p
mK@GQbh[3@bE'DESRL5ca%)UMA+)@Ei'8fDG"4dpZ91#J*,%"a%Nri9%RImjK0PI
%j*D$a2[[QGMVm!,p)3GP8[HPmlRL1%5STUhale!V8SFj1"e#!(KhXrf(NB+e-5C
,C5lK8+[PP,IPbaflBkR!lT!!@i[bZU*aG"UIS$$ipP,pI4,E64F0&J-Q*2UpUKc
4922FXSMh)QbU#"klj,G6lE#DSa$pj3l')"0rZi'jTTAA+@d@"HDC&#Y0r)ITHM+
'FdpD-kmkmA#KGSF$#JPBhIhph$3QDJrG6r@+B+@3"!%!!%B!!,Ea-Iqfm6(r!!"
k[!!!IB3!!(BJ!"E&&J#3$Ne66#"09e*eER4TE@9-D@*$4Ndf1%X!!4i`FfKXBQ0
QE@H!!2q3"!#3#S!!N!N#V3#3!rN!N!32!%,"e1T!eK2i8bb&CfD*B)5M*XCTThp
ep%ZHIR@p-Ip%ih,E14XdeQrbm'Y4hch1a`PLSZaGC)&JM`h-pCEhDDCqBd,%GkB
89&mrk%d'mURXH8CU8XfF3XB0%rfepPaNc8@QVfLf[GQEhJ@1la%KN!!D,Dp9EVD
-85#%L'X3G5+Vd6*rLrHP[d2q)5K0J%(j3UYfR,hhV1PCjH@SAS%FU[PEe4hrAQD
ANqDIk0!PM3ap@rjXrplm`Z''HVk-If(baYd%m9G(iA(fUABE$!L2M*KJlS`XDXY
eCcLC)Q4MlJpJ#PXPJ5R+KrD0*p2lErh`,QK1DSaS4amcKN#PN!3"!!"#!!#fm6)
2Y[%b$`!!I"-!!(lb!!"f)!!5Q,B!N!j09ep08d`Z3f&bBQpZ,P0SE')!!IBhFfK
XBQ0QE@H!!2q3"!#3#S!!N!N#S`#3!rS!N!32!%,"e1T!eK0Grcb&Cfak*Si$*XC
D535IC@hD0q[pBU%,+DlE)IG09DkiVe"Amj!!1iPXFS'8Fc"Rea6l*8jcRIKTT3X
82K45GhG!KTmV45m*&1VH&*cDmEANeM8RHf3L"b,HMijr)(NINdSKck0ZFi1r([`
@MP!FTQajL0(Mc@mIKc6`'R*e"`jQKLi9Q9S(R3ZEFl[ZHU#+N61,d0Ye&1LMpqD
B'*8R@1FV3*D-4EP$9k[33Far-dq8S*Dj0T(3Z*[jq#EB"TCKR5#2[I6qjH3QB'f
3!2Z6H(J&$#ll6Umi)e)P`!2aXYcq`N8TpK!##KaarIj)A2cqQh!kJ+@3"!%!!$m
!!,Ea-Jqfm6)2!!"pK!!!J&B!!(BJ!!m%iJ#3$NeAAde66#j38%-Z8fKXBJ!"iQ&
cD'aLBfCYCi!!rj!%!*!+J!#3#3+F!*!$m`#3"!m!3X(8kN$@%[FFR)9RE(SP%V-
QaPk),i4CkjGR4HCr0A%+p'!mdc9GPGd,p'p%(ra$8KQFZT6pU'VErMZDqZ@hPY&
fUS1+lUe5!5k!8G[ePA-84'c1i"Qmd`-NQ)DX0MjrNH&QL6#cI5i##d#+RpED5Bm
AhcA4S`#[iF`Z9NiU5N-PMP3NjSJB#Ck&a,FIc*p2a&Ne(Z"XiQlZTq-rE-Ji6-I
XbHd9U6&DX'mk$5CaPQMk9Kc-hZ#k!58h'GZem'1IZXI,!l5(B'm'PBN*T`+ESl%
,9X(d(0UXRcZNk*VTkel!GGdj86%&kD&rpiPlh5!dak3!TC!%!3!!-!"!!*!+I[)
!N!Cf)!!!*P2rN!3!N!UPN!3"!!!`!%!!N!Tf)!#3"p-!!-#crj!%!*!+TC!%!3!
!03"!Y"eaD,Ea6Mm!N!26!!#[BJ#3!h)!"34e!!#"$`!"4Xm!!#j6!!4#G@PXC!!
!ZJ!!3!!6!Z%"p3(!!-!!J3-1rrMrm-Y%!!#!!*!(TC!%!3!!1!"!YJK,ilEa6M-
!!)#f!!#823!!J,B!#&K8!!#"D`!!+hN!!",5!!-S3f&bBQpZ+3!!Be)!5!"T!MN
#+`(!rj!%!alrq2r`bd!!!)!!N!HPN!3"!!"$!%#f&lE"YLBC+J!!J3m!!)@h!!#
"$`!6IV%!!)(5!!!(6!!!!q8!!bK6GA"`Eh*d)%aTBR*KFQPPFbN!!2N3!%m!9J*
"!J!"`2q3"!-1rrMrm-Y!!!#!!*!(TC!%!3!!03!!YKHf`EBAYX%!!)&V!!##Z3!
!J@X!"4M3!*!15@0[EJd!!DiJD@0[ENe"3e0!!,(JXH!!N!U!!*!*!HB!N!1!!*!
%$`"#`G5L`,pNj(cG#Y)Cd!IRq+M!r(hll(3c@PLL`hG1JM48Mq6Q'G&-*Hc%K&&
%8h'&K0UT'Zfc3E*aKEATDa*Y5D&A@c8$F*!!96'kY5GBbhpPh%XA-p&!GPfq@ce
PdiQVK09[X$`C[ipDiYkQ4KbjUd`aC8Qim`"CJlm[2'*mT!#PN!3"!!"'!!#f)"f
CYS2,H3!!JG)!!)3N!!#"D`!@p"m!N!j0Eh*P4QPXCA0$9bj$BA*LEfiZ4%a-!!'
JZR0SE')rN!5!!2q3"!#3#S!!N!N#Y`#3!r-!N!32!%,"e,jdKT!!E1Yh-bGa+)X
[3R5*TDVZ$Q*N[DdalF$%hJXDh"$RH$GUMreIA-8%"(qjrc6DMYllY)Z*)Rj`K"m
'LHq2-bHlS-0@jR%$IMTFH+!+dD'b!l8TKBJl8qm'8DcX#lF9eei85mBfJK6m+kL
VP3AME)A1D+@2F`f1a1BRkC@fkP@fcJ!R[@8riA9hkJ[VT8EaPG,*YKSa"R,EU&J
!-RRr4dbZGjUS%6#M-kI4EAeJb,ZHQ6GHUarT!E#A'e[($8De3"Jhl'aV'[#V!&G
C`&mcRQ)"6,aQ%5ldY-ESdbMq%imIk"&$S*a"'6AljQTi3!#PN!3"!!"#!!#f)"f
CYS2,HJ!!JVN!!)@(!!#"D`!5QfF!N!j09ep08d`Z3f&bBQpZ,P0SE')!!@G-FfK
XBQ0QE@H!!2q3"!#3#S!!N!N#V`#3!qm!N!32!%,"e,jdKSqI*MFc*jAh0c,#G46
lFG$DfUBe"k#AFTR4dal[eHarU4mSpf(B0&X8R4q0I)6fca,kG*k4jjlHU8Ck'Vi
IMCHM*@jQkVY'pH#656j1j6#"c1@%R'18akaUKJN*YeplP@FNU)&a!$EQD#5N-+E
IH8rhae@!R)LhlDT@`r+%Q0i9"J-Q**ZG@S&'SXAE(&2YCUQf4CX(QkV-`N6bL0e
f(rB%!,ScdaR0bEGeKd30bq14jaN8pLd6ApYKpMfQ9$mr09kPiRVjAeQbB[Na`dJ
)M'6$bl@cXD9,5#dFeB-%44b`R0eXUimN`r!!TC!%!3!!-!"!!*!+K#3!N!D"D`!
![PlrN!3!N!UPN!3"!!!e!!#f#%[MYJK,i`!!J@X!!)EV!!#"$`!&1'%!N!j*Bfp
Z$3!"UVeTBfpZ68&$8d!!XH#ai!#3#S!!N!N"jJ#3!md!N!32!%,"e4SF1)aDQa)
RpZ5*#VcA4'eqmGk$a@%P`KE+RK*Y+0KPGjYEZh3RcqSJ(qZ$I`k$5,$*Ta6HPA,
fUICUFmDYMA!%%ShGJUYh%*d&NI*hEkFf'$J,!@K%`,""AYUd)ATXV*2Kr3VrbmL
jYXfca-EqQGp'mF'R&2ZT5Y8R!G0(,ADjSjLHdV,G'EJ*dS[(L@4*qNi9PD9Ra66
R4b"ArrRaBCQlqLmIQmb+#109"Re)AkBH@ZikM%'Zq(L*5T)FBKa684U5%cNA--G
`3`#PN!3"!!",!%#f)"FmYLBC+`!!KEF!!*30!!#"$`!E)ZF!!)GD!!!L4`!!$,-
!"("cCA9NEd0KFQ*[EP0eF("[FR3J8fpeFQ0PF`!!Y@i!Y`(f!UN$S!(!rj!%!`l
rq2r`bd!!!)!!N!HPN!3"!!!e!!#f)"FmYL!A2!!!KZX!!)K!!!#'k`!&TL8!N!j
*BfpZ$3!"S5pTBfpZ68&$8d!!XH#ai!#3#S!!N!N"jJ#3!hm!N!32!%,"e+,![f6
NI0d+dKR3"qJJFB@i'fB$qIiJ1HD-D*5U+I&6mb&Zk1dBm6QRH3)J09f1'eJ5!$,
8kUe4E@Z0'ZRqTMZB9rqc02$ZcNd*D,"1kIiR%SkHZ@X9&ZeAYm[JD&1PME&Cl5I
aRe$GDP"-RNkEh@43G-eM$A*[4),BbJ#PN!3"!!"&!"#f"mkqYPTP,`!!KeS!!)r
q!!#'k`!9P,B!!"PF!!!'S!#3"!m!F(0PG@4[3f&bBQpZ8h9`F'pbG#jM!!(e094
&@&4$9dP&!!$rN!3!N!U!!*!*!CS!N!1R!*!%$`"#`G5FhSaD#LedD)U4T@*PhAF
%')*Ei96P"ER(A-BVEYNMMKYKGTEjD'!"AfrZlKXr&Fll8C!!,EELQp42[eV0T3p
PmeIVj#-I*#&1I'4Q&eKSq-fIjX9-HL810$-)(@"Kd,RHK[2UQ%A,,XHLlMISE!S
C@YI)ARM5V%CEa&(iJ#R#FI0K8`$'eM-dM%"kXLKqMYm$8F)if60-cbKYm+jf&(R
)P$dFd!"#`G5'ak"X1EA1D(Z'9d-mUL6b*Rm@ZHHbFX+(al&2FmTcAE-4k+DcT81
(H#@*B)mcmERSHiRCS1(IkIEDfhCl@J45MKc'4LaPjBMf"jfaqPjB`QFLPY8C'#1
J8,#m6L1acd-lD2Ebp9dQJXVdQ""%U!NY3K)@$2K+,S!TQl,'b-&C+Il-rN3mN`(
p(pNaP%"@h@50qPeUr-8S+0AklIf)C`prTKXXI"iPEU5FP,L0kISSe4&!,PMd!L)
IH#ZiR$85Ce`2p6NSCK2"-erTpl+J&ScKDYf2p2ZfpA5@d"I[L@86,-1dI+G&jr6
TN@94jYeErh3FHl#MpDEXD"&01Dpb)RZp'ClfG2CT)iPmje,6$hFD&GqGc%p$bam
Nj850P+U#dJ*"bffaTiZY9ZhBrJ$J!N,Y([5KJR4)P3&'cdq$!L%XZp0'Sjk#S&b
eSE8[2),BQ588q$$,F+$i(Mbk"'DF#MMmX@G20!XBbhqN`0[kBSRe5JBLiISTN!#
5b'K!KF!A4#Lr4d6Cq[68hhCKPCPp3m+Tk@(B#DUD8@*(1!0q#N8PBkXHARBlImY
JA+b!N!"&ZX&TddD%aGPH'pl`(ALZVJ,iVLGQ"N9m9QI%"+P!JF3#B[B2*(VC[H2
`,Z%eb!,-E0-A0ElRFb0S"D@m&)6V#CjbKGm%Rk%2kK2rNk6a*#,6mNB"cHF$&Cj
XGm1D!,IVer54mYIZA`ci3+@fp8)mYGBEDq9rdE`XJkB6P-rB1L$+0LQ**EcLF)E
cI9EM88crE[k#dZr$1MJr!-IZ&EVX9IL[QpBNI`j0MfF$R!BDF-Le&rIGSh'rJ66
eSd"P4jJ'CYk5$'EdKrq1R[k+9Qi*R6$lASeNIUa#C!,T1p!P*qFP52I&b5c552Y
3GAJR&ZpZm4B@B6"+DK`lEX+TE`rIfZ(&6-AZXPV(4[hSC%13!)DrZepjcJZLd'l
F)iR'A2P&[`!$-@edm"QL6"VAQNjP5+!HQcDLf(FAr3D8K+NR%2Ca1#e#ampZ2D9
RdXV**ATYC)G%V&qY%K'm@FG-m@r4fpqf3UmjF&Na(q"@GfVFpbNFRda%NZ,%CJk
hBm6K[*%NTSE&Ei['Yf*QqE44i123TIGkKp&aKIGpL%p9eBKhjHG'Zla+bR$jU)Z
rP5fPQ96q%Fj,DmIC)k"239R5eklfGmr2QkI'hq2Z*cGl[%JHArF(RX"6If8mq1'
bRNqH[P-()KTaX+I"RLeMPBBX@mq1#&#r!0#-U*CqF38dK-EabNhCjB5TM4!jerH
"bJK$GDI(-[AG3QC$l`V*FhCKpf8+DVS(@rmp`2[&a5-Rdk4c26b4@!9I9H8+"RY
AcG5'ZDJq*Y'4)+Mq(AHj*%J@JEYdMGN(IhZ[M9SFR8*-NTNIpai9#0V!%5C'DYA
QSHUpVINMT(Bl*[jP@4bY,T8`4Dl3RRmj@pN-C#iR96EATqZhapj2-8!DH*3CBSl
PZJ4lM(B1BQq3!!Z5pZqq@3H'mI[B"QB"-G3SEj)qQlZ!%4-)3dM,Lc)09kFe*f3
1644MJh2qKb0UVHIb0S+q-51'TJZ+k6TBJqCGPjKQC9XZ9FVYhqX*4V)9H6(PHFq
4f1@2XK(AV9bXXB0K-[45M3e$3UD2DhSd"@3&3B0r[PaMcPCXX`4k4jk@Y0TU*&m
VaabCfpD2212I0*)4$q`QRJ9KhI3Uc$&kbL)-Ule"#$V(DH%[0b%0XB4aH'Eb&p@
kpY,FA,LqLdI)j)BV,EDUE`AE(TXC`DPHX!2XVmrMRkQRbQ,fcZ[@E'VGHVIi1B1
Fq"FHm2%PGLVbMbhkUHFQCcZJleMa"aR(Nf,@Mq,b@YQ)!Xj"!B9SlZ5d*#0Q4"E
-VEFqGJc+F"0,Yi,Bj6)Qe8DY'YFFaHNa#&M(3ZaP0X$&!+Ummh3J(p!D@a8a(K3
&9j[e)0YbjiR3l'!ihF&9$eDb!XMQk!K*X1-`RiC0H+rrHerhhk30#VRYX-iB8L*
(hpE)[)NJ*2@b@c'Y!Tc[@P5J,9f[4P9Q1D(I@4Y!$NPe)f-EcZcB61)hZqSc,5L
QS4C!3d!IYSm6`(!3S6cJLY$5J"25cG1EC&GH+ZHA0f(G@QY1eP08$iEqUh'&-2+
CMV*b2l0%h1fAYKSF+hA"$(NQ1leq'MIHKlFBTkmP8'M!&3KII1,@%R[,&PlFPU1
cXSr1hCdr+Lja,cH-B`+UMD*F9S8NPRAaT%aLqJbqr2LjG@31,")AIpp8TY`L-"8
5D+Pq4F-$#,Z0JM3h2VS'AbpN&5ZXLd05J+@3"!%!!%F!%,B)!lqf#&Xp!!#)3!!
!NIm!!)EV!"GZBJ!!!A%!N!2b!*!%$`"`Ff9eC'p$BA*LEfj6GA"`Eh*d,Q9iF!!
"0K9849K83eG*43!!rj!%!*!+J!#3#3'D!*!$PJ#3"!m!3X(8dC'I&!hmR%YDGk#
l$(h0L[pq"r4%hU*"+4FVZc2r++hJqlXd$b[8+Z`L,[lC8qldUM`QZkk)qifUC%U
[GFaE#+$&AMN324PKrSGR9b9If`jFLa[8F9$K1VeL$cpE5*!!l"(JllG"`(p#0jC
0V9F9&5dC`mqI%$EjY@A`e**9mS(5(Uk!q#SkkpQLZ5VN&HGf0f@SJ%,"e-NiZ4T
fr2LD35$-+@X)k5@#9V6HJfHNil44"KB&l6qP9$,#2c)@!MkrX''"El2r8&i9c9f
GE5M2@hlf39Fpp5+9+#-iI'2(bfi@pZaXRUFY-dMdR2L(Y+CT31YqAZZ8I*ca$Lk
qB6fdMjd2+*lhfbNDe&'MG6!DH@a2ZcU0$cmFN!#13,GcU"#hQM`A%$3aJKhZf`e
8QC*'2q#lSa'HJR@P4C*R4lE3j&Q#aKbp@[EY%(-`chFfXhf''UPjP1l'E$68j81
&Smmb$E24MaBeik'P$[##QkVHJjI3326QUe2PDq&J0NC8BFYJNI#aY'X0J+@3"!%
!!%N!%,B)6Dbf#'+E!!#2rJ!!Npd!!)EV!"R)`3#3!mB!N!10!*!%$`"`Ff9eC'p
$BA*LEfj6GA"`Eh*d9'9cG#jM!!(b9&4&@&4$9dP&!!$rN!3!N!U!!*!*!CS!N!2
@!*!%$`"#`G5L[rqGkf,&!4+hZGE(N!"i'[(Shbp3qJe2)%EiRDJHeLKMZ3V[6hM
J,!,%E(Tj8%fGC9XaMEm0,iq(kX`al52f%YNG11A94NBc#VNclc8`k'PYP3h6B!S
C$rfK-q%,i40%)$YI3*'I!--l*kIVPX"YCm`4a5T`E!4C2k8mX2pG4[(2VX0YI$R
TGhSl,@89UQAQ@3D+dq+YA#3U9@S9KIJ0q+8SYH(V@%FccbTbZNGT35VCU1+mE[%
AN5XYIQ+!+%'L'%Q$[JSJbdbm5c*FfG0(fY'2U%,"e-C3'4VA6BI&93E3LqJ%P58
1*FF`VMdFNH(qJ[KJLFBXi+qS)cP$3Cl$(!q!MHbMCq6MJ9Pq5QG--ZY!UJ!(4-d
qDGA5S3$8JUJjSlY*S!li3-pdEJc9MHrIp*8,Mff6LSjcj((EJrNJe)(-K(D`RMb
Pi!EHL6&9'N%0$DF&I6J9l98kK[M9%)cf3+@3"!%!!$!!3!#3#T(r!*!'KZX!!#M
Rrj!%!*!+TC!%!3!!-!"!!*!+KZX!N!D"$`!!R6ErN!3!N!UPN!3"!!"$!%#f&i+
MYLBC+`!!J3m!!*d8!!#!YJ!6j%B!!*5N!!!29`!!#(!!"LK6GA"`Eh*d)%aTBR*
KFQPPFbN!!!('!%J!5!)k!I)"`2q3"!-1rrMrm-Y!!!#!!*!(TC!%!3!!03!!YKH
#SlBAJU-!!*3p!!#9jJ!!P$d!"CbV!*!15@0[EJd!!@[+D@0[ENe"3e0!!,(JXH!
!N!U!!*!*!HB!N!2E!*!%$`"#`G56kGAZ`HYlHG!LV4m!frPBR2QHBhj!4Bri+(X
,#ZMR4&*VXRkUJ2CF84B$f[$`jeE&C(!CPPM06$CM"2QiPiL#!4612e-a%Ip2YG$
!,!l#+MY0TYD+1A4VLliK,m`9H5dYeAUNfjE1JeU!1fcIY2iTqMle`m&L,`,Sk#c
A2cLpLVKCp!EJ0[*I%SQ)IYLR64S'"eVk[,Qq0J'kaI5'ZHA22R5Q@r[Zr1GC'1$
,'QD$SELMES)Jmf6d*$A5G*PedZ!4QXX'd2M*kUE6rbfiVMXJ[c)jlhqE"!#PN!3
"!!"'!!#f)"f-YL!GM!!!P+3!!*G6!!#823!@%Ai!N!j0Eh*P4QPXCA0$9bj$4Nd
f1'XZ4%a-!!'Jh(0SE')rN!5!!2q3"!#3#S!!N!N#Y`#3!r8!N!32!%,"e4JL31l
A[1*A&f%9Vm66r$D6H'(c#mcck1&kFd$hlceh@pJkkAI)!0HVL4ma4NEQpX[+,0V
d@CJ*3i[k*bX`q*G+eUP**Xk1@f*56-Ul',#62D!FVA8E%(A9169-l+rEZ*MTU`D
r[1$l1I(G2rNbhm6!Qm,V"QRFRE4`A'9ZqmaGa0+G$$$6kj'a26*$r3Bb"'G32qR
EdpH-'hki0XG`kD`J[-CFF[&Q1Z%,JhCNpFI[ACZIKX"IKJTS2dd0LJfVlLJ*hN2
'kM"bP58"V&IQZ+'l(4T[I'c4Z@Y6[D5f,'E"STJGGhP-R8I'rq'idS6)*%`!TC!
%!3!!3`!!YL!GMEBJ(Bd!!*AQ!!#BZJ!!P$d!%l-R!*!16@pbC8CTE'9c3eFZ8&"
$,N4-6!!"&,"cD'aL2j!%J!$rN!3!N!U!!*!*!V!!N!2b!*!%$`"#`G8B)N$ZHiK
L9aGJqi2idr`fQF+1j-4lXPfA(P1*ZfNEYTjB*'A4*d8PBRmpk+M,i"`Vp`1l#V-
'XjmZ)X0m3MeU@J"i99liN!!LX6TF)(XNTde@6#)62N1p!A&Jd-J#2!5*!CH3!+C
J-PTD-$@8K1&*6dN!aHrj))jImCQ3!#V[[bCq,IpilCl!3))VmChh6LD!CSB(I$0
N(!%S%dQdrDP0eeNlbk"LMYqS[V4AK!P4fmedQ(Q(fl4bdP2C08r!BmblH6f0R6T
9NTbZTLUcaU)b@AdU%BKpA000f-6jHm'ST3GBN6R&'QR[`QG&N55Pb$+!3+@3"!%
!!%!!!,BJ(Bff)"f0!!#A8`!!QKX!!*3p!"!"*3#3$Ne66#"$,N0'66Bi5bj%6%`
!!9GCFfKXBQ0QE@H!!2q3"!#3#S!!N!N#U`#3!qm!N!32!%,"e4JL31j0EL*A&f$
K@#c6r$D9F1*&r4k53VjIdU`3jUQa"A0,$bJ@@+6L6HDDIQ83P&bA%B$jM6mI6$k
ZMf9V5!(SNb$+-mfM'Y)ZlrGp(4UlAK5C%DF,Br+JD@mpVTXckmVGS0'V8ML@JT`
A)3F@F`j()d(B!)6fRXcj!cSp0QS#E6`h&p`5dFN-@e@VU#KXIm2)3%CkfMbJ-#k
VHJ94#[q%08rC1IC2daNT-P-f5p-fkch0r@*T!ImV15GmBbBGb"@rUN%$fNGAGAX
F9AJS)pH-GZ(4Q1Ja@!l4'RDMkEcG5&C*M6@RDHBfJ8i!TC!%!3!!4J!!YL!GMEB
J(Bd!!*Lk!!#EK3!!P$d!&LLN!*!1690-)%eA8R9ZG'PYC8aTBN0'66Bi5`!"a[p
cD'aLBfCYCi!!rj!%!*!+J!#3#3+h!*!$mJ#3"!m!3X(9'#*!lYHmiPFA8YFVa02
m0SqYB1!ih-#IE%BGaRN2#CR5kCMQ6AB@-Q[`VV$@QVbPhNhJUb)I#Gl#Lf&FIN5
3!+"D'p3!i9*aN!!Z56Ae'6cP8aMq6jNGU'XK)aK+&e2A6f4mb@hIQ0r`j&+q2!,
KCa'TH-jE'#kQ1)12e5cV28QjD!JdCBUrh4rRXGCY85HbSD4"V6fQZqNaFSL+mcG
RP`Jkf2cMN!!feVY*ejMfkp(k$&&*P5G%P9FH3KFM#+H*chRH6#L!CXT4$i2`!&b
3!)3JF%6f*+kRY26Af4mJqES192-qCKUFDR(X1hcVU,$*b@-!TC!%!3!!2`!!YL!
GM,BJ(Bd!!*SE!!#Fj!!!P$d!$jHX!*!169GI690-,P"33bj6D'aL!!(64R0SE'*
MCQeRJ!$rN!3!N!U!!*!*!UJ!N!2Z!*!%$`"#`G8B)N$Z(e2L9aLD0rESdr`fPJF
G0+3HNN+qAp+X%1DTX39c5`mY+QbNiNer*rjP%*4BY342Z82&!A@0LI2j'd$)JG1
&)Y3-S33@G2q"p4mRi6[BiS43#SKm#K1mfQZb*eC29a1DJVM90P6IEFFJQ!TkcYi
ZhSS1Ve('X0H1a[iZi#bl[K'i&eRk`*aACfdR*B+H$A1i8P-Z)-hKmr'r3Y&ea6H
)h-(A(qAeHU6F!Gi#Qa#bfIi4'i9529irdDa"$+YTMJ%*pKFT-a,qi2"pB[1MIRD
0Q-+qFPC6l8#er3JaMYVdpa2P+5HHj%d!TC!%!3!!-!"!!*!+Qi8!N!D823!!RX(
rN!3!N!UPN!3"!!!c!%#d(A&cY`Y36`!!P$d!!+kX!!#!YJ!$A[B!!*eV!!%,r`!
!%8%!!A4ME!!!"0%!L3$0!H8#I3(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!"'!!#
f"mkIY[&-f!!!R43!!+jm!!#G&!!@q!B!!3[r!!!3T`#3"!m!F(0PG@4[3f&bBQp
Z8h9`F'pbG#l2J!!!%Tj069"b3eG*43!!rj!%!*!+J!#3"d,"e5"CY#8aKF2Q*9r
0l+5HhQl"d-FLD4+`'2%mFK$&ZS%CZBjF,dXhP+%aii@ckTGpaHdFDZN'3UGckTC
(HaE+aSe+`Dm#48US1jZh@PM0iIDQ'VM'BJMhSYIa,NY5C8qX*5T'dK'*M3@hj[K
BS3rRkUK!8RcMNZme`l`U@!'L)$Y%djf*eL(1DfI'h98&hTN61RG)ZFl10)R8m5#
Dckl99f(r0@DH%H-IdHlUMkK3pbR6VGH1HV!H8c0+5$qQB4)b"AY'C,)P!AcbQ,b
pe2+1GNSF1"QaV%Q)+8p4qH"k5q9M[+0UiLe5'pmE4Gk5De49%`DU!)$aS,b4Y-&
4k+(+Dqi)Fh8qThT13XcT9dZM3*MD2*1J"SQfDMTXLra`1k4SJ0%kmhJp`YH"r(l
dAN4RH*a-*lbfNJI*9+bE#,#SUM0PVh1YchD13(aNSZYrA"iY9@mBMU-GS(&C1+%
EUa`dY'ZcFc$(#iT8q&kCl-(5r3F8pQkU2%Hm,LfVUiEf)CZ01B5@JrMh`*822c4
8P8NFpDd5Ce+N48HPP$YU&BqbkpTkjL)h-)jdMXV&3TeXfVdC34M#4Rk-HT'j'&r
9DYphNpHAGAA56fj66S[05m9i*jmcY`Vj+A"0IF8l("Q3!%k%pe1P"&XF8prm)mL
0$$VVIG2A*Rj!$68p-qdhbMa5ST+P&@2ENBkIlN8QTc`#'#iTe@[X@N5%F"V)5h9
l1TNfCH`$9q,TA3J2VP&PISpA1p,PH@NRqAPh$mra($h$F#!60+QmRCZ+G9YU90q
!2&HF&cMm5GXPPA3fZ8NMCi'aTE5YV#LiNiH(3N%+2RfQii,**THrK96j9R-&@kD
h%'VN[!Kq+3'D#aKhZddqa[jiNLQ6I9`Ti+KT%0BUR%jm+&mRrXDfk!!Nr6M*XX`
1jfNf-mqNAA&q@bF&&VM*PKfXTr%CAR9)h-d@[H`pdkkjT"hUkaqfmhF3A6X0"ee
k4ZAR1l,rehSj`rrmNeJI[-QBpPdMac'ErSY6JX2hBf4K!8IjhmL'*fqNiCabkZZ
T&G,-+FpJ[b3jl&Vq%YReq%kfil(cR-ml%9e3dbG39Zc@l$1VL(,"%@VGP&,85CY
-A*ZLI+eK%0YCJa8rqcIj2%J"E5a#NSbaC*YJ#%"F9,f)pH(#eSNamRk+ifUU'-c
UI`PfMhQ#LIS(5e))X9[@0CUFVd%fqZ%jl'iRCQPAVXGQpRDVq[pKNEaHY)(![rE
Qh-P$GMZ6Y$paYr-qajpQ0`0Krki2,Aqc2'*mjTe"Mh6ff#L5"%LX!(Ze@6J6,H@
S"'Fq,$f)Kb6dFP)bIqFY[8Ul8T)$r206b2!#l6E9qm1-8#`r0YqD)9iq2U!3Jrq
BQNak-2hBPS2",R,`9pFb6XGX3"ja4@jb-ZVXl%)LQaK+'m[%$T3d`"Hh'Qf[Fmc
1`1jR`Y4ArMGIRp&%r&M$5"J)4fJEf69cD#*8jL"Xe[$V6-bLKK53!"D`Xp4QcK!
ZS"1%m#Y"jCB(*192hiQ%Vlp(c#2JmS0H,pUjN!!)-$Cc8h,kV'-"Sk(qrc4#hq0
(j$VUKqfE-Xj5MK$UPr)KqXE40UZZ+,$h*e!@HP#Zqc)LAacC91X5#%&UE*M-5X$
&13%%UZAR)#b+A-30-Z1-YeikUZ+C1(kqj)P(SchAC!jUFQ,8jq1p4KT6-D+LmlZ
XEeh5EJrBGAfYiMQXhb#@[a6Uh69$Zf4,q1l3!Bb[l9XH0+3qk98SA98Kk1f)-b#
%2H1c5"lKEG&9FP&19R#!fIJ-`,X!)qAplG8a`9YSGE,,c(kGc4KFHFG#h6PU""R
abAf#m,U!m5aUhLfZNA[bX*d*GY66#UQ+mi#XHH@T%%jlKP00CD@jC@Cm(!3[GI6
j8P#dT5q!lb!)rVd1YriCI"q`+-m,EKf0A&qTp*mU-`0[fK+Q#pafZ*!!fSd(m2A
B*!3b$U%q@aDF'b![lCJr2dZ"V32!a"ir4PD@63YDL)U,80HfIGRZIMLUEQBK'Ba
VRKr5*)%QMJeIVqR@ZrFVd6&2l*3NIG%"GQYm$4f"rkY2IS+1TkqiT'f`'V-LMd2
)63@JKHKN1hZ2##Q0G2BI*#&4TicbKi[akD-6B)L)ErZllL9Y+HRdJ9GBA36bE"d
QZ['4)@H@K-)!m2CVlZ5k-cl$Z-1j[5R1MA9FAcCE`"UL*C2l52i!E0Il8F'[Eh#
FHUBR!C!!`jJ,CFN-8b863a[jp&(*9(rLX@HH`6-3Kf4#*mPSR@G!i@IfkR#Uk*U
f,,1(X)H-0,5&pjGJ,(A'NUN4TYT"&pX5[hkV"B3BA'fPl0p15&53!$6k5QlP`XL
hei%4,l'Br69RIXCJ*09EZKK%(&a3,8V0eS0[mmRhcLAlUBU'[Y,%GX!D(X1*q4e
HMH-lHdDIi4&Ap+rZb6@F%e*`[XIK2TN[+Tj53L++iac5U!BYEQje#*h45Qdq2c%
aG$LPTmaShh!E5DC2Bk*GT-QRINT%',ADq2+8I8D4Y4)K`dq(2FCb#jCUM`P%rh5
[8`e+l%q9!`f8,YfB!qK&UmCXr#d2lM0ASlG"T-6A,HAX%+V1I8@Zl1-Jc1Q9iYi
4(,jF"`5HXRT&N`ldZ$),jV(Y$@)Tref$Xk1UAam&lGkGjrGd2UV&kjQPh+(6Tf3
rfQC$VaZM9j[NZiCH@h'+S@T9hhZ$&,k`'f6D#)",*XTcY%k4JISbUbNVCGd)cP#
RlLARl#ErAFcVhE2pkRTNL#Gm@R&Y)R5r)(2&kG,[UYjd&4-af6dH`Uj!NV&U[L%
J0"dVTIhd*3(@MjTDZV`h0R#Z3)amM[Epr3QVYQXIL0[Nrl&"$5QFejd0fIE89%8
'9'FRQME9Ma)f#F&bX29Rd4iaVp)dd,9YM*B4#dAqTQfZ'IhCX5S,`YfSR,ZN6hD
&AG8QK3b**Cah%5)Tqh,-G-A)98DkjYP))34NUXK!D!2@0'dA,'[RDq"d-A++$T,
IQ5K4J5%hiNTSUT,8rAa(9*Ejj1i+QeP*JGYaFhh2`bASD6HI)ILEcMiYXD6N0L%
mIaf5qkFiK29TpDTN'SS@cQ*`FPXSHF6!!f&LXX@`Zlbp@@"jVD`M+*!!f,R$K`c
Dprb0iRldPZc([b5VZNB@DYXH9a'6,kM$9Mc@P[qANBTXL*Qrdllhq*(XG0RUMd@
*)"F'fB!UTL%bVA@&3q8h+G0PfPIpHdL"Bl#Cl$%Z@!a!Vqp(YU)@e*F'KMPNjVl
c@(a4BDh#X6BcIhAjm6Xp6QVV!5eaA%H#YI4FBC3H*[6%b[e8CPBb4T&T$E)M`1E
$XhM1bp#XMK4arh&e55h'LHG-p(JaLrMM68f06(HI6&8Z6mUT[#BVEcjJ@ELG16q
!RhUSi3)"ENib+X3hPNaFG-'NJ+FdVZK3Y)ME&1$cNC!!LQqpdHbCP1!)((J8bQM
IJ0,$XrFc#+#iU#Vq#lKFVTPDJ0m*"&PKDMR'SR1k4H3RX54*LT)-(fCFmLV@8(b
qp'U0@13,U+K5JFKC8H'fK9e4+UXEQX,9(mB2iB`,3JAIV12BRC'"TQb-"`RFPXU
KGA0+IXmHRJ-CD)`B&4!L%QL'm53*B#JaC[RNK,GVXXIIkPH%%J1Z+Bic-C,h0lj
V!HJ(*`@p"cLSKJI#ah[TF`#VKR5-6lXI('9'1($JmV[iKrHcZ5U1mYEdf1j9ViQ
3!&a**"KX@QI[GM8@DBeqkUCTK3hAC5cMa4$QK6!h!3X8&b5SAL',8aJ&Id`l2mB
*$1("k)kS%m,aI[f'TKL,&+h5L,,CBecVrXq+TCALK,BaFm8SS8DK,Y*1k9PAET8
3Q*qdT+dG*MTi-8-V88plRh2`Lh,0crq1c+JJfJKZ+"!TGhB,($#rUe!S6FJ(k%9
XD9)'G59k&G6k'#mi(e!RY"K-Y#"$[e*6B(V986iM&Fd&cqa*301@B"hi"68hmpP
bqRk96Mk)+LfI)8X*f3`)QZXRe[N`35''!"XIbSAV8KRVYLZRY3M%KaXkNDGShYQ
fX&*)G3ZX-pj&82$!-l$Heie8fiH-Pj(CZ[LpY%2CGSB29aK@kB55f+FKVRj%j(b
EY*KrjYQGQ&ZFabie`d&+C0(iGV*&Ma*2`,Npa29-%H[4+`!@VB+FHJQc3UcaRmB
NDVlMQ2apK93a6a*LLV20ZGT)E1dFGjb&H`iGG2h&DiBLGe"Je'hKS3PRh)D0E!0
#fifL9%@'[ih82hk6a!VNhEZr[r1C63[@*0)ek1DTABj01L$*AK'F5DjHNqTE6hi
iDk3"(D#@@fallV6fpDhGi$lMEUFe2%B9)@iZ!h)AJ!MZN!$CUQ9G9-lVJ)h&9)T
PI"5#SPHe6@R$q`khJ[!LpcfF#kEpj62AIKi,!C(qbjDqB2'ei1lU3`4KX8ALDm1
B@pYLH,hAM$M8"N+a*&#RLC6eI@K2,PeJU1@X%-!J5Y'+hfVlCK@'eif"P[Mm#`H
`ejU,ap&QHHf2NMHCqUY9D'V&Rf',k5KflXmE1a4YN@MpP$,8##J29F#2YDcDZ-V
[LR&BElKEM1pLa5XNi8DUIiD2(MpQ8084R'50R!jF1H1Ed2ZAj-*eFkhY'6*NML[
'YBZiPeMNX'1Ti'%TbjBU4erT`Y@IHc@R3jFNl6X'-69D$ZYFKhTE8p$AACU9+L-
Br`l*+#TC)iAeCl'3!1ZCPX%peie[,4J@$J4A-YA0`SfC1l@3!'m"l&$dCQ`Em`+
D4f82V9P-+jV5*"'BUplUj-mL&V1HfSY`ee[J@2L09YF**m+rYRaCe'T)Kci#r)P
dV+%CH9$l9AM"dVBa2#EZ9XX@baC(J,J5[@3+68,-E$9Qd[AjaUNp8YZpK9#(A'F
MrKZmlC3La20$h0Y+2kBMRT!![2eK[MHlV4RX%Clm2*RNq6[X(ii*UPmTNZ4"%@Y
8&ddalcej,X3[2A!H-9+j@,G%N!"F0X5MhQ'"TY-FfYFlhK1(-F22r&RP0$Z+kGd
TiM-U"fS1J#d"FfNYrM9h9DIHQT99ib%-'`22('H9RVbe"LpEZp4$@"U&R*!!0'i
aT6D2U`e+pdBDM%bL#2+F!c"FrA8"ILcTF3rUiT,JHDG,#+@)j+qQQEZM,J'mc5&
p2Fa2mDfNRYkjVk!2YTY8#JPbKTHVS$Ma9Nm"$Y33T*!!ZlDkHIE,DT&[%adQT6C
#1f1"N!"MfVNa0lUE*afm1bcbpR5j6RPLLAH(@0cYMQhjP(X3$(GB#E!0i4SEiC9
XEkPTcFK&AeqZPN"d@[$1Hb[mH2PhZV,f6YTB+)"SE9b%4E'Sd%N(VmN!lGDE)Kr
r,P9#Dh9BIL3HjFmkE5!JJH2ekIi!l'a90&Q&L$eMT[pBl"86$%VL"*R)di%LYhL
DUU8Q(jBU-ED5AM(pR9kVEJTCE([JAf$+Pl*(Th$c"%TB9Ik1H#Y&4h0S$(B[[*'
88"UmR2Bhr%*([d(h2`#J`8$XD,KrXV&M*FcL065!3jql$V8AhCfE9r901RJ`-c-
!QFMAHYqZ[UC"a@$6Y)d#mCaMr16l"`PM1FSTbif$!BAU(4U6`hNAq$NPS#Ta"4T
J5",iVkrbbNL&)+P*c04Ci0H!*EBm5PEIm!a[ZN6')+6p8Jk$!Aem#M'-lka5cYh
Y+AmZ2PHLrl'Lm3HiI#8V,IIGdF6b4b)h[LI45$T6T19$UVrTI9#L4fV6YMTNP*l
2F2#(qB1L3Zqr3UAc&FS9+mVG10I29'Vm*`EqL%$LL`ABj1XF5"ic%Z3!TC!%!3!
!-!"!!*!+R@X!N!DG&!!!@NArN!3!N!UPN!3"!!!b!%#d(A&fY[&293!!R43!!+m
b!!#!YJ!#)cJ!!+m#!*!(-!!!G'X!!'SS!0%!0!)$!H8"`2q3"!-HrrMrm-&%!!#
!!*!(TC!%!3!!-!"!!*!+VU`!N!DZV!!!+NVrN!3!N!UPN!3"!!!`!%!!N!UZV!#
3"S#f!!"iqrq3"!#3#U@3"!%!!%%!%,Ea6SUfm8k+!!#!YJ!!X,X!N!0b!"(9LJ#
3$N*eD@aND@jR)%eKBe4ME&4V!!%X"P4&@&4$9dP&J3!!`!)"!*!+J!#3#3+H!*!
$jJ#3"!m!3X(9'#*!lNeZ)PEiMB`0F#U,YJCSh`JD-N3Vk,5b%KIY1YXVI)k-P$0
B"H+"[ce9`#cela*9H6GVLTA-6e`2+&"9#SX`3K%TV#KDS"SMf&2S'1&'&,hmJkD
2bZbER6J0DC)Bhj2rJiVi5H*,6@JBQYU*emdQ%'N!a9L)-cNAT%IXD+"F5JIkDG`
Vk9jm9U"TMLH6&[+I,T8k8[JMqZTk@j,,md0-HH!S%!i9KAU@C@-NQd$!Be3P9SE
H#'R-C6QK-cP'hparab(I4qZmYa,$f03Pfj+#f[)%(`c&+EbVbLCXJEGZSi#PN!3
"!!"#!!#dSQ-cYSChH3!!Vf)!!,I2!*!$FJ!5%id!N!j%FQ&R)#BJ4(*[F#"8Bfa
PG(-!!39CB@4bF&G*FdL&!*!$!J%!N!U!!*!*&EX!!!DJ!*!%$`"#`G4lA6Y#S$"
#q")&hFZrR4*(AM5UD'H5m&p6aqIq[(jrrQkM,!N+GZHQZ1@!X1U@UKD'AaBrh-Z
rRB'(if#G8rm-!q+BLk,@H'chmi-b9j`ee3amE2U3!&h@hYKIpBRq+Za#BQEmd0D
8,"SLAj2YdjJB4N*KkPr2dj+X0036IAFV8h01Qe2-AL&Fb`f,E'D8Hb`XiAShE&N
,&M&,Y18B80*[4ScSFXAkI"IkX'Ik*CZqUKa3Y)Lf2c&@jREQaN34@D31[R"cJh5
'S$E)TiQ4MS%HLS1%p,CJRD$FmZZbNj5qbCQQYfZI@6J9,qMpVVSdfkB!6*N!`)'
e9IIk`LihbY$FJF#,EXGcH5R3UD8@Lj26L3SAbB)jjci*ejh[iJAr6RS(BcCBMRG
A"fH[S94YM#6N*Drh%"$NNZXQ`b[RK#AX1dNaSK98Ihk`*R4eUi&j@-XEI+Y2(mR
S5r9J#jaqA[,GR!!PQfKhRb+*qdi&(r!Qi8&AQ$)lm'C%cI#%j[2BrA6LjY#ZGIS
*)"8i(jI4S*8FiY-e-[(#[F9`+6"Z(Pe29HqUY*I$!e'r3k!b'C-@"lp@UelBBU2
QXch9Y1Dea`DT14RYMViA4kjFTJEh!@k2Y-Z4GUSm%,%aCDKr00hf[H21H*a0`ZT
cpmPqefe0Na1+V-bDZF"r*aTFI&Dr))JAAEr+iPiRMA[dh&mN($X,XVmbL,"qrF9
3Vq`S4dqUAEh-q[+KrRTcU+AZa$(mEqB@6"Z6jFaR8c8@G-i$l0[C%jE"9jh3LG$
DmFDrjEQQ,!N5NHI@RAK`aG#&2&)+#I1*-eSDr*Yi*CC(Fm2eZcG9a!d[aTp!el@
)6dMqFiFi`@ZG62ebpJBfF!UmP,kc6H((2pSq1V0Fbc)!0YBb&!h`Y[[1*8!BNRF
U%-*4DqQQ#&5dj`CBbb['le9GLNi00K'%(ATHcB#d,-X1BFGIXUeNMR$iQl!G"mH
l"JBYjmlZCER$K%U@8%N%+-c+X+`D!aBTq*2mR29K(6kDP!eDFr&%[QcKJCY3j4D
BjjJED6aH!@VFYZ#9f#)[VX1I(EpkKkXUMm1A-8"EdPcER@pPa84E#A*`D5qQT%c
c12pX$T0f@e0-dLEcX+XiMD-%T*if*EMrbD[6p*Z2`QZ"k6NJ("1k#",Dj'1FSSL
T[c#,p@eDEZ1rZ#(2+-8S59G)$r,1(IS3!eNhQ,SV28(IQ*dG%"db8$irQ`qd2VR
F5dSmr(9-DRc9Q@G5KYlI2Hq0$1EPUcED2p3meU[X$MHTTHV0cH,Fel8JT+&pbBM
9qKm@XlFlBE')*kHGGDA()D%`L5bl[[@RXTM0BLC,PcV"N[+efA9QF!9)5rl-qTE
)4Z+VlZ4J)0d2k)#9,%jPZLXZrY2I"Z-mcL(f(KC"RpY(rUi+I+2*%#cI*H+1D-+
LZGp'kI(D+06NSfa[!#daN!!VekG'N@S$BdqFPjH#Q)$hp[,I3!aJHN8QU"%L6cF
JcKC`c&8fXP!Y-LCeYEJVeq@HT3VhjU*-cHQ"e+q2&kB4)bBC3FRUhibR$mI&rAl
F@&p%m#MXMkhG0hQC-,I%bN26@l55Di8LY-Ui)0&Pd2Z`$0CMZaR4XZIC3YMNGHl
YI09rRNkf@!C+c2@Sj`C!d4KlqelRK(bZ`V"4UJmL2UZKqE$amRk-GFEQYkD#)9`
"-EkJVZBq)bBJ3AJH)HED43D4h`l$0#rlq05X#,)hRZh5idrcA)E%bGSZ-d96'f(
L2RZ+DQ&Y-fd[r5M8[M9kH-rXTNp'cY6Y1GXSKI9C8pa-`45!8a#me45B+S4(K5i
9*RNrI(6pm3jj2,!(Ld,[+#GbVl0b%r5h$4LQHEqV!LrG8D#QdDdZFG*E1$%-FGf
r+qFfdjpi43FPpBJMST+4GAM84Eh1i,fUK&V[eLS3bfrYfa!2LN3GRQr@%VX'6ED
qJL`Dl[caCT,4PS"8TUpdV'S1qc4$LMGldiLXZ(#0(YaALPUVrcQBjLS,0Y8Y95E
J[`0l(X!8'H2&6LjQ!cR*'bi4*HP1m2HZePcB9MeVaNc(FeS1c0B@BaiiQIf[a8+
@HhI%&TfYj"UP&$diJM&-X,CCkj`YU'8r@Tk`E$+`5HUZlJkj#T['eafIeJpU5FL
8`d%i2UBp15f8#+`[#NMepb,k#Y`$3!,C6FA-Z[UB15Bh'X@r2P&"P8,p1d*r-XU
-dkAAc@i2Q199LfmfMq$Bb+`p`KXjc$Q592$MA&iH#[*[KPj206EB1m!(akR*cQV
dDC@m85)@3S#PN!3"!!""!!#fq0V*YaJra!!!X,X!!2*P!*!$FJ!4!ii!!'mM!!!
M*`#3"!m!6@&M)&4ME#p8Db"5C@&NE@8!!9AlG(4bEh4dH(3"!!"!!B%!N!U!!*!
*'LJ!!"Em!*!%$`"#`G60p@NGfXb#*VSG1"mlQce4J@H,NV5K`fLh0-F)Vp!KT%8
cm'@QQf`"(RPZXV,Z!4PEe'bB6ST-Y(@Ri)ED[N9lf`BlK*c"ce&IVfiCBr"V#M9
`AGG[!SmD4%[*1`a8Y1Hb+D6JTMGYM6Y*Y2GSI['KfIR9r,!@D-,Bi)@6MZTG!3Y
,HKEmC9f#LK48k#5D&jfjU##m1J`FGaZ!A1Gdp8DpcVX'e!*cX!cdM'Dl[-VFYfb
5LijJNY!j*c$-+(,k#,FNDl*0P6bMi(XT#ZPhGL4q*&#iD#k'Q0kXQ@TrG5@Z!1&
`m`)jB&4ENN2dbmBRbP(X#fBDL4mi6j-Hdc9Rkc$SF'bJDl&Ak+qlF!8(P9QQ8@`
Nq9lXfrG2J2ZF9Y,@fbE[3-S`QqS0jpm1STm1AZq3!2X%ThJ2CZ%hH4UUPA@NMpa
9crB!VKreNcmi5r*62e62c(#Tj(RmcrRL,NUc%)VmLfP9%AC-eC!!EH3(,51bXEV
AD!pq,cd,Xaj[HQaek!2#'+p64r"hjVP%R3pNTaSMIe5S%lJU+9&[`,f)fhB(X8T
pQk5ha-ljj8U@h"c%"L`)T$4Jb[Dc"UjlR'Zm83b&$EMGiF*$'1KB6I2J5KDpdTd
TdDH)V$N'0qM0(UDS38-I,8kK[4E0HVd--D29)8T4CrKB80'-*XqlACXM9P-Db6U
)NKJJRNmei`N"0d,#VLQ,(DY+4lI5(,S(9C!!'3,e-!`qf[QkeQl8ZRJ%8ecjK&k
62FJq%e9`m9$2fV@VekN4e[9E@*Tm-*5BV%XkZpTRYqGMr`#G&Kk[!ha&V%!CkD4
a#lTIE1PRmY4Fa0S'd5JpCfaajBe*#d!e02XAZaUkG3jXK6",R!Dc`KD@"LZ['f0
jaM[6rL*$b+)3A)AjJM6S%2%ATjHP`mi+Mhcl[j,3&3hfHmU19@SbqeRFP'RhdUX
%!K8+(qc$pePkC!jGAA`JV0mJV[Y6$d(h@&1E)I'JX`+bKN%4H&+R1pK&N[9d8ZS
S-5@42()+6&If!Fd)DbXS-mEb,$U$baDc!kXDTAAD6lMebZdFSHBATS&1QNlh5Zd
`MST"QrQG%q$Y1Ul@4mJ$K2X%ZF!+VS#'rcM3&q0Pq),HR(Lcb,N5dq69$m6bZ(V
ScLYhXA-(KRbr1qT(B+mc&T,AH1!k,Ym3p@qEcB%-%`cb1e%hIrGF8bpTA%@E1-l
m8#IHV'!%*+U&D*D+"e1`!G@PpcF5A8mq(X0QNVP*`33rYM8N$'5E3)!!bPjljfh
-I)UD3FVSj$4@A*aF-CQ%JiTGRP$j)-%%QX6KXMZUrCbHd$LEr*,aR,9jXc2%SJY
9p!)XI5&[MqQ&-Mb&&q[0B1VUhcMrTAU!klJJa,ci#m%61M-(X)3qIXciSI(DRZX
FCDl5qEm``aZ20HU[ZXU0Ji`&YMMNZ#e3fTEjl6+6L#jSIcEeA"5P,QAdD0d(-Lj
I6rCpqqQY1#6c(Z1pc9+'%QVYDac9%,4BLXflb-9P4Ra&YA91JI#L6r)jL0dYCF'
SP9'#eP`L@'C@bH!qeQGb)VeUh3Um'$bYDM&mUCA#mNYP5lI,!QE-Qm[C)hm+ihS
S(Ne(aZX[F-RQCi,IceFV,1T(a&pFV4Vc)rd"-84CX@QiHF'P8kE83V%4R-%(&qe
$#ZNbVDj%eHhH+$QbQ,F(H!Dp"-iQbRbcd5[SfKD'5TdF)D)N)QZZrKULLY'r2pf
&pDm"-`rNE3(A1,lj"qfcmU889'V*B9UUlc)H9r("jp,4D-5rjjlr`jSX0)*Bf3$
#aEh(j&)c42qj4TSeb0eQlBdBJB"(INY-0(dQD[pGSU2H!QbT,I%0e"!4,`f)h'R
IRFj9!p(6bY*q&VI2)42qRC6,il$-Q)BG(5QXhPIK*N1+,G21#S-rR5pHGAZkr)*
`N!$))hViddqF)ec!4rGHe(rmm!krm+R4Fj!!'PArPdq%mS#LiFGh0*THX*cHPRf
lEr(fU6cdYC1Z)5qSfb!3He[V"P`%Si(HAS([m9[0[eMKHQ(4'8"N0315jaSj-f$
HPHVf[Ep2MTh$'922Z#h*Uh0IYIZHSi[(a2X6RmXLHTYRF-*8U!1,Dc+VT!dF)HY
0UbM2`$l`N6daql0T3aH2U4B2&$95h%i(pdjUNSNk6+48&*!!M$PRAFA8JZelfhl
GirH+lmBB'Rp@[dS@Q4j2GeGXmIVJ0)pi-2J&bAfReJ@P@!EZDebD"JE5ij5cRe&
L'FY9Vm[MM,LNa(')9[hbPbD99`mQr1L8a1fYa#Ge3MC6#malkU@6ZpAr5mBG-@3
HA$L+5'kVkZ4,SG`BC)#1BImaU*2dV`!mbR+l@F"pN!#",6@JFrEJP886T+p3f&V
,!`81p*13!+q@2jq4%dGA-EL0**CYQ-PheT831`L,Z%+$q91L2rkb+C4$`q3B4GQ
@,kHE*ajKlUpc[5%PBG5DTUG&MG!PQ*jilpdMl!b#lfk3!&2)$CBEj*FAfA"C,54
a*2phc&"dBljHhGmDCQ11N!#C*J)T))3DZbIrSC8m&-@RFp!T(IQL$Rhk#fXS5R4
@IrU%FfK!$"Q8kP`&R01[kSmRR'UVNh(eXhQEL3H"er(P@I3N[R1H!m`!heSE(1T
pE!MrY9Z5Y)aD2R0$6S1$aBcrR,UpBPT&-A163PYCT4&A,rTH*cRbM+0dHbca1T(
@"5P!DBE!JJ@2j'dDA4Z5Jb-T1ijU$XG8)QVrJ*'KNKd[[NUFEGNcJfDe!kQMajB
ja5YZh2(E66FVi+d@5Nkk50FGI'Q+E1K*d1Z-93+8edPC[M5h*@F[e4B'H6Q@YTY
q3!@9*m)am[SLM@@"SmqHTh"rH%QB#fc%im&F'Erbrmbl-+Y6EZdLN`1Rf`#qJk9
H5+#$&&YX&G#8b9lXmke1YpIHa9Jkk`9db(*bi06,iUbL"P(aZiN%(f*INjdAm)U
ZIKr8XCZh)3Z#)+`X+-V&2rA0V959+Klc"K9k!e!-6!$mJhHhDi('`GMQ4d#+'MX
mDPM"4NpRjD)AeDE9IC+BI0h*i,2,FlUI)UZj9Bkaj%I"aSbm@PbkT9Sh39b@LQ'
*J`kkDh`TE#1f2jX9RaeQ6Z!ZZ+D'Gc(6*IpM4"Lei-d%3LG1J-B-rd8,IUF$P(0
5`T8l2TLR@6PEEBTf,-Mr-Y40cj(%L!UZU@`Sc)G1'23hNcaSr5H1PmDY%Tlj)#Z
,VlpHN@HDm8Ai*URXeTSPafVD5%kb'*VIfICARH'L98SHl'&-'a$PG,KM6KddP09
p@mRXVJj"i'3QEM8ep)+dZ4i4#-#Rk'[2Z43'QN4emahP$$ESZIr[km3HA03LhK)
3Z`00NkdT#QGM,*&Dhb9ld`dMq&cAk$TIAri05GKpeL+C#C2jYRCPAI6VkldANQQ
[D[Bl'MGMSZ#V3e4&1ZCEH[#G)4J@Za)4$TA+3keqh-i9adC#GP1Q"-cXZMB6!EY
kZH5T6jYCimRrFqYV4cr9TUVr8&&hdG%6)$*kZ+'X*M,*MalFhc$!A+T"`L3X8V"
pBATek!)XPZ`K-Yam8G8X0DrZ-%fHR`'HiFlrlBFh,mimd$j%+8FZT6ra3CHM5I2
TM4)FEF`bCNTF43`3c9F,a8ZKI`T%J+bLfkbbNBFZlFJCG#VTAfc9$-,kA"2N0B8
)Ki*Zlce1C%*VFLIfQEk%U8-,lr&J+ATkl-Jf0Z3MXEV3X2AIG1M)eLXZC9&2Cbm
bPijk$E"'aL)a3&Z@#"q`SM@eG)(3J@$k-1U"5#I#,KqM94`fMF#$0TN,&2fX66X
dKTD18Sm$+ihcAT*Xf9aBVDG*dT2VcX'P-(cq#30kX%5XH+30@HI"9K4`fPT)rcm
J$&@GA%%F*mUh!`YJ0d3SJK&6A'-DSHCZArmbl)FLUQTkA0(QCjEa&&'ei!5mEF5
m6ak5!!Y8TA0,%Nl,edeGkUrFJ'0Y+eiB$eLh)"KjcKpYL#D9R&R*&&M9'IUmjeI
q(-C3BII3)rLL+ePR!BE1+)3FTqK,!G'-"mX%+&91$dk+I$kUk20a50j'Gka%!M*
khl"M*&MZLMGUh(FcAmkRBpd$HGiS8I,%a[LEiNJJVakUR6mSe9NIh!5ffq-dlJT
i#VP1A5qG8F41H9D5f'-)%Ikfp@RU2`chpH*S4b2R$B%r,PK!*aP#IkPEr!@l'Vf
+TN49CAPS-bi-f'3!l&pPBhe(AP*-)EiJ(,0RFpaQcUbmiVL)26$QGcT-MZ,PI2R
C(ZY*9lFljdV8l)0kN`$qQ)'6BkEX(aiDbU5i&3pS*[V`E!jRd%EHYb"UD&lKpCY
(V+,AYbfmJ3f[B@UE04Z@T**Fm9@VXLkP#0Fp&rEXCSSB34bGhmfhm)A#-,4JIB0
R`2kRd@33q-&d"2"#9Xl+Bd6KIYaME9CfKFT3mB#I-[Bf3T3re$aSL$GU"-2iQ(1
K8VPqC[F*U3`@prFJC%[1hTYJjlG82BS*Y$f[qdZ4Sa[2&[9N@pp5A"`!&&UhbUr
85%0QJJ89Ml2@AR9m"Q"(YV(j30$D$U#GpXP9-a5pdihbD3!JrQXSIKbH0%1*!Ni
%pN*c6HfV0N&S%,9kqX$$(Y+9#C4k@R6*&mPLaG+(j#kFabJ3ZmHk5bdb,%&E#JM
L`-8AdM"#FMkNrSX6PL,rkUpT#(Vd&+aDRkJ0UXUE8H'&iETPlRRbZM*V[fi!Dm&
cKD6q85)90)lbB%eT1LBEUSaDm!e5KmPbeZ@cepED$UV,+dMd)e)h2F'Y(PNm6k[
ff*4aLe-Nh&*)N!$Kc6FHC"qdNV5FmX$bK6mflcGh&F)rc(E([0UQ,[p8S4,l``!
&8HlAD01Xd(0l044md$Y4BqR8E2Km-aIZ@#EEjc(EPQD-8Q5T*B'Hhf2+)L`8NPL
Lh9DL54TVFPK,X"PqBb6%d*L6LQNqjcc%9bk+KC!![D*Rhe)LiF5R#J'L*3mZKF0
+RF"@[*P"aeXpTqq4'@Rk!S"1cCk+phGpdPPG3m)jel3HVZ#'U6RD#X@+,8T4pDY
3q6CGT2kCP8'V2Sbrr***K*LahIPr1&%KC-C"-cC@HNP6C-@`QrmZRQ3PaHR0rD1
KCYd&*E[00Sp!IAC'"68G"#Pd)6A%p(@ADI0"l6Mj!$J%Si8[K22Sc0J$@Fh&J88
iFbEGeaNeU1%E2Ar4Y#bj,HKEZI[#0)cUZRIZl-(TT&je1NC*h1+1[*peJIR"K%c
@ZQ1"lA(+62EH'0q$C1QfYXlUJTk,rNHHj!MQ"B9XaS%$9J`H2VKA6cN'e%beDEY
!jb65Y'G*r6DSrZ5r1)aK,M9(Eh3f*I&ZA4LXFj(m-LkaHSclR@fcqVdq+C@R`BL
P"h3XKfb06Sa[D'mkf3#rD"rPB&SD1KpZ%+1kpG6HbmJL$'1I,iemYYEX&G1qp9C
B'e@FT0l%q`[`&l,eaNZN*&"(5#B!(9f4%Plc6D1bajUbXP+ihAJNe-`CKiGURAj
i54*V6D6Q6!h%+ejZ`N2m&U3C%k,da!`hFII8*h4)fAmp@aKLb@$"arp9@4CMR$d
3V)*$m*(6F[q&'N9YlMbl,Q%MHYVCRYc*EKi,1`i4N!#1bEU!2(IB'pHi$m%dS13
eY2`[')'D`ch0ME(I#q(VB2$8Pc+hV#I+qT(*qe$-Zm'+-@"e3)BMi#M@M1,*LE%
*DQ&%$K1PE(K"'ZhJ6rY9AJ-DS`[I9jeGY"Y%6dPR%2RqDU&r56I5ZqMe&0LJ1Qr
,GB"U!NhdP$!faXGNYPk'qjDf,jbpC0m1TcZrPe6H'a0k9!P8G3r3FKTRCV3$0+U
d9Zj8,QL,@)X9X$%MZ5H4BAh#TLXBIp0K*bh-!IGMFRcHG3Q`SB8YC-K(e!bkTRD
RN[Q-0%@DT(6h%UQcZZ'MRb#RjGc3+qY9QK`!R&#MQiXHZ%,&ap!BbDUqaC-p@C*
4m6pZ(XUY*+KAUa2Hr5DBZZR8UFcikd*R'R`I[RZVF,&`"+mbTa![*b5&I&&2I-2
%R-a@M!6!16R@2Ec4Q,+q9V'p0XE,!Hi@Jp$H(%@)eNF%$L#NrbBbG1815$kNARF
52fEl8+,kmJl6TPA@(a4D@%5lcPd4hr6KH486jV3F,k#aE1'r3cm!8d4HpeFj"Mj
'[&NZPbX0`PkF(i)6MHY[HlfC(laZ4T+@3f)9&iIRK)haASAa$K)!@4%qN4`(%F8
#e)ilVFEfMTf(DddMJ"#m6#Ur3J5MmNSh6CL,b-Z+3X6UmQVml86KKARDYjB1de`
4%0DC`6bY@Y+K-DeT%aqE#RAq!,Q%pQ`BI-+438#ERaHQ92GR&dC1YGaPjVRBeFQ
283ir#L4ke%Ke3*NN'8E)*Acl8j'bb2pS55-iTrR8cmLU3j5CfVjZBqS*fY#XG9C
)!MH`h8QlbX[I[aH84dBUXkhLF)C,jaJ!2P-ACI5"A1$5r#3`MJR6D[p5UYA"qc5
r1&35AZHa+"6LCM6RJU$6'3Pi8UUG5P9YCTI1hpCMKfrp0IR'cZkH)#QBUdJQZ)S
Vc2Rli0eXf-&XB$l&Nie'SD#PkkI`q4+TfJHFCaYRD6pZYib,R2peX#aaF@cVeX6
j!+5kYHHH@V699el%MB*4@CeiK60G8Af"YXa9FGpUD@+qK'`%IV2i6T,L,Hf(@dI
)A(ZJR)p2jrq@"J*`92G3ZTe$ITEEKSLj31kc9'fID6r3-62%%'&2Y6(5#+EJp1@
hrmP-AT-*Bf5r!cLV"l+T0fHB(8,@elL+KT&9[$8pIK2$Ji%mlar0m5l6pR(khGP
ICa9F49%12Yb6UV2S-Sf,`XUmqTSQ9XAbM,kcr0DEH!D5UbRaK,Z,UlTE&&jEG19
rGGd`[UAE&`GlcbeU%kMTNmRH!qdj0hk%,qQYHa5'X4pGd[Vr(#Sa-'Aj0-2*ZF0
q55qeN!!U)(8dbdLLpR39`)4X1$Q(JK@I"5[r+YM)MVK9-3bB2IGmcIUHB(5cLV6
a,kT&FDH%*6e9ATS`N6V#fX6Fp(merlIfC#GQCqIPC@9R[(X5&jV+dC1hS'!Jj(G
)Se%8e`5,&Gb-DNJ#D2FTR3kC4!@&aeQ4&3$$D'$%KmcAq+Cq#makSKB"eUEUrr8
(+d*e0)3CFZlRBH`iK6&"FDhp1krlH53kG-cl(L-R[CEb@SjmR2"k"#D@d-er34i
5`a``hDpqpMa)$2(#N!$*U5iAAK+)&D"H[lq3!)`ID[J%R*LXj&ibHqrYk+LkUrS
ZT9lj+K2Ch1GiNJLB,VkAG@jR@k&B*S'T@!4+&fj1iqUhjS$!@`N9If"jI@l+103
JAEd%$DX)r[EQr0YU5XC$h`XD-0Ij@P95J0C#5EUF3SD%%kL5HMDLJDR3IKQ#R&&
QR5#UmabcRhUa@phRP`BNTTaB,!dBD%-@ir[bb@lKp0R8+Cd19R&#R*k1cK3G#$Y
qVk([amlmbRClX[0h+L&`),0EbAHiFL&0Km6ZZH&FISNUAj658ApmS8Vf0Z[jMCZ
U2-HKCr1D+cV%DdeN@iGbjr0[@I8aZUfFV@6dXU#UdSHeCAf&55-8!RC,RDdNADI
3)$)Pm&d[+N286ZFNC1[#IcMX*Td!qkML)mEhHfUKbkdrrFMrIbMGK)id5[&5kBE
kL[Sl+rEip0IeK4E#i8!!(!2*)j3RAKUML8q(AXVbB[Nb*cV$dY)m(RFD$)QY,lK
4MEr2mNjB[ZS,66ZeR4qTZZj(%0-mIM*iL"j#ql!&`%([RR8YY@NPm@0b[JX+jel
M+j08@5Gp%05cVq%Z+'`bKTdQK1@)q(ZISbQQ`'RP"(2lXG4h@8)M!c)RApYVDHT
J'EU-MarAlba4lqFHDS*b5Qld-c-G6E-Lh$X4ki45ipU,a94-4if)"#cid&E[VFE
@KZ0-c[rR0!FM2%6UL$A*DEa+-h)Xh4XmX,I+KqG#V[aqVGeiN!"8N!!i2[p4'EA
[lffB$9kCa2q!3X(8f$51C&9k-PXi`m(093kcDiAh*1GH30!$LBZ!T&Q'XbI6Z"k
DXp#4hBHCZJ@IXTiQ6pMUSF+@[2#X,%$P`Xf'l*FcCU0e$Y(YXk&@h+4E5,KQC0J
%jR9k!f2JZY0V@'QUi%MEC%MpDqcLQBU!(kKG6Qpd$*k3!*Mj96QT!E'DqhiZJ4Y
&aQ`e'kc(F-k9Sbrf8DBL(`Ze+X9R&m-0jYqDGGmTX-Gm!)M%j@fYcX#Tf%JrIEI
XSiZbQJC-05rDNL0)C'L0#em9-jU&'1G3V4r%IRY)fdf-d,-'$M*VY$ArkXq9K'a
9KM@0SMX5EQrL5pUX,G%ZHU,J%@3llrdp)d2DM8aUkkI4HI45#82V#BL!0T!!Zp"
fRcjX*6D*HqpcM+%VZ@1dA0[%X9rXUQ&q%0pUeFA5DjMCYm&$`*Qacp[LjLm*D+8
SqY48)M2Fq[EN4d@%ABH#kM%*!K`bR&BDSLbLi!N"0!ZNpJ$lldP(X23f5-LY'"k
BSCQrB%ZNkL"k[U0)&(F!pNA'QJbXQE+@*$X4LLXI3QS'1j(F0[c#jL-VUG'+X10
05Z(!)UK@"-jUhlY#a*m2&E&RKa821A-'K+9bIKcT4NTZ$q$UcdiKmaeBD%R#'8!
'S$kiETQCbk6)G-IT*fT%ph9lJUM,SP+eRIDUIPJ*QHl``*K3ZLUKY#pi*PdL14"
8jP!CcJkIP004VL,`*BIU5[h"j%!iVpZ2CKFNGJI5m0jr@iGa!Bd1&UY1MR%B@U(
'h$*JpQ9CY5mK1pT*,*4V5D@#VFr#e)+!XF*AXKhVffiqT5$IiF@%IdN*Fq@`5iP
UkF$%Q`2hh!Xf,9UZU[Q5UQkC!PI'-Hb#Fpb1BqK2pDHRXCkRP&crJfS[8Q-jR)D
(hU3X39FrpR4*`4d!LhcfXkQ043m#kZlp8m$e+NG`Y$-+XTZ(*M#(V9Iq#[Ci%55
8"rN+N!!9f$kr##$99V&MCK2)eX@EaXIJAS@qh[X5-MIN+UEIFYEJ,l&'DZUMH[0
#S&Pe*[p`I&l&el,X'-ffeXTX$T(PB-ihFKae,6ErEc%1%&UKS!J-Q'm%ED%9MCr
F0LQEQPSKa&(SjAf&KqJj,f1+[48H+'Te5"CkMH`-d+d3jFp6iC)hERG!J9@KXAr
P4U!q&Q`i,F)f,k562B(+0#NXf5N)("f+@d!l1jIUC+c8CP',PAj(9P[ZF%Ki8(Q
KK34hmcaIHV0%fp$lk)DM2M(T3''()JJ*cl,H9H6KjSC@J1h+,c91$%c(&KQD(M$
1q6M+kJcc2d`kC!mcmK%jbq6VPC`dFJqXlMPRfG(H55#j(cRUV4ab$TbS*$JCZAr
Q@TqK)T4Mf(JRS4e82N'KA"@PY'%V'DI0X&GXmm0[M#araI*R9FJmh@-*[jEb2GP
+1-Iq03+5k,ZUJGhA%VN'bNfbVXE&[lC(ZKDi&GrCDEU)9`UcMLAMh0pM)9H`RI0
"h3m&-cq1B9L"bj6p'la-,bi*cSJXl[0$&MCKVk2pUCTbhJh9MQ!&e-HC@8GUI36
KiL*Z(h3(pA-P''B'dJhbBARTX,MlEK(I,bVl-+eZkC!!hE'LpJ*aKCdX[AlFq+C
Bcb)rCifma`%4HbYUN!$6L55@(VE@[q%%A6*TY&#B0T!!PkmC!%&(D9+Cmbcf8DV
mUab`p*)45rFN@cR'XSlp$FSej[(EMqc089MchYq5XC&d8""k3I40AYMH8`NGB0f
51B&#Up03@jZQGl89C,)'@D8LT'SUiZ*$kQ'1Y&BGaH4S(T-aTaU@AB5EEED*-Sl
Ah"HqGZaQe$4,RR[mb6F6)%U(lNd$,QMdll*[DB@K",`8S-3Q,XEkNIXFd1IicRP
efVYF*UT('`S)lIB4(VaqB+HUV2YT&h3@R"3KU@Y$TLNFEa&m*pVI%G1Zmc2I*&#
LGCl25jG!r3!K)*IN!5a(GB()AEeYM#(H'%Zi)kJm+ba!E6M$h8lFmMc[Urp$[3`
T-A`FIa*,[Sdd%G`"%Qq5lr`HSREmFbPkY$j[`Q)Z$)C3MR256[$q)$Y6l26[mG6
B*ABEF[Cq*[EerAS(2S*JiDFi5%,$XUSqf#`ZR$,6E+3[SA-8eLD4'A,,ZKHH)Vf
j#pBip#HVX-16$[U-eJ$+TkqHD*aTk3[BD8%[bYSeK"aCPe45-,m6aHc)&iaaSaX
kA"[khFSEr(+jhY+`Ra4j50%G&63D%h*!eqRrSFY$@RCE(E5Db(F6(#p32Lr%j-d
k6$GQbmLc*c&MI``Y1*QY2L6+GkID$(al8miP[@kMPV&Y-1qIcXed`3mqe-V%)Jp
eQbZ#!9VJTH([95)h9hP%+MlHC,Q[0f-f)JQB")NU[Z4GFdfQI0GD*(Y6TeY@*q$
@L8iLk`mSU-JD9VaZQKdh4QZRK4)@9P-9DlrGMfPjFaV#J1EYMa&IY%L'9F6PEH#
$(3a&h)A%qPc&*c'iaHKZ454""imcT+1Tq9)QcB1cAV2T&!KRe81Kje%%N!$)pd,
$D)@$XHCrbTpRb*h@mZepr(e[&VJ'YK9*2NRcJlm$8f!F1Pak(#m$3(rGUNBlG0c
FVD(af#4Km(+Z%qa$IpJ5[%1YH&P0d#lpVQR@,(kaFlASXBTL,pEF"E8Ad2bUART
*!eYXfEaM+P#Y6S$1hZLbH"D%pBd#+62bN9CXdGQSiq3SC+ZR3@Q+1p1"@@M(H[X
2liUVJj9L!HTfpe"aV96UhNZAjE'2E,EhQaq'p'E(E@)AC"4PhKCej`5VCcq)Z+*
C#A*-V![4(KX@rHU@EKU!e(JahfcMpUa%53$ZEDE*KDVVLX2RKV(KCL(2ef)*[dj
#BYQVLP80j(X0iqBiRC!!A0J$reNi9AXHB[0AV)00jZF(H*r0!`@5!V$)TG9Pj-T
-FCAQ9kpXqXqT(jlZ`dTfdH3Vc!eLKaKGcJR(F'#DJ'm,d)fY4hq1-U$3[$T1$l-
2-+@V4kLSk'cdA&XkT3NFLUf-1@YBeb5Jqi6djBeRfR1IfGMh4him[D4ja1GISG+
9fG+m9fk`rP53!%aFY,3'@8)fI[mF8"-$@%L&&fk&Gr3iS(CImE,18cpX+r*DifC
0UK)913PL)UXa*B*RpAYYI[GJ$e[9DXFR($P5h8PDAKI48UA+0HSmP0,%pjHNiX&
IVLN'jC'+f*@aB,3"'2#&REK+F[$q+05R@jT6+SqUja`jpXb05Z-#b`LY`MhTl[[
iMk-,eK-V`++2*%j59MCR(jr))Y$VSRJlc("XNa[N*,bF(@d2))2Z,SP'Z1%pXrI
Km86Y220[!SMcd"K$Hhi!`HU$UMa0MVpU&p#[BCN(8GciNB@Gc0ql0A[Pc#2QAkS
@jFbqhNbh5&CIr6ADmcdbPJa+),,iU(HY)jULiGPl4V(CK!rZ1Z$`10SCV4k&,NY
+jSdHqA,4$Y-#`0GLDmXHP9(3%P"%,@mm6pfr1fCY#X#GjbKhKeXmiA!iURe&VD2
2)[9jZ0N(bM28$ZMi@UlLTJQ"D#6bG`F'cFc$)mUT[-TcZ9b1rrmC&-mhGBQ+'-$
VRmc!Gf,M,-+k)6'%CB#b$@LFB`ddrTEF00D"DMa@FAp#rcGVrC+&8TIIlLd(cLT
bYPJpiA[p&1L5GU#EK1kdY,c6D(Mc(`50qiPG8c&cJ80bM8L82`HKATQ6ElTh!1h
5+10qVX*T9+GPI("UMA4[SMD89P4ZZ`fjqQrjPXNS@X0$kZ#X&'!fdk`LH3J4%[U
,"UJV2%31rQ,0(ir6RV-mDqJ6[5a1T%2kL3Nr+3G'alHdJ#HV9Pq2L15ha22Ad'K
e-L(T**1LK,,B%b[$Xi3k&I!+A1)pb0YP`Qch,cJCcr)Z*)U+&b&HS'S)i6qb)b'
a+q%IELFraR[!KT%[$*KMpEK5)cAlMHGC-Mh&QaKSC",(V"RRG@*"h`-@QR")$Jc
bNKDpbA[)+q3i*l9K'cR@Z(GiVr[aI[E(PPlT$#I,#,1PN!#*[lmTBRYk'S&DEhC
TL@i!TM+@$-Qp)X8-hKGrRefr,jc6a8jh*,XYBQBEBLMDidmYPRqN`5-r#@,!+#F
a31GQ*Cc+@'R-L8"YT3&lXhL*M6-L%1rTBXA1+@BZZH&aGZ*a6a-E2l[GQX6l1j0
jfX660#%fejV@l`j3-"[Tj9QqX,5J)M1b0B5KCh"')H"Ip'!+8[9eS1c%4%iXA"G
SNfT$3AH9m8!cSLc,VaY`Y(AUIaBbaf'LV9%T%fi0V!ke&b$[hY(&k&aXCPY3[Nb
LPGiarXcmj&UKZb6ECrba5J0,%abq6-5'Yd-56-C"&ZQFZY"f0eVm1aZa*#B#,54
QRQG916-j$liVQ3ibi8ijpYD!N!"`L&Kk"NS#R@[2BAZJ-UE+'E!)XcrCVH$4h[%
b6X#EN4,PNA(ik+aK9alkc[2GXi#0`q3-!p[kYpYrfPY86%N8AE1L6"MMLjZqYdU
p5IHImq8%rZM%#90QaXBB0k2VADU0K3qKCCeJmT9aJ8(6EVp[,VYj1Cij,$UIPr1
Ae!KEJ23hh#(*qTm8IacT)JCTC"RpaJhf36@Q,Z&(lN%rp@@4$I8)bd5TiY&fFjD
QTU$1)T!!*r83SF51*@hUDJ8U#-%83bFISSX%L5eLA0$b%ZEX1$!aJ1pb$K,q[#1
Uc0@Y,lPKFA9bD5G0(#c0FlD*Y3Y",IMX,`H$P$BXA)UBS9"1aN2#M8H!cNE1fkQ
JY49N1p["4Cm4bqkR'G'X#UMdrhMIUd54Z1S#*b#951N"S,q!k@h+X2&3&k-V%&X
Pd[(M%X,6A3)(IAD,dJG0$ZfHa09kEU-dH6YJ42RJ,$H&cXpiHmj4MZlY'BYB+3K
2SZ8J6"+TZr`m5-f#PZUHT%PQUTm0E&*pIFY'FqZXV4#J49XIflq!@NprFIe`Y69
pH$(Iipfm'AGFYaL4RA4-Tlq&j',EDpZd!G@B!SR(M39!3E6rb5T',mC295NLDp&
,5'!$AQ)d@fi`MjJHRCm'UNT+35Xb#HX1QGL$GepA6ibc9#DQZVT"Zkl+H5[jNcq
*hUrq5,hqh5lVV+VbQ%UbM#rHBXfdAc`Y!-T@LScTkFJH@rhZchH,I@chSb[UT$Z
,KS9!R!iU[VVN&Y0fTYfLC39PA%2,@cVfRH`HK@r0&K31*UP[*Sl$GhXDJ34(53Q
5,DQ5e*!!-dh024c#$i[GhY"Fi&DKeXC3PC!!"(2R-$B0YY&H3#1e!L'EMrEEbJV
%f61pGefkX'k'6EH4JpF,9VN*'ml8[jGfPTYd[eKG$CN%f3F@A'FSH-jXc!80I,5
6$,'D(m(C(fa)F3i1'[ECp&(NZV*FMT-cZRU06q@P@Ae,N!"jZJDbG6q3!$BXRF9
F[IKr[MRU)cFYEA2'LfrkUEh"J*-[cTdl38aFYmhdJJq*r*!!db8`K5$+2Hr1p1d
!+!Dfc@X'ab0-rJSD8GfC1lJ*daRi)l-GqY&$@'9V"PL"AP(GR#JHkc8LVhEKcIm
N!FLr8%C&f)c4GiBqjPcNbT%K[JC"0h2XM)D+`4pR3j1jh2@P8aCr)NI$I4F*f!`
rdr)#4MeAmN&$bpcScZPC-ID0ZXq"'lR28G&2iY!"$C5Na@)SA1rF-Gj#UBee6a*
NkFJBLldhR+kMc)VdI!e2T-MPpq48$58H8AP1dHQ'*0qjP00F`4FJ`(RBf8VJFUI
cL"RV*q-BJF4memI!+6V(d+S164qfHNm8CiX%SDh4PLYGA!HPIfAP1#Mc+rk2Prj
qJ"jhCEb*LaYc'BH(ifQf&(!HR9T(p'Rl&!G,iI$$!,B3#G9$[)cYS839P4ilXiC
lHm3eD0KC+A(m`3)[HLS13d+5H`Y(0E2(59&2[6hjk2BN)`kH6Ec*5q#UERCrCCa
*2$(hrA'&j8JeZS@A0H9,K8+[VG`NATh8CD`mqEHe,fTA%V,,Y@TTZb!0*F"'YXC
!HKfjap!bB16fK[@5JT!!9,qJ@UQLp111[9T6J2)fF[rPL`"*ZL$UD"FXS38c$5%
j+lIA%G1Ii8"LBE-`UKHJ)Uq9P*j9FIS9eUqbX-)4)3M1#04*rRXcPlm%GHGB*$9
jZaNC0DU@SBN'I4Ied6p8pC'Y4)RTS&rIdf+jp5+2Qj&0LjY'PU5i(VEN0UDUI[I
ALIhI&M5UG[+9NA"Gb1i#)IDIm"RR-G49RS`SG*ZEpEY+&68cpB1!+I$1c#D(4RX
fRL0Gd(G'djlRS!-i["#I#39!8&SCmipAXh(qDMk''YHGfYVUD`k#rcb#QN(fe!2
e0%BjZ-pD1fA[#Sq16NF9Pai#3,*a')H3!$CZ$2#aTmKqD*M[ZG6p8h[@4a,05YU
$,NjfT(P(lj4)D23m4Q%UFQR!U@9A5pCX"deJkD8RJN!c5qrjRcRR$N0(EA3ErFT
pK&%4@)1A-UVk!%a%$&'HVPf*dNemp#pZ32B%I"C2*rA@SpFZ8j`l0LFailVS["Z
J0cD)%EK`1i"0rS*LBJ+f*E6AGf%AdfT*kZL5&Nb54VSK1'9GL#"TBi#98eJJckp
"3ZBfIBMXT(akN49'pGP[hN*U@-pA6c5VFPd!+&D)l[j'T,NM'MUZ*%'T2rCPGTk
N3%S5[UJQK2FC2`+4G3$S"@QfhalRSJXfBZ*K`AdVbLCYT,"[Iem@3)p@2A-iKe8
*k!idpKH%hhMY[D9,Q`-D%(dYIlRPXSPLlEe*%-Z#fi!F'j4SVAf0UqfNNZU+&-%
Mkh0+Pc[%cE6$[$(1El*j,kB2B6#d21akE2"-pk0qh&jLVjY`rf-*4389CR`l,Xe
jI"(Vlh86B!pSThhR%&3a&P#m9*R43p'"d9$KIXdIVDjA8L&"3mr!#@m(eeV$0&!
hrp-2#36q1XBbJ'%Y1V4r6X'qEQUP3LCq689jiKA0k8kVFYrYVT!!cG`AUDMJhip
8qZLpGh+LXTQ1[@T50*9DI[!H%9E@Ck0Pk!(KI5CkPU@i[#[*'$I$0*U0b"eSEk#
aCPk8Al!T,M5Xrk)pNL+KkVAQT2DVRbiUTl4V#[Ab,U,B8R&`Zi(&83r`&)*KXQS
%8cEC3BP06(Sa-cC9@lrUMk%B,ViVhkXar)*(Y&m5)LZKadUh,UmEXPEIEfF)9cb
G+T!!2%(8%lqAQ+BhK`)EE$!Vb1Dmk@!1h&lJ("9mQP`5U9LG-b5'aJMPL"ZJ9hR
KE$p&mFS$2b@$ZDS#f)l$5l3pId9HDHBPhFl"B#4'E[K1"-4SCjrR@a3$PL@K&"!
*SZIRX*F-AKjEh0MkETCmqV-3BUXmjPFDL&Xq10G,a4b03i1jrPZZFEa+qYR5kZM
kaYMf9GK)`J$#PmcJ9[BaqS,Mm8!ekc,U5EANYRikN!$4iFK%EBE2%4Peq*,-XK2
T%lkr4$Pa@$%GM!jYPRrIAS3NM@MUb&3HH#"10F`"`RIh&Yh"VJX&50-hf-qAI2[
*3heaZr6YQ3K-1Nf81q3Q&Tl""V%lmbGNl25E5+8RLVpb%Lae-a'K5a)jYR@%PJ-
2fQ)kZq56-Q`@F@Y6N!"[IN&&"H8m&ZL()M'%%qXf9p5B-"J9SpYEj9(VI$JUSQ#
VUVmD!3lk'Zr05HM45%%GZ!45SNT!+2F2-d8ccF9*(-KCr3ad6ll8*L6I&mCAK[)
qR,"GD!Cr[`'Jhf480XcZ@Y3fShq*L[L@-Li%[+d0ZAI`KVAE%JHLK6P4rJN3,RU
#`@Lal%rNjH!l)[2BNcR'BDCp%)e"JBPAY%!M25hEABX)f%crd+G3E+L!aF#d(Bc
DK1,SE3pm'ImdciT2dJi@&Z2qGB%AVYD'hEihVP,dqaPh4mRV+-bI)M(XLlVcJ#"
KA&ZmJY&Sre[bmP+#!jH!q$-*XpR13Mcq1&*04b*9pXPLfi)*L8"$A!JPhcPJ##T
MQ5#peKT%Gd5+U5lVTGHcQ02m2)q`SETS834(P$0@hE"dpQ'+-i1IkZ5aNAlaDpX
ceaP"T6i[i6RBN[U&p5Bl6"F0,8S'I"kcN!"Y%%-!"6A8q(E*Na)6Q$cS%hYJV4K
Xk$6kYMQA*Ii9M$cI@F+,0H4YUh!NRXQZ*C4fBqcGSB`Xe[i5qkMp0fB164eMNcc
NkQpcjJ9a9m%e3)+E9N0[rfKVUM-!a4R5U`fEaa`mZpZ*"&f@Cr)9jN500H`,SH"
HUkJNa*DDhr[UVibS2(4*MMF1(k+1E!NS!%r2JNbPM(bdD#84bcIYmfpL04R#h4-
Qc0)PUIDUiTda6F&SCTLdJPplc#!kZ13rm*fi8eXZ3!Rq*&1N[1MkHj0F5ZdaD!B
49*4&`YjQC+[M,SmQ%@VZ34-#3*Dq+bX2E!9YpdchRQeV&fV2lB6rN9rYpDB[hNp
hiiYIAp(+!(k,J@G8rRifU[A',F1m!Ul[ClV3lK[![r0K%BS1A85cA+[M$FT133l
JLJ8'Q8,9*#Q[k)9qTJM%S$Dk-eC1[#9[cBfF'`UZMc1bSmKKNkT8CF-j$K3cK[R
h,1BY0(V&p2pcLDNj0BCer'ER00k@8@F&*cJ$k'd14U!-mYfD`cU4MiAS-3a)K0m
AFDf90!6jh8fl+EqL5dL%d3ce89rNBip*P"43YNRK5ZCJ(1%lP#m)6l@Hrh$T+Cc
(VQPX!8$h'T5AMGE1FG33GRPcKL@P(lRAk#55Tr+ekC!!)S!%0UPmH4TYi*BfM#!
M8L&CfLKj`FII29f"*$r(MiRNDQb#U@YQq&X8@!(cl-)"0AdbVJZ)j,D6m4c0#AR
hF@4R4S0J[R2be[PhPf"Jqa,+-iT4m@dTD,al*,$'$brp-@-2qGle9$C``kNS8bI
q!rqXp-+`1E)K&I"i2'p!c(8aEGmhV-dcLBD8q)X2i)i6rei@`jNIi@qE3QeQ0h!
G+1YP+MD[PE`b@-88JGr9T5KL#2Kpbkl0d*S,&DecRY`kiJmj3[-kah)X5$!VYmQ
qJd[YA-j`Mj`Jf,H-eqNDdXYVI,36r!r@"ML[T1cFSfNrpE@TR4e@GGrD"c[)JEm
cU41!@h-9$KHK8%,Z&1b,"M1)3-H)Qqar#1AeLeFUf%a&4h)GZ5j*YhM@Qpf(EH8
8--qZ(Ih"KaR2NP-'bhm9PlEI$*(&XcEKekcRfl")('Edp"A$FAda0Dd#4YGiMMP
VkF&a$pZMjY8[qBEX1qJApLM[,5RceI!HU!IS#+ZYA$9XrddVh'9pXK9%Y*d*&re
E8,[H3$4k!a'Qq3LjP`(qllTBXEdi!pDABc$l2QrDfUl(89*F)iHf`'L,BU`18%c
lSN,PDqhm`qed8YelE5H@P8&mIE%aQZ`BQ@pa`mYLQN#`2`lRMAThbHZb#MN2qJM
@JH69FGVbc)L@6m2RjFAqID[[0bjajje5a4Sq'qid!1$F9#X46YZS0E%b@8dSjRk
%aQKpYILddK#h%(%L"5+S,NU!2@BF5D0ZI&3mCI"+b5QHNFi@`TmBjVKH4)bR@Zf
bTYF9M-klF)"!M0,pFbDN(Sd19(jTrliT%-JCLMHbXi1'$e,[)2ha*'!Gr4%V4mp
kUdcZ+k&RQ!GJe*!!Praflr6C(G&"SZ'Pl%dGE15BM#r!J$Sp*ihJm58[AHf6UIJ
VSH%J1$*N,#I&f58Pb-G(++mK'B$`0-`TaQL3!'p@k+G&X@0LFkaVClH*0EY*kVm
SbQ1aTM)*H-A&ESBRBlYP3$9PIekhZM)ar"`Q2C`Ab(Q,bF&,'S!@frJ8QeT,qeU
Scc@01@VYFe4UXm(-$!34h*D(cMM45%MQkEUKCqh[R-'i2dJr`qAbZ1E@'$`Jf*V
SifN2(KTfjdJKL@G1%+G6X66%TH8KEAY)ee4XGASAAe'F6$K@+4paH%ZQRPKqCKp
INPT9&@rjYU(Rj8q8CpBbALr""MB5+$6%1S&0da500P)5DC'+h%QCa%9AS#5KSlX
k-R&bLYSTAThKSVGY@JKPQ$fd2C3T[5PS`0Q@$-`D+kl"`J!(e"lLiIfajU$Bi6f
Yf&-(D*4SY)h2%3Mp+3G01Hd)+#mG'NrY$ChUGh5QS4N3H%6blQ14)Ddj48!SX9!
kZN3Hr2VQPHf480'ApF,8F2p$1rlM[&Dk%pZ0R)a[j,83QQG%kkhk#B"KR,-c4Xr
3AkRGkSVY*8T0PV9+ANY)"9IR(%0@&@')E9Te03%a(iS6PAca%,6iYqV2eK$5(&#
9IN%KEADP@kHji$*MZ+0hN!!p,AGSIp9'LCaH"JfeB*+Xe&e!Pe+&9-X"(@qMP,2
ld)@%h24H)3HYLZJk,YihI*b8Tf4440-C18&(3Q@phec+3'Qq8Iiqb&6+IYJ`l53
%c#BZ(l5#99D5mTZXG),P)hkZ20im2*i8b"$XYLQq!`HZ1qCF,r(mHTSS)B89RKA
&)eDS`A0S2D5+mH&Imq9(N!$d*q&XH`SZaeQVhqbjUH*ah58H6RGT8(G@YA-lRJ-
0AK+ZqcYX+&0Rm3e46"l0fSjeJ!fSmI8kdq!4#+eNZAZ"Um0NjiJqK&*XiQfNIJN
kBEal20Y1'X[he+M#Y%ZqUf!j)dF6rU0#[mKia8NadZri2`$pL#)K-Y9Sl0#3!0F
Ae5eC*j--`+@)!IK+clYLLFrmLQP"!p3C3IH0Lar"[0X@&AHE6r-VS*0$9NHl1C!
!kP6IQ3HdFkilRh6,S2!TBSXACKM@3cc#5D&plbq#Q(M8UVpIdJB[pIZ(4+q3!#B
CjVT5Br%CPED+IkIEDXe1`20&JQF2YmA2T!Rmcf3EN4I'@)Z+N!!+$bGQdqkZ!hS
[5padpLY`6Klk2b2T4#mi1[Nj23(QJ0IAmJK!F3McQVbjR'hDf)69@L"q5c[+SYk
LhLV`j2bPQlZjB+MdNVhd(R4p,Z0&@1AZf"LS96rMADSF!ET*UM@cPAKR#"M*hbB
X(16"fPTA[UH)lCZZfE+pRA#chJ#ZrdM`FRD2$93h3SiG0)bjBY%FZKdPV'6r'06
Qa!PJhi6@E@aBC&-,%0fI0UUqF#Y@LS-JU*YcjKPbYcibeSE)lS'5,!&CM-S&S`c
JS2CU06S2arI9T8pDYNk'3CPR`!1Y$%%5cG%0HJe1Ebm$IMakUDiKLkZGcaSFq'M
ID0'r90EPbhHY`eh#JIApHKDVC',),YYC5-f%hjXeer8,j6HQ9cLQ`9*&X$*[`T[
-bP25QFGK*ibK*iGZ"4L$@1A6e1Kp188Y1S0k[)5X%l2DC6A*e*AVTSL*pH+%kU*
,99+85ZbJF!ihNiVK82"+M,(*DYjhrlQU#U8%'kIcQIii+m1ebBUc!`bd@02dHMR
8U@VJ`[`F8QL9@%8qXkTF925`MMPp9%$DP'2hI!#L!%bmqcE024S`KiT4D6rc(DP
F1NkU)km4aMM5dZ!5!6EQeMf$b+*R-BH+*LEMGeqD&Bk*6r`V&,3)qZ66FBh4heK
B%Nj"[`b*!dN#Uhdc,rrM9Y%lQ4LL6)bY"&"cZ61r#$CEGiI5I,[4+G+V)r*jZ4(
dA@e'jRQ#Jr0p[VeI#29GNL5rNJ2iBZM0*L5HXb[$qHC5TJ39fT&BYJVV3Uk#!BJ
4XUVHN!!05&4&GQGVSiV)1Mcp)R1a#kZ#"i#RQP,CA9rrlP$5qIdM6&'('9ST%Tb
V"[YajNcYFdFU*rTV0250E(5N[M3f"#qm-6F4(KVF!4j3e*fM)aHU[b5q&If"R&Q
IlQi&dP)XJaDE0di"'"k2S33Y!'*k1YbqA"alXBGlpGP[+a`b[MI)SaZ%+8SBD@K
,9Z#kSj!!"iirjAifCd'6SSF3pVKmpEYAjfD01$i8Pi8A28$)*BJlJ(GLGU$HhkA
8E'D6Z3MRk5l(PXbdMTf(Z@N#bc2li%BT93cql0'*Uh5[%1'3!"[XT2Yk5TjEQRa
(fCLLh[*hMDV!m5!3k"Ra,arU4HH*a4c@Lh)9[jj08@K2rfUb0iK,R)Q[#,%L5c3
5mI`C'Sq!FaZ(&16cBaGZ3E+KEmU*k4DPA8hdP+b2V*P2[qq2*q18Gc[B0`[dc-i
F06AEl@69aXI8EpaP[84$`@8Q4A5TF5&I`TP9h%9aD3+j'V,jdl@HFfj$iQ)-!j4
*&QG6IRQH$lrET29,GEhi9*R#@a@IVVH'4i8bFE2'cR9,YIELa#[UIJ&jk)CXeic
4cI%j`p-J#ajhK1ZST)BU66LqTKjb@E$a#J3`8Be9YM&*EF`X')p+$),"5riddre
Hr`'"I$Cap(CVLIjHK#9H5[XD&m#PN!3"!!!p!"#dSPMhY+*Bp`!!Ymm!!22@!*!
$FJ!05X8!N!j0B@08Bf`J8N9"4%e&!!&V-94&@&4$9dP&J3!!J!'"!*!+J!#3#3*
V!!!"!J#3"!m!3X(8iHr%("93PhXmAdET15-qLr(BVT6)8FG'NL1D,H#Zd!Z*,Ba
DA)#cdUR5Jd+MZ$eUh`p50Rh!PY4FhLh#-[SU#)(rh9)p`THirZNb65me0*f[NUV
#Df%8N5jcF6k2f4KSj9iQG-kP)i6X3VVN#bE"ENYZBF3E`elI)S1Ve#ibG1AS0HE
#KD!E*Yd(-&8hG6aES#IJR(U`XG-a8"N3E18fm#V)(HQ-P),V"JRhqIlbdGYC@DM
lQ(bJ))jTiaL`+B44dHQ%If3K)q-KiU1LI9%N`FXL`I5r6F5kMK5jc2LGp9,mdH2
dmJ8N$0'"[!5+F&*)d1ESh8EPhU8,9EEIYT!!!+@3"!%!!$`!%,5L@4+dSPN6!!$
bC3!!p8-!N!0b!!b)p3#3$NeKBe4V)&*&384043!"kGe849K83eG*4B%!!)!#!3#
3#S!!N!N#D`#3!rm!N!32!%,"e3Q#-dD0EcB$!GQ@h,)YYCJ&JkDUL-YG%4ZE,JV
(0VBZZceK,$DG%63re[3N#Epac&lrfm"G2Re-AAI,'5T1S##K[a4a&pI6idpT&B8
JcM%AcR),,eB9(fNI%ZrG9mV-bEUMTl`p`R9XF"PQ&ep*"pE-0+aZQmK3kcE'kA,
9%ja@&GV1j2T02hC08EV5KrEa1jSBK%3p,SZ3!2YH6aB$Lk'LLEBh'LVA#J!mB@+
4iXF1i316,pHXr`krf8Y+kiX9DVi*2,d!,bPNa5aAhJ3ck!"NjjP)9+[$N!"H,dp
AV2hk)DFS@Bp32TVQA#8-ElLq["H4,HE$I2`j"C%1U`!!TC!%!3!!13!!Y`YYQVF
,ECS!!22@!!$fJ3#3!h)!#Eb2!*!16@pbC8CTE'9c!!(P3fCNFR"03806J3!"3!%
"!*!+J!#3#3*S!*!$d`#3"!m!3X(9'#*!l&*0BPEdUV&%-+*0FS"j-q!a*4Kl8R2
&,q3iKlRdNbG81+N33QjPBB&0mrFbY-IHhMllhpa4)h[Hh#'DqYhZmUj-KTSj[XY
3-,4Q$qk-(2GpkYN+1Ybq'bFmpZ[5Y'cAVN#N2p6#8f@CEeF9L9RMfkS&pU[0#2B
mbqh2j2SLA1Za$iTpKSGI`Y(Z@,Q&Er+0)$-*h0Y,@(NT#LffJ(1C,lJR)",Z!rV
X3"Hf'VbpF6KE&TUdZTJpM&hfFIeC!Skr*hcp&-X)XkVDi)ZVi+@3"!%!!$S!%,5
L@1kdSPMZ!!$e3`!!pl)!N!0b!!U4q3#3$P4ME#"548&%688!!9jQ9%9B9%0A58@
"!!#!!)%!N!U!!*!*!Q%!N!2&!*!%$`"#`G6)[q9[ia5rrCf$YG%282R4qUP$0pe
PH(6PU&["r*U0[-C1YZ-`5PPf['Zq1D6ph#pLG6eHF[karp#8SjiJ(LI&RZc[Rk6
2Vr-DFaaL4)RaRqP5fE+Bp[P3h"'+#bQlQUIGaNA-RSGh99'c!+eF#9Y&j5FkM+H
3!2K)Mp92HRk86jUV8q"NrYj$(pCRUhEZ6TY(+@TEAm[AD+"F1U(M#K4V#mKX'&k
V2HKPKEkZMeB(9k0L"dR(+SIY(r-BCbh5)b899qLPN!3"!!!l!!#f$CC'YJf@4J!
!pS%!!2Pq!*!$FJ!,RqX!N!j8Bfa#6d&6D'9XE!!"Nj*KC(*`9'0X6)%!N!-"J3#
3#S!!N!N#F!!!!9m!N!32!%,"e1T!eI3iD5hjjh#)@MVZJi5Si1ADl(0K"bl$L6F
c(IA8A548D))F(#92Cl#EMF4P$Fk*0j,h@Z'hZlhC4IAGDVJ1R,5MXeP[-VRPrrL
P)@bm!B#l,("ZU'[Tlk9V3J[S+STeJBjElJR@`KY@5!BLNdFd0[4L(K9#qKaHZec
8R8Fp3p1`Q#,jD5INF#-'0R51rr9lI4BmbMRJ+4F#R%d&,"qjR0f*TZehNjMpVP8
4)UT4p1DfBM`c3B+jh@NBd!AYhEaCl!j*(!Li"8mL[hGpjBfC`kQC@a[%TA3I6Y#
4m'1[a6$Vp!PXH6B8pJNYh%91Sq3SQHScqB$C%F%-heV#('f)m8$X1#kR&Z#2c8K
Y8,@p,N&*Ihj`T'`61(59V-FfcZ9I)RPKCA`mf'TiYKU*1Cp+$MidC1)!ef[0U5e
P$mB`Sf"-X@DG)dJ$4DhJXU'a3-[G,a%0&21*Lac8!+@3"!%!!$J!!,5L@'QdSPK
T!!$hXJ!!qZ-!N!0b!!KUM!#3$P4ME&0SC@aX!!%Nc@&NFR"8Bfa-J3#3")%!N!U
!!*!*!QN!N!2l!*!%$`"#`G8*JM0)4lA5I`#8mk4A%0Q*BMTMd9B(FDlf"kC5A12
,rm'X0'',YFKddX-SVHp-fTF"`HA3!(kK`FqB$TLq*T1ME*@Xr%r`11hUMd+hPmB
+b!88&S8j2$8BSaRK*2&p`ECFU8m[qB@Z!T-4Te)8GkaXmH+"%$iX(6FQdac&9[E
b!NGL1kdb0*2%pb,,+Z*B%if+i'fT"9p2K[dpc%m(9T9#C0I(AT!!lfah"PYGp!)
'4ZT`DB5bXGkQYF,$mR$FL@f6&6(4H%d12ji+-E9IAEkdB%,Y3&+)Nhp0AlH@MNJ
(@YV)%SKl6"kd*hmF+Pi103)a94G#`D$Sq!#PN!3"!!!l!!#dSPM&YXf[%J!!qAi
!!2ak!*!$FJ!,ad!!N!j8Bfa6G(9L,QaTBJ!"pFj08%a'3eG*4B%!!3!!J3#3#S!
!N!N#F!!!!5S!N!32!%,"e-qAT`Sbp*!!1P59K8N(L&e*3HdP6KC)q+Nk-HfpMA-
Bq--af8L2L*[hj`q+JMSZ(pRA@qV1NeZhNqMh4'ZV%b82!qTIkpk!BF)R@26CKYP
)C,3kq!FE@X8%d+DfijEaL[!Jc6PPL2`i2QNYPD[cNL"ecHQ!-hTj'JN&'Zh5hH&
0Y`d'2$BTiEr&+e5*qla52c0U&"fj6Z#i%h4SRpbY"@GHd#8pUa`+PRceQ+1bL)I
N4"q#cUKf0)elM+bS-9-&kf1KT)&ha,Ja54TqCFNb4iS6-RH)5)K#19aNm2kEf9J
,FL[p'De"P+H4LKm9eXBNJ6!ARZkeV%6KmJmD-)SV%ahE6SVMj8cH)(XD8C43BZ1
)q0kdlr+*BE,Xkl@(+4+4Te6X)C5@9i8!TC!%!3!!33!!Y+*BaVE0Va%!!2VM!!$
q)3#3!h)!%DpJ!*!19'0X8h4eBN0'66Bi5bjXD@)!!8N169"-4N0A58@"!!%!!B%
!N!U!!*!*!R`!!!%d!*!%$`"#`G5L`,pb2XUMI,4[j@dC4,i`Ul9Ih$"iM#B2&U4
$Ec6cQ8bjDrhhR(P)K4ZZh-)jT[`GH6&H5jMbM(afeY-Q(,rjUBAar`6J%hljUj*
[df8'hV#Y50+CNi+q*&Gr)bC&#%80Va'Eckc*A'U)3[@[KRe9E[pV[pBpj("1%IJ
@,D2KiKD0m2S1KFI!L-B%$IaCN!#jrS-4K[19ZY,R'-!fd'*L6*L*$8NhVDQD!S5
#e[kNIX$b!p6)drk4RF,Yebq-m*BSe,`rk+U6hUMbJ%Z(GaGP***Sp-MB(T*i8h`
K'QLdk4TQ91l66BMac,Hee[JR-A,4+a'4(I"ImVLhC+MhK"39ARlTrSRHdY"iE9N
KTKlcEJ*5K#iPi)*DpS2XK8X80hXNGir!d&16dG9jEQdI3qFSb0LPN!3"!!!j!"#
dSPN+YJI6'!!!r(S!!2q$!*!$FJ!*6dB!N!j8Db"548&%688!!@kq9%9B9%0A58@
"!!#!!3%!N!U!!*!*!Pm!N!2h!*!%$`"#`G6Klm3F3&63["mBeKi(c4[8HU$jV*6
UXG&GaAp`X"aX0Sf@Eh$m2$)XD82+I!V-M%R"PNUBK"8#aQAb2@E+NpH)Y5,1L4L
`915Kqa0Clj`!8,UjC1"d484(JNS5T+Yk2JDS%XkRK50`$"5XL9PcML`U#HXHe4[
&SZp1jYDTJBN1qlj$F9Z%hbr%6[F5b"#a"[I1kAVqD(Z"(f3mM$6k(&Z""VeY-Ua
+$6TBd(Cf`[@"ISAcJ6ePABZiRMM+*YI64`LQRd1SJd!%%EQGk2rXCrpTILhB[$`
*1a3PXIBMD'kb[4E)ji`!XB88DUMqq%4LeJ2&T5Z!TC!%!3!!1J!!Y+*Bb,B(daJ
!!2iK!!%"%!#3!h)!#Xad!*!19'Y6G(9L,QaTBJ!"3KY08%a'3eG*4B%!!3!"!3#
3#S!!N!N#E3!!!5%!N!32!%,"e+,![f!HQa1'!*(Mf3K&b96VlIlGF@'iaeH$lFi
*Z-&#$$)SZeL,JG[hMc@&(eLM+-X'r[3'"iPa!VTL4TEEpm2FHp0C(q*he@rY"qH
$5-ASV"N&RZT21ERkCkUU"A[GNbbG'Qd@b6'PHAabj'PUD`jA3X"i%HFEV%cRH*B
dI%b6H85,@f-ZDLFdc+jaDkbb9M!Am%jh+mk5(NC!VR,cq"40C'R,D+b@LAEa-GN
[+U302Pd@&cbJD,r"pF)XHi55YULja(G0fp`H#URmq*IIl5X'$aLKc([8kVEI@5`
FU88$Bd1E("Hff)raAKA%Z--b)mRcL2JCceSQ+MP!j+2qD`Y6TlfbeEEr!NL23VF
pK"#5'!1jBMG(hHlZQUelpB#PN!3"!!"!!!#dSPM)YJI6'!!!ri-!!3*a!*!$FJ!
31hB!N!j8De0dG@*$4Ndf1%XZE'PL!!(&Y%e36%C$9dP&J3!"!!)"!*!+J!#3#3*
j!*!$l`#3"!m!3X(8[R5'I"$LREVIJYe1PA2'keL1RQN5CLR3GPX`16%GKk3jeYQ
6KeBUR3Tj[BCiVMj+@HC$jMph6+DeN!$q'c@Cf-'eX!&j(rH"PK"T3BQ++bLjZT[
!Bc"ETdRfaM&a8%QHYTK(j`8$bff(05'ERiZbCR-N[Gk!E2XhCkkhcf*h5e`Y5Rb
8QeFb4(iK-f@N2V&%A44*+M'3!2hQN!$HG0!(&BqJM6eC2b'FS6rjh3`-TF'F2jk
CPb8c9#i$m41rGKkmJIJHer5r'e&VU@+"m!,E@X+q4IrAMha'8aKdQj!!rre%Rq8
kAj!!BG8b8r@9hMkPJ+@3"!%!!%8!3,3T(VQfm85Z!!%"%!!"$NS!N!0b!"9JC3!
"!YS!!"88!!!,F!!(9'p[E#"$EfeYB@jN)%aKEQGeB@GP!!$mD3&$!"B#(3'*!F!
!`!'3!`i!I!"Hbd!!!)!!N!HPN!3"!!!f!!#fm85NY[&%T!!"!R%!!32`!!%#F3!
'3B8!N!jdBf`i,M-!!FUcCQ4bF%e"3e1!!,,JXQ%!N!U!!*!*!MJ!N!1Z!*!%$`"
#`G82jI0U9eYPY3YM*-ZKq3HRr8%`UdjALrS-N!#hZr`k[263P8d-P1KF@m@mfM9
&BkAi$V%[N9ZF!NJkkp*Sa9C94Gcf@BPF@,r3p(j,p-NE-`-aH$2!)6F8M-G&9mH
hd0CU2G2+Z6+[(3e*C5VlFUmrERADC)&1#ELr`!6R,dN)EQHL5@ZLGjbUj3)BQB*
BARp(&cIr0cFLqM8kEmiP)`DdGT!!T`(kL*SBD(f6X+@3"!%!!$X!!,5L@9Qf1r)
b!!%#fJ!""Li!!3*a!!ZU5J#3$P4ME$JZ-bjcD'aL!!%35R0SE'*8Bfa-J!#bB,*
K!*!+J!#3#301!!!"d3#3"!m!3X(9"+5qk$KcSP-*+"pN+HAl,K8k8lQc'XXd535
mkB)(SLmSLU@RL%!%Dph1fRi2B!S3Nhh(IIqe8(['B3X$+Ib'MM`e-cMR3Vj6GQh
UkaZ8%JA))Y!IX'mTAbYNj1-EMU-f0eAY@i!5dYRp3%kC6acN&q1@%e0am&$NH&K
#i)1@)*dd*Q`HH84%i)Y4,B'bd2P[%6AI,6LQLGU[k,Hhm#jp(*S2h'9IYh1l"i*
4p'NEPR@f"2P5`cNd1UhN-+R0&A)Z`J5VjL2%UiKBUS#4fK&1)qNH-P6Re3Ykc(T
A@5pZbVMYK+0Ne-dCQ'-(h`)H#h12K5T$E6ZY`*hbabl3rN!"X`'3!,A5+,*ZrUi
1cARJL[P1V#Bi)5CL2P)eSfk5`GeF90+U0$mbUEeP"4"jFEKf#fESDLA'BJ4JKC*
%9Y[UfI8dEGT[M4IZGKKU`0L(K-be9ZUJI6-fj,HS*b,T164hFFL45Ap%Zc2r"Pi
V31XhFGbY2SU$+`FB$(Bcq1A"eiqIhq8qhjYZpPY20C4MLF[-#K&TJda8lD68*!R
Ie5KRR"Z3!$6&&NK@$fL6(f+mX@2Y8"Z@)11G0(ZJ&)2&a(QE+l)*UjG)lNI&dB!
GL+UhbB#PN!3"!!""!!#f$CEIYS1eR!!"!r!!!3IG!!%#F3!4+@)!N!j8Bf`i,M0
$4Ndf1%XZFfKXBJ!"mrCcD'aL9'0X6)!!XU#bB3#3#S!!N!N$@J!!!6`!N!32!%,
"e3hVTAlJP()mL0hYZPIbCM+T)@@a+Rq&[JIcES!ZKPaG$)&lTlIXRXCj[1Il#LD
drAk6,cQ0)IY'cQP602UQG2c`[4#!DKVG)b1MU%U990b)B0#B,r-3Qf81p!+J-SY
m`p,08TTf3m6,)'JR`,EPN`m""PmGKXM!%RG!E$VK`0E2Q[)MKDJ%GHF)j@#d(J9
%`*DV(mTHQpp1!RBa'dKak!&l'%K&%M)STCj5L8HM"e!P-H6&,!V,Lp!#r+hd`Q+
jIEC'#pRX4$l@1J9KNDT$1NN!@UV[B*MBFYMSJFTm91aZ8!qIV![bE$a%SFhcEIV
+Mj(PdNS"mMNpbbKI(TJcMr)U9J(FGAY$68aXDh!Y@ZV!i0dJYdZZ$'Bh$5rpT(f
J8DI"fEY(%lR+qmD,[N(,'6+a0#&#)&1XB!#PN!3"!!"$!!#f$CE4YS1eR!!""Li
!!3QL!!%#F3!6iP8!N!j8BfaKF("XCA0MFQP`G#jcD'aL!!%eMR0SE'*8Bfa-J!#
bB,0K!*!+J!#3#30H!!!"8!#3"!m!3X(8IHVQEZAX"LHU*&)%j#Y(95+4KL@Vphl
KpABhbhB@!Y"&CE9)iA%-eYfPAF%B1bLK(FUB"kbZ$!m8kc,#,q3$d@hYKRcV%ma
hkZ[4B28j5l)p2r*dpPam2prU@NU3!!)K[@mJjA6'L[0pG!FlYJ#HlNY9`D4SlR-
$36dGI3ah#p`U8Kml&GqqI(TiUVF&B5RNJEiV&kV-#&!'(QhAPaM$qjC!2Eb"4Dq
jG1-l01r#QFS02qD8a6KY$dm%4L$+)p!PYNH8HY503%IPKI0mNF$Z`pii3IJU20(
@aPZ4H&HLbbapZfb0BMp5D[[e%'NI0%,L(mY-*laT8ETqrH'`Qc$Gmr5G3&BYEj)
SDhFd'BI2J5U(fF@(-*MpbNH(f&1f0+fK('kJBBR%E$4kmQ,(amXdYTE+$IkL@*P
&PKPj#`22r($(!#'amX!01ILfeIp(J+@3"!%!!$8!!,Ea4+bfm85X!!%(h3!"#VN
!!3*a!!8j#`#3$R4V1#ic!!&YFfCNFR"03806J!#bi,,K!*!+J!#3#3)d!*!$X!#
3"!m!3X(8LR8'&[8,TelN#*1#IJF1B)EGSQSRD3@K$fT!UDUEI#%RDB`-$PR!h8@
$@)IqD!rY(kUN"4a!"hKRIUN!EiF,21)ha(b2F""a[D+9pk)fXhZ'Tq8H&V[(B5-
P!&MC9'c-H#YNTY[rB`fjAEV6bbFBI-8HE52UiGjiSrhlVfD8NB29*%fRKS&%1'-
aS`1%b29HhD6Y$qVb-bb`1L,SIqqD@TLFB#ddiqbR`3$JV!#PN!3"!!!k!!#f$CE
0YS1eR!!"#D)!!3ah!!%#F3!+B``!N!j8DcJZ-bjcD'aL!!(Lk(0SE'*8Bfa-J!#
bB,,K!*!+J!#3#30,!!!"8J#3"!m!3X(9(Hm6`ek+"j(K4VAGlQ96B0flEIiDYKh
B"&96ATd88HeGA%9*Mj+mZ&r1aflFS!9-EcT!&!5p[%CC@pSa&4e,kfc2(2mjPll
B@HdqGS681r5+R"f%XJjdQFHQYD3!$USZR06*MRCKQiKh+8#0Kc3(F4"q,Qpbk-q
m$E[hNrKq-[MRj-phQ,E+d4p9JZMP11)5)m$m[B!3iXS1jUUHKZ3*R%F$IlXVB[Y
-JcC+LhrqD6K0-fQI$rHhDY+f,"c+&9RHkXMUe5BKVcaBheY1EQ,DdR-4e+eb3L$
jkSb53Jli"@9BPLqSYpj6i)JZ$(),)bbk6"3R(YPPkHLH1ZMC9lAd,j(JdK+@Yd*
9he&&fG,AE!JA!N#mc8*kM8VNZ(rrefC(H`J*UGNkMf0CQH,!4eq0+J6X3k#'MJS
*RmYTkj!!,!bDJCT8cGJjf+NV$m$rdp!!TC!%!3!!3!!!YJf@iED$YC`!!3Uj!!%
1'J!"!R%!%'jV!*!19'Xi,M0$4Ndf1%XZFfKXBJ!"D4"cD'aL9'0X6)!!XU#bi3#
3#S!!N!N$9`!!!6%!N!32!%,"e2)G%9!FAc3L-0cAL!cA&1pERJ,h8Nh6F@9Uq2'
Y"*!!Ti+a[M-$qSGeFNHC`H'IZ14[IJ*pNQMbBrcH%9X)(b,karMNRc)A`F90ZB!
I*PiEhlSRacL,(e2DU5fjpJU!-eNZ6pIi9D0M6k9)B2'e3NbDXYE(JBBGp2)B&rI
U'EKB%)#DLYf%$NhJG@BSE1@N@p5f`D'ZH5&XNHqiKm0rfG2ClL)`L`'$MPEZcK-
PjQLPTdQ&Qha5,$UNM[dMN!!k&[@k'Ek,5$AM2"I-@0ZI(&+$"AY9JCl[%U$PZj[
iYHmf[2Fd0Zal+44e&`%1!RA[)LqF3j,jk#f%GheNMj6d)h-TcAfZ4@,j6X1$2RL
h[VQCQ#*-3"6[a3PAH`*,,))eebH&!lQ85c)kj&Uj%ae0-8#PN!3"!!!`!%!!N!N
"$(F!N!8"!R%!!-rMrj!%!*!+TC!%!3!!2!!!YM-[3EBc,d%!!3*a!!%2J`#3!h)
!$#`2!*!19fPNCf9d)%4PE@pc!!%VkQ&NFR"A5A0)J3!!3!)"!*!+J!#3#3*a!*!
$b`#3"!m!3X(9'#*!iNIZ)BM#b!T6Qp[qZhdQeS&S[XJCVcmI&DCJEAE*N[cPmU,
d,L'C3lLUFYI@!KQSU*ZcBpI9T,)INNMci@B-)qQS5[GU#XlP0f*,N!!$Y*-,k5j
DGjbVaCp%Uj-FQk@`+0d&+5LD)YKkQ,026rJC0SaiYQ`#[m(C[RBbqMTD)3rSrb`
b2ETjCLh$$Hc&T,'kK,q*+BJD$dk2dU!iGMjilF6k'piT3bB'PbaE'q3@m`UZqCd
*c1!IC)(b5c$)NL5*Q*YmHA8!TC!%!3!!0!!!YM-2qlBc$rX!!3j+!!%4#J#3!h)
!"!pT!*!19fPcD!!"IleKC(*`9dPc5)%!N!-"!3#3#S!!N!N$2`!!!5%!N!32!%,
"e(+SSMTD!GR2!ZYAQ(%hfFD,4-KE&9%lR+kr,#H%`a05JhcAXjD&%FY54[lGf1p
T0kNVdZIZJMPrQ"@[NM0M-EN"3I3cI#N&Jcdk)8bQC+Rd"D[[q3#DKA9I(3-'l#5
R%Q![rQ$-HIJ+pM,[%N2bJRd-EI5m,DJUE!%pEZDVPS$hfq6YRqqG(adZKk5cGcc
-&DN,YBJ@!8%(G`,XBVfJa+qDpjJMA6V@8%@SI"-Va3i[kGd")m-'Tm*)C'k*QaB
hRb'4KY[f6,l+T9Q@-mk[Q(clJfEG'CaMm@LrX"MmE0qEG3'##(K,e,BH6Z0p,c*
@+&SiUp[f$c(EkqS@c"0S#$r#i&JUJrj6bq@BX`FM(Pqj8!m2c#a`0XS%&+m-6!#
PN!3"!!!`!%!!N!N"$i-!N!Gb!!!$0Iq3"!#3#NQL!!!"!!!"MdN!!Bj*!!!%E!#
3mh`!!3#3"@N!B`"p!*m%!Np,!*!(23"J!21)A&4SCA*P)'Pc)'j[G#"PEQpeCfJ
JFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9P)&9Z8h4eCQCTEQFZ)#""EL"KC'4TG'P
[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3Z!*!$8J!"!*!&E3"Q!)%!SJ3#6dX!N!8
%!%J!C`%$L$*6Eh*bH5`JBR9d)'%JC'PcDb"bC@aKG'9N)'9bFQpb)#KH-#NJD'&
c)'pMBh9bFQ9N,J#3!d`!!J#3"6%!C`"&!+d%"&&eDA3!N!8+!&!!(!%3L"T9EP0
dG@CQD@jR)(GKFb"cG@0MCA0cCR9X)3#3"3J!$J!S!#kJ!J!"!*!$I8&%3e)$!!"
q$9-+Ni3"Sfd!l!Yb!l5b-LXVieY0hP[[D[HQELEAJ$%!3!-!N!1kY3b!!!PT+[l
J!985,2Y+b&X1iq9cZS94MV)rcirrVL!j0k`Dq"(+KM9jKQ+MCf[`V&ir"HlX#m#
`U3BL1%aA2VhVbkfM'32&(&P,'cJ,!*!$@J!"!*!&A3"`!(%!V!3#6dX!N!G+!&8
"%iJk8fpbFRNZ)#"*ER0dB@aXBA4TEfiJBf&Z)'pZE(NJBQ8JF'9bCQpbE@9N)'p
Z)%K'8b"fEfaeE@9c,J#3!fi!!3#3"@J!HJ"m!,B%!Np,!*!(5!"H!5@)6P0[E@8
JDA4PEA-JGf9bC5"cDfP`F'9N)'*PBf&eFf8JG'KPH5"KFQ8JEQpd)(0eF("[FR4
PC#"LH5"dD'Pc)(0PE'BYCAKdFQ&MG'pb,J#3!eS!!3#3"9d!F!"a!+`%!Np,!*!
(5J"9!41)1P4SC5"QD@aP)0*H-0-JE@&j)'*P)'4KE@&RC@3Z)#"3E'9KFf8JGA0
P)'Pd)(GTG'JJBf&eG'P[ELi!N!-S!!%!N!@N!)d!Z!$4"!K$EfjdD@jeC3#3#Ci
"AX!#!qJ!N!28384$8J-!!4)08`UE*!!lLSL+&Fm@d(1X4'`3p5`rIcrXejfrjql
1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y1)2Q3!"m"9#5BqM@mKDIGaGRG6G,)HT+
pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk53ElSG,A`G'S9QL)q"HC1abaeLk9cJ@A
[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9c)KIFIJai(r!m3+*2iaUXL26-$cGj+&$
EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`cTre6rb@d!N!3k!!%!N!93!&N!C!#6"!*
25`#3"3-!4!")!1L)'94SDA-JBA*MD'PfC5"TFb"NB@eKCf9N,L!!N!4)!!%!N!9
(!&S!@`#8"!*25`#3"3)!43!a!1L)*eP[G5"SBACP)'9ZG'9bC@3JB@iJD@jMEh*
bC@0d)("KFh0hEh*N,J#3"!`!+!!S!,B"(!3"998!N!--!#!!#!#L!4`!JP99!*!
$$!"L!*)!m!'B!)9993#3!``!+!!S!(8"2!#(998!N!--!%B!TJ#k!GB!KP99!*!
$$!!J!!J!SJ%F!)"993#3!``!+!!S!+i"6J#e998!N!-1!#J!+!$#!D3!L&99+!S
!N!--!#J!+!#8!4)#!&99!*!$$!!S!#J!M3%A!J&993#3!``,9@j6G(9QCL"KFcS
!N!-)"b"QEfaNCA)!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3N#a"CUkB
Q*lFpLicJGZI)5EFc8r+CIhHrlpZ+2"[Ic,He3*,9cZc*j%RB[MZ6%C,P9Z5*V-M
[(j%rNjr*[0R@GK&*&K1b0bh*)LK!iJIr6PQ'N94%1+J,1hML*hBK,0+!l9$&S4C
f%PiIcijT$+G2[eNUFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR'*!P,+@R
BhU3A&C159eN[%2cJbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FNFrFAJLaU
$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUmG+cH9Fc#
*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"GBJ&RSpE(k4UNSE)5VZ#(4a%4T(NC4T5D
'+#Hca)G5#DG%eC'a54-U)Z$aJ`C3q')!Y4*YQG#!*634DR+,6CR$@+QN(kF-V(@
SLpVJf!+P0U0c9&M$',E[r55!`Li$a$PLQ,KZKIc2X5Gal+,YACH#6FZ"UHV$eS-
Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,F%r*FlYZBmf)r3FhBZqB8*mKFDkBmH&M
*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NBKdc[fS@l
c&8+41k84G`VH8bAIPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi*$'iYhrb
A$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIrBQ',QaYK
L5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''TAaj91(AL
#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"Si!i4'pV`
UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A9[Q0'IDa
q[E"flB1d$rZ$9epp#4ZUUbq"F")bcdZiN!#&AS+9c([M)*1*kmMQF"*$DeK5eBS
,0G(8$DlUGG,@)I*P,r@PJf6iV!k3!+U,`iQMEf'*D&FHY3@1%H!C2CVf%Lk!`1`
-EZQV3EfDc)k)alY-h[lIZ!qhTr,*MDZ6TKGp,[+bNp-`jPQCpEJ64GUkaD!DXF'
80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS,DAF-pIP
CbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMDNfrH5e-h
a@AMdST,jr-qAljL($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+H`Fl,5pZ
Ha$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!-B!$3!N!2
c!9i!!3%!!3#3"32S!*!$P!#3!c`!"33JEfBJ"b"TG'9YFbi%8h4[F"Y*G'9YFb"
bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j6G(9QCQPZCcS!!!FL384$8J-!$%-1A3Z
VJL3qkK$[IhHFK&$&)G4%DP3id51JI+m$XhQ`E%%LLLY5&L[+BUmfRPPS56c20V5
eRIKlp5'd&R#V8-'DN`[NHa2f&Rp[Uq2[+Bkr"`Z$C0@51V1le%jX88M#[#6,5*F
+)D6h2b'G@&alE[hp!!hQjM3a!53d)c8I9H31TRe)rcV)$iI*09++@dDQTRq#k&T
ppEhe[XIrZIY,JQEAQSTlA2-l*paR2Y5,b2iCjXre,L1E3r2Sef%ELF&(C*Jd)T(
#pFK,#LST),jM##,K-*&P)-*'4#N(P,)Al$TU(bITSp*QRrABYfrHDa1r,6ZbNYQ
XrAKQ61GrVaVm%1D2fkBE,&GRSiHmj'jdIq'+@IR4JL(UGe5X`5E*!eQHbRapb*Z
BmZmrGfA-)@dYfHQr'i"Y)IkTiB`XAjf#C%06d@6BATL+H`a'2eQEE-kf+IpU1*1
YDdKN$-N9qrQPKCPeRHf6%JDc)IYAk2DPL!&Dh!UIjADp8-!q4hB[5KibK#-S)Ia
D0Zdmaq,MV3&H(T28'jD(r@GCA+CH%l)[SjdNfmEk-UZA@RA5k`r[AePd(Z6H@GN
Ei(ZR#f0fIc4Z%cldphL%jIr[+@JqArAVk3,h[p@GN`4mj-([2DIj5KfmRVaKJ-K
3(i2,4hV#!Ej`Fk``mZU3!'(1Y[VK-#CLRRM[*[A0b2i&[YCHQ2FM@iU%X,h2T5G
"SY-3c&2Z4+H4+(5KA("K63c*QPKGd%6$!8eN1%f`#K8QC%qL3NCVUAUH+PkT+F,
G*ERBE&L6qA'pV%RTqhC*Nm,EpS)Q*pqZHNZ6(BrcT3(Q1ld"T[#(RS!AT@fTJ+6
j(l-"$q6QQlA0q1#b),24mMSm[r52PEZcdS("#!a5B2!#JqS1GX"hm#+(KEAh#0-
q(T9LIif+X83hfXl(N!$2KDajX'+)-G-JaQE+,D[E-L)rLl1$A@L+48kN6+2A(p8
riYX1elZ3!%30["K#[P"0iMMN%'I5pDl"+9($iJJJXeh`r)K66A46"'G#6q'"1'G
X)pR$1GJ()$K)%EikjmV"McEMQFiXRPT$L%b1QR+#U2TXMQl#UCS'[kGY`ZS#8XB
c2MHLTK+h,m4QE(`P8j&K"NN8q8LR%p@EX,5+E$ebj+ZL'$'q5jcDiK"r'aCE2rM
![3Mp3ipm$r,r,VUNla@b)ak5[2,NL@EbC-H1&*8aQNammYm8+D,i%Pf)49MDQ)m
acSk`RPqK$Jp1l$GJp$"20l0kARafiHF(YhA#D1kmr%!GMCe)G9dBhH`JPG8R1i'
mL'`Aj[Am0lr)$TlmJMAL"!0#e4+YcRI(qI(aKj4VB",1ikHNqkKTHrD`(NAIr,B
64)dBRD*kI)8(FJf)PpYLUHcfFR"8l3,`e[%Q&bL%`-&&YGEjP4ij#NEd6V+N-r)
qKQTKU%paAR`@8ArV[!i4'Bam-j0c+VVaMi`"$`5'lajYHZ$Xd+0%Q9YU+YAP[#8
f$94@-k#0MSPSJTCL5S9dc+@K(98LMU4HI-Z"*Rm343l'9e"2HEK`Nqj%)qGMQq)
+R0&[,r0r@fTq,F''-FqLM!jk'3SQjA!,p!IDJk%SKZCHi*)1@H!J&`-")$(rh0Q
R)14RcfEf0$DQ@cqEZhqaEpcchI[hrLLqclAmDE2-8SaQ2eRA5HPZ"UHTC@-&[Q%
8j"YUe1!Y622V3R*TYr#bIG*FD*Ghq3h4Z'5eDXNV+ZjIikS%GB("F9T)XRmAZ(c
KCrPf15FCGQ@Pb-e3mKCMK@#Y%`52'qF!Gr3)R,f`(j*[q!dYLM3a&%UHIUZL4'k
X5P[LF`-A#jZmTbUCk4B59h['2-(LKXPJ,FYEfQK)*'5VB5rk8$c0c%VchKF+rK9
N1l%I82R'JS*$-Y3DHCC$hSKLHIN04aPS9dcrbk&2&L(5F,9FTUfDSCL5h%8pT3Q
Y4p2A4bbAG0+APYepe@I2P&9YYedrVaAXD'RZ$-&aIf-`D)LDeqZmFX8E`V8*,pF
BA!U9mYJZGlSf+Nrk2F&Jb8i'[Rp08(r[j6c"a9#4MqhD(UBSDr"2$0'm9X&64eP
(U2J[cqZ'jp+,JQ9G0j%2YNR99Z&5ifjZ8A#%cJ*bX*(#@jJU5Y!)f+hZ%ai6K'2
DqN[dA!"'Z2k132HllH*P%+r4m525"`NbLV420j*)$p3L@B%)&fQ2cAHj)&`fiLX
ClN$MN@6qkSB9MT1F$'G-&b43k21PXRrHr1KIqH54*!+d@bP*RklP@V1Rq[VIc)8
S4r4Mlr4%IYqf3j8Y'eD[XY"H*eIG-"KBFc53!+V`6R-(`TQN3UR%li#bUaf'@A0
FScBST8KK4j+M&2I6pMUVhE0JN!$FUHSSGAbJl2@'`P*aRfPNY'bJYShE9AC2VVC
-'LV0Nq(bS+A3*b'"X"%i4N195-SpCUG3N@C&-%3)+h4$prRk"ap0Q11q$`#3!aS
'!)!!N!-$0Li`$e0dG@CQ5A3J8d9")$BZ-!#3!`i'!)!!N!-$0Li`!cBZ-!#3!a8
!9!"N!)X"KJ!"!3#3"`4,!*!%'!!m!%!!X!'B!!%"!*!(!3F!N!B")N&%3e)$!!1
+$9-+Qb3!IiC&X0dj141`a3jG5dj2(GX"&32EXIVB$&EecMiSU&KpE-&ZV1V'`$p
MIe6d[rp[Mr0f9KR'kJ!,Q680A&D0p-'14[HZ8aVX",2c+"6FaH)b3VE8Z5$*F`Z
3!0p[JRD#kG&%G-mTHE-6hEc*lLZ&K$2-5eVUQP++(3Xq(j[6I`6`H[ijkXV6kQV
rRepZakZIr82rqj'@*3+i-fUMJQe@`8JQ[%@VE)a9Y9jE2Q+EYiAYB49ph"I'dPT
-T*5d!R%I6(k-`pHZ'qD(TKRU8p[f6Gd2ZK"S@S!R"-J!R!"-[ISY!2lU#3-4I`$
`SR,K!K!FJS!"JQ*J,6L,N8'-h`a#j")kiZTMNXbp+(%I60pdq8A%+fc,'!#3!hG
"4%05!`!!J!e6#eXJ!`1QB-1UDV-`X!%LBQ!h5l(E@C@J)',$(ZVC`*K9-3YM+VV
hTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9!Tf0)-Sk[fIFQ)JkrkFEqqpLI1PG2++D
4"4f4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#3!d`!!J#3"3J!0!!D!4Z)'e"XC@&cC5"
TER0PFR3JC'PcDb"H-#"hDA4S1J#3"JX!#`!V!#ZJ!J4,!*!&(3!d!#d"')J#AM%
!N!-k!!%!N!8f!)F!5J$""!*25`#3"3)!43![!6q)'9i`)'&`F'9KFR-JG'mJBQ8
JC'&YB@GPC#j,!*!$UN&%3e)$!!#f$9X,8c!$Gh-YCJEX'G2+9FBh011qY99@aMp
[6qr9HVIZ2IrL'aS!!2!0!!$S0Jd!!!Zb,4Z"TIJ(GQIlqH@Y,A269XhI@GL6%@d
lV3-R+QGCfFQZmRMAGd5&i&,%Ii)B&,j%$*hc3NQSKJ%P3S!ZU!lHe3A!Ni8FS"L
dp)0C(qm)NQG"[L$ILXeK[1,pDj-&TB85+iUjFYcRZF,59(MPm@%"!*!$$!!S!#J
!I`&`"+p993!!!3#3!i!!(rp!!#!#)!!L"*!!!#B*b!!L%q3!)L!#!#*!!3!JKq#
!)3r`3#)F-#!N'Im3+"U+#$)bLL3Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!#2q!
J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!!(rr
!!$rri!!rrr!!2rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrr!rrrri2rr
rr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"r
m!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!F"!!IrrJ!)!)-!#B%#J!T#!N!)K!)J#3J
#%![3!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!C
rb!J'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P(#!JCr`J)($!)#!ri#!J!B!J)!E!)#!!
!#!J!!!J2rrri"rrq!!rrr`!2rrq!$rrr`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rr
q!!J!J`!,J3+!#%)#3!Q%!L!)5!)3#j!!!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`
!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P(#!J
Cr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J2rrri"rrq!!rrr`!2rrq!$rrr`!r
rrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!,J3+!#N)#3!T%!L!+5!)3#P!$q!J
J!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J
-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!r
rrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!!!!3#3!i!!!!&!!!!
#)!!!"*!!!!!*b!!!%q3!!#!#!!"!!3!!Kq#!!3r`3!)F-#!%'Im3#"U+#")bLL3
Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!
!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!!!!(!!!!$i!!!"r!!!!ri!!!Ir!!!2ri
!!(rr!!$rri!"rrr!!rrri!Irrr!2rrri(rrrr$rrrrjrrj!$2rrrrKrrrr`2rrr
i"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!
!N!J(39"36!#3"JG6C@Fb!!%!N!3(8f9R-`!#I`#3!`G6C@G1!!2r!*!$"d&38%`
!N!BFBA9cG!#3!`&*3diM!*!&K%C548B!N!@%!*!$0%&9Fc)!N!-"5801)`!$!*!
$J!!"!)%!!J##!!-!JdC548B!!`#3!i!!!3#"!!)!JJ!$!)-!N!-J(kNJ-6Nj-#d
j1#""E'&NC'PZ)&0jFh4PEA-X)%PZBbi!N!GA384$8J-!!3%08`,FeJD6pp*'c88
6E3#dq6FZ[0Y0'fE#E,kV#pq%hE$Ej0efeG9eB3!*1+@)rh3&qKSdTMBHqm5GDpP
1JSQ`da$k`,2S!'L3!-@qrJ5q"J!!"!#3%B%!N"k"!2m!N"b"!&3Vr`#3'S%!92p
8+rm!N"L"!&6rN!08+rm!N"D"!&6rN!98+rm!N"5"!2AfN!08pT!%+rm!N"+"!2A
fN!6ipT!&+rm!N"#"!2AfpS'3"PEhp[BVr`#3$S%!pIEfrIq3"[a@pT!$+rm!N!b
"!2AfpPErIrH3")(rprD3"#[r!*!+J3$epT!$r2hh9Rq3"DZ3!hrfpL[r!*!)J3"
8pT!%rhrfIbTr!*!$9&4r9L[f9#[r!*!'J3"8rrD3!eErq2Gr+Rm!N!089+[h+rE
r9#[r!*!%J3"8rrrfN!2mrIG@9#T8N!9rUrIfp[rr9#[r!!#"!&6rN!08q2ErIrC
r+T!&9&4rIrIi92q3!e6ir`!!rbY8rrrfpPErprGr+S'3"+a8UeEfN!2rre6ir`#
3"2mV92rfp[cppPDV+S(fN!1"IrrhpT!$re6ir`#3"[mV92EfrIhh9UZVrj!'IrI
fN!08q2m!N!Mr+rEf9[jrpj!%ri(hN!6fN!2hq2m!N!Vr+rEf9[hrN!D"pT!&prM
r!*!-rb[fN!ErJIH3!rD3!rIir`#3$[mVpT!$rrrirrripT!$prMr!*!3rb[fN!2
hprMhN!2fprMr!*!5rb[fN!48pT!$prMr!*!8rbY8rj!&92Mr!*!@rbY8rj!$92M
r!*!BrbY8re6ir`#3'[mV92Mr!*!FrrMr!*!Hr`#3-8'q384$8J-!L*3393eP94%
!)9AZ4TmqRj95PcUATCN,r9RRV)1Y&6PH1jc3GFqEVLjEl3C1JUk`V3AFmqjV$&`
iAPc"J3XJ$Z3-4`bCdm0Y##l%,r%icjZFCiMR%66'8q2A)&qI0c'k%%2)(0[kr[[
m2Qer(3-KPpIhrcNG9MB5%3)"N!34!C!$%8)1!&d$hjVfq3GkSM-)I$p%JIi-VY(
dH,DTQlm%+I%l&pq,KG6e2rZA[*+*Ki9Zk1YTJNrm1+q%MK*aN!!IIC1)fQ+kp4C
CBci[B"bL3I2"8)RUN6Ap6DF6h`'adj2)DcU0"36Mmj9TS#RE"L,9@i0@[`hNhLm
(IrBACr*6N!!XQl+0J6[RfmDDYl`eZ-EFY"[,Ar&P"-ZGI0P*VbG+3ZHARDAA%bA
"9VlF#D*`cl+cRIm'%,b12Zk6)#!Q(!22j$P$*LG-J5E2RrM!p&ER[i'19!mLFeA
c6N(d(66I2qpZca(Mf+)36klmC[al)S#I%(k#V6P#rY0r$hpUIYB@",(+iU`)$BR
rQIVVj*!!BbLV12B!RhBj+rKLAm4PV[p6I@`Z(mV1**MMND'46f-5JpS*JThiaJ(
9e$mc!FYX`5JbS%jQc(ACRK+qcZdJ5-C%8Sb,EF+8If@U8+AL2hqGqLXec0M8ApR
%13bEmE0Pp!T04Dl`k9(pG15+a-THM1dE%ppSrR'N,pSRJRP#jC&[cqrQ*)1$9[I
RhBNF%9hjRr(2XIR2XIR24E$MKqNLeYEb!h@!Ecek4d!G-&[-pGGEBVU94iL9[h)
jSlBI2Q(HkZ+[+[6(@hria*@Y4q8F&#j@-A9AJdj-(R)FbQf3!2[cZc[L4$4YlEI
HBNe59SM+BKeS1Xd'k9K)5mT1D59#UF6Fpehf)N,XfQ'I0DNGG1Q2r%H*d0P$P"d
SUMS1S,'4el6EJ5hD[9K'N!$*Q'clbaYLY"XNB2b(E,N5qH21Jd12#M'9APmSe-r
AqEGd(S6+!K$l`QLhqIk0'dqp,6``#)mmd"4c*QAA2K$"1fY'2p!8*qr9"bHDT!"
P(`CE&M)rS()$Dq`Q4pHkf8k[l+V1N!$IV2j)cTBeXVrk&-MqIKXac9$Y5CM[fLb
`QD+0FREL1hrF,,`J1iF5rPMdRVfG32#2c5+NqHR,Fe621"#8+*2Nc[Qi,%1*8YY
IbXSFAB%"CkKCaEG"aA%TXR+5f)!rHSi%f3p%3F!A[Vb8Lh2BjD(9YZ(0rb!@SB*
"LpCq"(P0CF5DY`MaNKBaE+d$"90r'),RP3LfC[Im"KA"`BkdY9i+[SL86Kk3!,G
34%Q"Qb)+34U4(jYD%fNblKY6UDc)J*!!N3(4@A1LZc@[b5JRl8p5G*[[YiRd81I
fK)JPf`+#b0[4cS1Y`Qakrl2fJ(RS[IVVKm`QNkRqXlP(TCGK4bDd4`)QNpPN(jq
&TTlCjI4C2YX%)EBJ,H53!-5dLEmdQpS$+GqirZKGPSCR-ldecdC#,rmB@fG-RBq
U9#8H)X0CJj5Y',!KUXG844BaXF8[UJHU8mejcBHEFTZ+V)JFPBSb+*TEQQh0Gb1
6ilqD00@cUQI*BmD8R&4Nb"6HZ6K40d[BakQ#RV3iIIJ*aIaNR-ecBP%8ZHUB6aT
UX`cQ@i0VmTSqE,`ARfQ0*cXAIlXB*,bSk5d`eL'6F-q*EQ0J!Z"fGFe6!,BE6hb
DUrTkik3mCMmMbrT,(5klhaLU"aP2RiRhUDXa!UEFM*49-VdXMje*cl#(-38U-Ie
Gjq,LM8rYA5XDarKRk90l9DV'`kDmaVkRpSTSSkPcmDl032`jFeT)B$%("mc)'XT
E8SHIUXiC2lM'&MFYETjlq,R3P#hHjhV+eAbp+Drj*L+*i'FZ92a&j`cc030l*rU
Jj2QQ4DT(m&10LRQckN@`9022[M&E4I1[$81rZ[RAB'XFb'XZ95h#C#2pD0RBN!$
Bf"!N#Ep""!fpI2J#IVl3XRk"RrHdV22Cd0rmke2eI@*Bf!DDRk3-&BZ&`"9RD(r
J9,GbBiLUkpHBQamh6Uea0@r&YMpd"1dY%`mhIf'deFDJi'(()YAM6M@C!6,ZTma
T)[6'Ai,)5PfA!X8CXT*f@5NE#8!A8#LK,&pcAZ0SmmG@RM8TNXe28aDL5#,UGP8
rPE$3#e6c6aZbA!c%rbii5Fb2,%@3!*k(JX3"NTTca2DUZAkEX+d4AR0pcE'f[Ai
UAAecMm8fdDXHrD[A%Q,M6qPIk8r[X'`pBX0NUpKiKIk9AVRHXK8Jjaf[f3+ck%$
)A+pcBH($`F[Ea-DVp+rdkXf@VFGXlXS((cPkmq90U+VRp[dpUY@r(a3KQfpZ,`D
qF))pCB3#L'RV2JYPq*ZV@j%pKb,C8Ie4Hk3,5-kIA)SVjpdQ3Q-$64qDhpXad$6
0r0RbBf0Hmh[,Mfd,D0%iX[9B5[,Q)iF(QZifIapXFm(ffQ'hqI[,AqX*E2b!rT9
qm2L4VDr01JC8qZ6)$8!-Rl0!V@aZ,jr`F@6k4p[Nb$kGD'QZ(XMQfIH&e3l+$U1
XZq%D!(B$MC01R5j#fGBL#H,93(e*I*Y)lYXQN!!p$4)b-NJT`KT[Pl0MZ[B@aKJ
N4RN)1Ap*L!pMEIlrjHaf-lEG)GpZ8"#b**1%dN4EC,5bHXM!c#KBV#e%9*BG-0F
N#Q$Y3@Z3!)kJ+TR4DUBPSG"mE&DF,V%&fq2P-Pp9-,pf(F`R&Fb(9QG@28-'hR4
'BHE2m-cNA&9ammIdXBkT#P@&6FdSH)-Lf240D9+SKEUT!BX!`0"[kS94aLL4M&[
*h%%Z"MMHdLkHYMM94[pdLee'Y9P"Q6I1iCrI*d*f([cfHBR3VGU[kBlP'i2689`
Eh@"ZJk055-SbE4FTYb",a8H[lCZXkrCj'CU&K'Vcaa6eXLDU!cAm9LHDk%*YUj,
%&VU-J42G-Cjp'r8Se80CPfJS9jMr33j'k4Vh5C[YUC!!"&"fLLMqkHKR6D6ar"T
8S)eCFP*MN9eV0)h'03$E'p0MlI%H-3,&$@-aC8e#I49bhZ*K0'CdBK60ZFA&1N5
hfM'`j&&l3Jik2Cp,9C%k9S&#a)LImf#50Gd%bMFk`b)388&43Nc%M#V,CbK5e14
'a)X8fJCFJUBHZ$3jP$I-`F"eeLM%aM4A*SISqUclB+Kq`q&aQ6+Z3G*2iR!&$VM
42&hmk2PCJNc62NXpd(acLKT4T,B10*G5dcAJRb@Ja2&6h9#UQl*XIP&PLbZ')l2
LYL!bT46Cih'Hq3j(TH5H`0l!8i200khTDbjpDJJ&mm0,5P!`cq9&m9TH&!Xa6h[
Yk3jF#k3Sfhkk`h+LflPA'ST59')PI,$i851bJl`d!6H2BSk-BH+b,Fk9AqqJ,DQ
G4b1$Hp"#81d0BjYCkGMZTA&NTZ6[Fp2425)b10U03fCEQENH!%Ua3S&mDk6!0-%
3VH#)QKLLJj83(@K-X%XkfDADU9FhfZ*G3N+AN!#eHF1G$-E&8UC'UVC*CE96cbe
Z,V@hc-KVIY`H*3#!90Vm4I8[V&j#rY%dLLbRKbl#P8PEA2R#[PPjJC9-`2m+6!M
CdBe`0)*"L8fb`rK+E8aKLZXN4TLEQYMNfkXrHQ95b#M`%-!ULPr*&Ufr!#*L3",
`bPlMmB0CSJZ#%L5SI694[*LG3R$a0-AEXq9ecUjb"&Gc`ERL4eV"K#J6#qB11+G
mU442TYfUckcUiB'E+[8!&$l@2p6j[*@CUfSr9I8dI5%eDj0f1SET)*[ZdNil-1f
9TXmB4'c#Y*Y0'd5Xa,5264Y%8!CQP5&`%(LlrfDT-3qbC5'@(l`e#"*M)B"pFZ1
3!'YMXm5q)6(&!C!!G!$ZZ`XHS1TA'@aPae"T!E+He5d45fh2AJ(`+iUI&K$iKLG
+#ak!D0Ni"3**+m!J33$2,1(dfB)a3"eb6m&Q+PE9`JjR!8aei8JKM[$M))lC6,Q
UFAj`VH*J#i"!@@8"3DF99a&SZ!!(DRPeHaNEEAmRZk$%N9Y3!MI4VF6#a#k!Z'8
JaY9$j'AMZl8aA2%**UT3p25SUU6M"5RQY!!DA2ZQidJG1CT*K3Ymc`*0)qpN&aA
5X[QEMYbL3XTB!M%c$HjNBkE1[VDQ@m"3p!kjEad!H6e39*3R!Ul2f@YN5af!SeS
f"1rPVS6$U#cfSKQ*6kYQ)++ULMD5H3LrhD0cD#lEYK'ip84G5[+1bhGBN!"9[M2
QN4fD1L,-Sr'QIePhKd8hJDd9fr!MqjqSJm#Gh,f`"!54VqMk`8M[)+C,#)4S3Y%
Z*jhTlC'19q(5TYS2TjXZA"8ES@CN`fh#Dipb"c69i8fEr$&rrTA)d25qR+d1-$[
E54`KZDq-#CVD9`Ee'03A)UA-@+5b1&[JUZI+LZ,LZS6Qq8-C+-Mb&kP+)S3Q8!5
KXEJ"P9H180h,&G%"-AZE[`3$C@!ID-JY+XS44H6N@@HiB([*[TkL`ZCjh&%6SUZ
IYr88P)5"2d%81+MqpV&UUh0'p)YCFB8Cqb9(*DX%L%40lmBjQ5#j4Fh!l*)RLDK
N@P3)Ti'dJ15@#$*2)%q)+`4ilr-fIB0!I+"93Nk*r'@-Zb1@l!Xf9E4Q@j0J,$,
R&YV`XkQj+EU)`$&9LEdGC['DULM2Mm8P99'11TVV(X4%"4BiNZ[MMSKH!%D1b*!
!iBVTVTcU5*q%bR-ZU1b!#48j0MU`T-ikX+6+R,C@6GZJ+KpN2"FfIC1KkKRYG[,
Jj@i`,9jbPCKZ3$0-Q0j!3dcdiF!S'0Ad`Y3N-J"F$LbjDKeB2)aT[m2&+blrJB!
aBieVbG9bANIY`Yh"TMaFM#l`%X#18aaJJR1N8bD3!"@[A3la*KT-RlU@2%U!b!N
pBKk('d6)bkHkk6L-e'A1qhFd%C1S')dC&aIrHp8D6#bj-Z!Up"UB#&b$f"P&8H9
@lF+l3#%SYj!!+YAPR62@[Pk*,HdT[&Lb#jq&M@P4K0-P#jd9D+KUBX*l`UKDi`)
+LaqYQ5KHUai#Q)!#VQZYQSSiFqjf,`Fr,8"a'Jh"f-8VfM(KjG22m5TemD0U0Zh
Qdl9XfTmQfVf%B[3m!0E6A)8*S(BHk&*8')N4Jp0JYK`)%!-#FY-"`9mJUZP&G%"
iPj4SZP-(JGV!NT)h,36-%(PLU,6`lihHkKi%BQrK*ULbMS`3362T%*TZH`ZQVNT
6KF8djI4q$J%8X#G()r+qX9#!QJc%JQB#VX)&2B@E8Z,,,G*9$8Fdh6P*Bl`'diK
+3R@6Y,9LMDCE)8M`TNGNk1('!caE306f`('H90+#3k5F2IJjLS-0($`DYR-bmT*
(8F6IY!D[Pa``jb)`JTN3Q5JYh%6!'U,XU*j881M(6e3L&A6YMHDCqTU,)'V+1Fa
**9$leh558!#0)Q3aUKTJ6PPQ3V-hc6K*$YZYf66X2*Jh5-0f+Y68FN5R[QC4BA5
bULhAj5f%Lb#Ua-PpK!M-Kb+[A5GfarBUSmd"8mmjKbUYGZkLSKIQdR&,@ki3KG&
VN!$08E!-dmpG5m[6#"JZY3#Jl`)CEiS*5-[[*J1P#q$+eP0`KB+25pL6R)M*AbL
[b[h+m5bUN!"&ck'B5PdUHfZ`D1ZKkka#!ZM+5[94BhS,C+P,T")[#VTRKJdU#H3
kHZda8M'#p4i8*dF*r1E"1QP2K,fBXE16TT@"+'$M4G"4BY*(+B,DLI#J&NL5QRJ
"8'`&)&Um"CI)[D@&SbHZS*NPa(Z1AUI202$f+c&Z'!"9%0f%j0Z[D,Sam#5J[MZ
J2P4dJG881+*%NkPS,P9#X49Y6"HqXDrY$pqBdmr-8'2Y+@L`pK60,1H+1@5`9Lp
Y#U*YF!#RKP@,2STdJNF5@SYmbm5NbmGQLMFE#LH3!2'+E(%UC&$XZ,J!LF$h@ZH
-,4q#`#F-lS$F@CD$P-C!HdI!9rqXdarY%+VJ)E[$k-G3lHN)j8@pU,bAiZ1fEm,
VXP#@Fj[4TQ@ZXUmdHSPjZ#2`[@J3c"AiZ1hdZLa`fSlXPVF6$)NMR62q8(UL@e)
&Mib%j03-m*%hAH8ic#NNGeY&p5@Hf4cYR1Y)#efp,@%E%c9I$LE-@!#`r18FTjU
bZ3$mVkfZf3Ib#3lRJ2J-XdkBBllJUqZ3!0i&3r9@ek6,P!m#G1'16d3)#AS@hE0
A936hC@T+Vh@D(!"HFZ9l#,`2mDYXpe$#)Jc@*FkeBK!5SGLik3)r%J)cULe-Hc(
Y`b)S3RMTMAD*8-#DQe4h"D`4ekXZ8FD&9ILlK(GG`ZPlPB6kSfRl9+'V*kAK@R9
AD#@b',kh!`9mJrcQMj'T1R(2K%JkZN)AEr1dG!@fB`rIL),iB%m#mCYI25r+a#h
hT)A8SX+4&Yb9eiHV+h"mc13%QEP3lViK,CN[2%CrEFcHHX0jq0d0ejEC4pii,di
,faYlHb2pYiYaB`#[IIHF"hfa!JSq)2FRi*4pq*2lUMV[)T1J3PA+KU0Pp@+H%9F
"&mXSL,B`P84GV"hCDV0XBrHp$&I,k1cj6TpM[V-PYQZS4-KrR)[-4@+cF,F"0EN
-D$lSR![f5+adIfE+'96HXEcMUHHab$Mcqc2lXDJMNMB@bqh'Jh!1%![qR`bC&TY
[1jQ"4@$NH(V@E9LBm[+))C!!NA)mMaCe@9M43V$rB%a(%iKLScGk34a%%V#@k)A
3IJ#qhSJVjP0h4ApjJM,6Bb$CG!91BlQE+Q#+-J`FL%4[`1VXBT'f5Hjq"SAPepk
erE$(((A&2FlKU'ZIakR'TmYCJDNZZ%b)@!@Z64TK$XBJQ6*%#5QLFmHP4P!V9q@
5i&Z$8SAe3ThGKb-LjZ2ZJj442Ndb"M'F-,GiR+,SMYR#[Z[LMf8rAXlQaZ`VmlV
pDq%bc-eM1-`mr'3H!)h+`&iPQ@)HN@LkSMq,iNCR&*pJRRI5*5&B&&-L4SdcZ5[
JIk%15Cdq3#!GE[T!MS0YkHq@MBaJ'%@Q)95MpTKGkKmiV%K)9i'2cqPpF5bQVKk
,4DAKXM%F'8X#a6K-44rFdB#F*RHrJ5DJD,Q"QX8!r-3)IMi&'$PZ(+Q149fUDIC
3Y5"$fp%N2$#d&ZDDNY3,`&%rNX2!+3+6H$N+)hcjXeK)mjRf!Vq3!'qJ"VF(JU*
[[#aD6HI&0Pc5i`MB[G@K@+Jk5+,TGD)*cNAh*U3V%%a8p9a%NU2S&m29[`"V"E'
Fq)!c0(#'&XkJPVC3lEF2iiVakULpBQJcR'Y+%8`@L@Me,Hp3SM&*I!8r2LeF2$q
qYY)9dLDMf15Yp)S(1LLSA"D2JU9R0CB+iH'-flK5HUVlT)#ES)",dHP&4UdIj2j
5"'8NhS"Ca([3$%0L-k&@alcUc5+!iVA%T'EXQZE(B!$H4"f+C6r2d%1a`J#ijmN
9T,QDP'Uk9Bil%j5*D22!IGh[(*lY1JP(M-N*TdrYZDXqYNZYMVLUHr4&#"#qfaU
%@j0Dp6JDfRIA6Xd5)#G%iEbrP5F'38D5MD+-0mJ8jR3h$P@S(Rm(c+UY'2K9K9c
!,eBcR#TV%'c$URPJDe'p`!pqKFEXJKr4iGp`TieU(+ibMK$CJ+l&pBr`DchDDp8
E*U`fH9fL8%Q,GmLTEKk438&BH)'VJB[M)P"LfAAF#9%5L6,!lKQJLjViKPqN3rc
9,8Kmi-8P)b#5HGJe,3U%TcM#DRj&9289hka2[eQSq!@1iV!@45NC@p8lG'JH2r3
#[p+!h0V9eE`+pSN0BMHYaRlh1m5bP5,B'+U0DB0rYpk!q#DhFQ8p`#1"'j1aM'e
5E50(G8Si4)N8T%e[,RI6$b'K+Q8$*%')U`!*Xd@Im#lUmSQm@96%hMNS*IGU'T%
5AT9m)5AhiU4,0mKRkq+8,6&LLj2C)J(3R,dUj5Y+USJ'eJZci[BS%4pSZ$da+`j
R*(pd5286%*@[R*+5aC@5Db5DAMH$1CdcPqSc1+5X)P8)Vdi61ed!eXfB!#,bZZT
69L5&S`ZEham$mEEjl9Rak#,8TL&9XAf+(i%iPLKKGPFm9U'Ia*CfG3%GHfJ@#)J
hr#8CXrPS+`!`dm+#i%0%q1!*1+4%*qS`CA@%+HY659Q2,QI+LNS+DIS8)(fpAMf
QGbAP&-jA+UI%"p5(9(qbYfJChk+QI1%RT$6lJA"PE@r!BAYjbLUi&UrD$-VD$J&
fC$Sdrfc9kYQq-&`pMei6VKi*m$DB+bm@15QTj(8i![!-M'2'(DPRdP1%P2b3!!T
Y-NI*d5`bmF+Y2%RGL#d`13((-I8[rA`L+8hBYaJ$#P+a)4(Fj&*eT(H@1cSN!PP
dB'brF26QE%S6VC0rHRrd#M)0LBaE`j[Y2'Y*EK3q,+D`3+*Q*"*6Af-"ZDihEaU
"kZ1+jN283pNd9+!I%#06AHj0ANGI6L5k5I6)`MkSGYH%)U,&NKCSElYfCZ45V0A
@eqTrGBP+95G'EN$HNeXFcicLFq#NchX$NZ1*b+9)(bU@@hGicCr0YZ6-aI@q592
Z)VVBBp0Ir(Qh1HpeN!"!*[Y(-j(&8)qUa'GDr(T*E"081["k#9bl%2&6pmTaHiX
d*4(MIM%AS)eDQX,"%MP1ahLcIFISllRMQTEBlX!VC'FajKpkj,Mfi%`j6K%(ac@
*X&G,53jCGT8DcDQTrG,a9ZQ)P@FjPQb&Q"CGh&l4[UKNFqZLNSH`1C!!Tq3SL&3
J3jE8%L-)6ddm)YVd"XPIdBX1PYN6E8IKe,T)9E`r%(0SfI,qI5&Rmc)fQi+YY6*
E`H1-,@PJ8`F0#4Q4dK%E*2$H++*(pq%rHc4kK#mS%HV+k0(4h[a4QXc)1A1F6bB
G4qdqaa%N)JhSX`&-6ZZB25FV3`T@Ah[4NIeQ25@6prH3!(2,lXrU!hd#581ji9r
X(cTPRYMG1pMIf6IBhGEA'q%Z[ec)mD`,CjL3!0LUK,c%K%bdp8p-IQHLFq+XAJ`
&)S"4AVC`Xi@2,mj,JF`Sd+P%NVfUB+mkfB5'XXD*0)bS2#mL-!+EP"d[SK1EaA)
dIGU0E[P'DQED,P,&`TSqU(MUqSFLNk-6N9%K4Ma$+CR(dc2Pe*aFq`AR`C6MkI"
`PSqI@8TS&PR,X&eH)2Lf)BQVGmqd@-KdPV,R)$$DJ`U)`+RAZ-"Z$GrD9DUNi*C
4NVKQ4`eFDNY3f809ULmN!1-G0'Y9M5#2jB)eQc)l$PXSF6S*P-4GhJeepC!$4bB
e[81mf&&GXCC"E%@Bf&SZpK1klJ4P&#cJi&36&heC,rT`h(i[!f9UDI%'#PS43P4
j9Bflka-Jm%mBCm2TI2GR&M3BpJ4L0R,&,4V"CYZPV9-`KFK,q,PLM$BpIcLqZpl
5SlS%Gm+!-l3Rm-jCdG,$+q,(#kN3rHPJpbNB6(pE,dFG@I0P(#M8)bp,KC2k40h
3EdA%q!dTLMMD*ATP)fXcqmh[pj@Tbq`pH`0dK%a$BYVRNjL+lL1eG5#V`4KS115
mbA')M[cS,&9fBL0$#*8GmU-R1[AfbiY`EMJ9Y$(k-@3HU"-$f4,`)Qd&!5"#aMr
8h6RBIeDlTI[-p`HS%2H6UJTIKkT@@XH)rQf&'eLQRB4DSqBXJBBGU5ZQ!eNB5GH
TQZZF86S(86*XFU)k+T6Bm1+qcKQlGKf13jA4YVqS,B3#5%KcVp,Y'Z6R+0"A,81
Q(,qH%S[Z%6cS8F,V&K"00"6i%#R6(+ra&bXGI8prKUE6P+0[pda(b&R4(Rhc(pi
2(Je9CRZ6$JiMDDSkLFCVI3$6I[J!94#ED9$2q0cJ[Cc4p*E0peNKh(c5b9QaS+)
R6XQ&(Dm"q2R#0'KbJl'qa5f*FYTiT,BBMQ$$bh$XJC'i0%QZE80`lj9[Y&f%S*P
U0c8rF@%A8&!lGr"SI`B4IS`L[%IBC8NNFm8JBI0'iPa-+Gck)%B5`6H3!%"3H3J
CJ9#qUSR8"+EA86c!m",AN!$K(3LShACI$a`@#ql&&Y6F1&SN`49e2A'ZfYFS+q0
@%,3'cP+(%HTLCL3!1qI$5-lfG[C'*YSUf`T&ebiBLdGIkHm4MQe#)kRH2[E1T'V
A`'d%Y(!3D"H!PIGli[B4Z8e6Pd"A#IULk`G%Q(+EYJQIK-J2*%68U(`YqJ*Y)49
!+#hk"cq[K),Jc338KMDMYrc#F$N1pr816TaU'k9MR42I`G(KUIlFp-b8h-ad@31
McNc*c%h02--&UJN-YNc#j4)rbCLDXN#4D#$k$K(HNM'[+GF!i&r@p%Dq-pSp1%N
,"8*NV(!dR%D&(SJd`P$iA4Sbp`lGhYmjfGmR"6HiJ!A&Z&63qdeNkK@Ii2LEp5Q
KfE6i,$h`JZr0Q60$[!!6X@h%`LmBC`%GlV+hC2'Sp%XU4!)E+FScSFJ@&"IeKN"
rDE!l-Y4V3%$DX&-b$)"N&5qLN!#SB%KAk$Y2q$M5fpBl-4Pfd%T*9rd8jE[VHB8
BG@5*6LFjJA8fcc0KJ%M9k,,e'frVKS$"ENe[*ppiXIRqEj!!f54(J)"N1V[V(Hi
hUD#@6-L[4PDZ2E6RVccSS8VKlQ9`-d1a8S(QJaZ"4Q1,%qMqc*0MFB"5EdY"b2L
R"LJLjFECVh&aZ@Uh0N,pXCL*h&C1KiZcmST#qR61q*ASLLYI!`KS+1rkJM[BpAE
Pp8!hqRH$S[-([DM#Y`QhVFcV8RhSp(h2"9GC+@+1)f,31B9kLel"9''EHXrfGdV
"US4("iVXJJDUm[A94Y'9(f@VYP1eU$HRBcMBfpR(Ma948L8H'%dp4FAEAN@R(4B
#V)dU'GPG1KFAkT'UZk,I3RK96rc0HNVBj3$3`BY)#6dl,a!AL5PHh&*L'f6X&"8
6F'jb%B(%A'm9FTa)GE8pR"NA[[QCipM6-h%XZMZX#%E8[3MPS*P#9b'cS,0j[N&
CH(d-L%(a%3eGdL6VXJf[jDKGLa)UPEF)M2ceaSkidGY`+%GkPB&AKfAhjaCXGT5
Uh8304k,Hm4*(2r(*5ePqcRSb&YVfUMb9El&+6Q!qr4EfHC[R!b$f8SFX6%NpT+$
#*k(mBPcJl8(f2U*X(%@5[QLF3XA,LmC4UX#%2LLcLK003$PqCk+R6[FENa21Xc,
ElM#rB)SR8#)NTT!!P@V[L8GISdhDTka6G"!%d&B*1*3YH`3ZpZJV69`-mNb0i@,
c"&`a@&&-J!LrIJmT$XVRi0K1(JA,T)XCU2-e&-8SqQ&@89afBD9P2!kfNA$NT)j
[N!!&GQm2[9l*Q6Yi-Z@G%T,+VB&&jL`I9GiL%q2TL9ZMFCqDMTjMk24`92Cdd!@
K(VG-dIBDMcDiP1T9`45`dD!!2GLLe!#"XNcpT,K4YEVq%h*`M&J1#bZKibH3!0C
JYM5mDk&HX940I$c8VINFe-,qcV2GTdDe+U8!03Ah),ATV,b1`!5lc[%5&5YffA(
SD9TiV!4``EAUYi-*G*Mep*(Cr!8hrl2fL+lhaMmbK[CYF9)J823C81&423cRNG"
Z%VmbBDCZEQDrI#m*TqSJZN0YrZb6)ebSpr#BkLc%SMXZ543R4ZV)-6PFT$3jpc*
-i"N15#$V"38)1D3r)c8S!M6aS@%L4"-c$"0"QQJd6(KTBKiAMQkHN!"Xl*RPPfZ
1F(+9j4dH54j&*&dkeDQC',UpYh-dmVPHQGmJCDU*(&11-U[#PAPr#90Q9CJbqr6
+[2qQ$NQCrNV+p+p5QAj5jSa`C3j+JRJMBR99XXPYiZE,9KqT%HBeD$![!r-l($$
hE$%!jTF(*bC(%9+C&[592DQ"9jdQ-LZAqPA64-[8E&GZQRj3-c%'S(p2!"06$@I
c)L!XZ06ha1$1#2FF!H+&%"9Br"H5#2UmJ$F1@cM,*Z-U@'caKQbUIT!!E1pXE*N
NqQQTfLC!UeiI$+lf6k+4hBYU[VYcp`3$b9&9"rfXQiSS&5mmmYSG#hRNV86"6iY
K(RNSSKmi6*%hqeLfS5Vh8'&Mj3dE)JZJF+f9#Ji@[1X0TR09+Ykq-k%a++j)Eck
mX`a8EiA8-%LXii@&alS198FKU5qmDQ+)YM"%NkLQ#KAJ4CCTm)$JL,PCCA[DN@h
IcF%`&c+fKMpa28h0JLkDmU-K,hl"+dNGN5lT5RV"!PCl#lD-Pa)30cL1icSh0am
%PTXXXIQXL9(K'!b[D1e6V-$NRGe*cI#HZ+3@V6&",Am,Y6#Gp2G1'Z"B4-p101&
*L"U*$%Ie4%9Nb1m(X#e,Ve"S&eZec8!hLR5D3[(k2+kDdMCZSj,kFC(K"RrCGii
EM4GbRA39-`38X6S,%8P5MERT8J'rG3c+Smf-8E%X!9,'0jSkG,pa,,5M!VB)5b#
Q!`-[M,Pc%E)9QcTkd!8A4%dCr8dGC",E"!QA`(pe[B+F-F6)'AU$P"Uj*!T0)8Q
8"#BC42&Ua6I!'jd%!M0#aT!!PT!!SDq`Si3ij#a(TEebY8Ul"eA4U0A23,!5S&b
Kh`LDZakU(P&K68'GF3AbfSS&9c,FP5##Bb%PJ#)!3'AVLFH58Y!T09)e5D)'Y%e
P"ZC*@1XE'"AS3"+45dZV@Yr!abCm[&(H3FhmQ!4X+&`(rr"!H2-IJ%3j66Tq33X
Zd2%,@UaUN!$TkDG#F9&5V'3A$FG@5Nh+bQa`r0K%$)DQj(IlKeE3NQ6A4R(Y1,m
fDP9V$5A)VP,(@L5#Q#6q9e8dU9Fcb($PY!pA+AMG#J3[8JS'X,&Dfj'*6@V&*VQ
5r*`-iQCL+jMBC*b,rCUD*[AJ2Sb#3IY-Q%HVF!p(d3"!5B,9`XF%Mc1&HbUciC)
LBM!!U$mPK62iP&ddKBYDq896r#,P*9(4bLlaa#S"Jp)&Ahq%ASB"STAKX2@lD'6
9&qfF(Rl4"pU0'-!peXbZFAVi0AjF3d9"NSQ1aLVd6DKRCY1%&*!!$[82mGB5%k$
@"L1e9BNL-['CS#N@M"6SP9bP&iBLmq2qSE!5Fle8-,jU&6aD%Dk#KIb5e8VrpEY
XDY@A&F[KPhh-e@fSIeQb%aZk`+"%-4A8`0`[dX3"i6LEBapr0HS6rh25Mi6G3j'
U@!6$Z4RYF1J)%CLfYRd+#6MX88Vi29Se1R4!&E0&VN5U4Lq0$X@),FMC"'HVN!!
5L1qZfNf-IQ,FI@Rhd25cH34fYXK90MFbXa3*4PEDaK4)(4$lKFdGk@dBc",q"4i
dIp9H,hIDjBQ3!2lRT2#RkC-KJA*A%4J2G!5k!S1"dF$*J$'`*h!j-#r3&*JHH$p
`4f"MS$43'%U'2+(fd+D3!#QN#GdEbJSG#0@&[JUp'*SGUJrG%GSB+Jd9"T2"m@"
(X#Xi'"`0fS2T`D2"KF(DB%0`CR"ZF'Y`TcIN9AX6hNhH3HqSeqj0paleeRJAH&r
hc[$1m9lVhHcGjIDl4p`kpbbhfEhERH&1F9[F9pf2Z"HjkpehZ*pdlr,jIF-qR@q
@VmqhfhIHGm"hfEI!eq#EkC[VfqVE@HBVQbT,P0R+$THePCdZ1eqf[kbUE(PCGGR
XX[UbD@8hPpeAYXXImPIi4rcYrKhq`hk(IlIrj&5Kq!Im9)dq'a0PGMBma)IjE2J
D(cVBm+Gm1-D'&rQ`K`friN1C$4rK`aBf[*-2[@aB682I,MDXjF20E2JL(pl%KPr
biGeXq+pmq!8E[X@($@cBc)HeE0M%K`[CX*%2Ml(K%Mj-Bm2&I(L1$9rR`a0XZ)J
21pR`E6jdXH(2q(!('rk5$e[CF$BI$V2K#hcSCm2T0(5AX1(rjX1(f(!'(cl1K[r
'Kh2Cm$riF#BEIX+(,f#j&6m@8ZTZQL)&%&-$CeM)KPc&lQ0Xb*AU6Q0$VNEh1B@
S@LiURc&)#1X0i$Gm1-CHFJ@jHpL3!%H"@fDLUV5L+KJ$9i4EX#'2)ZmcM2fRqLe
i0l+VMR''1pK`2KqqcpMVm,1!XmpQiRKdH&p8L(Z4-baA62dVRl+`)pbB[#PXb#2
#Qk'ii#KRMbLQ,[)TPf,U!cj&#[J*+Bm,N48-5cL$AJ(F$,ek"I$)$T)#TZQ9&hb
5EAFC(el,KXrai4afm"rjF!BEmS!9I*d0ZIN'&bK3Q%FS"#pMq4jqPR1'23UPe('
',-@4BhcU0"2*!dZ`M3fj%3B2+iaP'@IIaKKi`!kZC)KcK369E2JX(iEBm'pT'0U
*j6rV%3Xp`)B[mH%eLQYHSQY#lbQQ&[)TC3"iK%r9+UDqaDGU&&2cqG3HaG4rmUN
XKYE2qGAh-SE[iZF+CfKM$&cjSF--84ia)4YM2d*'cpP*!AmJmpFEG5LUZ2,ID#T
3STLD`DFfXf-8Q8Iie,@++@k1JIF9aqlN8rS!`&%2[+KJi&%I@+kBiN%QB&&-0I#
TA,DpSea)M!f[m''%$Br`B4mEAZ,$@@aBaiFk0[bB$dIBm#SI4YR`!aU+)MDmc)G
Ef*!!4cY(MBB,qI"kTS)[5IQ%V0!AJ0aNa!YX1)m2Pl(K0rP`2K[q*aqLLaVa2LX
SpQ,a6kb)-E)"99FC6*P8d1Hc&e6`Y,%"LA+a!9fjL4dJ3p#a&pr#B*`0#"%e'e!
ekTek2r*Xj*)%R15*EpXj12-X*H`PPk@`K018P#T%LC!![(C+K-J"Q*NFJ,RPT2#
fDC04Mm0cBM4i2VM!Dj,q"@IcaBLh"`Fl4)!IVHC(iqJ8laVYdHPLJ6!,MCL'(MZ
RLGdLAC`APd@MH"($Nf)QNL%F`(+Db"A(a!Na4hb#`A,4`#HRLIR$Bq*18L`@Y9J
FaH,,f!&mASbPil-XPSY28q`m2XfaNrJXLCh!jrABERaq&Y2Jmd,-JFrrM[AKmaq
a`rKm%Z[#Tckf!jr2BY[`Q4PVaqIl-4QI1E%4I$k-6H&6'+[!TcMQaqHa',bXe8K
#k6BV0Lf"HrY1LT!!6J[Z,3[-"9Mh1VCF"lIYQX$0BRlJ`m#eJCf"VB(0JG,35P%
GmJ9+3JKBSLQd-P!$`#mDDK%0SC8B@N5pH!kUZ%E-&4X$mm9Q85bf!)6d"ccSFdJ
1k-"N#lJ!6*S$q3&0i,P!GH"m)!DJ-Sd,q!,)`J%m-!q,)a3iX6L+"5Q4JJNTX3S
,8Z-K,&+`1)E&15aH`i,8@)I&D5aq5S%6LbYBN!!D,f&K`J*G$!D@B[%a&U6'UeK
dB2%"&JNXDLK`BR%4LaBXPQ14a1)P,%*B,%4NPQ$aYeJmJm9A@0b(aAFTF')a(iZ
EX%#AQq)1,1CKm5%@hk6!LF8M@-c!iPYBc-CL!4D0@2`'LeSXhX+#&,!)#e,!fmb
)[Q"'p)rFL2k*'p(Gh)MqK4[4YGb)VZ&'p!3hSJHi%Gh2M@Jc0k,IFL1kMa[4VlN
42F50k'&Z4+AFL2l!MHKAh)LHi8Ed0@j%1r9'&23LiFM2i0EZ8iq*VdXZkk%Y#X0
DlUbJ$JEii"8RQ[Fi2Sf,qJNAGD0H9'J'4#eRSYjRSTBT4"ec*L$+c!HhmN%VIYV
adi-I*,4bbM%E41lLfrJfhmDMI"XPI"[Eq6B+q19&r(+9p[,$Z,bCAIl[l2)16&V
Bj,qab@(q3B*0C'QMZ!PjKeZ3!(aQ+a)i9D1VDU$kf#@1FJL*[)+%UZ8P*0$UQ+5
(Mh4m6TpCNiE2k#RkH#B0(c00L4SqX0&(A+CMBZ[,&XlFml+&[r4,(kk-$kRE0eS
'9cScq')M1DRaJbp+"d39MUIT"hM9pV,PHaCR#KI`IjhlqF,Ml-'VT@!k6"1h2!&
Q-["kU+UD'HUr-N0YC)DkQ"PU!c28fFa3ImN-G6Sce*pc3hf1'qS-EUMr`!heRlQ
K[XF0pFIF81Gb3lf,'qSGh&$rb!heHQkSIq+'qYmmLQrL8A`cMq,rbk0i)irLV6b
+raH2iLGC&*p!02h"VUNF5G&RKAMpU(-EAaaaVU6&PrrS60+LYKUChKi)fF,&rT@
,ICb,r3X6kq-G)3P&eb9)6-mI`5+4#N!Q%#Yj0aC4Hj5j0e(b""YeGb)G+6K'cTq
Yc"'%-RS'cX%&IIiljq#1rJJ5G0I+MYUb@C6KHfhdR+N2(EAjM01S'%(A2AhSZ-H
%j$%GiV$1`KFpl4C+kSl1c4p"BRJiAKFFJ`2B-ZTS1L48M6a4qQ`DHJ9h-Mp@(B,
`Y'LZH8e4b*jbhBGa68q4Ykh(,`VQfA),DK2qd52TDjpSjNR6Y5+GAL64EdF#aQ2
QHUTBc'ZFh[h6BLf[j"BX%MEGSS,TlBX+CT-DU6VAZkK59U4(TXF*95-R!-NCRd9
#cAQj#DMa@Q3#N!"c++Qh#!53!"meSIZa@)8Fr0G%+a+3!-R"1l'3!"hkK'N-0*!
!A-DDm#U*"-KUdlZFZ)0ZEhKL+M`QSeA4@828ld'd)42Fll`h`ETYL(PEhUF1lp"
C6$#aGUE&[J81VSGHVFSAaRMp)IY1[0U",L5pFZLaZLU,($+l6#iXqRAp0rkc,[V
,pc1Qj*RKrhjfGqC$)&$E$!BMMq8SZZY#G#5TLc"k))fqSbeYadqETHiUN!!iYA8
#REqpkQUY`m$2"dGEkp"p8c3((Dj3jiMIVX[[PKhSeJ8GCI'*mrRGX5*T`pr+cXj
)cmjqHFFpk1$VKRY1(Xr)cNa,c655Iq2JIURc9Ze9RJd92emTrZr#*!Y*Q*6JK*+
IF2E89E+RG4lmc`I2(bq(DBLi1011cS-,P%b90X8jaHS+E1Rmh43B[N@kkhK@9Ni
UZdC#UU@2@-04el)15@V@GhJ#*&C122b6eYBkC-8JiHYf$D&bSM[(6d-*&@9(5R5
)%b+*f5`GjCf4q0%a4(GP9NRmY!9DmEB0%+q6MPkRq0(I@IcSGB[rPiIdiJ[%HSM
(Um*Lk4M[U!8G+H5[524q*RT'3A5p4-mS1#`G#aG+"3B5qhdN'TfHa%GLQ4bSD4D
ecdq)@VNI6S8VRcH,"DXKd!&4SV@12Q"UaB2CTU4YPPbcBQ6JH+`R35mZQ8Z(T@5
HHM%da(96NNX[&$[#XeDE4#eE,+2&VH5DedK,3SmG@X!28GGa&SNGQE5iT[!mNYm
88F(,*Q[aF+X&H(c95#Fk0)1lDT'#fFLV1I2cB*1ZBQMITfqS16UJT+5M8G6D[5B
-q-38ZS0F%'N8#hkN8DNQ'hN6D6kB4ZcF8%SfjP-5m4SM28aPTrQF&Ue#IBGEq&&
"#&#D45J9-LDMBiLFmj(-j%ERS141+jEPir&a5,cT-'YiKZrL%L59hel(R1iIJPP
D0'""TR!%bZFG9NU-MaDMdPK*$fTKAB#aDKp1iKPbCNT+6STm)9IZ68XI[*!!PGQ
IDcbB2TQ1PhP,Pa+,lL-KhN!TX(5TYPakiieH`lUr@c(5CY3`p5&*MYUQll+[RG`
IN!!3S&a9lU#ZhpXl41edX'6aMZ"*ZBREU9*"eMiqGd(4Y,JS+ASC9h3,ZTKEaj@
pQA8eX4cG(5#a,h8`))k5))AL5r3G$eVA+G4HXJ+e2d5CY8cYI9cYZa4UhmAGR`e
UceHSICGHlE,d%$6r"LJmpIcaP)jYmTN,"c+cdcrD)1@V#LPCN!#835C6GmJeF18
Ham2ZCNS*'lDAjN[)8PFK4Tj`#SLYGX@T-jNT5XNX5dM0%eGT-j2@BI1ZGJiN1NG
DEq0&!d!G$Ua%V8'H+!SCl(*3V`!*8'*Lk(KAZc#UTP-A+adr'P+TQ*!!P55%!JC
e1D8A-dcQqbbCEjK!J#&KQ9X'P0#j!b("91(AUk,N18N9*8mb9E6S95%cd(Cpe-%
ZpSGYBJFkF1)SVhCT(l[8q$Hje"!&&*!!Q,+Q2ZrQc[N+PEI(BITUMU!856'kbU!
d#%SMTd"*CI+E#8hL!V)",bUlbk2#@cr"1llP5BB-hHCTUi*fG#cS*DFSG)dE0Cr
M(A#28b9!PkkJ5UTdJD'+%S-1NGpYP`E$qGdS8*'N(X"-k1+Fm1iBHC&#MelebT3
B2S"(1rU9AIlaV1)Qi5FhjI+Ucjp8kkY2-A,Ge5F1pH$3bGBk8SEXB"f0YdSL[Rl
j1MDX&c,#98P&PAqp3BdCSN9#Ya+3!#&PcfF4@P)ebP`$r3bjT+%3CLUI)8j(B+C
@kXbfKJb49F@+M'(435mU(pFhrf5rqNBl(Y+SI#&VP%-Mh1-F(RZ*FY+UKX"06$!
DrrS'!BC6X5J(8KG,)+VqQ1%"Hb3J[bjmdkU&+e"8K@PjZ*)8eG"QK@TJ@19Ic#j
S$jYBr1hjKXGA#Qe54ri`UIPNVNjrC!N8FAYX%1kcDC4-"Tdm2Y"U*S-Bk+D+"JC
,kVIakQNPCq*6K3XT`&,(-Ymf-S65U#%i,X)DJP%FJ4)$akJaL1STbJXmfR,5X&h
qJ%pYelLY,ePI"F0Ap-#crP+H+1Ff!LDC#MUP!)1#LJ9H&R$E!FK&j4BHR0GJNah
FE!l`EPCeBBK*3GLb)T-PpiV@QK9&"k)i@,q)*r[clckbh#)(&%a4-ZH@'L9ibT0
*Bp-TFX146'pY6`aG4$U6LE8YedaDl#@*#ENrc#625j8D,k6AD9'$#PA(5#&R5rN
,#Lj-)DV$j5Y%0F`93YXI9hD15!KT"a$dfcSHU25QAD+rPT+'UPS-Pa,SJ844'bN
`k#m[QPRqj8Ack(*chNqq,d9$d9BbEkPcqIEX2hma()kfD+L-YTLZ4&[%9Q"#QaM
Dlc2MD5N2EAddlkK4UR'Z4DR'2kY4F5EIfdLLq"$3,0Qjc6$iqVf'`GG@9LlbjkV
$LRb!G&+4riGjekPFFVkE4L+NiPP4!*Q[UkKQKE'KLpSdP8VKVVDi4+F&TY#dJI2
8989ahK8@'(4HEp+#$BB9UG,&CHV+aA6K&kY0[ElDe$cpP05*Xa,d+M'A9pA16GG
AYHJQEEfV[8I(TD1V4cJH@+!f&-N5!E+GZLPYQ9k9%@VhSX1U'GXID4GiM,ThqU(
mlS`)&F2YjmMP8`iDM(9lPk+i@bFCl2DVfS#d6Q,lYZD9)H%P%ijTp)9dE($kS95
6EM@4*3mS4,,LFrZB9L3,Q,Z+p#+9#Gce$jP99MC5GeN0!))bI3##d)aN93`[cVB
IE9G8-P)PXIfNcLa(88Qdm)S$&e*&8l+,'!QBFY"MaJHTFdF+r#8f'4d#S[(#L`d
UmX&mZAdjVkKNIY8kkE+[heG19A@lXNU3!#9N!A+0+N!ZCI'0*PbrdXb"")%',35
55!DNfKJQ$Tfq9$DrSQX9VQ#m1c&b6iFE@#"01)lPM&Z6$*ceG&kN$XbFS5[2A[Y
XT1UjBhP2bR!PmkC9lVD!9h4VF'"'S%3RG!#U@pXkTYVG-kSdh5I4GHLebkGAT4E
VJ[1AFeCdF5baLrEfj&HSq*pmPTUI"L"D$N*pR[#Z#k6(S2B!A1dSDqZ"5fpdQe[
AJDkQSIEjadJj$8KiP9&"B2eA5-M89QB$mI5V3h,,+A5Iq0MLEHlTadkZ[2CC4*1
AA4AY[*M`iM%pk&#1M$ae+i`ULNHEU`d2-c8!bYb)e$P4#I3!mJP0prl!Hif#rRL
"k0Bk&19N(QSjV#0cIBGYP(J$aPF9IRfl!0($,c9ml)05BYBY2YC82XqEbS@+TM)
RG5LDbKQ+TR+KYUNFP-J6%`rI1)TZ+'cS0`PUHUcj@D#U!B,2i3GGdUAT5H8AU18
Xfp''PM0c-ml)"h-cdibCUHQC'9Qrhe#5"5ZbS"$UmK$+G2'KZZdFKRiVVk)QUBS
+!lYieH9(p%8cI,4%akFp@[$$3,)GjS4l(49rq@(&AcJJDK#l6fV5%8QL1Ub)@#4
9(Arc+k5M2-ZJK9qR$cVqcSXR+KHjIlCV&4YlEX9A82GU0+b[86EIbTZFH2KkPk'
#$D[Q(blCU"KX9JbZNBlqD5cmU+(L,RiSA04fS4Mi&3123Q`a#BKVUqp!6cjrE(j
J&Lh#Uh3Nhq!Ur!@4H(H!L09Uj`Rh8@$[`*'q%peiD[Spq+&K"@pN*""ScL&S*AM
33Z),8Ff#8SHHP##Tq8,1QHb6ampNb[EM&l*!F#*#8fT@j['8e3-%Rp!I@,U8R3J
2%"`-ZVid[1(lUfe5KIl!`[8"JakB3b,+Dk6qbPkjQBNN1$Zd%8k*P2%31#6Jpaq
eU!2P[CLTH-%%h+-&r[N@+%VL-&29)Mc@X4!2'JmMIM-bmSj`P!fJ&fY3Y+i'f$K
!2!caTQd+*ePXfcFQ#qeN*qm+G3BkH(04jKh)QdL+K!)dK#+`'PeYjUj)CC4&b4p
macGR#pXF%U9TZk9Kh6a33q&D-M"LL*2bCK5K`a9$%0%(9P-,b+`"RU83)S""LqS
ch,`dfSNlC(pq0bGU5a-cHF1GSkfGr%*UpNjp)UKEQIQ%L2jPB5&ebLUU`LBhBp+
SR#TUN3*(d3kZ2*im@I[bR%3U+$Tm3RYP`9Dq56h,P(5mB#G(T-)!QT!!+4SDdT8
+-A45'8BFJVVH9"3Pk[)+ELh"CR[6kU$VLJSj$U`J$cLFC%B25GD5+(Ph)CTbb4"
+8X8IXPC%UM#3!%J8*,aa!`R2+&B[FVH(&EQ4*Yj*MAmedjj#d6M#-K6,09)k0SR
MGZV8aNqNZ98eAUK#I+*16a#pUel"V#6DeUmb#'S"imT%*d6pZbc4af*9fUS3f4$
N`LpKC+'-&C1p($9fIf6acir+p+0H6D@H$5)d$KZBmeI%V(q)"$)YN!$98@&Yi4N
JNQY!0)a!8)R8UL9-+`(dMi3ADVJ3TJ+ZQ[!'16qX,MqLL*chd1#6G5XJV1Nh9e'
q@9%eZVfBUY&#[f+J9Jb%NR#3!+JTeh3hA0',#h3V9V5qH5eQDC[AKJdA58dB-#`
Zm'ZdcHm#9q8UE89SUY*AP9'kRPHVVrYURJKd5XSLj!fZh4VUP,qBZIV385*-UYP
%G!@"TM*"Z,b)B)mM`1CZeK)PpGH!f+[T0PbLUUe-N!#SI(PjB+%")G8"a4B9ekJ
@K9ecpfT(&aI)Ub`5p&YlqCGc&G9S)8[%A%L91c[8SP$CdV!!pA+##YIq94CT'Nh
GkSJ8[9MqYX+99f5[908`Y4Gp@-jfZeDJ`+PbYYE"ARBTYMCFU4KdV5kXS(3&NA&
['0UZkd*2UAaPeEaDGK')l`Q&djRmmKYY`UZlQ,MdEVr`YQIV$1"8P$U8ah9K"9P
BC)cp6bALQ+aHY6'8&mP53Q[q)#p**EV9!pQ+SMmm%PFG!-S2H1&"52Aq#JLS(MV
H@[-+@#NVB%9Ne!dMZp)II+-mS*T0AIbp3Th99,V%ZUjGRiddqFB&MJ3qmN[+4`k
9L4kTJB"1+&Yj"pBGJCZ1EMfdcIe&3jE)p#EFX9#V@`l9(!(KrdNj)(@*CSL@9MT
q3D#VE4[m#4qM5Ne(K!5G1+SJ#(-95Ubk@aH*9ce8hDNh%[[Z'b`MB53Y1*f89kK
ZePI"+0$h6ccm[ciN9jMIEN1&h2Vc15"kEKBD,)CT%S0U$*KV9X&Q&24*j`iF-K&
a%kr(CGi%CmfVF@,EhJ53!,Q5qpEU$PlkLYlbrbTpZZk"UpDC#kRC4"BjHG#HrD$
HVf`6H49NTkFF[j!!IJE6f3E(XV$0E(er[6G6V0r-e[p$QdNYGc1TfXdB3#-JYR[
LiFG+3C!!pG*#8jGIPiJNkYSMp2LKLrrdVPNX*66`3'a-!'d2f+l5RjH%2pA'`4f
#D)Yc6R4[+,)jClJRah8U2JcCdlKq2ee2Lh"NmjAS*U3T"F*4KR$dGdAi`Zq#-*5
lFDDNh)dcedHj'mrr1C@l3BB!j@l85-VGU&PIjA+%rfc+A3q%pHJQk(+@BF+[C@"
LT@[jTIH%AIVhl0+F-aYii@0ArkBAVNFKSlr3p1FT,MK#IkG%D0-0%N+5cYHRZ!K
(kmp4)+m2@UY@PYT+h4"f(R`N)bIl`3XCQEPk59fTkEmhCS*aD$"9k*f"2&eX!hh
)M!UeM`k[%6Xm`46hR#-1VefHYBDFpBQN,J[U`TQ4SEJj&cfAAiijkl[PY4aQQlK
RJiUf@@FbFp06IKrQKUdRpie,&fh(Re*4@C8F-*'80qE-6)H2mHm3U82rAekl`Lh
cDk0iQKPPd5(bd&%N2Q[KdSd)c$d14lm(biR""bN+k5&[XkcSXQNS!0!'53l8r!p
$`%1`5V-10rL&lBIi8lELNUMdR+bF"c06bT1e5P&EbK&ed'KFS5KH0(MjSfiV11"
+IkL!F9JLZ8E6K#Fiak,f%M"m!L*eh((0BS2F#fI+%5QCc`dfDBU)c*[bMTqjlF&
+4C!!22(`%q2FQGfR)$f9%l5qU`aCfSXS#XJG(d&hUDaqfA,Afb!B`)Rp`+KbqR2
YLrmUPrfr'XTRhhZL-V,h&ki2XTChPGMZZ#IlE'CZCJUX+M8R)c0eIcS`4pPC6S&
-9l6q@Dj)$Eq#`'VmS4e`iJ)!2%cQ[d*h'L)8d"@[V-L+8a'pQU&8r*qU5@A&eLU
-R[K68mY$C'Up%(Pq"D@K!3q0&+5!5*6q2!4N6PU3!!"&48&"(Caiq,iXDJEJmX#
UJe3U+ejA,1VAjBJU,dMT4D',mS-@(IMbMUGPCfAQ1Y22CaY+Nl#SdKGKa35m$0"
$1)Tl5e@m!diS6%f20q811AJm!!qB6E+D'PJ-!1R"*GGe3@6SJU5[8eN-Y68iGMc
V`H1r2j1GQi1Z`[H[%M[T8$X1SGrFR!cd$lC+IQ-3l!0J2jKlj[`&HrSU-,ZJ34a
'H$3L)%l*Em0!m'G2B1(KBRC3)C1l5JPmCa&Z$%a@ZD,ZJDLFJqNE+%Y86[a`re8
H50AV'e`AK#9EfP41)&d[8hR3S0kAZh[H"V##2`EL)KiAL$mR`L[rX+%Zbc[ahc(
[a"m`K(PFKf%m@+jKL28cM!Fhc$!Hh"$$H,!F`kJF"C[2DD1Jm'm3"BU#'!!!-!0
"4%05!`"@X!p9#b`T!#TYFlqAGePA4&a@)L+L&4(4e)aac"K(hrIGIFRcbmK-c8a
"cLdB!F+#CUE2ZlX#)Tl0e"ScTh%FafR-QXBaTk"a(+I-2,mDac`hRMXP-j!$)k6
PITi&A$ahdhcrllUqll[1mehA"4XFJ34"%!4"N!")LQ4%+pE9eIeQr92kH8H`q"9
S`60JMX1FKZN+`f&#B5l$G),THl$0FbUQb8d)39(NbGfRFV1$4eZ5kM4$qS8Kir2
9ZqTN)a!pM[p5,DCI*lA620)XScCk'Ap228!I*mh4LU3mqL$T8ffdp&YM6,5Cce4
R'#A4Mr%rU)r3GdQ,Y'`TRCBN,G!HPjBDMdCRmF9U+8e2HN0l@[Ucm94d'Ap0R@*
iS`rbU@S"68ZDVCQN`FETk"IUq$hU[qRZT)&DTA5'KL6GVpdT2@$m-rSX(k3HTCU
NZc68!q0%p$&Z981-mZJrmD(UEA4(8V"fA'UJP+5(Y6h53mEcdI[iF(@%F5Vk1Ak
[HT)H6"UTlCIQ'MR4HrNhkQiDPM4+UjGbDAl53Zf3!$621"aYiC&U*b-m1UU12k-
Qdlq51QXlT'EUNr4hEE2d4b-S1S(IVQC3[k5rDZp)Ic2bSc2j6fTrBf2dkrahDK2
p*DQ[eLMYSTj*2pGqP&iehSkq`(ZVRaXhSfr`,p9[k6G*hE@,dLH'1cU@reIG3[p
)HPp,Nb+S4p+(@ScdJl%TZTAh8P2TFY+YHl62T!('9p%Vq6QeQl%LHK9r3[fHRNc
USLfAAMDf4Ar%rk2ZT'H61QMETDh82ZN9l8fTSr&@p'VH93deMN4[i0I9YA3P+8a
E)kfMUdQAY#qNDmEAdHYjQqSLCp*j6CF5MIZLihLmDMH8D!Hh@96*TL9ac5,Cd23
`P2i'b651$Y$MG)*Z8*e4*pH0UcY3phMGL6SbHfS,m`*&aTMLCI,SF3G8Hr'-dEU
ffUaV%Nbd1BiMlKURDmm(G+fd@0GUBE*J(S%C$D3*(3Xkam&8!M0MM-XqHNDYbfl
`2*Fp`%Hll,+`"cL3!11%pA!X)A#&l&3`(a"fR,"Mf0iCYEVQJ@5M8,F8kYSi@GG
NMkkCLb8MqJkqc2,(a*9"-8%4D8%*PMp+pUrFXCEQq!eZ5d2bRKFXYpR[2)RJ2'j
4-k)X#HHD-LeIr4MM$RSRCVpP3fEbUIf@4SYEDbfh2(GiLqe8P'"UDmU-q6(Q&,+
mjjL`X!hZjjEPCG1bqc+#,*Ra&M8faYf8UIb[3*hDbIQ0'cFY"[ISh&!YKX9M-55
lKp"64(4S(V)Bc&SmUXdMV[S+(XeMk0bM@Mca"JQX4p8-$q3,6XM"%)bSXH6"!-E
*Z(3JFChB``e(aA)+pl!GBM'&'bkf&00!X8'DS@)9lR(B28`JC`ULCiHdUQ8iikS
qjRJaV9C,2mpk(KHN*RSiFR&1A1&FGD*2*YGe#cH43&Ui+JCF',$BB99ZFL8b"M*
a0Ek#dF'jUd)!0bNfJ9DjaD@CZ**BXGhNd)!+C5aLYhUHV@"5l6KAE)*&&5Xi3YQ
5%'p4Z)AKA%iQ"'ZVA+K%eHSPXJ'BAADrKVLf(mDdpmY3H+(&E#PdfFf&C$&,A,J
DeP%eJ9(aEcG6)I*55k%025"jS82XdX9'l&FYKC*Q,P5G%'%QYYeH+(SU$X8HXb*
B155"3a'5*16-BU6D#UZ%5f+CZ+Te+m5!"IYiYAT9r%`+SLE@B4BL9D'DId99+-J
,&FCP-G[mQS&8S[!YQM"+'b-32P&T-!)2+!)j08C5-($0&5r11B-`&"C)+qKRX&*
fB)0khLp!R2[lSNc9H#BA)UjS9#'"aNXpJK@8khjfYYXTMXIVjI4[jPV&URDKhA@
,8D@Yd&5e@5S+Xd)E[hb8YS(8#k2D&9%*3'D$*%86'-NX-1Ue3ZL$!B'$&,0L-`X
@%!XjR5TbZeX51r'E3ME!EM*FA&'F6,c#&BIQ&bI@8H`-k9qR6DQ3!-r@866XMKH
lJ2-c#T3GXP@aXU+FCmZ`I&D&h1Y9@jRk$"h+pJX(SYVabZ#!-KD,*2US2Da,NQU
h`&B-3)hVk1#0!4C96$+ji[e$e!l"*YR%3!Q&$','CC'B,-8ZS@C)%VF`U`LaM[1
-T`S[PS!1*U%0&R2k&f%B*N0MV2#3!%U&8*G0l&G3-feJ&AM1p+M5b9'aQL1d!S1
%*RSX91JKFk%q`%bL!q![p&J`X)L"m+#La!SpLNf`LUS(0[8+1fCEi9MYf+,DX89
SLB%$G5'8b4(b(0MZX!QC!'@c)0SPX4)cM"pPGGi[6MKdaL+N#4N9kLLSP4i8ViH
0&FLjcmP',LG$1Ha#$jX3LJUVaN1BL8`5Fe)HH%+25@+Hd!3i!5(JkL@64`d6"q3
"hJ0hjf%E"-8p+U-K$K3Rie#[Xah#Q"3d#qjcXT'I#4Q(i&,m%BAP%@AJF,)G3Y4
jX6c"j@),%qrIlS"U6#G(U&m4UQ*)"*VB8Ab&LXLJf-V`mAj14Db$c%8qI+T!Zar
[*2Ih9Aib$Rq2*TUq+cQSeBe[#)ITX-p!hq@1DmS)fT!!f4VVrXSG%46eMRV&Cd3
&fUbV$T[J8G([l,Jd!E[JD+r`8X5q$Q0@,h5LIA$'V1P!Ad"r-8b`VRhr5B&@d`#
$PkLDikUf+J@G)c#TJX(,4kVDMMBB0``bUaApBp`*P[,3S#U9SFCl4ahA@L3*5Vb
hhQ'mYabG(6#C@1HX1Q$PI#8UqIA0%IQaQ3RVQp$`c!b+8"1VZq"XllLN*MHkBc-
h9k'&V0XKUamkhFA!H'mQa[(SciDCUf[,&kPrH@Ze+mSG"9+iJb*mL6%T5Y$#BFc
a&QKcFX6!Q(-DmQS`aS[NR2@3!(G4eGi+9K2IkT%DNEmj)XJ5Ff[LBYM@1BhBCSI
TKUhTUVBe@ReLkj(afR`4krBTb"C$l2V!F@XLI$LC!G'4k!`5!q0M`VK(JIDa'5C
,elk+9V8hSHHEC`ZF3b0CJF4Rj'pZ5YiCC)R3mKNT3Iq2Mi*r(Fa@AG[@4h9Zcf5
mL4P"QC[GMB,CRXm)[0liH#[i)m$VK1N+rJK9fjkTfJkc,FiG83NlSb`Cp[cN`rT
%N!#UI9+Jq(L4ilS[3(`m(%X-4!HdRJdh[U1VkNa1QkMbJRHfTF!jZj+GYqA(ZRI
Q0qq-L-VF(-4%'E12J581NPE$C1KDmQ)eFAYQ9B%0d01#-Ye(Bc0MQMCRiMdS)cp
cmc%)RZddCRFf3Lb1LDAKUKS4%j6CP&ceGFm5%`VU1#S'Yr)MQ&4A8daVP$ZjN3(
Ql%KMGJJdQ9@J65Z%+6*#S&$),TK`Q%BMT(9L5fN+hU0H#BS)5[!&UCEJ0@fEBk*
J0kh4B8aV4FFZ"XDdUaLMXNlV"Y2I#-'hMj!!b`AR3lU1EGe,BYfA"-TT)mB#P00
U(-B86i%fT83-M#Nj@"[IAkEXKj'-N!#q@,XR6(6"-b'p(ZaTXdcSPeUQC)UlfSP
0#6@QF1DHTL!p8a,33AUQ)$dcI&d6K2ZiTLRpQ@[D#%$GZ"@QZH"@5+53!2K5UH0
6A9@V6LdcTKDa9DGQBG84k-!I6$eZK!5hA,9'+Y#'P[KARAVF[qT-Q&i`h@&ZacR
Uj9"6`E0$*q*[@LClDRYMDKq(-48&0I8RQ0l'8+`cp(M"J+(5Lh!B8iFE8i1arl8
#E6V%6DmeKN+YSB#kSH%&eiC'YPaYqRjMqR&MD+-aY2AUKLr'9mC*+q[dm*D9GAU
V`jJ11*jZ&`0M1XTP1RcjG*6,p2l'd0$UUT[BP"qcFdG86""UFA088dCXK#!Zfrm
Z1SYJ4ZRDkae8Chi*fh%q)cmj#Pm1bTh08FP"EX&Y0Gl`kYIbVdk3!0JhkSdhcKT
$CaY$!3C$)a8q3Z%V&"kXm&mSr$m+IeEK2bPm[m,rU[$h&*l$X(h`qUI`%SArA1(
2+0bZm&L&2mbi[eGiXm)h+MaHiCX8[PMK6LDa'`[2X2%ZKIp$iC@-6eEi3Y%'jJ9
-+0SV,SAE92'kk@"R@3SIc-5"qh@&(f"l6M,88`Tr'fd,K3r"qb'6Hi'Y-8rKpbU
mM4dN+RbY`[qZm2N+hk,`%)AhC#hm%@`FcG+c4a'[FlZCaPk&4l+9TLRmSX,c&(j
GiGmb3HfBLNN+Id(KIe2iFDC+Sm)I8ALD`Rp8q!Q&IkI`Ac,8'DBF9NfZ@Uq@$Di
`4E(j#B@rS[!r+rb5`TFUI+$#rm9dDQ1N[ihTp#&6U%$K45be#NXR#U1G`XmTr#f
&cf4,5Nb$")9r`JSJ@q%G&'j9q%k&"a4q91%USmKdKIGAH&H@B*6PiicZI9RDTLL
mNm)(X10lQDkJrS1-1ZmUr#'@KSIC'SGBQY-9[PIKUa5q41&SmRbXm"X+rdEK[GP
L`pRr'DC+!b-0%V1G3F`k4YDV#Pr05JZ,h@*kB1eAUd"N!k2JMbb4Gc2@,a5q8Z%
[-pBYM2Vl'1(!1P[K(4Aq094Ra4-1@3akBPNjc@&-&LCk&5Z2"a4HVr$R&4kQm#p
C!L$#T[#c#KqNe$e&A)UfG!U20&e1RAfk9qYJFqL4Q3ep'e0+ZUkHFEcRVQ#2dp8
ZjrD%ZD9GPNmrqiPl8'hEqPRlqf@-c(Tjfq+Mh5r@&0U9Gh-lljM[2EGb5Q@2L)&
jB@Xqf0Grir$XpPXAPIHq%"+)MjYFhkGj9&Qh&DqGH6pY50(9GA01rC3j)Vh$pLA
(2VpCCc8d0HR`-e(c#Qjp0Zf&(cEG-qEkKYrZq8[6`ipeI1X2YrhmacZ+cqZrh[[
(S'qHI[,l0rljhpJ(PPhlqVf6IhhR`8Irmp(5hrrQflYNQq-AKrk9[2$JJ+qQr[[
$Q,Y(AeRlkI1rHrfK4ejjmlXr[IVfd('*prebppmh$h[UL99r[[-I@qirF1Q,Mjr
l@rkpMcqlFm'*,fqBVLP0lTGS&#p+Q(L1Z3M1D"&mfD)`-6!@GF-B[Qa4"jJHaY$
"UVCj"ebhj&MTq(HPV`qL#4c5SXLaC)b,4N$QN!##a1rbQ"!XqPfkX@J%AJ@3!#p
m9eE43ADjD!ikb#kr1f*mKfaXD,#U4G6$&-&N#bH(A!EEDm`&jfY-&IR8GaH0lqa
'M@A56!NjiH@De%PD,9hc)d#TVr-6JM*SDe"%rKF4#8%4E#c%IH#BY*d6RcqHBC(
$q'iq1M9LB#`fBiamDV%**XHS`G@9'M5kDd5q(+PUc6I9bmh(aLl`fL3+,'if&UF
jM-AVdEm*%fE8A*j%k2RQBa0T[Na%@MYMmA5MCQDeK'Z3!1"rH@"Y0F%cb&KDD03
-IQ,#P`UIGikPpFC5015APU%2fLje'AI4@YqANU8*aY*-ikl8LEAPcP8N2biUa[d
VY"bApTY)3IJEidXR3aP!bY,jBQ!X"A3YlB,qN!!#E8QHF9G&!r-ZeX"%Ta'Y[GD
Ad1bVM2`Y[i*Q5lD09E-P+,NP+,8Pjm6!@0)"BaIkI@"k'hIYUY#-9fJ@@R!TT2A
VU'5IPXI%AK1@$'cCp&K3k$!@j"9F@e$Uff34"mB##mj3#aDFV4JE#ij!#4"U!9T
"#c+-ZmDr8S4@08c%AUHai*aaedb(IreZ`10Y!`8X+[$4j-DSL2d@GR4*$(Dk)k+
Dh$(X`(+X5QGIHBXV**fVN!#8(r1cT'!AAQN@i1dRdL)'b-M34hjCDbcSMbj5&(P
%ebjZ%ad[,PCSpR1#3hGq@qZVG2k,8pUrKYQrKYQ)G+1,BSVXV@Y[pa)G,`p@RID
,6%,(P[6BiKGB)IkFVrL+XfUU2$QH!#pUQjm-mr$Q25qZQJcc9JSb4++P1'mV$$i
8[%fLibG$JZ!!'9VSQ[qVk&T0$,'5fCMA(YdT-'L@APJZ1RjLV'0#Z[TAm#q`)lE
jCe0kIX#BAkjVhiiXd+c`k9C!SK8Zc4UUD[NS6L[UUa99`SVkDN@eX1,9cES,,qf
pI-Ze'Elqa5eAlM$QS`l14c(1lkjV2q)p`KTGX5kFS"A1d%Sqk`k'`8Z60G+rVR8
'Nrl+K1PmFD6N#b9M)9*l%fm&9T!!e)TX`3T9V(MeXq)0b3VJYZ),Pa@9e)UFbJT
hDZf+C5AIiUY+lBXX[S9)md+NHH(l-1rLFLZq!9Q$aHTHE[BL(laVF0A5AYlJj4B
[&lTdpAB`9EqE9,bC@(#e-cNM+#U#$NrJL#b(l@0lRE%F9LEQq*m&pCSb0eZ5mr&
0*5)ffCdI8@l*Y"bc["1eDfG-di@JUNmRNkl5iQY(pG,M[mN`G%8GQr4eD@l2#[G
c+pRpBfY3&E'1qGrU`KLfbPA066(Q"M2SRc[,BFbGAU"p!r3hTEUQ@990kqEPH*q
9[2`)4ZZp2"@ad-YAUpU0%Lm2ae@2@9lHH*pY(cPSYh'Sm$3ZKjdd0jcHDmlT9-P
cc$RKP9+ZQ4XhEYJRX[US"-IB%M(USX0h#`0`8GLMh%cE8CFGaLJ!cLMrPmC11qm
616&SPSbF2cR0A9&4r+%TdehPN!$D+KLU94KK$+2a)LFAD--`')E[ClED0relZSj
0*KA`B3lrAQ-B2K!-3j0Pf%DBH&f,akYrI!*-YUUGR`[c2S`GTN4e1P1Bi0XR8ES
DhLHk#&B!J!p$24df50IXr5[dDrm5fe9I&3FjM"4m[NL"BdhCS@ZKP9lHeFXlU9T
L$F`FQ2B`#JcFlkM2M6UZDXi1AJirj9cZjCG9,I1UUYQ'`-a4cpXbrfI!HciY503
)5hQAk[SKK2Mj,(kqqm5lA#PlEhFjY$cqQG&l[lJ%@k$eh[q&8CILjB2KQSf(,cS
d,djIV6KpYFAT,!FZPAjQG+milHjl1McV4QUG85KlLJ2Mc'2b4YFZ+cTJ+[!H,(f
kl+Q5al)IbASdrA(,iGa$1A[VGcIXfIImrT1RRM[p3Z@rcrlcc*h(Eb[rdp(I(cX
K4He)6JKUhYcBY2(eM(FbmeXh4F5iBp1fl2Va`T[E2YUq-hcX$'pIr2EQME"CEGH
ZGQ[rE',SpE!Vk&qkI1[FJ#j2GRZLDmIfVlcmR`l2GRUQmlpZrf1I[rIp5rrIpI[
VjerfqU((Kjrmprerp2ajleHlrqEc,k16h[e&Zep2rZA-hhi3HZ89bmH*XkG0Q6V
pMGIqE*P4YqLla8ZA,)LF0hrKh1ZA%fpG1YIPb3&2G"cFpH81rhPJb2h"Gi3-VER
,@NIr8aUSLX1PapehC-1DYHZrA[G&kQFV[eVqrBT9UpqkHkZI#'2Pf-U)`$@lcAN
qIYLRhr"Ck$mm+QAiJ`q0G)kijplcl`dFG(Gm5aVmp,H@02MTEcidq(6@HjBjifR
`"emDI$0U@-V$`amDqH#)H`II-r$Z35eS--Q[X2TR[)LIZ(BfdCp8jqqGRXL[*@m
RRaprN6pI!H%q2mRR9bI4f(p9Zid**%ZrmUpPDR`4)-'%bTSRiCI'FM4HSdNhmE%
)Q*!!6*fVU$8aZPAmA(@Lc'@8C$%&-0h,6'-SMdC6,5fM)Ncq-P%"l[BiL,[*RUB
bHST+k$(+TNFSLakPG%`0Xp"KbU9$P%0lUCjf8`2YSAhd21fRNlLliMN8p`ZBPrY
[h%Id6pbEGLFGTpZSR2k%ZF5rTf1B@)D#LU)GP%`*&%60Y*NDUBNfdZZ83Hp3*ZA
M4VY0&%%aj+CB5U-YY)YqT![d*QfMMfJll85Trlm)H*XZdVGd%r2D`ULZMDl49HT
'lHPC5U43ZJlX&I+M,p&PZNARD!"eS5I"p!4eTBjJIB9HT[p3"fcT4-p3CrSAh8j
rT$ldGqT,Ik(qp$[U4hqPcqP,kN8r8!rkN!!qSIr5qr32kNNrTpld+R@Rhc#'D-b
qSRIT&p51INf6kCFdNhj,(d#2+eMPBraQdc5D3P0T1Ve"Vp'ID3CqLqJl@Na,D3N
YS%LD4r0T)Ff&jTH4JP[3qKc6G`$dl8L$SI2,d28rp!!0SIXTQ1kJ%"T+0A3A@DP
1qEm2!LTQ9cM)46V&dAedK$E3'PT,kqPV@NGI8#Tp4L[T+eT1hp-+@N@Vk5hDfJ)
%rPm%M!F"h(5PNCeXj+6c&%r$k&2k"YKCj%Fr6+-SKBE6Jr33M366#,U(lJAVHc5
3!!E4hGMb8L$`%rhY*8&!-%46hF4!i&2Sm"l0`@p#%2J$IK-(J@qJl6$Sqc!d&[S
q#(h["3MF!fh[KVi6"3%be[%l90Zii(8)jKS4mTDc`%8BRF2#"b,8CV$36J46(!X
A4$LB,F*MJdA)GSU3!'j#X+4VE&$*!YZ3!"l2`Q3@)PQB+m,M4eKJairhCf%@#b0
%X*5bS,#`QJ@V#)IAX0#&K4!4FK0BL'CKL3Kl-d@Slb2#lM`@cSM3B"EK4#F4T,-
LT-i@i5ZfqDY")La2Cf%P#aGCk-A#)K'q,f+"EIkqNB93&MjKJBPBY9L%0pZc`",
fjZFLE'1UE#YRB6X,%5*ma%Mj%52+GNEklBamfeRLYhGQSBF)iB`SiI8XX!),CiN
2lmd#)h%i8c6+aF*P%ACdCB'TPF`1NX0CH*Q&ReKJ*%KQ6!NQ&PJL%pL')*EX)%D
DS$NX-(@$'1JdlaHKFEi)6DGCB0ZD@!%d-H8f-Y*[c'+"-@eN6"Y[XX#+Fq0d%6+
1Xj!!bJ*60)1"9`CMbQ#%IUGCK2bM,$!JbrHM''MQpf4K#JX-D&V,@'#%Df@Jd-U
@Eph+!LZUeViXX-fYM*5Y$&Jh-4*[FV2!90R%#,H*JF8Q9V5EKSX3`BSYJS&e"#Z
f#!E+-5cC-3aFBKJjBKMjh!%@'&RG$+cGV,+j@59dX`5lql(!5101BB&9fPK'd&J
,#`a3BPPLBKP)aE*+&FZ+0TDT'2XD#fac'L[JY!B@',R6GV#`Li9c,,"+NXE)NFD
UCGS3%EB`TEH`T'jK5Gh##QP,0aBBiED`C1m5br"G&Z&T,,ZB9pJPT'UlHXP8@bK
6IjKfKE*4@LJA,SGa&mVb6CJ2d%M[@bJA"f!U#q8a4`[P2!b@V5Q8LrS8bL8G#Z9
$f`VPh6MBh30Q4+(FF!`'!KUk&-TlbQ(!X!I#Rdq!!I,jff&k`Xb%Q3'68LM[*b`
DN!$P`NKC$Tb5jC)d@GiG,F[2pjIPrG0Pq85B,+Y&XUaNb,,H@CE[Li0abr)4Nba
[!--'E&cVKHNKbqZcB&E#,*EPVi(mZTXXI`&"UAQbr0Pq'!Klkl)XKiq3!1@SG"J
)LZSZbcXZbR*bUL`(PF%FJ3%LU%f@Qa9ChJa"66KS4@H69CBMS'4%-ma2XKc6(JE
+EZN+!q8ZG)#C,-YCjccbkAL2r#HA4rjpZ8FqJFk*IKlCYGdMkjFpmLU#`3(9&XZ
8A5c,ETKfaE+R2mb)BMP3#Y-2jV9LfE`9jJ*-Mf*jc1aLZAC8X9c8!@C)X9a3@#`
IR&%X2eeI,*H%&m[CABVP4il$3'"@AV'FVX$-K"PH,$pH!R1j@$jm"ZBL$$EQ&X'
8``3AbiH`d+%G-&MX8'HBhX9b6LA-DTJfQ$i`%*B$"IIQ`NJ`f,!AKhXA&m[ebf&
f`8$aqMN`mi[Ph9"S0aCU5#Q@pd38bbH4X*2BF2*p'#akLQ!@&F[23C(R)2ad'3`
%RiD#,jb#k9NX9hB[PXp#mAq'&XYR`SVP1k(Jm3DB6iVPfm``50KYqf'J4,N*"K[
+"aI,4jZ,j424aE,NJVN*%e)X+dLNFK8'a(EXJeN(JifZ!!b)k)*`9cc-Z@)jVV9
B[LqY@$i#jBl-,CBhp#f@eh3VPYIQ`)$!Dk(!HK6B&e!f&B@B#Z'IT4E,bb(mHbc
qIAXB%'%&$PI"8&P!TNT!1X(d$-L"Z)!m,LdJQ`(pjPDBQS!mCL2-r)#FY`mQ!kB
(6%K!(Jh'dCm(j0S!c%fBb3&j@5h-5TMC!EN)`Jm!F3"#6""Q'K'3!![Q"Q6[D`(
ji*U!r&4U3-lU(j!!(fd,b1P6!V)&3JlYJ%N*b!hC!IRj8TJK!IRNdB"m#TdA"JI
N5M$GD3V)+K4e()1C'C!!AHYK)%![KqN--c)Jakd1S$,#B-14b)#m!4Xfp![)DhS
(j29)8#S3Rrd%-cdJEiAL@kd"qFd9!6RK6%"ZcS2C$Y-RJ#F!S!%VV"5kX(3G&GA
6Z2dZ2Jjc@h$a"V0!H5dqSUMDbUfBY&Pi9%c(jq2%E%fY0G)9'TPeP[*bD&`C'!Z
mpK4ZLZ0V[)NTG0LF3mZ+9&XTQ8mT'MI`&3CIZ[[b2%b!cLZ)[cq8`SmhN!$&+eh
2+`-R@8cdU#*N4$*QeCECRJkkq'PIM$LIbB&1m#E14#0Z'a@ABhDcAfBSC%k!X`Q
FKFH[TkIUb95TaUqMR$9dZ%b0hdV2ZbQpc$'aG2U6dPhBk4aIYHHZa`HP5Tp4SGI
ES6Y&,AI48jMYQ8fVQLNhMaiY%c0ccj63(K2K1MmNil,Td,i3ac5fpb0$A-B3kDK
Pp,YTGr'$$Xh)pGVEqH#`lQ*I&KF2DBNUm0h!Y'hV4h@m[eC'*9jk1PYeDZ@8AS*
@+D8I8@eCP0kX1XXSRIIf*fde@cCGp!bKCGXG`AKk%@qM-VccZ&3Rri#+6UR1,#V
#j"A0cf5l)eMXl56dkH)0kd4e*6Q8Ck*aakS+(LIl['%TG'p*($Y*pcPClfe,)8Y
*0TQ,m-C9M8mA'k*5XkQXL!kDe&Yj915P,"-pAdTl6AM"DP(`[IaEr*fY!LbUS1'
Qk"4i1d6qcm[Nfj'6P)R!qC3*BfP4*K8FicIiP!N2U5k6%PBQ*Da-XPQCP+*-1[L
@5@&eQ9`4CE,pCR@46'C&NLf+a0'b5$S,GH+pBChr0bb50K5*ZC&UXfPF,ZjH(Er
Ec#C3eB*D&j8fI$ALR9I3lrNS+Lp5"abRqZ98@85(q9A+EU#$1A3iPEQM`D+HZN3
eVDQSTK!i4,AG`+4ih2l@e@ZI24j9i$X8L[88RZN$Ee[2RkP6VG!TbTcfXa5[rCP
FY5*H,bQEJ-VCATib8AbB+"2FHea%il`qK9AjNLIK*3Q6R$51rH3b6XiHSDaX+M!
4lYXl91UUVKJ-Y1eHfb`5rR1dm*q#E0fmpVQJk+6iX,NdV'3ejCA3Z#+I9CUpee1
ScTQ&5d@"Bm+$32M)JPXeJfPh[8,H-MU3!#Xf(8"TqS,bA1&IPf#fADShG#l!fGi
06kcc&r2J&lPpU9eXKek4$GXTEdeeiL1&`TfpSC&NbDUR!(G@b&@[4q!aV9Qj[MJ
YBS4L,r(*jL*'Z+jDkL[*DhUTY4Ih8(Ljd0a5T&fJ3%P92Hf)UQc"ajmlXqPd0Zh
*TPam5-UQ8Y`aUE!9-&IPXQ,[5q-(E6k$9Tr"FTr"FCp"9V8Jh9NN8A&*PGF1aH+
(5cG5FAC9$Za(AC`3C@UX4Y88R"FS,GI#*DdS@l@jD%bf[a4aS98N@A4V#Uic0Qm
Q"E)G@J95Zb0B1Eq2DXe8V&BT&BjE3#S'1-B0G,KK4K$Albdh$GH[Pq#6E+e[6DJ
9lBFSI,-UcU[1bQmK+cqFRN[,5XQE4AR(D9N@Fl[cKG)KiV@B8-C(UM&DaLHSBkB
*4*IkUal`*Ppm#6UiBDK%LMGRq4lXppFmq08d'VI$TiA6"N'+[GiR*5ZhaYQcUK&
)Z'9#K+ZMFIBBPHA5SbA#[HiTTB1j9&4#"me8T[S,!q3P"Ulq6806I3"Y2!l30Qd
b*Kffi2c9TCqH92TT[r3c,D@IGS9C5Y#-Dd'E"Rm'-LRqjbNdc"RH3*9Q1PP#hq+
"E'CUb+)Q,c9ikG"&j)*dL2HP1f[Td!j+aDL%'QVTC#e9eMUBUjM&9"AG6m4h&0E
Y+EkLX1lF!PX0-FEC"EDKJaNbZX!@B[Q9YR4rdBXiXDADlIe+M,l(Ph"FCh+*Y[8
B2SZ+DKRa"`R&rIlY'[cEa-L*QR#SD+Y2R4EeVNj,hdH([1TPq*'cG+#@5K9kV)4
+H9G'3ZXS[f"djiZ[8Z5[R99eGllUE*c[dfCq6MN#X-&YIG"!E6Y0ZHRdG#kC5ZK
TFj@DIMqhZ"U3!-C$$Z"P0ZE5@Vfi*IY5r39k,+ID5H*aLY@-a0bN(k$Z+R&9lH[
QLjB+Mr+"d[R4I!QCUr-XF(k-fI9'1e%9)dZ18YjURab0(@1'YD$6X"+&LSq$6KA
B#&&(cb0V0Shh4["!Z+1qUXELjDA%4ARH#56#NDm4bmdVN5K[qD5RS5accDS8ZDI
2D4b2UrBZ%h-km(*j[[JmjN019@FdSR860i&2FF9(PI+8kYaNL0rVP[&HeEKJN5V
F2jIQifY#CNL&fYEpdXGZ%q@ED1-C5Pe"2jC4DK(ph85TkfQYPq,b5+fPSbDkddZ
9*A5b([929-UMYH)JVTE@eP,U2RVM'!99dXCDbUmPYapUf`'kqSTfmf,ae9MdqJ-
9,(TT!2P`dEX!9+MSR40INd@[JrL86#$KV1eiIcSP(+iBC@*8cNDk9KJ[HJ*%ha9
INeQhIjA)62(jQF&[R`*R65qIZ[Er9fMYrdHK0JJYH*(-m6@p+ZB6DIR*LZEGMTZ
k6U[D9pe8cBYE@Vc0-2Ell#eQ(S%9Xb(#("01Se6JVdp2N!$&R4'+K&Zb*+GSVCA
i`ADZraA"1AGXmcYmPV)FaLh`b[@5SJPDV9irH*G1J#raANX4ZmGVT4e-eEA2d,l
k+U"U"c&IjL"Q&Kdm9j'SYKEFDUM[aR-kkJ,U`haXD$pTFThc5$3TVR%[bkYE*Rb
I2jqDP"khi%r1CP1fLBV18%%*M5j"bmdK1'Ba0[(Y)E0U*+ThZYHC-MC#Y93IY+U
Bl6AKJ@UbPHDbUZV&V*`ZUPD+q8,M3RAYe#j9bmV!&(p-3jcqYEDkl'YY99p9Hr3
SCSZRk0TQ60h*c3%3VRk,dI$JE*A4j1!Rk(cLKa9[H`%[1LSPlK2'P4`4PUHcX*+
&LbcdBQ'4#0mAXA#@K8B%lIY3(@$+ZTKZD9UKDL[kUq,Z9@h9BKdhJQ+`6h@qYCV
MVPRE@ceiP-2j9M#2+P5F@ip`!hI5ESd@dIEQ@CcChlb)j`Qmf9lBrYb&5d#3!'a
r-`6pEAPLN@hP1UlrL1@hp@&KZ!JICB[$MijKX9*9qbK$e3jB9IY(%+&pp+jZrfJ
f"(id&mp*f+jS"`!6fl0eqrC+5-9p'pLj(I1GF+1LGQ#bDYpq$XcE1f2VpKj!KDZ
fR6PJFZj-jC&SL1lXMQdlCiPY1`IVp["kF)B[ejhK#6cFSfMK[B'FM+FQK#rLi3%
&&j6%!aUL,%"&A4BS,5T%YqqSKC3G&L&PKd[(P5E@ABcebP9lFKNd50k(,FNZ,Zj
V6`lAlFPT!KXQl-[#rL4X0-3N,aB%5$!*%3PRG5h""6'jUKC8T'Y"k5VZ+0+#jZM
f)+6H(P3$ECZcG([cIQaY2XDIFpLDEf)+Q+djKCp`f$E[i)FG$(#@c8!Mi+S3fMK
CeaT"XQAG9AY6&J3dRGDe*Ua5Z`0YQTZ#TkN28,f"LJ22)2"X01[fM9e%lhEdTL-
T'fZiT9Da[Gj"E(JGmNBhS,9YdTdCi4b2h0!bR,Sp3fc*Z&e(Xeb`[91Ufpmj#Y`
lm'1M8Imc0qTD*J!fElKUcjb"Nda!G4lQTH@M)C+(`XSrUY[cih#5[`fpCY'lS0[
b@6VbH`)h4H"'S@F&09T"CkfeAVHhZX4`Ul#C!QF(VUrSpG4a,8Z3!(F6!rT0j6c
FBGq8J,00EYfqk@A4kiAHjk)(4I,La#8YX9a%NBi,@Q*A4*S!RSM1SL5G%Cqc!Sf
BMq-4iL!QLah%('F(-GYdCd`M*TmSpKJ"J$%!TKL!VM0QVUJmGRF!@(HkERF$G*h
Z0AjX"X$DE4&(AA5RZjr!DZlTi%S4b'$G(QX'Hkb&XH1q)CFp9L3f0N+JireS!8k
aR`[-Dhj--$DRQA4l@S2S(8G["hM5GSQK8hHQc4*UDQP$G2X@SG8@D,AP#)"U5lK
)rjB`(9Hf@,HhlY`bQH1@IQh,#$(a&Ui,d2NMjJb1`a-e,L`(6@e[%`Zp4,Li6B4
[D`Aa[KAH"jr'9#d`Ahbe41GG-Dp8&epR&MUd'lM9`i-M$Tp6'#bQQZSfV4ZA(6C
-A-C@qcVGCZm[40Q%3,Y0P+m0YF%f"$dRDZhj%Ki1hFlEG9ZmF(+BfUME3LY&0l6
,eml(c[!kN!!cqh2GpSJChNR,@U2EXMVc1SIfD!pG5mI0dk8E9@IZ$$i2I)Hf`EP
#fj`5AFYCMN&reERA`aFf+0VZSlTY0kXXZhZJ1d,8X`CiUi0PUVh"$@dDi0HpH!&
YQ)c1qkTp6cRS[@HEX$H&l35Q2Hh@FF`@0@@S0YN0-MRPGM`+c`R`G0"YR[l!D"l
F,h6JGP8V"N81#(U9kVC!2`&TJGIi3[#D8h@Rq3,(`e@FjKlm8+fLM8'Z8!628iZ
jl-[3I#QkUYU+@$8Y`N61)Z3P"AK`bM+Nkq!-G0#dH"Th'pAH9,@5F$b1#XM4m"A
CA35CXkI`3`lE)mI&i"%hh`f#jH&49Y"Np%C-AK#ZPUGE1,MXk6-",HR-GcpH!Sc
f1$j$i-%Ub5J15epG1h`'ZjCMTS+!!HIK'G`S91bj45"$,LD2jk+fMck'@3["3Y0
$@hAl)3'IKbi)+kV1SGkk,8H8SbeRY5MkR$BFjI6"SMNc'9T82r[HA+$h5N$[h5(
3Hp[iCSHfGl&ZUemZ%2@lK2ckIVUcIJkVSI@!YV`dc)VS)Pc"EZ'%GL-ccS-VE-M
NmabfKK3!TQe2"!VBYQFi80Sq91Tp6PkAT@Ml"qZfNfe#mXRh19TK*i0efbN'RkG
%eUSp"jIpA$cNR9CYc`NplDIKSfbRdBCbD+F[kYVT3DSP6l@pF%TXHS&Tpd*294Z
$E,F50@X-I0"Cc-)G!erm6p5`-Ae8l8`B1ZG8lFi,k+$8MMISYZ2-[akISGZ2Md3
5EM2VYYZB(VH*[%3V0qQfmP#"+1r1%)0el8q0f)m+Hl4CS)lL8kTjT'Sl0P`!mSP
XhAELP#M%%eeeQb3b2%eU4&F![%hU,)kNJEUQSNPUlUhDP+f#4EQUfa`Xlh)&@+J
AD"ID*fC!X!Z1fh91P,eV#R1),T&ekAJ%KKP6M2A2dGQP1Z0DHALTiV`[MBIMd4e
(LN68MU"%c#Y8jiDq2"aPYQ'3!'jE)ab-YJEYR,8L+lHYAFH#@bbj&UdK-eT*kp&
Q-H-HZLmZkVB[@$XSPE8T8U(51&53!-m`XAdFDZIbGQMY('@YRfB@fJZ(pIemSHb
+E(i)+Uc+AXFV`Gj(%GqFabQUc8MKN3iZapRNRR!MYN#Ff$T1C!dfFk%!&R-V'p3
)JSlCL*U,XKXcAhIQKBL'NMBk$8q&3aBB#"0e6hFZ@mQMi('@cFDRZc)q$'fS!l9
m)9!(DR5RD34$&FaP+1pVZRB3,m-"6-8[KBF*S'D9BDTc!*qDRd+LLTfUPShPLVH
UcNFqi!Y4!E0!#`rQpMq+jh9ii((6Tk$6'8m(!J"jS0dKY*B1S9RRb3(FC`Zrf)"
QTpbU1[HGC4+H4aY-KRNH,U33,Z)Nh%JK)2@83'$5q!X!UFUEiZe)YGeT%K,Zl)$
ApAM9HGXqPL(Hj[E(bDcDP50r0h)"IHqLIYTqRb(mlc'i!!2PGD*'%GrYe$J!''i
*rJR2*m$0`@'UcA&-9%A(6"&Fkd9fiCULfr54SKZh@VFGBHli5#5!JV9VeqF+a(U
d-El'$E50UQeGYS#DGEL&HLA!iK4Zp9@ee$J(VRJ@0V[le[6$lr+-'G,+#V0maS`
E(@YUDJCC3kc@J8lR9+YeL,$S[b(k`I0JlaeiSa9-09CV-%-1[h%qe'Sp"d4mX$8
Bb*!!qGEaIb%eRdj`r)hrT)DG4SB))BY#@!baKV4M[DA9L'm@ep3m8-08'!)80,Y
rVY-CiR31V1!B1+AP'"[ZVK'LlkQTZFGZY`qT@5L#3#h`paMM[B[Yl'p`cIe1Dmd
3ra+$KN,#F'G`"G2Ghfjd3X$G051`IA"0"IVqNFlJQS&1Uj-*IGJTD"95-bhXR08
j&a+GpK'-,(Hm&RTjZ"KA)9,mHraU,Q$lr-Ym*lB0&&+Jr--#I3m8"1,qlm6S)A3
IU0kj825qU4M1VHJ-HPJ`49BY9d'X`AFXX9jBIY04943SpI3HjhZ&2GRaMNj5i`$
TJV$RT0GH[ZH(5r'A,X9,H[bPlRH`[rI$`X)'$,dFP[K(kCdVYpr6mIV!3Cqc),N
lcT&fMZaicmKK`k5Y,#5IlpSP,+ccd1$,!kjG(pMK9Y[9EVGkGlebrC1`-+PjbJp
6TNM*-+%26d(i(B*d)FcU[#VY4(Jb&%q+hICfa&hr4rqp[9H!Fdd`!rIIrVQ#h*r
Hm0B)l)e90lSRrAE)Dr%I$)Urd5Rq2B5V0jq`IQbpFG9T[I($YkG'@ZIH@!AJZ2'
KdhVc2IXXqf6l2#Z+1-PUA@#ecV(qf[lTjC4c6T4IARRX3eFNj3(*eI2$)AF2Z9[
km$F9REmR2[0+m+$qL9Ia8ceAVNZ6H`k58U8DP-pD88Kr(5)p+`9*@lZFPkk*-[K
@@*YGfQ*reNlq[pXNVKDT1B6C[2'KSFq'KRCliYc,k(CGqGF"LGFPKl$V3UA88(r
i-,4AD-r%kkm#r9ES*iQI*%T2I#QYq%%0501N*-JE*fAD`SM8dfeAfS4m!!!F%8&
%3e)$!#la$e80C884!$&PlN1rE@q@19r#b`cjKT!!Nlb%1FG-XZ'40%FP,PN5jc+
5X83*h(c*e'36bC)eaM6PHR!a-B4S)BB@,*G$!k@RmIN-,&#V(S%"PX-9,cIbI+c
eH$NL&+5)jECFVpM8IIjqllYN#CCblqPprJ%ETLIP34!%3"!!SJ%Ajr%4R3i[2Pc
)A&#*C)3"[[jRd`XYcXEZ&MlCl3dq6TAmHUVmBRcKN6ZGlrhpLr83L80DQaTjGMT
X@@KbqP66kA)N(6J'RMM0K&4mVKqGCk12FI&MQ&K9#-m5qeS83SIZB`A0k,a$qr"
4,AiNa!qrV`hZ-G(0)cQ!JRjb1$Ri6PFA0a`P&b3V+-fJ5NLNR$MFkc!1@Ai9VRL
CYeil%[V[JP!"1DP'ErRJQI@T9Qjj*a"DZcG%VN2GGhYl(4RAMqm0Y2P@1T@0HfS
YmlQrqmIdYr&#pir2lqIEqjarGQL$8rhNRLXK`dm$dCa!8pQ8&Ap99@6(jCIF[4i
dpk0QfB([39D`iF$GeFi+kkM4UR!jLek6SE"IDC*"`@3CAUhaDVaL4Akm2MX3bZ@
pfq1#+HJjS`5(f[5*l9D+A@&Y%m2$M)`b!NIp$MKXSC,e1m)fe9qrBiLVTZ0lI,&
!60h3T)6EI@C6IYcEq*%Fi3P23KEiCakK+4,9X)TB@6Rr$%@Kl0fQ51pHcfTeJj+
Q*KUbLK8BemCdD1lQ%5%PP3QYr,14X%90)'PPe3D4[)ZT*X0@-TF%)j1DB#!96Kd
Nc2cD'k1Fhfek!b)&T[+k94QI0rV-i4jiki2*#QSi"UHmA+ZEjB!b*b"ZYAJeFAR
jPhfa5@RirhMKP*jeaC0G1'IePIZZj*DY,S#EA+J2lqJIQa95ap[LlBEN$VVAFVA
c@4mk`[*i+LRd1IqNp9UNC6hpRQP-h`VRp`*Xp6Qe$@QX(L5a1ZYIm*R9$HS9Npf
6m2D'cGV%kFeF30&,#8MV9KiEd9af6-YU1a*p'Q[GjEh95T5+ArE*50beUhY6%Ah
``@A%R$-%LM`d56b#Vb,U4E)[,&iDVJ3q[rM55(&DIDNq1C6I"LHS#QE#a&Xb8m'
XY[ZXb'TDMj@IX9+U-UQNcTDK-8"`C+4(R6hb63iF9dL0)EADkiL246fQJJ0,!k%
e"Eel9rekZ%*025q((%631BG(8#ZL&M9eG8R9T$"5%4A#&GEYhaB8ABS'-0KA22M
FLZF90UMXh)UVP9+,efKej[p9eZTGEd,rH[%aE%r&aTpkfha@EkI[m(dA9&2p`l2
bND+T5%DdNCD4C!85#"PF4M(8-S*8`"HTYKGK0KUK"28"K6DLj1*S!PE3aA-jVUh
3Y32IK#X!2'%N04a6Ji%fEbRdC5N#8recMh`)-K+%*,kf3MN3HH$A3a@Uhdb*DJj
a*G(!%LS3b42NTT05B'TPmej5409rAfCcQJ%j8ffHDUp90GY[4pilmY5`ck3ZL,H
'Hm0l,lGcT&29pG@#"&5Vic)T9'GT4*TQL3%Tf8$)!k,HpVC*k3K$a9$EV#a2M,N
`H042(`)2S#18%Jk'G--%PlZiQ&+JG-5+[8CK(-N%PN!3L&&!B[`l!f0Ifr*m-XK
)*K3D`%5G#B%TMhIA)CRRK*%B-2'HrRL6ZVrAr*`@#DEbCjdMQ5DEaam'F2+#EAE
H*"Vm(#k8CQ,k'ZRp4NT0@JSMprE9Q6"N*pY-Glm5dHmQa%%*$%R%Qd`!5Yb3!%C
"LJA$rpTAjqi[(U)Vhp%2F3@*2Cl!6c9G5M8k'f(dE6!+5#6'iAk'FGP'e9q"(0l
p%LEJAGT*fP`-ph)N1hQ`qmF!aPCXC1Z1IPT-"iaNijBk(+d&Ul,L)e5Y5E@"p94
UF-Y[9KLh&L+Y0,LPES9abm@9,PbRapEi34S1pZ&JmVMcJc3kD("ZU@P!Klh3YZ8
9GI#$Y01Sd!D,%85CN!!3C2JF8S-lI62HQhNSE!DkDlBYi4BNT!+m,aS,@f%iMP&
DU$DQMr!X$@MZhd#JfPJI4K+VIT)8cQHG@-L&aEdR&R,rSf#C'QbjC((Y(fbjdI,
*dik8B(%pl6!IQHq(1[LeL611XF'@2CEr@$rBdQajTqk0X3V,Ip5p-4aFq`6p(A[
LcS*9EiaRTIc0ADVe+i4Mi,8"6#ZE1eL&Rj%aZmHX@J%'cFEk`4Q@hLk[0e'k#+N
Yjjm8#$k$@h[MAUq9dVVB9$Njk0V90X36jiIB0PG6!K'#BIR@6R8Qk[9Ta)84@UM
DN4P,J(fTT4[r9Cha@FKXP&BlNp(C'PG6Jmj@E&YQ[,(EZE(j&#ShAMpkbmEhk[m
rHe@,J&a,bEX68U!$3l@NF,kLchREI*10G@He*CA,rlM%a*Q4MQ&"*Y#h"iLXLC[
cJUIX'pFXl0Til&3(*MQQ@l[3XV'CTY(1H5S+93SSJa[2j#UZ!JJYF0Z+l'UVX20
ElG&YqUNrhGZ8*'"!I"Z1k1l@YL2F9"%RYaK9j0AbJAi-EUL+PP6XKU+B"VIFKN#
DZ9DJ-CJd@`VR+"MJN!#02,Led0fIENRK+"R$i5IB*()8$qXq+CaHE"X68T9)RA-
0('eI)Z(j,edBERcr'@,6jpcRTL''!LkKG*qP)Nf-p(JA51P'mq**GN&CZQ#8"rG
,bb!ZR$$aUAk3!"E!G456AlT5peNi!6G0'5i$&X&QCTTUD31TqY4mhPek%k26G%K
U$S#X1'8VIGc6Eb"8%K)YK6SG#BT#*jDr&lBN%bdR%4K330Z!Uma#NPp'4Ij(k#L
fh"E0J4(CVp14Xi-BY%54lL4(2"S[-`l2M9iNePA"BV1iX-8TDRD9$ipc-P35X(Q
)dX&rI)D"S6TH6D`*&+IXcYCS%d0+HjAV`,82N!"S!"*bFll0$2RbA@p2pHXPB5j
5PdZ1mNCdZ3E$iCe4ph[5-bCK[Lq+jKZ"4+k[G4F0i4e02$!%dp+"cM2E"0-5ApS
@55jJC-,%J2L,qYX&G$5CK2JB3)$Mj2l*ST-hXqdlL*pG@Ylb!JbU5La!k#kiB`q
#aEG9@%KQUikC,4'P$fD4bH[q@PFhHZaJ&S5pa3rL+VURZl0e6d&aXTkU4$1-5"j
$k-'Ri[9LHQBa$,2Spc3e"R4rK$!FLr[aXRLN"+TKbM2kKK*'&QL[hd`3[S#D[&b
U83&3@V5b+$4crmU%'h3eRhT0[Sk"+mYq04P@0"C(BjNPrb(E4-68P9e'JQF+!&k
"N!#,56mY+MVcqS@IAcS3S+90KbeTLfhM%%L0VDBZMj*D+#hY49FjfjAYTk9,0bh
lF$,Q+r-qlXZ22[Vc5ajKS#EDip1%8D&f$Q51G$cqU6TRP@0Y*[dYbQaql@k(fRR
mdNKX9F(DeqK[d@[AC0jGm+8M3m'f8+TV,0`j812ZMeBR+b`hSqYHVKX+,)#cVZ2
i*Dh`#pG5VN[T#eXT%Ljah9kE-GDpZ(YaVbfMa+5HharMb8(RHM$Ce,Gm6SiHL#J
3i%kSCqJAYf`qk+(0KdT!Z%D9eHP%"kmSie`b4A`A#5lcN!"i&EIC$b%(3Y-*(V,
c5S4'IA*q[d)6R3$6E((5F45@GKZGi@kR-f$UBLM@Tp@m-pI(4fpaATe-a8"HF&3
D0UG9UT`3U"*%R,$-Yi(%15%kQ%K0b$L-R4FNaV&&B$FG(6"ea-2&62c,DH!)IZc
hfML*BcEqe$!DPDVHSSG+6q$2)X+dL@ElHC&SImj8rd+!dkN#T4*k4[efkVKT+$@
qS3,l[#MNF4MP*QFi`jE#9CPMpLe"5QkTZeSF!-P#Qc2JaL#*JG%9'(3'U!RpZFj
,#Am"+G0eFQM-,frJFRBYULSQeXNmeDjL)C!!TjiBr$XB4&qPUPaCUK+-A(D'DIQ
k("PLrAfCBD0cq$TAG!KQ"G2'56!4%#J630E0G9mQL"Xql8,6%Na@1BK&,a&PeHR
L0djSj+iJRaa@)pCm,24pNaEMFMlDq$UM*KQ"i4eia1P8"rU0224H(LG``"ReC`P
P3TZpfETpB$!fQ6JKq$Yd%5KLrIF+@-6B-fd!@86(3*!!+!&"!Q!CaL+E4jB)(HL
2mP#VBF!KDF$R*3-qGiEp(AcdHdAH%%f8aED5!Ld%$"YrRNqRj0#$'h3(5cE82j(
#KQl3hp$IdBCH[G)0p@-MapIRBP2Rr1Ff&D*)9la`61MG!(,+M`6A9pk9rEfkHQU
$0fDrjIfR8Pr9F)Z,L,YL)c,QP9`[jEH#i6"INCqZU*80q4BA*AGeZX@1D%)kp%B
@1e)9&YF)1kKc$!9R&@3)fl+-BkTJ*G(F0`+%(,%FAK(M63D%9%SKj$$8-SdGK!T
jEiIRNbJ[Ia9!mehhVJq[Ima0G@c+,2X[(1h#N8eI"$d&%H,pq[@$lpI,Sj9#aR4
U9)d43,Zee3*q3PqGdqQUZA@8MSfVp0e%e0c9-Q1FT!kT'ZR09ir`3Tl(AkB!U'V
Td'H$B6HI5C[@+*@cA46NpD8MhYTBDFQIL-KG1Te(+%5`@FUZ94Xb#i2hE$ECde[
4P8-N5ITKN!$#!reJ,q0c&KQZJ4S+Bd'6mS*aFbNRNKm12(5+1Cr2,4LpjAeA'H,
VCVmplcAYjki#"BChYQXSG1mVCack93(r[EpH8kSUA(&[cI@P&i8qrL)Pe95b3!d
&fJ`Z0YdZJ#YP#(4#UN[Q5REJj5!#F*5lM(QFZTVQ#ejq2m*1C(l(er`EFfK6Kfa
AZ"%Z@RkMZS#DejrVI"a1q&hH"9#9cGVEQq'QI0$'!QdLmRVH*SILY8cNfq@chA'
1+XDaU9EMqrAhjjrMdB4d1,jHTSpb*$$+dE9jS&"TF9r+(SLK'aNHqqS9)3k"1UU
Na-'%#PmjVKE'HA3SC4pLbalmb5XKh8%6AP"%#&49PfH(a[QU+mA6H"jP"lMH1-3
GHCpqXl#3!!00Dr-BUN!9E$iEa1mdU*F#pG`[UQIj$e62FS3118Y8%i10FdN0*F!
0FbaII`,'"ee-kNMSUPd+SC4!3BKY-VdUN!#)R*Fk&I,hr40q$J64mPE%0dhbHQX
AJIZ10*QDmpIdkKIRXJ+8K4@hLBC+6N@XGNS3hC&@b`h,5jXT,-pmZI)5P[IXTD-
(f0',M+cH$Qa5Q6i6UG+cU'4Udm[RDA"ZBNd"$9r%K[qrMcYF9LUX(-H41abeR")
96H[0h**QYG-5+"NrQ*I(I5D[()ephmj$!aI%Sc6M6FR%H9*p*SMqmaJe6%ST**V
$HHc+pf9fh2*qmh@Zma%&4Y[LJ0LKN35dmJIF09DlE1HA5E@,lY4h`SJ"QG9HKKj
K-iJMd9Dq(f58ICIL-!4fjPT+-bjLb5)$+C-L+5bm-LPldq&365)T"DHFQXlP%E1
T)1lAV1iYm1a5cA$*lFkDQ6Q3!+lp,IBp+BaJ1C)aekSK&T,UL+Hd0YIfH+[fr&`
(81eDEqLH+jRX-bcF8j2QL!U'Sj(32DpYGi5$0)QkAChYEH[Er8K(iIK%jmb'STa
qMqGN8Fl-6,[lJ(Y("NY-PKY-+!4CZEX"L4+i5mRChR%Ejf8j8!29Ci8$M`I,PRe
BK%G-e-l6lbllG#N2#UDYA%ED-UDDMhrSMIN#A(lJJ[TC-ec(2YX4(SMXf+Y'GML
+e[RmQrDZZM!F85[[bjceAB`AYDVB$M"bH5fc@RKX8[#CSmT3a*S9&3*`cjrEHf$
2)apL8VpT#aFm!P$c5G9kqJBN4Z3Am-$'iXI9K43m5l#"@jj%r8bSiQI0@%lA8"e
Ni(bp24HS#2HA!1Ih-XkEpL"'(pf#QlPB)2#,PH5#FrI('pIJBhRDdQU%fEAHd`P
`YQECSYFMIGE)8Q`1aYapfL85!M63+YHjF(("``qH-D#G)bA"Zrfjl-Q1`J0&fKa
NJUe)#qG15T!!rqVqaeiX1CQGl8NR0-@'aF,cZI`Y%NiH5G$A8#!aK93l["*,qql
Fh+,XR0%$0*+BfEpD*j9Qja6P(Xe*cc8%ILZ5Q9p#JEaaHIb`j"KeF#3#Ph$&4b"
*5%#jGY`%*k)RKNGCG!$dpE6JXTXVY,Rape!eLaPfJ[9KQ+-RQffT8e`b5)YKNP*
i68$DYh!h(i$&Q3pGFk15rJSaif+HKF3#Q%@cYGAX`b0@A+h9X)qGiNHIZ+"GV"M
60V+2FA(!X,M!*hj-6p'V#H5KDILhc&bjZB!Gq0P9%VL)R&))K$$eV'(V#%YJl#X
Ue)2K98')V4"554jcP8XArE0LiAflmA,3DcBVc'B&%bZB@+'6&6T4q)-dcf2TH88
pkHhZ3VEV*`eE)k@,#%'4'*V2*p6HF3A*SDI$jMrFbLQF0B)f-F!G@4[h6L#`2Xr
[fl$K9Yi8B!+YDfrFrhV0@5YAAlr3DepPKY%+C6bJEA0PaF0j5Q%P@ec,&NH`@(L
paPH(T9fV1Z%)Mf6-8eNLF$q2"bEfUcb[XS5YmQE0kc83GCK5e*UQqNAf3XDGkSD
AHN#SfCdjXJ&S[er0i%)*XRpIZUdlAGZEFr6!cHfj4ie&$+lVHqERT[r)RTkG!hL
[$1FCQ[V5JBj**2L!S-J(F*NTY@GR+*m5QYV+EBlXK"Vj'c-@d@SemUC$+Sc1ifV
BJQeUXVKf11)Dr,6#V%FX$SZ,EIMZ&*`&DN`UU"VT)h`cRlMZhC*K#RiDbGP3-XK
DGBKMT-4flMbDXAXPGmYJ@iY(3F436#LHl#A&NcdqJj,92Z@&i`c#SkK`j2lcV+(
L`mp(VaN['iY)#XTe"N@,E#j@Y%Jp&+d2VeHi+eJ@[$%8#ldDZK6D&h`S8XrqaL*
Q[$*p-VRH92X)VSQ(#d+@Rm3i(U[apc9)+S6Q1)qm5XYJdqe`1[SPm[lP5j184QY
G+B0%Am08[kKd20)U63-Q!Q-5-M!K&NQZfUY1'CShK+3KR&%6IjR(3`&-1`LQZR)
IR02iV%CMhS[!D)3mN!$i4-b%DrlL-Z@RDhirPkE#ic!GI3fpq92pfFG%dm"$[aQ
5'3RYqL4iE5@9*9IcmC,+K+%b8&aCA6+BUm*)T(KkA-IlPL4SI(*hr+TJ!2KX!"i
&9bEd0U$D!)lJQKm'`"miY*jYA@LP@cId&X48kl'80P1m4,#2YSCYab)DAQU`l66
#eV`@Y9hFXQVGlGLbDRaUG$GKbqJ"K*ZS19S+D)Q9!Ndbj*cIkC-r(Z+3!01!Vp"
$e859#irm)%B$"T5G[q`BNVejB[&9&BKiHK%239b*U9dQ#"ra%GAZG5ql&5l4f0R
j5)P"&"'[3-aL"$,@e8`c9N-`Q%1P1aa*N919BKI,bd2Gl-,rh&A961l)rK'%!QB
T2ik4G1GaJiLQ-"'0ZJdNM'%3`je`3UK-M)(B*CQ@K`q+cQ4+%LS3621PcR'E`lL
Tf,hV5%V%c$ij1lYA@h6J1Fpc"iiDHN-)*q0&K6-Rp3mN)[E3Sl(NkS6`8$EB,kR
U`rABU1h-SEf)+NC@Qa`3T%6A-9@Gh8mN`@N1ZEDX4fq4VH-B`ZGCGf2pGK5LjQ&
E100V`YCAieTlk1#&+432dY!hEdV+M-9`-9-+%QI&,k80-$b'Hf9QCRGf85'ZN!"
60-QPlTc%DI-m[Sr,jRQ)-IIfR6BBGR0kGYbdfkKGbAlNP3K6c,$la""l*1%L%Y*
0(f%GbL)Br5hFF[PQhX8&[-`mKSG"bk"q3"pe#%d0+*md*0`%dXY+YZ)aL3M,dHc
*M+)G*94r,0ciB4ZeQKSX*2`er4XQG"aQJ8aK"m"e"UKL%lZJVh9R)25*U!Y4V`Z
1CU3AG'F-MdV5(bS@Z62GQ6!$@rN%2AT+!eVI'dF+68mSV(h4C[6&'`8E6aLR8C!
!idfpYRJB2k&SpH'j0,hBe5N'*Kr&L%Pd14+Hqh`prd$(!-!*[1Yb,lG!HFbA1lN
l+Z$6AC@S`59m!JVa`iM*!!&jF3mM*KZ&UAJ#K%cLamV8C690bFa'J(IT+ih('Kf
6,Mb3!1Qc*"A$!JPG252*``b%$'($265NbZ8d95l(G8[)$CZ8L`G1(i&!2['246c
KfmSYCjF3`Z!&K)'`fL8V2-")D98l#HaRdF$!JB8H+0#YaQ20&(b$#KMQeA3S6Bm
,h3dNmeZd3$+*[#Ch[k(CD4"j'6**H*Cl9I6Lr*PbhQ2j1jj8iCDrkqJ4`5m!cNQ
q2jR1HlJ0V`(HKGF8Yq!9jHENjc69CH'0QCNFiL5T5M*"L-H-T`DN-Y-T0D3I&pX
[4h-1c#Idl@+#0JC!-B&q2&k'9ic5I8bPRarSaqCcK#'9)6hriV#YVaPUAC30e6K
!2,KK`Q5%(VEhK2)%1#'A3B$m&+lAf%#rTp9%S$J#0`dq[*qJ1I"EUZKVL'j56BE
Qr@Xc-pNr!Mc%K[!m&TJK0Gq*@E0SM1B9'b0af'3'39%d%0)!N!"pM)jVL1P4N5Y
MDeMJ(9Xj`aTLH&6N5%2ZTP58#HUVfFI-C,QqQG6dK60p"M0jGfNcfCZ5$+eQ8l'
C$-p)SB#r&lGUCZR4bCQM'4RT"fCQrZpNcQ5lH!efj9Qdp2KNcR`$UT4H3SJZ,GQ
pdL@UFBqeVi%Y3@2+q&cfdCbLUbcC+5fTfkeRl`aV1(0D1&Zd,`%aZ)#A`'-,,5e
D-Z*pZaI2c13@aCml#HicmBcdT8FcCY+A,J%6,U8GdC!!U)@E43dNH9MYk'j!H*Y
-+9f@X0XGYXYPh1eCEldJ(qCf6iKpl"3rmMa0UVe*3G#J'qP44")9$`3E2+j&M36
QQ(XTMRpiJG!aFNUdr(*"2#DQDRFVQK8IHGE*VI`Pcqej20UN4R)6NR#NDE88@0k
jaU&Y[XEK#q,TXTFmUp310Gm`"4Zd5hUC0*i5PMkcp8+da9SMNTc!8#)F&Bd8e'J
[AXUZNN$P6QN"PZiX2QE,h5cYDr8dEMXFhaa96*(L+dSXFI"A`j!!2aM3KHRE$!@
d(mdY%K%Hk+RG5D'b#1Y#)!D&-SEQ$[3MF(E-%2jP3$XfB0!j"UGjLhk3!+9BZEA
+SQqV9(aDTH+5SB,%#ce'EjF%X6LGBbci4-'2M&$"NN9"kRSedC*$&T*Bc')A(HZ
RYr'`Am49N!!ljki5`V84Z2APR$PhEhcE`CB8&,XBbI"CPP#kq,S6Ge$!A+JEMG'
"rY)"[pr38E"8X+ZA"kZ'Zl)'*!30K0D8`E88aVpZ8AdG3'@rYm1,LPRj"d,H#2k
P"F)ZNNJ!mrGDU3Y6iJ,%$K@"2C(pR)@)Y([NKp,q-IHbRBI4SDUSM+&5-19RRd[
jU`4ZPSLAQ&B$SpTSSK$*F0MFm9F8V0RP*L[Fm4U%3jUR-ZdhD!qVIhRc8c6Lc&-
AYQhKi31#Eb%2*iQX"5a&%QMPTM4'PXC8i8P!l&C(ZLJ8m#cq9BEDq@5TJ%9$b!!
4J,!"TC!!0fT-!4k-,`A+"Z06+)6LV8$C4S!eP+5T&Z)aMZ8h$0aKia&h2aC%2)6
H)8m+`EH*!)i(EqCKASCQTjUX3+K#Q58((D3XEG)06k)l$4F'L8"&+"8kQC!!JL(
*CBL&ai"Q#!Si'1TH`K[CTiDpZP86#A,5pX)SI'2HfZ&lSQidmje$GHq8MaBqXHp
hYY'DZUGa&R0rF-MccZLqiphEMpXq4-h%BapGY0@-*Q`Y@D1h2PmlqZ5Il[e`eCr
rGYHCLaF[(RVrcY'lPcekl,Y0ccbH[rch0VYYik'k2EDV$bfh04bUXh8de$cph5m
hYcae[1'0RelC#J!!4fT"4%05!`"ki""9$@4@!4!a0Hj&rlpYcM&A'6,XBUcq-TC
P%CphSBQea1#B)XZ`DUDPKR*JTE"CSV*$2&i2(fqkJ6a[J1C3`NRTZERp%TU6UP3
PchXSAdYb$0#%8JlAT$3"5K2+)5QPK()**BD+HrrqIVmpViEdpRXrcrrhm`!EVDF
S*i)J#)"!0-qALNGe1Vc%j5e1"Y!I[i$-9E,%&a&J59Bq(8`B4L!UPD6(NT,r[k2
i9#8p8,CTj[@C$k@dd[k5IG**DEr-l&%B@AT6&C3aGFb`1EKG9rC"*'(iH[V4H5&
*da@c5PUSD23C[N!F2b%S-d`c,i!&*S2$BPB'Y1!#%-VeR2P,&&CQMh4)RSb6b(L
1QSB#NC`kSFDLc+*AVcjj3S4-Ck'dkC@+49bb"rb4BL!*e3M3#6CrTdMZ'*[+`k4
-)b+m1ZC2l$FQIMmpB$Aj!`i-D*HZL0$mBK'k(NVX$cEI8D3p'HaBi#[FJXBa%iB
0f*p*0e`9mHc+CqG*A5iXB9Q[,1ZaA%6,HKFZKNM)0B5QHP8&ml*HK$"K3qd*hH*
RdKdG,aFa5CrGNHS#8pAMqV(VadTcD9$(@@*dC(DRI0LJe"9)mR&JfCbb0I'"mp(
8ZIDVm8A3)EAlN!"3VA1&qT2**$1RE5`dU9jSDLYGfX*+PmN-8HC0CX"Lm+Q4,Ra
qmJ4BbC@(X+PH"+BY9`b9f9)5B$(N6&T$885i+LZcMI8M(8a`*G%kA8-fdML[k%k
DRHM5DkL2!dNXp@(3AKUdfA*3QC8TfTV'Fd-L1IJI8YF6jXS-@KbDX+Jej3D!NX#
'mi19B!'16Ci-E'SBiSN*N@UrLlGB@hN)SXYC%bi3d$I99[+fHNV5q8*Bc!iFQ!"
k[Irh`F&LZcNi+"XCr8e-U**d6-phi5,-i(8'!I!DLFfTaX(Q0!YaUUK(@'k&QEm
)ARTF%-8F-i[Yc(jY2k$9["5+Chm0E'`6rMY%LdJJRc)UA+Dk(jKLMii)S`E4rE%
k4&1)$X3N4&X4r@+X$G%K4,0MGN56L+E(3L0!N!#@&h1$LJ0)!Jb1V5#8+9!hBNd
99TS5qm'!k`0UXdT$meqp(NUC$Qhc,*!!&f0EQ5@IqPq%*T,ZJ9TCE8L)(kUrCKT
d0JekBm3+mTZ8)D2rBj[`aa`j9d9c6$q[@#4MrT6*D,Fii!'T)4"h(p)kJD(0@Af
jm4%)%F+2ej!!5(i2'Aq`P[CRlXhF#k'R66-ZYN[VRjZU+p1X$em4E8$GrV&aSI[
3c&'Y,l(r1d@(YQ'LI#QpUd8jI*%PkJYZRA`dNXPZ+PEeJEDQ1PAIG%9p2l[bqA"
+C+B(r%rfUASd0P0MmiXDQp%i4)e$,fSFNZTN%(%)1`&+V#99Tji+@*XmcXN4HA+
2HXTp49dD*K!c5ZL"8Y)3D8C4$4ANkY`fJ3*b+"BhS5'3!%6KR@BS-XDPFCdZrhQ
R!J*!b-8lXlUa181"b1*)Id5BNAJcE*2mV2)&#mjZ6%S[Dcpb16*1Qdj$f24%9ml
aaEC'3VYb*Ap',J*@Xr4bb8HZQr*RE(R3-mdRK6#GQVLVr"PE(R'U30)X53[!F4M
U2Cm5`qfXrBVS%U(-G$$A[f-8RSZ-!MNJ2TB(6RJR[`38(JiJr-HJkMri5a(UfmB
)PTHd[KQ0b5ZLA53#59%-MST3iffVl4iK"4ai2399Ehkqaile!jfBB,C0H#S3aq[
K'(F$6+Ra))X)Ue-UYYU5p)MfQ*@@VJL9&Z1m5)G)2)J,j1DN!'+9$2HK`-J*RfA
Lclp24&PJN3If6C`kc#bdm(PPiV"lSKN609G%JP8bUh5-'PDHPCXN0$P@Ac*$4GR
'#m*(#dBXa)0QEl%D6kl'aH,"*(q!*+Sm15MC&Z6*$TV-T&,akHI2*qm6&e8pAQ0
U-eihe#'m"Y3f[$,9&MK@a09f)0Yra-*4p44H*@SfANC9qpKpN!"VcZ(9SilM&91
2iR9G0H0P8XF`U9FGa5ZP0Z*9Tel%B"dUUmjl+0QZAJU$k9bXZZMc2S2CCECp9S2
Yl2`SY%8EIfI`AP80p0(%8D-3TA3a2XK&"r@U&q8,+-H0384)'Fb'SXI-G-')DXC
5RE,N`P+0fV1EYp),iQZJ4p6Y0UZ(-94@b'JU$KN$CR`F$ehRcB8+(+Y$3VGUYcP
863Hd"eU)p%N-84JU0-ChjiP3U"#I"D(lJX(mh#I0S@'CD%!)f3'$MA3ap43RM$b
FHNiCVP9*("l`2[8[mS$UAr$j+r8C(M#r1(6p5E0kr-NHcb8--q`C`5[UU@G9S!e
4$#TLq9#HJ,,k6kiUhI6'@LkUjF"@KQbSD(%jAN&!e0elF)9Zmmc`'#1FZ-CM&-P
@djQB95l@recFb%9k2,J3$Ak)`Q@k(!4ErBBUd3baqKhU['C-a%4l&F6UE3$cAI+
`YBGe+jLj'4HkjDq`'RX*Lq'ibXB)a'r*$q&pqIb6Yr55jfBZa+IPH5S2pNN)Kkc
3cB'c`iV)rTHhLULdrq"f%De,rZ1q9-G'&*hiDFB3bfHI2)`1QIXbpifY(LicpH%
+0HJf4pT[[rRIq"H)M`#0Y)G09d4()$NfRJqhQ(BpJBiISUX92`lmf2($cFmE4A`
VLZDfJ!X)XJh"9-2"e$U22i%mUR5,QJ5#Z!DLr"84[j5Ilfd533dbD(Vm0%0a3)M
BZJ["1IV+IFM+ch2G4dK"XJe@cCrr%i204V1%$1`m(T5Zq@GFXeIZ"ME+SZ%i13M
mb6T,q!%L(8#@piQN'XFV$T5*P`J"i238Q*[9&Vb'++Lh89"[39!IeVe$J03Tr-j
#54CE`2+G'KL["A$TAJ[UjXm5dCMHL550BA4mMC!!3BU3!%%GJA5MHLlcb2%M`HD
0[YNqie8d4+Nj4FdSi(CcB#["UeCpCMGe`+Y*rF[IVUSPZYF$B6QaJmhjHb9chcE
9L14Ue,dqSj%Q[)R21VAN8R1qGhd40EfCldfCFGJq%i!mPM,&Be%0(,i-4I0c#m1
FS5E`$$&iGN#p#C!!JXT4!lF(GYTCRJm'cA36JNC*HU#CPk@N0!!'c[3CMIbC-Ub
IZR'I-RJ8JhF'rI0m"bB0l*rR("J"f%1)FNp3MGVR3(6HI9b9+"XXlAirUH)c5Tp
4rM3kT)'X)ipPBSSFLCBFHbCAkVJ*!%$`6TLZUY%!@0@D1PA+,eB6@)bmJNAGI&U
-iN2595'6L3PhqP)(0hV4d+LEMk9'AG@G[[A[cYk(5Cfk3HV3L5"@(1fi9U9l*hA
`6GmY"UC&+'5Ar(k&VVMDJ#`MJ4kQq'LJ`CY-@Qarr4HNKJFa%*&"!KPD6ER$NiM
JHFe*"!D3!#)!#%p!8&rZ'(Uj#!'X,B-GVfE6DaZr3MH-)V4hSK$N%,%N1Z&DS@&
RNFG*DXm&d5iHD*PdU0Pj+%KT[eQP@r%MG!Eb@+4EVL5!A4VSfkV65IiCM4P(8J-
QUa-0H2cBcY4B#a@,80N'((,KFZNLZFmX0mD$#Bi`QTP(`3bSDj%a2V)HPjXk#R%
$36[%a6hB%iXiD$ZZcF-R&q61B"UD@Dm'df6"!@*$@0NXL[5!iK3#X5K8,hEhU$A
)K1q0Q[TqUMDb``lrTi"JTF@McN@kY&#eYQX,Y4H"+a%biK@KiUNQ9-$"+R59JeA
S2Ll83Y9i24`U$0H&VU+,&@,6aEjYS8XX&XpS4%Blp%,*),Bcq3RS@jRi36m6aCd
%kMZF"%Bp05cL4K"mQqGXN!!'&X8[12"0'PLb$5a0'MLQ$#a0'PM#`0SA$4ZRB@r
3S-ff3CXR$6UN$0VmiN%*kBH"#"B&@,"ZSd5eCqFd[k1`aNSIK(X8NAq-a)%Sd!2
)jVQ8[jF,GbV@@k@kd,#cD$Bf@dj4Mc-kLE#$+N!k9J"0UaUc!TAeNZ-0LKrqH,Q
)J3*)pr-@J@*X1KICKUYU(#,Mp(iJYDB'4$q(S0r'Q@S'ZK@RH#KFXLeQc@R8I4j
ShSdTDLmAl3k)cKa`K1j@R"5F1M#)Td0FEZIJX,X(f9iFJ)acSfikKV,$E3dCjeL
bU6dljrkdNR5j#&H+l@&GMK,dHM3H#pEICQBkF$CfSKJ"CJ-9m5$@F1!F#`55kH$
fd#@Jfa@-`N1&J@B&+3ap(4N&BaZMLU#!5(895F31)m[j3clH59J%mHA-C,%PkRN
3rRLJa(Q!DR3HS2lPK3j35p`(U#A1!p6M3,$Db3G-)%'2*3'FV!QGLi8X-,V)-B0
GMU#3!,Bf0SV`L!lXQVUQMRjr8c`lCpQ@P%&U3%)K%bPR@2[Zj1aUG!0R9bp#53j
@TI#J3"20,aHPc,JiEd$r$8DA)D#51A"'*Q%Q0!qXmNX(CFA,j@!3&hkEVRK@kXJ
rJmqpD$`RJhcS5&$pI9%XM`%*2h2XM4"*EJE#L'J3F5$b&#**4"l@hB5!&m`raL#
)B6Ec"l0@mE-9#qp*[I-(aDREIJcd(JMqTS&r1--cV,X'CiJ2,E-fL%"&fh!D'`i
hG66TjBAPb6&"f4bV)ZEDQr6-IPkD-bD1TlmS8!YeX`XCDk#RprliK@qZ`b$2)'J
Q`%"TCl*#,1dF%`L5ca$i-d1P&3A[0PX4[!2&Ti6)KUqRpr[425ZlFRQDTNXZ6V'
P)`$m)m`F64QB86A@PC8H-b0)(,PeJlZ!0DAL8SRm-mc`@eimeK@,+N-GD9U0T4e
MAFk*')U(,`DlYLm@Sb,D&6K2KDM,mUM)6cSUXYDMV#pi&,D1lIQ3!##Cq"R!M`%
r2@#MD+6pc0LYcG"PJNRCJ!jc`D!dJ'RB*Je38jCZ!%efTDQ(#0[)%Gd!IJcib@3
b0qQlQ,P!),cLAJ,J#)V8r62VQ!'*`HU)l&C5rqr$K`6a$3SXk3J+j!DDHN'CHJ'
NN4!N@S&FI"`BJ'MeF[!J4"CQaS8PDT&CCDa8`2@Xc'KYUK2ARD`,H%*Q!5@D+50
cQ3",LYQjLCG@p'5Q@c+qL1(!D!UX-@Cf!%ABa(i%-DJce-K)%+rSL)B(f(V8**L
&5@Jp+BZFGrNL!&(*E`QN!3-[U($cM)d45Tq)aR9mEHiZi[d#V-9f*#RF1r8l$%9
hqAM$aU6FE$&i%X,"N!!XhXQ#ABRh6YpGAN@)BU4`&$rCq$%D,dfkcS&JiLiIEq#
AEp-'Y&48$4$#[FSLmedqip&*R4T,6KVV*Lff"#9-Y8jDpJHElr**(NZf,,1),Sk
VBp,,LBH%3k0Q(#5f@PL1aKCGF!R(4)B5b'mhqV8IDIGDe`55B8I!rjSrX-cK-2L
'3JE[0E0'MEMC9"hZ6N#V$VPMaV'!2Bc19R5H&`TXTFjVR*hVR#bQ'HaN1k,lHRV
R22hjF"FmaH%)$Y3iJbSP`-f)N!$l4N3I`2+FB(+'mBB)*2Xl(Vj(Ec6@pE-!J!)
-56CMm)NZrjTlp1F4##f@%66dJbeMAA)MJkl6"9GAj-ai%q+9Xpl6Z$[BEF1kDBb
)MV*L!-Y'd6(2eP5%TY+MB04hI'*Cp*!!B&iXZ0!Uimbd(jPT9Pj*(XSq9qQ+N!#
"EY39h6c*a4SZZ$`ljqj5cYK%$(,@*QDAQI&(Zh#J!BAjG0d+ZC!!1mVCSM(l`Sb
AXjj#JA%c0A"CYArPdX![rP2SdG4UbeSf-a2Z5FT-3XMdXa*!VF02)hiZ!X5'&'@
3!-2B%Qa$eB!N[Ha'1cSjR*mNCJdT@@Xr"rb1me`NX)T$RjNk!8I[KH0Gl-c2#5C
RJ0-H(40bmYRlG$TNdi5k8qiJRAMV#l(3C6MVGFpQ"rH-fq8"VR*"!e9S@1(a+4#
0%$1GD$$5GDYFbRLX!-'X9FTi-K-9(JU`QA"32`rC)5`9#,hS$$VQqDT[)"2CUM$
Qi`GUE)cj"2ihihmE-X[0B%H'4+Z4)af)a18&eiq"QS$SYJq"4GPk20dBGPd&Sq@
Ui%JEIUciDB9LS401l0ppi@C%SP"#-HT)C1GXUfiDrq,qfrmQEj%hL'+N$KY-1EF
RGH(!U*3"%5r"+%4%Cc6b%D+1HBqZUbTA'KPhAITr[M'"6!N-)JQZ1+@kKaS!S1'
I&Fba#!q#lLRm*)M3[bV[Qc!%Sr-H$#&C$S'Z#Hl+A6iVrlIU#9hDZ!#B-$R&Ndd
G!6q5marlipfc)HTm169!l*rV!"H(SI"G1i2-eqieQEm"eN4BA(ENq4PmM+fD$Zf
KYKm+!5DZTT!!@ERIZU@iX%m98"%QZ9))%0)'I#$2KU'B*@2&B!8QFfBk!2r4X5[
L!$*d"b*Aa(Nd(X#4erQid$[m'AaICYG!J&i"K[Pe,15#@A1GQ$8)QNjQ6@MV85k
+SK"HGLj!ad$b+'8%e5ffJ+4&9Lb$JP)@"DAMJPQ[*3JLecQ)I([!X0hS6""19L8
SAZ6JL)aKaL9(N4GX2#-UYGLafI-FI2J(a0k-DK4KZD%SE@*$`"kU%hm9+M0[M*h
531B4G`#4f4-)0!-P[0`CE(k`@0MT-!QCd('&IC&3)LP8il1Aq*!!l@QNSL`"iES
4RaIT-d8&@i),YVmlKf%fGD2523)A#BK$!q1M")*C*qq`2#aj"`E$cd9LN@B%Q!h
FbS!2T9GmprZDK,C2"RkZb[#QVh$V$AaS$ieeD2UNj)4V0fX1TC+m+!m)TC6pH[`
SXd35U0BN)kX@4PBNI2KCh5)RXmUZXQf@QDFGq5AT-KTAK,4TLT!!"RB+9,C3J@[
1J&Ae*lGi8hE++Gk-E#)K)![)XaFrVQq`3RdF`b&)'SE,6R&a!C'`$TH!)%3#N!!
X#0R4I-j5%(VkNL`)696j'AjVCmFEURM4GrqleH``1fU91M+138($c%Gr!MS94cJ
DHXXEmP)PN!#(@i6KA5Qd`bGA#RNGVZpbKeMqD1l!23k048'R15TAqQZ'1UIP(kE
R#90ZM0AG3Pf16E$)maj[i8BAP#qX)(m2660!Q+&!FKj)r(1KjUC3J@E`Irfi&d9
@N@EmJmV[pX+YUBL9$G,iVFmN#C@BTRp3'Ge,#Zfc38F4Ncj2'KmTR0"i0+K5djJ
dIZNAKCC0#@G93"56dfrHM2Yd1J&mC6q'kTAL9McRC(8SeG(NN4dPZ+#md5ATXk"
i-ad+K(DHP26BNVV!9lh*Y)HCSUe`TBLC8RjR&hDX#1LGkZk*A4#9h&2P+4KD+C!
!Ek"!&JY0m8!cCC+Q!A`k"rq9h#NH)LEkBAF'A1K4r'["`0$!I@Mj[*2ArFL5+Zb
0'e!G0M8dbH,*#K5DbGP!@"KL#50)dk'B(mNbGF*"NR,3KAqBER5J-`2i%$*MQkR
+)l+TDjm1*M!bJ-K8)h%9B(p2"RC0"e326VE!4UG$%,,'l2,Pq1Dk2hlKU1H"``r
dA9DcFql*![#Kk$Ee$EFLkm[J)%)S1,0c[QU'b$F8h9Z5MJ*!rcHYlJ((N!$#)Y'
('h82K2cLCmD@bBi$B6#bH*,9TfNh&!(-0ZElZ)*()jc4lrjA64ql+k*`'D+UD'9
Gb$aqp9`,"aDpU32+8Rq-Uh8fF!C#YcJlCp2FP+%NR4HFL3UJI9Zbar6-'YRdj3J
hfbFd'c&3'`B[E@T!C3!i&Mc098H4HDA+S"$@f)@T+FkSK#ka#ml+($LfbjhJ4$!
6'6'S(R4EiG###iNYpA$qd(RK(Q3!'Hkj,#!ZlU$11b#',L&@d$e!4RCQ"E%,`6c
+8X5NbfSp#(XV$!I-(9+[3f-@miHBf0SpfTjjIB9mb!j#A$Z`Q6#B2Kf"@,e)l%I
P[5ASU$%0a4)DX-mCJ9lc5HV"E8+&5"'Dd@JY%dAim@RlXRSJM'2!"6h$qC4mjc9
pN53ce,rNNa-3@B*-#KJpd[kSL4P1B-ma5Q9a[JdU46RC8lD1KNNGp9+[dK&1$-K
%*TNGpk8#6KKmS'MqdR%iAq4mGGF%GK3jSS%9ihKEI(2GQ2q2Ak##0`e"!4AQ0Mh
!P9!KN!#RQAU'@qZGJ*I*J,GaUJAJ(@9NfH*`G#LJCdG8L*paPXlB14RiH*QRF5F
iM#)TkTL"XPAUZ*XU'5'MRKCJi&MQqM%UlL%$Z2%"G%TMm'-Jdr3`!6BDeJ*d#c3
p%Q9rS[YR0)iJN8`pYmbF1$8L`mF*9+HqkDY1)HYC&*2X*1E&`NJ`9SQV8[cQX3`
Sa&dY'6hD2NU`[RPp`d8-ZR)&P[9EeJ,+,UMpP)#`rM9@qr'#aB4S'cEamT6!Q(f
i(4@#!Sd%`[Cq4L"J+$apr3B(V1CB'`LY)k,-eIPHbH2*F"SNFS!4F$,@1VQMb8`
G85A-Q%P%-mP9R*P!63d@3DGGUGiX"ajdIRCfA9HJ&B2f8R)lMrADMRelP)'ENrX
!1TGQjfcB1!RF6&$kQ0Mj%!"hP!"96i"kNkT`FYH)TLG&S,VKbj-kfbQ*6*+(J49
JKFT&M#Jfc'ALbS#lBEiEF$Gm`S$lT4U0he)FJ-XF96Ul,&#%&U[[+iAS%!NI+0`
I-)d5m`c+@6r3bT,89I9pJ%XcNVe$C&fAPhGKUBkRLjdm#$*q,A!L56jT80qANh#
d5aNJjl+DTm)TKCe-0#PQ&K5NkS64H%!Q0)NBRXN#aLq(4Q9'5bm,*TK`P3C`b&H
,DEJ$"03X-'!q"UZJFDP49L4#a%B'0HfGr+UPAlR,CqU*a4F8Jj@i%&%*4aeA,K+
'!(cFe!(408bEf)6!f)aL5#rKS*NA)0kqcd5c@lLlGBl+MN'F(8`Sf8F869H%UqQ
+k'PUB2'@-qQFGB4!FGU@FCc1"AQ,,H[iF[V"!J4Vhf!A$9-a#J%JeQM[dCN$N3p
D)JDh+B%AQ$i`m`PXaiU#di'UipH`JFVR4amaF#*BCQVFcRUkKFiNYmcmhZJL`Fm
&X[5!q6BZ2"EAAi!LB#EFk6ppjDT`kBU"e1EAAK8pZQN3!KB'9mi`ZV2&TbL$a0Y
6+XCEA$Te!Q$#K5fa2P(dfaUEDSZ@G-mL8,@L38k@5#XR)$,VhC9b0KbCU$K[b-M
EqZE%5ePF5$r$f0r"@lC2F%mNKKiREll*M-$$DV$H91f8kNMYP1!9lC6U+e#66!R
+SJ833ikiD$)I"dKFk80Mcj3J6'd86UQ'XZe'-)5XY4i0H@M`XH1$M5QrV-R$3bK
6(A,e!aEGem6!r&J'9de@9j8j"eZeJP%*rf"+$eJVLaF!F3#S@qQ#R5B%m%$EPF)
Tj90bmDUIX[F+KTP5MX2VhG@k`E$LLQLX2Kl)r-KKR4qQDY6aYrjdHh&3MCa`Xc@
C#1i,VJSL+`#51+C,Y92+hlU'9reEa8*Qpk*K95Da0BNFMNrj@MDfjMBDM)8d0Lf
`QGN`a'K8PD8b14+DMmJfqF1c$-QcM3X)1&DKLQq`BdCM2pc$P#jIjJ$Z2S#V`M,
V$F(-UN`TB+G`1IY"#l193`BX$MP5MmUSKh!3KQXa1Ka$mhqS%CaTRmTL5"pPb9&
3cMpfHjI&i9'(rhLkZmUVl(iA4JB-B1"M9EpJ&b`r&0fUT(l3bB*hJ"9G3e'6V-M
N9ppbFVkdbaeQ0"VUr4`BQH@FC"8rA1IdM)DIk''NG@9rC4E%fUi*MXq0A'P-X$X
T8&QVMB%*j9K@S*Q5KCUHk$c1MUCC%a-@M)-#2M#aPk0!T82CP4$%Y%rP"3jG!+H
BShrpVeNI3FK'G(E1TM4Nc4"eA-`D%9CFbZ(1ZXP!5p9QNK12B3'GKhjq,`0R5IU
Y*+%FL#q5bCCma)CNN!#%1XSq$R)%qe0CNGAh(TR+k[eiRIMYhZYq,Ca'T)lIlT@
b(V`TXdN#pG*Kl4Q0ApX6c9Tp8i6Y2F)F1hjCe!ZifK3PXMM,Q1)XimA4&RE@3U*
F((fL2(ahpfNI,6rqZldq,eIZJ%[paA!iejFkAE*2HkLN"iBm(,IIB8DRP!8f#M0
-l29!,`TlCUq&)$IIQB'3!,5eQES9H)%4!39H[k5YFGclm6TIEDpZ2LSXMHVHV,C
ViM$E-FV#UP&2(rAmJFS5A"R`035c)ab3!0*@!'8ZbK-)!!Z3!#%SC3%XT@95d(C
qD0[1$bffmd2EGZ,BcJpj1f!#P8UR5kTdTDLUXULN&pGSeLfkr4SfYN$5bKY6(f9
e')ZGQHN4,5Q#dP*#HY5HP,28j+"4pVJ[A")CNRSNcAKbael,TKTeM5rm60f3!(5
)'eeQJePZAZ-V10Fi*"hQCEI4"Lcr"CG*+m'"Z)jIPhClM`8aiBkr+X`&*33AHcR
XPN6!kP`phe"L%$G#fN1'Ar0R58Q*'!pPp4VHimq#NJ*a0(6UX1&crU`[JHp5U!5
ZFM!EJS@T*91aF-j-@DdbQ!B5UqFR5m*B2#i[PPSZRTFA&lXA-eef+!B+K@l%pE!
%a"eHTPae,T)pc0GNN!"[G+4J*U)ZJN`N6+K)RPjIdGQSCmkadllDjh4Elra4h([
(e8rU(r"+lI@2Eaq-Y2reb&lIKT15(a124Iec6Q,LVd#-dMZlK6rZhIljldpYmNV
a5pDGJp&iZCd61(A`MQP5!cUFM$E-bD815GddG%M'[3NTq+@0AUNMEpA@`CU1mM9
h9ahaEGSRa6%p&p22dR5l,Kr6lA([ZfpXAR'A9r*FeQmEV218YpeGZFHh%3VCAPq
dSFJEl9!k1(5Ed-%4prijEeA&"UrN(hRmhX'8rkrlc[VZ1MCKLc#@TGZ1bGDipr#
CpqVZH&GUH0ZkBV#a!9H[q0Mh`%QTR6EDVQ`dM'T(h5)Fp`jUHPI64PI44YFS'rh
FYY%ce+&99i31VA([dYjr8'QMHYTSQm9'cpJf+ZR@BES8prl+0hX$Ej4)lL'5Rf@
5dcEpb[5%EJ1Q*q,HI6h29h!#%G(ECD+MJRrCHX@3!!"Y'"'&q"(G,R5-a,dkh9r
HSLf[SLf[S5ecThBLIrXFI&#A'YdbG+Q*HcmkIXFl['e+J,L5!'Fi!BVB%%1(XQf
0ELikD1,HqfkZLDie!FlB%Z"4h94-IK3NQ[h2VrjGZ6*Y"4&j-j'$kkG)pPj8XN&
5f*@N'09Y3FI4Z2I6Iq[lQ,DrLVE[6)TeR"50JK-MBCpcQMU0khDJdhMFqr*VbDI
@NK`0f,DGbBZ+4+9alk,1*`p3-Mc"bI",14RLP'#j0'Pah&YNIYfmrPh*IZNh10j
H[T+2Malmqc3&K&FU`bf,He2Rcce(j"iLFMF6Z6qLC)@MYp4HP1[cXK0!h2I6"Cm
AEr+"c(BLXe8KmdSLh%SQ()EF([IHeH6iGb,[%dcHAmVNP3(@`dQ"DE[LhP#20H2
[ldSVkBSVj5X556X)91h+J$[LhJdIh1XP8Ji4+CZ9cDcM*'-R,fPPd8Qkj+DillG
rrpV8M6k3!0"1*,35#6rLC+,Yf)[1dY30FGp6[rZ[HeQK1B'-+`NS9bU%h",h6[P
Hqef6#8Q)``)9B'Tqh,[i1cmi`aXL3Uj8#,P2$Ki@K&`ApadkCler,B4X8!+G[2'
TF@rh2rfdirq#N!$6iYkb[hkhP"13!+lBB%YU*b'G#9-8p`CZKGBc)I1'3"`QT%`
FMd+FZ%,'ZA(IpqX'pM!CkqdJ$T2a+h*3I`06hr,+bDaEmLdA)Ee@4RSrr6if!GI
&rq',aQR+ZVMhc$m[mP)5lkBNEP#)pfZTi3qqU*qQ!3!,rrpI4$R`FM(A'$FFGKd
Q`V9('elh46YS'K*LkGfMGL,'5LC'q@rZRJ9bR*%mr`,bdL3%M%rHfGE$`DHqPDr
p8k9!q,d[fNj60X@pqarirlU*@,Z*@!ffB,%5&rI30""Ud4rf'jP3I+@DGN1[UjF
)&BqZI0ejF3$`1rmb0dJ%@%P)rcG1T'mM%T)`m[qqr4jGZj@[r9-&dIc"5D5YFHq
f$ajC3Q#cQm#Q`BRHIqrF2%"Vbemeaj`NLXB0"ed(kGUI5b[raAPY"(RrhVpe%2*
B5D$r'b9jj@[,*0J3pklIN[mY3Kj-*-p2Mda+f,PalleIqZEG&0af8h"VF"H9YX4
&S1bDN9I+&kGN@cNTf@3L!6LRIHA8E8,-+`R8Iq-'GGmaj9)J`Z+(SMe%TKBQdrd
f32HG9)L!41QVdrf4NUk0NNj[L5kLpY-)b+p6YILiEpE##cpq!!(ZdKVD`+S*k')
PTYTTk[DiVqc9QGmLC0&!*0[Y4KDqXfk#h2l,-e1)C#e-X[YYL-+AUj!!!dRdVrC
ee`K0Y"'Dd&ZLL@J$$[A6SEZJH[MVi[rMld9)m$@8i+[FD-*haJh+ah,rr8%LA!-
4E[GD#)F!GQ[`lI5I5$JN9&V0[6XQ%mk*(SJF-Z%@ahhI9IZX6,Lm0B3H9VR4Jid
F!1RXj*S2+*!!04"Uf+fJ"NZ#)+!pRr(fD3SF,4`ilTH43jbZE`[iEpaBrKL$d%J
EVVm59jY&'r"EE!!J9(I(RApJ8K$"iJV"6[,e36#2%karHIE[2f*58&,kPD3mmk@
EAad8rRX'4I+13@'(S&Nkb8%M15+#Ub$b$fhhcJ(V9YZ(c%(48ekrF,4F@PANIFV
hU0$ffIXJV'kS&jG4I`6LYFS1E-b%[E6UQZp1lpdI(ETrbVV[['[8-m1A2SUNeE[
fAPVeU0m`*aA+2(hZp$3[$jc3e)Llpq6k%UGaD-1G*qIiDY5STPAXqLMK1AjkQNq
Ci2hGRQ2ASTj6Z&+M-U&F[q@NHi,"jA,aP%a-L4ad$U'e'#)BrPhaXAm-pPpD9Ei
5AEh4e6rpk26m'M((Pr"H@TA`C1&+882di@VKE2MG4bH[BASc6BGp9QF$)aYZ5RK
i'p'(epQDF%Mhb@YCaj!!YHY"&K(LI0SZLd`(X92N$+aSN9NVDPaK'q"$l,9d)9)
bl)mV@5"8"j*mlJ@U%(66[B!U34DIhYRZMfqViaUPimh*9j!!eVLc9)iLDBdlfm@
IcJ`D2Kjh,hpE(C3M(6ihBk1,@5T3adjCPeUGTdBpj9flZZHFVI&X1R[%#aF%rf8
ekXI5X6VraQ0l['p$rETp,i*E+`FhkI'hFS2p4EN(ljmqN!$5f%@`2qVImG%Fhm(
lT`kFRGmUSRlA3F0"ARK2@5J2Bc!X6+1&5%IdmGGcHB![B-&bJ$p0'Z"cC8(ZrQZ
jHlbQSmlrqf2D`rE$P)Q,54dlpdBlbVX)kEdVaI%CT`r[`$e*Yc1IA9+f((NC,Kf
qk)EAepeHBX%@Qc4"@Qmj39H2#U[%c'!cG3#LHM"'TYIQU4F1"A5PYANIcIU[[a*
$Mm#VV"1Q%dTr-kal9UKi,4%K[,iQ2(L9#6pH5d8(AQNLMTG1Y)q`!lAH'%RXKa1
"h@&PCFpE,Dj@#[c*DVr*'YX'KLJE[%U0J''"K5e`CmaA,K)Y!GZU9@(4k"Da'81
ZdNK9'a9@(p4pqLBr&+9R6D3H#HLlf!Mb4E$iiF#J'8S*U2f6A'8GUXL,F*m)b8!
$*NDDh5`DS5DU%mfmU!SB`&-Qk0Je6c`'jHrSA"(#35%kC*J'(`9l&1k`GRBN5iX
j6,@cPS#*2$m$%63-SZ%*0#4GmJ+-!m&E$P9'%B'lC1bFqm"!GP"m%%faFqN5GYP
T'Xmk9*+&c5rTALV"a8'ha1f#P1UbRj3GcP1b`hP'hrfc[XDUN5IkCLeKGe"M$Bl
SdUAG5YKVK@l@NZYY@P`"!41[JrI2@V+QLY9TaML6VAYU%l0"r3ECYAL4SE!iUr[
lp)UiY+iXKBKq9j1iU"Kc,!HEp&6D)X0`@YPJ1E2a"Mq$)SUV#BRj11*kTaC4UME
%M##aCUliEf&V[Vh6kH5"!CEJaq,)`3rieB4V3DA3VDNY2Q8Sb[,eSl*pFBQKk"Z
)$Vk+5iV"A$CjLFJ4+2V0$aCLBMf8qJGSN!!Cq(KU%%SSA1mcZQiF),-94'8QlV,
"FP4a6U41-++8&6(GqcL"$2AX5JUc@1dJFRR#d)4Y`A9D*JdcHEHbBB(ZlmZ,rDa
ZVRhM1LfbF6Q`-YmSB#*friJ,-#@C3dMQHjRNK!#j5T+!ZjLqqb4Br9fXH"[m6*l
'bS5ALa)R8NTJ6&[XC15he9EmA#Ber-!,+lQkGB3F@GbZkkHK6[f3!"Y0%IA9J!X
6[UiS9FIN,M$"1X*49(@TleZ4YKJXfq'daEaN+&!ACZImGUT-VU#DbDTC,6HjKiQ
e3P&MCq+%f(Akm[&dC6U8Ck%8Z6'!Q$'(C))lL("Zd`Jc!GqlCUKIbDS"0Qb5Cr*
"b@%eHGMd`2FbhB1S1jA&F9EY--J3XaN!`e@0UA[Pdlh1kmV$I8e,6QNTH9[U3Mi
DlU@0!-6NT+N4Q%*bEr8G9SR%TRjlK,Ph2VQZ1AKT$3+#qQSp'mbS)f+S-M'`d')
MIYL#q(BR8BeXArcE*URBmT0)1QCfNh4TR59*(dZc'15QXVMYK8MU"L8f1[2E&RR
6SPiQ5K1E1PEP,QaXqEIR#+@f"6TT-%a'GDQ&`6K-P9Z5aQ(EPQUj,FF%)a-@4KZ
N58BE2$#UJB!Hd$`MZlN1'91+@LD*!Dm"10['--@jb)CpIrXDXCJYM2l##0+iID2
QX*6mS"0Q-XkaBV&T221cfq@XIZZHQHT+$5!Sp58b4p5-`i8J9R!9XeK"XL3lJ'r
h'If1PTH,Q+P9!r@P`m0+P6D"DNq4&jik@l40FdieMYNla+UI0(f$jI5NSq1%i+@
-`p9#9hjPS$)S$3#S$q,kj4`0R8DdrU8md9#CGi@09HXUhkD'DfJic9(2ha%pbp%
1+k*l-2N(P4rcj!CGj8eU5+"K)8IMYa'GcG(f6a&p(j1E+fIbj0@kbKR8X!!0Rh)
dq6bLa4c9Mb*D4CGi8lR%Dp4J3--mMMCmK1KFMYUR)eT%NkFTNpqcV()J1GRNUV&
Cba8#(@[H!L`),9FmAh-aa#k&Yqke9'K'5-K0EJH#0m#*UVBbP9fjU048fpdRUqY
GK9@RM&N`K*%bjGiD52QjJ03T"D41Gm98&E[59h899j+U,Ve8@$QpkVbVXNS,099
YCGa3@08,YFib(SS$`mSHNi$6Er`l8fDI((kY[lEU&"Be["KJFbM6*aK-JE0X9$'
QR&"8H**,FN5Yb+#[HFZEmV)4jQL030BdqT!!3,EXNB03"De*V2i2A`)Lk&ZRSf#
F`kAZG%#rFimicGM"'0Uj"blprY5*b)R*TL38BEpaVFUUCPC6V8e*a84X$r-PSD4
bA"EPJJAMV(dmM'[3(mG2k*+)lSpk*9AVZ`#$$j+DaC'NT*lLL&e55cMLN!$8Fab
a5ZTaMS3P'!a&T,A[Td,+p0UpM+J+jqAaB'Z3!*L2PSKmlaCIk$5,+G(ADm3MhKU
K2CCcKKh+5cl5RV@IT5jhbXiN!QCf`M[FPel&K#93iBXRD[bK5)dr$JI@[FC'l@P
jf$TNacBF#e%&["V0J(MU'(l1eN#Bccr,4M3jkrEkie*laKNi9Njrb1822G6MMm1
pFTRc))"#N4X&%5S[%1I)!2mj11+KQ6kb64c9mi3V"F*B9F5*d95,cMRL"KF68%6
VM*%8PRJl64'eQ5FM`JTqkBUjULL6+rIV1#Tjh#L,A946XL&aZp'"b3D)NFr#B)3
1L2a$[X)EZB(iJXTCHkThITf+-MBL3ZTFUQTe9q@XMj9TA-%Ik19(q)"5P*@`YC9
3l+jV)EFI"eh4j4j%9RkcD4*-FZ@Ic%`R-eCq90q5"l3fkC@#JDG)2("QqN362%i
aC86!PH'8jCECU!S*j$Qk&TP!-(K`h9d",H)dab+a5CH*AFP)bBblc&6)jk"k*9G
9i`%5F'dHid,8,')KEGq,Zk+3!0JcfD64Q&aT--NZ(V%k8f(9e)!$!AXU(p0iqL9
ceA[(dl%m$8'SY[KEU*V*)Plli#1QbJTV`!TR%C!!%KhHN`SVV0NhiD!9dRMkmF!
#K4!NB!V"MP6#h[dEUF[ZqkcmHSc02I8V!4IE+8G([`B,k$T%hI4d3BLPU@%j)d2
(pp*9c*aKHFiA'q8X!P9"4L8$RS"%e-2P[KfLF'6bNLZ!DdlVIK[SF"SZl`L`%cS
1S-*5hS"$hN"3G*RCa5&e`LR13r@1L`C5%%IeF"$VT'Y`*4)BM4&kpm"XfUUL`GN
0&@&N"f[V-raS"rIQcjPU+aS#iilDUQeFc"PmBm+&*5)Y1diX8B6Uj4#SZDT2BG@
fl[1SR+QhIClJKd8df3LBYXA4K8Xh8NDNd8CkKfcqRVI)h9b2@,MDYjPUUkB(D!!
d6XIflGNhMFe14#S[d$"*E%@VC#Q6#)afHT!!`d$kB5*`NJhlE,mY'rKCpSYqd6d
cFB)hd1e)D@%H)J3h6KL*)%G1,%1!'M)824T"pCXj#hd,[A$ahX[r9qc02lh6Kmc
Q$(B6DbKQNed3%,6Z6qk14`Fi$1qLZaAG[3Yp%Dh'LJ03K2!"NiF$8e',)@HqK1U
!9G2`LPC0[3,cRa9@[#)9$USik1$YBmZS,"0j!!(%l`*K1$N3fCDG8fHNE8)XCDI
,lK-+#HGF19&K4kE'Cl%i9A'1j`HiI0)r[[dfNQXQ*TAM*`q!)K#TCJ&3Y(G[DkU
YX&YfPRTJ5,jBkS04[Um3B-'e#PFDJ*!!q3QZjD,"P!-`8"!66[@2,rX&2ZSaT!G
$HTSiih8m1qH4kFS34JbKaa#Rf#hArDJ"S(A1fJ83!&[*T6pXFqZh&D0TGT[6#5&
FC)kIaE1"FL!VL`"-XJ"%m!!-![M(q6AV@CibSGTN[6TJQUF1"(US-N5F'!aaBM#
NX'"9X[BYr,JPKHh@b)mFNE2Gb"JdrdHTQKQ)*l33R1G14+bb16SmQU1bSZ9f(Dj
9Jb$e(&IRN4XZeHClVjJV@Sc0cUAM2Pj`2VDNb@-a41IY!L#MmDrp#cYd-QN'M@e
GX9%%J4Yi,-TP+411(b'`H!T%(!!-0diB3NQV$R1&I%6,UT[K(KrAEDp&"pff%48
L,@HPmD#E(m"pF-)&1LdFY@3$E$*aB4l-k!)lKi[5'pNj$ed'-[E&r!k2X8E6ei6
!1fX*LKip4fbCFJDNBjb48-M[1ClZ($jY"lXP1JheTq5+%808%E0P8J((VNhN1Jm
A-kjS'Rl4K"Cj!N"T,KPJ'T0G5)H#-(&A@j&JJ@VjI+lUL5Ui-,l#9H3j8l3QLpf
Br@P8+54#%ikb!6,,!SNcD%iM&%qB+a,1M'*XiP"k'JT'XhHIKGQ"M5cBaUM5-N!
HV##Z0SJXc#mZPB0)%8dAQ3Rp-SQN%`Cbc+'"USN33U6K#R#60Y4c*[2jU6`XXVk
GcS%4-%0)4SM56dH93I(i)DV'@[f5ZEMhbYA3pBVcH"NVcMATA3&UZUpIb)B&j)M
RT")jTM48)r+&)KLkDZ+LcF-9b$flJQCH3K$Y$-5[A2@mAA'1`3)1d!d)cLQBjh+
K!1C0fkRb*kkdI#1U1Y3@QqCI$48%DQKkbZQHV)$'D8ccJAL,Z#ZF&q-bQ$4em'E
CqAIe!8T`SEE4!(KdQ8`31QTYC'L9bE#d4bD$HNiQJkTP-UMC6!B''@Tm4Yk`qKH
&!+H95+l5F!k2"#04"dpIqCkE'+%0U&KM5Bc,&HF!D[1S@V2HQ94`Cje!S0p%NCA
ZX%M%Y4!+"Zeq)U%FQbF5#XHkL"3L0%U"Y%@jC1AbfCbPCP+8hFKLpNBC"i&&bda
#GZH&QIp2B4bK'"9NTV&lV0-aPNa$0)*KXC!!X`018bSKS",GA##[#lMiSiJm'@L
%XfiG9A&j*a"&iI0F)*TX"(DF'fJ*$DITS!iFIQX(e*(mHXFBPaF4Y#lLTa%*GGl
%jV-N4!FL"L6H22bmKZZcJhX*[CJjC-8aRBTCXMDkh&(PFPR1bp9H9GYdQr"UdHh
J,(U0q$SMF-pFQ+2M"hTPjb6B1-dQZ4T()Sb2(CRT[('RmbdG-"BiLQeN"ZTiQl(
%+ceT1fVldRD#PA3[)j+RVU)SM1!6Jcce2J[L%%+Fa2j%VKi6D-03l6#Sd1`%6'c
M88fABQDK(QcK#$RQ4aL&X,Q6Qi0`(KHbJ2qRX#cJac,"+)i%6*Kq&%RN)LCT$Bl
j-LU$)Y1SLj!!@B,pZU2m!CHr!A,qMbJ'#M+aYH2B@Nd`-X0)dbr)#"%XTYTeAj6
G-V0cl)mLf1h03K#l+h1L@G3Z#DKi#&A9@Q'SXK1SQE-'8FP$KGqb3")#5VMB$!'
NX0MX+Ua)Z@U,!d&ldFQBR5D""i$JqZK,KbY,R!ZS0R3BL`QCIDDq+JZ6ii)V)$Q
0LL(4NSKN-S2Ge)2#"QB%`'T"CI`fVY*XB`GfHG#FP!fB3*JM3bQ'c(jQ+09@R(F
@#L$'%3BISfRbB$bP+`+fBS(k$rpcJe(!61+a*d!"2qL9Q9a8jERM`*LYbM1bfIM
Ib$m[(DT))9MhmX1YJ%"@)G[Sq&&PaAR0)5R*%H-36A&q-PZLa1+"-"ZG&3EC-$#
5S(Q%RcM5pA-rR*'lZ'S6&eQG@bJDldFPLTBL!U!K9![j%1kR'lAlE01UY(e8310
4)ea!%dY`BhhRE2-0[kB$kPNaK-$a*SUj@rkriF%[0'%(J'J(Q2k0X+$8k&c8qRL
jEeP5i1&M0-b-4RZIjlIdf+iDARL`N4i)k,a8$9e+MmHEP"2M(X'R8`SLk,XV`#d
e1&A-,!BdXN[aT!)iCFlMM%H#(CM"i#e`XP*KLU8VVB$0Ak)b#k*b%G%"%d"T"6!
G-B+%+P13!#d-T%5!+"K0,$8iNGc5VCB)EZPL*iU%%*!!C05fG&(-pR#[TEpNY"G
$PDLP[a`4&P1EPF``)$d3'P(reVId9BK@3djNYA5Kma#q9P-lQ4#2%L0@(p$,D"c
&[CC34MY2!TQ#5+E'XDk$f#cFEf9%IAJLSQE8[XK)6#lKYal%CLBME41Z'SM6YH0
8RI3G,,dDi-N,Ai4%$eY84H#Kir,3RK`&HF%XcY)b4Pj,bpD'[+BG9j!!9jB*%`2
CVUUd)D$30NCHD8*"AKFPG'IN*@mXEBJADM26*%CJ5mYN"*D@U$fFTX%8)5-`G,R
!,1)rPbYALJ!8(Vk"`RNbUb)P5-arNX'!+UUR'He14J`qPdeJ`Y`lJ3P6m!*-Q!+
C#G2SFE0KFKEb4TP)LhI+9`TpZ(CQ6-k#r$-rQ4Q6Xe"QaNaQJ+3)`*iA%bBAd'!
jm8p-KiM8E168c+B&hFbB4LFcTM(M%,C96QDEFeUi5J-8I,SJ3)a0`(am")'*!a3
V!b!DE,DI8B`)&CMf"GJmE0`TkV,5b`D#!%cGY&IbJ-`QJ1(6'f9#U"mcJ+)DD5Q
$%icBEkSGAQU3!![PP&)S,l!9bUdhhB9bDkjF++m9M*(FJEJBKL'2Z5m-`#m'GNY
`IRT8[U,BLZSmd9GkPRj5HhMTT`b'#+$&360AI@#'aY*2)+EP3@PG@4%*M(1"$r*
CE`K8Zcf%LJ2KmBlRHZ'BRlbPcqaEd&Zia!MQeB*$K8[NUBrAZp#4`C10JeA8"0T
`e!#1bXD%'J`rJ%N(N!"*[TjaD!,i9F[J*pA1qKJQqDSjfH6N`Z0h5Yd*'Gi13%%
&X0$`a!4G2XmL35-N"SUP9JX(%ca5SP9Klc&$LXd*LXe)N!!4r&c#TaB4k35V))m
mKdUI!)NLCY[JFBe2$,CTZNCBp98P`8$E@rGAh%"#cm#'EJaqjQ4Ub8T2IZLLA6q
LNV$TXjKH,Nm(k1kKSDj(@#92V&ifm-D9rZeqd3K&UemmJ3ipLMUlYS+#8rHrmi-
piHk`3VGijNY4(cHi!Yhr,U01'K)X1P3#SkSph68hZVK)Lk$5C`a9RlQKqa8f4`q
KDV'LUS'j+fE5b"F8@jKC"B8Ec2E&,L,"2kdY(*c1fH6"cI5BXM*Pm1hG6lS+haM
!6lB"NF%J*QZ0@8%21X,%HFX`+R6TC@HH`AqQKkL@+ZC[PR9ADlVJQU"R8e98Z4Q
0%1d,P'@l['@R52pi'EBecQ55k$'4'3M38#lN"L+XmND90EjiUda@0-$NZMX*p(X
j#4aXH-K@08M*)#F9TSR$`V9#bG5#*@He-326L0NklYRZC*reHrM"[)',LQVGBk&
BVhh$+#[,@4N14Uj&Kq2TXFf@V""N2QXVqK%`EL$V8&PKaL1VNC6GAdHJ-I0QZUf
)hT!!YiMU5NPNhr98L3i-VmH(,!EU!-0Ml#Q!XeL)aj-Z6%6%qkpjBme4Jr53!*J
*XfZc!GlAAS2a#jlS'K5IF#4UZ&!J&SVhmCSYCX)!dqcAd&4BB"S8#fmpLSS6#b9
8B0BYJr$D&JhYm!k-KpQJaUqPMKfq!A0B03j&3ml&J80BJ+U&&5ALelILdA'DLQ-
H2LLQXr*P)!,,9!X(mT,8!BrarU5ZDbdEQ2fri`Ci)KMJb3F,a-fe,&kcf#J[99B
BN!$FKPY!16a0UUd`2$JSEre04+VpH,$jE0VLrcE%!+!DkVSQ96aV"PYJRYYm&bX
P1B$b8'2MDYH("H*M&169m[69RGaJMm"iHc@,Ve#p)iVXChU!MGPjZ*QRZ`*0ikH
6ZKf$rm'9NH%kU1+a[J-3UJVAC3mH'HhLBN5HbLidmf'3!1$$(L-4+b-LULFh$pr
,(Cf,f6Nlac2"LV-`)@Dl-LB-b&FGBXHJ*!m3"kSL`TM&aj1kX(S269aX3fKVP"R
jNcUC,)%&'TlC0P8r8$%HaJbQT#NLKQ10K!af!fL3!$A$4`mUj4+bJk-0AK$RAFi
(lRB*bbBZBT!!"$QK5h#IK*QC%$1"6eQJQN)Cd6Z0h"%UNZL4!1L1V4U!M2h(+@Z
UA(SG4#iq))S%2NA4#bmQ&Y5-k`,$8%TrVcJ,,hha+EaFa59i29Km$N9&9V&9GST
55,YCAR#k4e(JJBY8IS'BMN1RJPee5R'!+RcMA,(e*EK&&CpM0Ebc`@KkiH-Q1er
4dRIAFSJmfIB!!cBD"B,&RBjj8+(@9Jc!C&15cErDQ0!`P()l*Rp#X6!JN`'(Mp*
e$KDAm&%[&BLTaDH#$A`F(c8Q&Q!Td2K`RjJU'BKJl*DiT2KaHB[b9@c%M&1MeFf
#aY"rXpKZVHfBMj9YI"IEI3MZDkmkJAF`Gf*#)@KPB'"+$2FfR82EKP1'IbP2IFJ
j0*%ZJX"EG%QIlqhR`[3Kfd(9N`r#!#XYVKUfAG9NF9@Va98Pja$X#YQkPZ[+3pU
'8BE&&F1@9ab0L'Z&MiljJ@CZh[#B$K9'P1cq)XlZ+jX`@@c#5JjiL`Cc,3ca,C&
G%#J6e8m)eq'+L!(m910(HKL#[c$3kaT3-9b*!8Sh$89!L3YTH6SMD2c-a-rl$l1
40a1p2XDV38`&ZbPK,p6ThKL)C3)BM9#(e4CICh8B9f*,Zd05E5SaldlI5qBhXYd
U08`p$h9DEI%"9UGGkYlL(FL,K0MBh"EI5kih"QKJ,9La%-cHb(`*,b3$"$@!i6I
b35D!B3N(J,KCIBK"NJ-r4,pL&MF!b$e%mS[dm(9-*rA&)rE#GP&m[0!Il'#9S4"
k2%bI4#!mLVhi%,VG-'Uqr5lGUlQ,M1cNC*C4Lia@C04%4)q)`BIc2Km9QqQ96k5
pNi1%M+Cq-12&D%T"4RU`8ip6--)JX9'!bJm*'!m6HYM%`+2qVIMF-i68#%Q3!)"
&$fh#UcX,9c3E'HR#J%Ah#39%"cQ,B4p'YUA91EK6G(0HQ%8i'+`l!m#b$qka9DN
ZXp`Ze0)3k3LiRQ29CF9cM2*aJ+-l-K%a1pPHR%%D*rEEma[`N`pfS`%1RXpH+D`
FUJcakbYTB$*1"pYX%cX1Z3UlXr#cf9ACABfIHbeCE`%SiIr#4Y4V[Xi[Z"+(hNk
"a@F[&2l+%MCl+aY$UI0)(4pdF[9hJ-Il1ir"k*Ai@@Re0McZTlPZR$rB8!Xb%,j
)4ml*@k')ae$Br3l8Q@5@eE2md2hGlf6ZbGa$IrT!cLjKdJkApX03e+jjP!%eITL
,ac'9%,Xm%'J0STTE3+m"#a@2GYKVK,MI4'DU0mc06'GhT[lf*M,lk%F@qCpH)`H
R((m9XrK-*f@4I`J%qFDl2HV,lm*J1Kl2$9-`-(kK&X&jQ-h2c'-(UTq9&LEPbaY
$G4jPQ!+kH!FZAPZ*UhT'2c`Q6qEK#j-4T30[X()G1SbL3`pYY,B5!1&*ITL,5dQ
QBp`"`Pf4Fq[BFPPrEIGQ0%p6-YfId+B6Y1P1E2UBXZN1fR3(XC!!F)NlhV0YZd1
jeRC6,T2bPK($peJ-$hE)2m9Sq0j*JlqBS(6K1klbi*AVL+6b&Sj`4TNb35*YSd`
@MeEHVXF%F,m-`$d(`#Z"-QiB)(i+JKPBQSE#CihiJ9R%Cc2a8`+$1X['@!#"HpQ
IPr0%%pL0JA'!Rk(A$'4MJ&Zm,eCMUB!fmZ-%p4281fIG#P,mk3#9cqp!X@mS0PN
B#5YP!`r14mm$JCdI*YFL&8G9T!a&q9KLCM6!e8iN!(L$#)5)IPE+eF`6qk"3+&2
B8$'TpSeF&1HPeFGV#pr)eC90G%NL"h8B8JjBSH"G$j8"'(#r@ac8FHCH6*rNh*6
$PAh"Z#Kpm"SE"H)$EX9Tf0)*`jDb%BEP1dDGV,!N6fF'@')I4rNKm#q`'4a`Fbp
-UL'5%Rp%Xl6r`5P`+(0%pm+F)"YQ,aXHJJ'Dp6"*#kE*leJ"US-QLi($6PPi"-,
[a#$1B502Amr1H4k2LH#+#'j$&VJS'"CI5B1TTF+[3#5X(!)`i0&%D@H*X@NRTbX
l6p0@9[)MP4aZ9e8PB46ep3*+(,kQdHcLeifeNPJ[%b0fZBRq2)APQjeN"E-kpL'
fK-I"PVPCPQrN$XmM-,F#c%r'r*,(Q#6LH2,hTS4VPV"rMare&BCCcKVm`4[5)hd
L!6338SE`ra%['%EDb#4BIJ!-A[Y%!T!!maSFG1iC)1G-MqbXDq'Fk8GeMbMF8C,
G$ecTkpl*6TMGfk!+FR6IaFJ%epmq"U)bU0`c25[G`S'!a!TRm&8HRJ9Kmjj2m'G
JR,"ma"SE!DEMEFl#Nbj`-@ALKpHB-SE,aZU%!kBqmHGi)#-Y2FQE6m#JV#4U(Z2
(R)@*JETGZ4!8S*D2B80K&)ke%(KBLDM0LNX*K-1r`m@YLBGS)BE)N!#01'cqAH@
18!p0GhG)QmB&d`Lamj[kK1`i34fj%Vb`)`0m+ZJ!5'[PaahD"1Qbff%CEIbIFaP
Y+#+e&NEDTRF9cRT@BFJNPD$2TT[iMdf`Fb!H@`f6j+9-9YG#1FK9R,pPK&[(H9f
TXF3*E[fVhB#'S*cXla-D"0GV-X!Y1qm'1$6QkGDMZCa"G'a3Q-F!TXjJcFUTla3
pZ0$''&G34q'(R&@PJ+eIHm#Q)$N%&9Xc"mZ[[YEI)bi#K66,%bV12lJ35aV,bLK
#!-5DZr0IBN$EJJppp`S8kKX2SRKKGV-c#9mml58)5LqHf13KJiP*FU%E(rl2kQS
bf-9rFXCimXR"YV%ZMFF59"8MSc"C59fB"HVRD6%b1U5VBK#ID$$8fFPd,CB-mN-
erFlXUB9"p6IP3)$%QiZISZ!iJ'%DSP-j1BhPT1#GUaL2[$(iVe#9'1dSNAUdZLf
a8rDU,alXbp"YL!f3!'[I+%er%e1r4e-MmS)ba"r3m!Se1#!-r!(QaDm&3c!9jMI
U%cJHMb!U%Rc"0[P36"rPk9$2j@R'P`j1$*!!l&l-K!X@r1,RF%Gi4$2H88[ND%P
NJ%4@@k1H'P@CS*C"VFN$CqBNh"$jmBeK@`FZrVL,i#j'jE',#V(bb43j'h#NbMS
)BU0Xb!i4$9I5334+H&BJT%PGXK2L&Rbm6fLkMIl8(ARTHTL9Fd25$qVU9rVT6cl
*4a+Qf23XV[(C-'IpYl"l'2fT,!Sia(Uj16Cmr4*HraRNDN&EfHL5r%HCD-BEV$4
0NUqfG"d$"$Z)bN$&!5iB'V``aJmfJ#&Y,TJJA-jQC[2-KhMSAe6rkM2qE(,3iT0
83@1AlIJB*F[LT[&Dr*1EiJjU'T!!LE$d("ej9*l)K'"NL@4db-aCeimeicriMCa
)-TQ@4UL,A5EHdKEqT-2Vq''`3!EjM#,6XU51Glm2pafqFT`QA*!!"bME,RFYfb&
IS@b$[2QbI)f(e9#@IdU*daL8E2JA5M*#iNrId0LFT'@c[dfb8DaQfIRjDE2'&J5
$BS*j-+VQ'"e`+RQ8rcIY9Y&ebaq''M`bi4'L-bpB2'L6(Q!!-)dc!S!Dpf1MLje
EjBThGCk"[-`1C#"lkhYKpJ#Q-fFQC+0r3*AXS0`@l"hS3-QLIE#S,jmHJY#,4ea
0B+Z6Sh"bJJ(`AVI#a5fXe8ZZ$-jJbNB+aCYMF`PXm3I)-!XG+V2&E'U*b6`BP2m
m&c`dHV'ZP2mm'2lMB1#qYcJIaUhK)&U'acI$e$9AG(`Q[ILKa!PXm$`"3bNC8iT
biJ`@`fPfR0%A!1-(a6AiE&3q9p'RK-F4&iJf+40SAZ)Q9i!EBL&AaS+HkY#SK`P
9I)@(MmdJ)i++Q,"d%cD56Hl9A`a`%Yq%LfA)H"iUhNeFR3Q!"'1(5cFamdQpJU4
YidpZcXljVh`i(i+953CkYb&iEm82c+ZPEH)(jH1MP)-mP(DECTjRi('"d8HI6L5
+2aC$5#B4Df-A5(,f@YEpc`kiqm(a4J5f+G0@%$P@"(90c1Ei&L-h(M`BiZ*A*K9
2`-rc6P3*TiARhFDI@J9-Z#9ap'+)cRDaDqCcr2#!d%RqmeXL(RV)!cq3!#SZ6V)
GdifSA$mK#+!iS)T4"H*p%0L4e8G+P*Hc"[VCUA`Q*GN3+@-i3I#Sj18,q)rRQ9L
SN!$49(rhri"!F"hCC#M-qGAN'(b1XK%rGdiFc%4'QMk&a6m!!$'*384$8J-!@#)
293eQ4K%3)H2ZBIpY[jDUp1E[ZVkjRZEaZDkVHUUfHN(c4(C50`EXbJ+pELDcXmL
IapEbN!#1kjZjK4$#&HhRPae`bSb)6Smi&`i6Dj,a21YN(VF3AXr#HS4`HJ-MK19
CKp'!J5EG*1pm-alVlprIrrGe(5#rZb6[*5mr!"9hAL6c)$)L%L(a!"%L"PpjA5C
M-Ic)[QB"T*JF`#BKL'Dc"i'6c+,ccC`$Xa5a9),[cI[c[JNMq2[1JSchF2@f@SB
mSY%MV8-I'AUlS891h!iA+Q+ahrf#&3q#ZABef[bF%Ha[peYmAbq54K$KDeJaN!!
kh8!@KB&iB5#&-`LN#hcT#5Ca[TcDLS#`Y,p&PZ+)j*JiA%EHX6lRH+0r`$m!X2e
KIa`rPp@YcA%SLmTS8&TmBc$4bZ+r"R`@jJ1aC!5Xi(+BF1PN%LCX`R6h`f`39H0
PhZ`TrQYEK)YPD*95!c)i2A(84bha-5iqSKVa4cmbid!D,El@SbjPd5mPY`)JVK1
A3b!U,dV90%+rlm`TajGE(0dTKMf$XaI9A9I%!pV[1c2+!jhk!pTdb9'Ak4'AmA%
bSXU6+QLIY-LH$4fqCRA#d'`YXKR"G$0!j"""ah8)XHTm'@2q8C[$Eb5,YDNP'I8
rl'P@DkRiSlDPZlB"1@iCYm&`Uia3IaF!JM![3a$RSq8K%XK$aXE"ELqJaSb!'PQ
XU%"r"jEDXcd-4JarbJErSF96BJ49!LP6eX'PTBXCK56`8S4aGS4`9ZIj`[+YhC0
"6PdJr2iXGhHrj3QRX4a+X0@C9hZ-C&Xl312PbL-AP8HL@"VBHhmdf0pPK"`@`,V
RESI8RBpqT'S&lIRlNdPPJ9mX1,[,5!TBR`bdKJf8`mK#6QS`3lZY[E(GGi90&JP
%V5Lbki[Z5)0P`@INT0PfJSST*qeY*`Vji4`(%pR)T-3dPCJQaA4bZ3Y!`Q3!PqD
``mUJb4J-pXr[NkUlCH3V#"*Gc-M`LY26SG6T@-bA0+L`!5fH3#UV"`cT`mE'hDb
DDV`jDGejSV$NAEl6BL`4X-E`PVE6!ZLNlU+mV!&5X[,&2fY48dX[aHVm@CF%qHP
HeVe3kpDDZPPB50eShML++'b)EZE&*P,1Dc)-!`SiZRQKQC8S"m8%pl2idN($dU1
,#lR+p!)6"F3Ea04+dlTYX(j@LC-46-h%G%*-*k9H@1YH9!UV+SGLqLbV6bE$A54
imFM$LZ#P[%k&j'-"qHbMSGeIc-DKlZA`2"I$kaCe'e8LkP0(3lc",*)Hp-#RiJ'
hqIXe5)53!-#fcI0@QXjYYf$6V5aH'&khNFqC(LpIKS$aQh-j'4DJi*3QCGX*hTK
rhLF+mb(9RmP*`j-d8QdG,'ie*1"#,[K*A,`2PH6LRM64T9PeKRQ+9")%p``-"f!
5S*A0"e""EjU*9J'@2,V3lh+9-LMb[5F5"9le*bTQG)E++ec-5U(bKc&4U"kp+KF
6PAD2,Vr4!U2(jDDZZ3*5'b`%Ef!UJQ,BT!Lj%Y9[a4'SIL'[BR%KrdZV[MbYiT6
@q-T1THU,k4#eRKKJQ1F99K3S#SL5SHID$'ehjNkIRj1Q8,dlj`,M(qeZTq#(QD&
l'53FP-#RbPK##NMMlZ,[m'Kq*0V%!9MiZPGMjXQj0"II&Z6LmTrcf#p&hR[BNlN
8a8r&T5"qA1UeUbLBCcC1KNLY3&baVf(6pSa8Hipp9AeDHEAbf&H9+j4AaV'[[ZT
@AS9SDimklU3kH)ZqF!-#UAq4-DqK$9A$T,`B#V0cB3Z$b1CNkELYX@1kY+$Y[Qp
-!HLbEHdXh-Zp'kXDHcG@kHp#p@qP+CX2)$5BmL[cLa$Km%B@,LYc!Sac""i2X&V
eM+K&9ePSfQ5!b"+,-i@UhZ9Y&k6kfX&HVhY&HCdrf1Z[EP*HHipj$3Kfmi,b-N6
XaU2-@+4AhK5*2NI"94L9CPH,Y-mm#`+L(%j#+'Gb1FL1F*+1#*m"YJ0-6"$kJBm
2BC*P9MPP@f+3!0i6PZh3DRL*#HLp%G46H)2Z%T61FK9FaV[S!2F"8k&M'&0pij2
K56[)pEZbp96$eamA'dJi5k`!i64KdRCKHPLX&8A4RA-`f@A'2,V4LZblNX0r'bS
4jXSJK!Cm*Dd+)6%cdYm"B$$+(FU`U%LSd,3G2qD[ld&&D'mK26reYf'V%[cC+A&
G`dNfjpP"`VZd1EUH!rZPcC%2-DRk``%NY@!1N60r11#cdl&@1VE9D(G,[2#KNp8
!8+dec[H1)m#f,mK)9UJiN@B5RFaUMRH)&!8RJ"cM[ce`@jMDIm8KA['U1!"c+Lh
@b-$BY&D5QBf6bGf&mIR8Xi)C1U+N(PjQaVVbrpj(XE'Lk1le)J3ac"rMFkT&FUk
bFL%dpe+X@Kh("j-rh!l09FE@UBYk8F`@Y"Bf'(&iFA*[I5LrAFlC`+"@4r2"@#K
IMPY9*lTJCCSBAZFLYKM,QcMFi)+f%,%P9LR5+[mArbrb2rJ[HXar3H8r$Im&m*p
q80D#&*)PZ-q`E)EceF2i3p"#MF++*&K3',6'K[`2Ka4$V[Q(3`Fej"fFfQ9$rLm
X1KQj-GbU*1RU8MKmZjbZi-N2B`[ErZ%3(VJiM'2Q)UPf+F[PY-'6[idY@%1@@#`
MLj22elHeKl$!b9fKVRH+M8CD!(&T&b1ULfr$NQkMkNa+Q!RI"X'H!$4AEM@eN!"
UdD4b'e#YUCDrKUA&kKDdLb%eH6(+DB,BZPKG43!X6)J#f[['J1L'FMZEh5-fGKl
a1+PcVD61jD,1jD21GCNkPj3A31iD`GMr'fm6ZZhrpCmhcP2iA9G$UG(rhbq9G$-
VMlaT@[#SH#64AEcLN8FipIl#hBEB*C5eY1fTVDSN9j!!bH8`M'6d$I4B6Ub'ZE-
6BH0LQD!#-DP`iQUcI!2aQ&3RH"*KaBp*9"BqNaE`F",@Y,I)MpQ")hS[*"Q#X)*
XF)+5EiEja9*%iPJq2%Q(4p@S)bjHdC*)mFGlerZ5GJ*QiRMY*39ZRN2ke$UBmL8
b%8B`PlU8qYR$CArj[591kP)&MYRk&bl(BM+U)[(iK6`Q)AH%*h2[bZJL#R$$J-H
VT1-"2R`AB5f5qAM*6-k@FjbLrQjHKX$ZQ6i1qbU2B-UhJS$3GYjR0Z1-4%!CM,h
2C#r,kD!r[-@Jm3S8LYf)%qba$#kF)$ia@q%QZe*i8Tb8BlG1I$b!`rrJNp&U1,$
m!H6-B2)'NQB(J8VbFDU-lJ@Tfc%CI2iqJ"QEFHmCK8Ai*bEL%f-5VTdE!Iir(-F
4A"5!22GX)bCh+K+@pV(B)ebJEHH+)U6%bcM!`T&r`*rhXrC8(Z%9-l6NY-,1-0Z
#2jYKJ6JX9q8c)5@d6Jf(SNZ,3P$,pkiRKm(e91#M91$Ab(MJk%FG6-Upe0eNT*8
k(`!)!!hZV,hiMaUA3"jp@AY[[VMDYJ5#hMD$JaN#["KppA2%S0ihlRdAiIL`RF%
j!(PKB`BIY%8'-R)iC))1m@EYMRaaa(+`3kU'(&)ep""CSQp%[TLqNH,)N!"$kSB
F8RI-)@[dMFJEk4XTMJijT(E))E9$$P'(lB1N&5rbF,h5q"!@L@GQdF,*jYeVGp`
(M*NK`i6EbhX)4Ga4r%49!iDR`8#X3dfRmMRGG&KN0L'bLEhV2GDCTB,FdVle[[2
HddZakQ%lILVlmiZ@e"JE-%,Upf!k*A!L[3R6+'Gh6rcCKcqV!3[Zir3A-j'aI@$
I$R'B","P$ZTU(iaU1daj(fkfrjL6C(#[4,KE$rCK'F,Qe3DkDfc&lMGlcc8a('K
6NkPEV-"mq6-5F0m+0FF+T*G$P6h-V2@0Jeb9-3RVRH,1hRFHRqhZ&,Q$PQ!c+cE
Jk'PCZ9rCqM8%IdCahRE1paSZ[U+4ArIUhB%2KbYI91m3e!h!J+e%FH[G3)%ESUN
"T6-NKi2lPP"d'R8#"0GIEHC1J#*Z[8S*dmd0)`m'1abk[L8G"K+TH+i#!+q6Pf9
KUZqmFmVP9hYaZGFR3iA3mrI*e+m2GZH*#Hl1'3R3i#D8`RmR1!iG!%AifHq#Y!+
fYH2&59q5!+b6Eje'Q[Bd%N4GaRaMem)hq#8kfKJ@R8!401('Lm)ki@M2)$N-)'`
Ehek-[2UP1cJb1jb9VfiD(Xl,aL9N*!KkGrPAaKRQGjh2cQqcc(A$c2F!E$K4Q(+
Gamf"a3SC'`9XSMBA!XrIjih0CE0b`m#XYKJF!d65J-XZ61J[rHkXp'de3LM`HR&
*d0F"GQr+E0bp#B5kK!Ne!IMP$"Vc!lKjFA5M@P%)A)NFrT*)5#"*"rI%3S!qe2%
(+1B`Jaqic!hX3(+#JBV*BXVqlSDZ"CY5`$AFrH!3a4HSS8GDBLp+kHKDKUe1beK
f8'69fh8iPTAepr,9C8AbVA[9*D2"XH"P160@A8ANe5`1fQ$%eEAi8m-"PR(qN4,
*#Rh!1hlNX$4KSLi5%-30JbjR-Y#RQlCZa'9mif)c,i&k(i$STMbc)#k'"`BI+ep
kUEV5E4Srr10pF&H'bA'3!)2`,iR1ja*"A+`FS!$$UUdjk5R`!RC&GrfTfr4Zjf9
'#!5"&eZ&Qf49DZ3"6('+KF2NB@Z65(fLfQHVpd`'RT'6"+)Z[mj'#+aNV(S[QcD
U@5j#5F-&`-"U(kXZBf)b&FPV!)5d,ChSr!1+-p[ipml'cXIbB1h(i8)*SrEB#@D
+q$JN6,RMaR1m153%aj9!@S3e$L)J)d3iI%4'h%3m,K,TZ&+mN3M+$B5Ijcc&a4r
MTkJi54qlLTIc4pA049jG"9E`Te*@ekQ2*cj%kF0)iS0'(kB5(m,dS5,a)8)IFQ-
"0316EUNZ8BfaJ$[+)PHE-Bh30*9M"ZahBKQUlDmZFh5E-"*I%9+mC38(L2cM4Q"
,*ic1pH[l8LV+G!FAIX&djmQ8,46ZcRrB-4PNTUqYBe+LD3&8F0Y*J+6a8`e2cE+
Dc8PIXa(Rp,D6QF-G2fCAQZe(hS!Dl5)efRaCkX`'h'[#["'2A,H*0L4P,864bXV
4Nk4Yr`fkFVN)dB93)H`b&[D8c'YZk`Z*08eX!b5fF4,E9"Slh8YLkb1ah5@a&C2
3(#5dZb3dP86@UcS5`MU9%00!3N!V%k,**S45J&#mLP"k%N)a%d)*#D%iUCXpDS-
$HkB3k'rIF!Z1IGfH9S1+b,YabemHIbR@HrbETQakidJpLQ(HDI&hq5C5YpJCGPS
FmcIi*19DBk2$`YdH$A5d+e*dCE@8SA05hKHi%`N)$DU"fF@`Sf2&VGX[8U!6U5k
j2D&!,S!S[P,MHS!MV!$p0#Cb`U8E$MP`@f19mh`R!p$BiPKecHPcYR1@PZTDTb9
ULGA'BVLTFeT!E[)kZH%YU9C5'I'$GIqK`$5j%*0$'#Xe#JlXF)+[BbGilhCQPa6
&&dChBq'1NA$$*0BCp6)FjC&D))GeFPVJ#Ved+R09JH"'M2--lL3H5!P'4(BUN!"
Ga9%2!-+50m9Vj4$V`5lbmRlp)TliGr#CLXlqkl1a+P3Ia"#J+KHaR3'YPbfZ"`3
!#B$`Y`3(TU9@6#,(h1Am5%PiKVr0iNLjG2J9c!!*#a$6j,cB-'!VrQJeHNme&Dk
UdD+(#'BE"-`iL%*6)c3a+5ASc,3a22BPbA&Y+38G&qPeN4iXa8B8f0D!-PE6i5R
mM-P-X38X60%NdX-Eeq,5fdieI(l%p3!+3'UlS&,ZFPHQ(k[(04C8j`SEYpcA'HD
#LI4MGKB**%lS!J`HF,CIM(c5c5iSFT[KmQFLDhc4rJZ1@fL3!14Fe6lp-a(i)m'
'$fMZma$!X88i9cdmmlDiq'0p-%eHc'TJ"%dMVXP94Y)cJ3FJ`-G@ZYK&If(QEDL
m%CKe-6i@k10Y2$)DDF'(C[S`Lq)CjB5DMddM`mZVEG`GBL0hpXZ(U%(23hd2q+A
"Kf9NkDQ'9mrbj@-ME1UmHFmBMXh)RP-0LcEabRY0pKMrK!H3!'V#6r,ACf910Z-
R+a(mmI%ri*[N$rJ&(N)(dcrET3mrBAR@$k2h653fQ($aMhhVc[l)'T!!EAEd'h%
RL@b[TTX*ZYQAiC[QliX(i[6a3)&[5KqKMdXPFK8qYY%$aI3!Urm4)[[EH8TXEMN
pi+-(pSL&N4E")Z#&9l#mG&1JQaVPS3m9Ck-4pdh45)TZcY)0i2jSQ-4D+TL@a[B
&1aQE+5##2KJ)8XT1,,,j6Fm!')V9c!DMH2BCmH*mfcNQ3!D!mpL"YJZiXCpUf,p
G)8BbXXq`-aaVf%%QhXm`8AVraaI!&Rq,a,ZFMm1I0KajM4d0%5kXaH)H@Zb'k5r
$KEIM`Xl#I,5G`38'MJ!1f(N5PCk8!#B%d)#(bbNCY)H1,M[9F,L8`9ldiLj5(F9
FG65Hm,,5ZMh,m#q+M"fApKQZ,$X(e@3Y)-6Ai)#d`aeA9+5SHLXhUM,Xk$3Vi!6
aIP2(N5B1)*5+(AATNM9$,Me!KS-d[@IPPFK9M4FBTV5!FNN8@Q+KF)(HA)6&c6R
j[B(B-MVJYci00bT5$J!CBXXm[FUQ*NJKf!(LV$M5a%R)f'SR9bRqibDU92a+T+6
qF$ffbJr'H4,EJdIUP%HUa%H)@da-46@BZ*4FYepF(&0H01)I4GG+)6N`bPhVkE8
Me,@8VTk#8"HiHcjpIH3"EQi2G[@RVp#R@G(4Rli*p[*CS6DHIQhN!4089%VeK)Q
FrPCY9PJ9UTbrb5I)l%j5D%P54$"AE$r%5LM015XVQYH-lfiQ0hmNZLD+M'AYXm0
--KZlI+1MmHHk'YURScID#i%YpcQFJJ+)JjJ&RZrN)1ql+!MCkIK!JKaSep)D-jL
+Qr3%0eMMC!0BT`Uhd@#CRF[-EqmZ-PEJf0IEQGK6%*'4RHbdlV1+CQI%*,(,#P,
8j1KK%3h4`QN0MNbML*+rc[BIh+-0K00HdJDJLP0rrb@T2I+'-9pN01+5Irm'$JN
2TMHYeXbJJdLF%N!6cfK)A#RX3fbB'ABdV'290HXrk4Y'YkZLK-[M)&mQ1c,pp!`
r9*!![X,-r)r3'%&'m!0J$$rVC&$PG+2'A9abUM0CN!$qGTpeF[lB5e9cBR5#5D$
9HSb$3,KLM*2mR'CepL,KC#rihDf2f-iJ1G4[i36pD($[Ae("2BALVJ8$fPN)l,l
23%3fhRKk`Fj*bmE6dbPkU"B22DA1)J3-([i5&ElCH2TfUE(aF$dA1GmZQ%C!19S
qGf[[Ai%8$MkHiF0Qf3fT4PP#RkBR`$cH3P1('PULm@8JY+Gm-RB*NeV2V"(BV3Z
9`EUkU)9EIhQ5839`9ZpQ3j`Np`CfTc9JHGhLl)9,CafC"%bZB$**MVE6BT-$q+L
&$k#Q0IDh!%RqVMa@4F99K`URBPmhZ#')51GAT6&Z"12Rf*%IE"l%ld44CiS!jf4
JE$+,MM-QFj41Vf%A(fB,@9JJ!*9`1'Yf4`lPlrjN)$$H2Ii6&$Q6Hp1"*)e`h5*
hXNUp@4""J+eJNbIqic+Jp0U#k,E*JTi%2N'Ar"SE&l0SSQ'(c1RXfUQ'hGFTE5j
p+M1jB,jlM(RZf&kcm4bFKCMmY),X!*,Z[m!92A+5YJpS'edqTaU'[GI5f,(!"#V
Afb*c#0TVHdqUZM09d[%'Ja`)f9Ib9R`&e8`FD6lIbFFU&di0ARLfR"Jfh9PJ$j[
V'!S6"CQlM),%JaP$&#DRjQqK+2I3CkI"$NdS6QT`c1abH+P%Xc1CKFT[CT@IlKS
%80+V&bme"bLc5JDqYbM*GM6HZFF1)$FZ8#-YJ[TJC0Ji*p3+qHbmJ'$Kl"4La6@
+"[%q*cNaf8NJZa#bl,SB9C4T)DH,T5&1c8"-GTmlkPK8)91)8r@fF60KT4(&(M3
RCH9iRpe`6M9XfDQ3!2A(ZF-FZB##3#)KNeHG9$aQ@hIMVGY#MIp#(HH22fa5YF8
IrUBEQka5#Vf9#Xe-#$b9%%ila)fAMLEa5'1,6%h,kKe$!T3k4Bd8CZiY-M-mQQf
I#@)bCVCr$f%b8-D`RNCJ"bk2!j9YjS3)!f6$`R%fdYE13D[X+H40K[#MF(`6UGA
I)BPIjFG(MrM`+$k8i+%J"&@ARDF,@[38#$Q9PT,+-0PCbpp1$G6KC-EZ94@IqTS
AdFaHHShlrPl2*89`MkX1GJBlKkk+iNkGND95G6R2pjjIqDNCafAqACJ$'m-RYpJ
%0PKmKF9ZjD!lRT`ib*-b4f@%+Qj4V61!CG@iNJ#k$b0"!fki(pElHhd&'+&*E)I
G(9fdd%(8J%ad@X90*6V%1DPH-AjZb*L"-XPHPQ4D+mMJF`DT$j!!r9D3!2e@JjZ
I`C@qf$cb&c$kHL-2KT1"V8eUNJ,)H[cCT,J0@D&!'V(e(P6e2@bYKa`)0(F@@e$
am4p4+0Y3q1bUjX6"ll-#SqkP01FRaG8M&"FB9ar)ciaZX-V!!qANY$!@fi3rpAV
5(qc(2k)*5b1(K1KkpUZQiJJlQS2,"%#,QYKl!#qh`d9e6k`F$VUlBQAXTKXV`FZ
ABc9JKj)+)bBM9BEGB@Qm06Z!ier'RrhiXiZ(22JPPbiCFZP&[M3UZ*e)bm[0k%l
@XGKl'c6IK$m)-cU`!Cma@6ecakpjV"XdMhdii,JMQLk!29hfh@9`9T)`T4V2-2m
dBVNR!i!l%UYK0bUJ%fp"3I"NE"Z@#LGD@JVB%k"EfGjaEQbV-P0EhJ[3-fXHr%'
iL*I"Q,E6aEc+a9lf@!qfS4N"R#lM8)@EM[)P),jF)Dih3BZcJ"F(!rIBqj2,53Q
9%a--S2,hCrA336*lA3FeXe`S+A@!c-p%`iBbd5!6+X+C8$JU[pB["'EB(+cDR1d
hSSPIQ@mr0Y3+0@3P-Q-N9*!!!49N#"88U`*"i6#U%XelDK`R#rB0YkEPZJq(++,
eZNZ9mB4XcE$c#SFjkiP8Vk(ZXUP)G*Gf8SlY`qm+Td)m8#mB*466qmD8dPe@(+3
l,+2Z))2IJ&,*+PfL8CA"$kR46FYP55c3DJEHfEa-miUd5X9P"%'*V[C3M29#jF9
@&2*aU$FP!GSM'V)5I&-JD'k83,PAe$ikqK-)G,9kGbB)eIS*rUa@rEUD$*j59(i
AZJ*)fA5TlTS5h(E-+cEaeH*!0D&@JmcbIq+K,Z(SJQKDIXm'fI+ACf-Y`Zf3!!Y
+8Edr`F1V`AUecK`(%@[4L4K#B$"35&aF0q$!$UBhMpHr8*S$l)2MR2Q)$HPE$3d
@pQdB@'L&3e#SF@$D2JVB"Sd%DJqea0CcBU$"-YKB2hE),hfD[prh-l$*F-YCbF8
9DFKl3ZjS3plh'LGjB(a"5NdGS)pJV@)(RZI%l3'B3BUh`QNVmIP)#i%#YUa*DKX
Ta$24V#!k5c$a0[me%"XTpjh4Q1hLC219)&,0B@lmcNe0p51G$+RZ)`G,9%Qi@'k
a2'TMU"G-Aak,3[ma%Q[cK9pTK9Z'6@8fG4QF!(k#5ZhN"SG`ebYAYcQRHUG@YK+
TqANDU4&*$bBfi9F#G-!fKCbFb$"%h`Bed!Chr9*e&@drJ1h(HA0S2Y4b*ST1cc#
%cArF9q#Q!Kil2QhL6fHLa-6q0VC'6G(d)8aP*+@SKBd*T6#MJpj3!ie3R&P5#cC
5#lC6$ErV8paCem#a(3U531d,SQ0`1P&QeG1+HYLBTKc%4Ar"&j@[Ni,B+03$#`A
+`FBK[mb#LFaQ,EmjMJVX8K5%SCYa[q@&&)A-r)i2+S'kq%!GTD5&k0ClU$-2CIc
+-#b(93GSq'MU(,+58k*VKMDGYeT*GCLN1P)+f2GCJ(dq![Xq*d,RRlSC`J3jDZ"
dTQH!`Z-"J[YHb349Cd&6i$lHX!li14@QdJVfVph4`H!H3YFG"`Ih)MjfNLf+f0S
pi55"e0)q#-la8$'mNBma!"!$IdKZ23&ff@8)GdFVU48r`IXA4A*IEQ*9GI9GqDR
LNTG5!'ml%dS-FZ%N5!LX2K[!**+Fhm``SFa`8i#@2m[#ZVbbX1K2[S`Ch(r6X(!
-#erjXbhm5Ufb8(%h*4Jk$F$)("c!d!5!BE@Q!aL!`T5QAM6ib#LTNcBZ3JMEcJk
Dibr*F'`2#-2PM*m(eVJX1@61"2Xle$%%[-G[6f3#r4fMfR0GMQi%Vce)KYjA%U2
4aZ1ccEQ!SiYIlrdVrG@bMZP2M-$K6REAcXih(Pq3!-(Vh0%EMdr,S+A!#K1*!$5
3!*KJK3Ne)B-h@Ch5i%ZRS1$,&8@&S@,81#RlFRA-r`5'%FZ`'UC$Dj8M5j3$kj3
$kh$J$[83&&Bj+KAAMf,fL#j#UM,kZZLkZR[jEJY8khD`J"C+RfK3I@!Bj[LKi"l
,5KQpJcDl`HJ!@Sm&P#C$1&3%2FT'NrjqMibZj3eL5p5J60P5&EDdPpe('`F@RX-
N#E+amjL0+5SmUK"FU1A`d+e&GY(@JV3e'c8Q!J0-`UX%DE&"Y'EEp8,qSX`&pli
c4(bKrSkF9YlYk0Vl$X3A1R`r!99!I*a5jpGlhp&I08"mKG!9M5%0!NNJ`-JKJNN
J`)LYcfr%EiE"2Zr!YPb$Mc)XTP4TKe+mF9'*U3Vb'%bK+VbSPDS5TDUX(PV)&F(
SD4Rchr'aB5I4"qcU'&Gf$YAEF!FEQF&'iSehX*&&)3T"2X@J*PKJpGpLYapHp1M
r[LJcrViTeCTQM+FA`Q3iTfI$MQiMhYLpX*Gri"K3`N$Fc55RAaJZ9braKd5&3ZR
Q-U4#`V%`JZUX6'ce1$ICTDfLb13lSMM%9[A&[''hA8$cLN[GSqVMF**SF`Ff@-!
JD$!EEX#l(HQe1+I+e!SH)#`ECc"ZcS+`*rSM1*4K%X3NL%N!%`f6-#B"6$lq%EZ
3!+%K"5BE'5M%8#hL8Z9$3c4b@,FU+DS8QJYSB'UdR(eXIYNYc`48-pb`M&8BqZQ
@clQLQci"fM-fm@"3[RL"!6mB,,DGG-Ff@!D(EV+Q`8PS20!`dF#!NC(2Z0cQpfe
Ai"TJ-YK9"HDaB16AIiHCCDF,#@TrV&+(2q"HGeNN'3TqGC%G4H81JL)CJ$cYiQ'
p@T@N-EN([pV*Jfbipaba'@%mA1p12@)$D3,jfXU2h1-"qP)G%%&JHJ8F3C[eK'(
eCMl-CfF9#00!#)F803"@$(G9RRil23ia9"8Faeq9&m$B[H+1c$&BAqXG,dVpr#0
h&J2b)4caM[FK)FShF"E%Db-SAKMG-hR$J@6Y"@k)J5'rF0Mk8519eVLLMJYVT@L
)0A&&'LNZ8!cjG`F0DpDHD[LMA3cHc39i@+M$je"P&l-*1cX,5f$[Nll(S5D6[Uq
4dUab2J'#$bMGL!pBIQaa@-#Q9CN-l6!S8rN-TaXKk-Pj$%,hRR$rb3E'EBFYY&8
AKq"YRBAmXhKBTK$qiEMeISBC21,Q1dKi6MK`3B-r3D%KED%09N8d"@#Rc#G@BZ0
McM`2`BAM(IV4[&Q2eSmIfVDGUM!"eLBPB0rNjVi(D8d@+hAS'Pdi$SD)'@af-d'
U!)'`4)8!*&H[%N#bViF*,EdDSmSfiq9DmC+KZA"D3mM"3DiB9%Sr(MI@Qh&8-!2
hP%SZEX2-@05H5EjSUh)dNXA9imTP,bUAe9mLX9'G8ekq0NRE5Ea%3i4U8hNjJdi
&3Ab[,h-e!A4@A()AZlQVE@6h,a12Y9,D1F3#3RH"D$%iB*h8IX"*k6!"MJPA9C%
J6Up-SSKmI3r5#U@[ld%L4Ac3)UD&A-Qaa%+ZPT'ijBV%HIZY0`TAP@eM',@0Ke`
2"JXDD5N'MF0S%XS-B8TY*YM(0C0r1LqY-`"a10L&#$l$l%[I!leaK,PS#*2MaB+
C0-&-pX)m(QGeiQFeb8TYPI*UTG[jGpl#Z,(FPrV0JeG@4)fjUq-I)B(1U38TRc6
kM@A-pL+K#eDVjdP+-iH0qjPq6Mhc)%)p,e,LZ&)NkGN9jY-e'0!4$+K["S&)VI%
FrrpPGJhjp)q9)4mrp4YA*k8q!15RGrPfjQdF9L8'2H5&EifMfYT-MPK"X*@E5rS
`4+'4p!QJq8@eedJ+9F-GT+PckM)Rmk6a(AE0m(ZRi'+4JKS"#iG2D&)M'K"0SR'
,Zj8RR#`MpdZN@pLK!@+jhXHT-DlSD56'`(JMNDmCjpGrRN@R9$H(Y&Z3!!Y2Z"F
BRh%pd"0I`KL+j,2h)KrLc`fhI$BIqI1CGb0VIiPJY`R"8XUlP-3,4`6F&0(J6I9
Jlre)6cr%(Ac,hEi("a&l'BZG54'fHkcJpjaU#&rL4Ye(#Ii6DYMqbGpj-q0'kQ$
#Mh3B[56mY56b%b4`$-"TIBN%AL@ki*GA+-+H0FlV3c9kYaZpr`5"4pD3!-"4E&r
q@N,JI1[6"IlP-!Qm"U"jM6[rGej[lqI(i5J32RT$F"&RFqbGJAX"J0"H1"(dX+L
UGY,JSQAFi&Sa$#N2F4MXc+06AG&92TUU*%b%PdHqJ3V"V+`'15L8HA[[(Bkm4bD
$@a#[&$D6Mk`b6*l)3h#eTK35IIjJjPPR,j0GZ%5XQNb#C&9LHF[Naq,'AIac'fi
JXXeYR%JZ5*J9,[DM@MBVhbJ5EcFM,HKDB0M5!pAr!kHNEcm3c3S"8qlS%dB)NQC
-N4&@#4(mU2lJ4NJ+5F"LbceaCcm4-iGKFM13!)fImfK&$kRC8`fK@4$5&0J!"bI
2AZddHJ@"iBC%22MRjLGKG2hV2mq*+Qi%c`DRAkJ[l8,-!1'JH+'ARH44(A'KYA5
K9c#BE#9h9e`)&Bem!aGb((-K'cTd2b@e3mC0fB1KK([jXTNAZ#b$UC)'D5&h1%T
3J0JrT%,P"*TJ!)*C@mA-fZ!!Skf*)EDBJ3UY&N2CqN,%'Zd53p,b$lUJ&5+Y)dD
+iFFkGdiiF@6khGHqEe1("d0k2(!2'qM'!!-8d$16CTL("5Y9Ul"5ea0X9-e30ZT
+4%eKD1*ZMmPXRD1$$%&Yl*MGVdqRmcbS+c&06@#DjK5QU@53!%e#4aZm+6%%!pD
K-%Y0#@DTpQ$-%KG'%3T$bc"VK'l!`pcf##@1caZBa93qDr4jR3M&Bh93NCX!Hm"
mdMVEcP6hTE2IqKF!p0e-bMaK0BAQPbRkQ9"$4CcmDX%`"2+Q&3)d!Di*H-9#4cb
#edeC6@'MUJEC+$6q60+J#P2%l*`Q&Uhk)#aDYI-mZa##8D[f0&1$a6$FEk'D)K0
#ZHZX',UHNpJ[hND5'6#a%B1'@MCb`Q%03fDhHkbTGQ5"(d*+119*i6MK)MIUHU!
3!K5&h8P1&5LF@"9ZQlP,TK8e!dPJiD1V@3d&&fJ`fk5RQ)S5LRhGV#K)MmVN1Q9
4LY#L&+'ILP$M)[322&%aTbQX)*4,@e-Kcd(c-FbJ09&JD3bKh-m-BHZ3!#%,1"c
LVSd"D8p@A-8@hd%haED831Ydfi9-hM@&`B46l)cXrU-2(#Z[ZQ-!@U'5hrc&iY9
a"V`lR`QmqEVq`6G#B"32Y@,bB0%&#hI'M""[2[(B(*5+Ih,qc3[m#81*4pq-iG-
2#P+SHRSSMLB,%0e2UaKFJpTM044EP[GSci6HI,hK0#D"0fqN(D!0TSae&crr'aK
N0ibPSrMcT`P@cH5"([L"Ef-iepJkA16&`P831AER@3G'TrSh'+E@)LFVTUpF1M[
c,"kkL$qAhE,qmaMFPYa)+,P`!QQTLl%2!EVFQ1%"'cm,CrQ98"NAN!#kZS`%eh,
2R(8H!lDFprS"KD0"`[SaIJ`-M@9Y#SNF0)MleEA(&f,ViF6D-RhfGP&XMBmKHKS
DfB1ZcS0CUFl%BfELX4!r"UF%ZK#''%SFkYP*Ld&Jc![Z4`963G[F4Jr2XFYYV"@
2Ei-k-e!Y%*F)6'01MRrN!EYXMZMU9Jb6UkYE[*S43`PM`3P5jL%Q*kaJ%d-&mdY
hiL85fml2*"EedBZ`)$4(,9ZT[rie1rGTD3Z0Y)AKSaC'Kba-Zk!X59ZB1RDK2$4
NBFUCD"*(VcF0H@fQ(AXKl9Ml8FGH'V,32RJX$pfqI,ha'Ai4T5kSIc)bq*!!'(b
%b9N"+@MiI-iAB9$FE$b9Mm$*`H9hY'rSQ+lGd$'V'FRd`8GiB'L`KZm4-mcJ361
aLSd)62,%!ViVLTZ'JPEJK2$LPCJbE,%B2T@JqGKM2)"XC1Y["0-"&XG81[hLe@F
ddF9j3(%Q&!!G3PGLH,`HC+#%KJr"82$$bb*C35`QYJX53J2ahT6Q#"SrJKQUm[j
ahjm+0aEZ$)S#KFUF+)2+K0)*ARYl#![+&q6YLiZLLbibkl6Z*&a1-BQ8%lXRAM@
lXm3)c[*"5I0YVaM'lB@1NVX%qlRZ6*r#L!D[$4iR9lPG4&KGB2G5a"`EE`m*M)i
km)3B3"6X%LVXl8I!FAVY')D9ldG66LJ[GSEPJc5aYGSAh0UF#)2@%AY2i)M,Dh(
RD5XD!TAPj-+$kNGV1,#&D'l-j08F"bE-4&IZdLXN,iKLNUrKU0J+9TaiQ)FRKU)
ddi0@BACZ%deK+XN&YV*JUMe%90))b1B2qKldYa1jDIIY63pLf!L*dHahBT!!H+K
U2`m$,cEde4+#)H3[HIMcLBHI6(qB'C654A*TaZ96A5,B,,Kik2IrR2l9l$-9dU,
mF`3!`34*@RQ9ADBLC`Al3)0iFbSe15SJ3[cM"K4f9*hkiT2,FPH0d0ZPQA%K"Pl
Ud3GF'U2`"SDC-S8Kmi&HN`IC`(!E8dBShAK6QC%(K40&cZprC+6Z@Uj8fMSbHEL
1Dqiq(PElVXA@iFaR!2ZfRAJf,jSSdC6qD4#DQKb@dY413$42VCMDDGU+UC@Q"UD
Y0(9LDY!dJkQ6TMP--c60BTUMk6C-Xc4Ga(3E65X`AD4T(Y-+QJjJQUIT1+B$0*h
#G*bQ,NbRD0U,UBZQICMfdR3%cQIH6)#D#mPre6+"JBjR"k5*2hEmXH*2+riB4Q!
)H8k5'(h&[a*LG(j'BH5[Xe(J(bZiS+XEABP@AdS-DF604,Ll(*KFVTY(N!#66+N
#f!3`jIS,',p@Qrj#*qZV,deI)E+q&Rr@-&RRd0*6M0XfhT!!1i,KiElic@EH",p
#pql5&rr,YflrkZM&[PRH8M8hq'Y$pik#j+k0KFJe)%8$iKTSkP(VrRLYbS6@0iH
2"K+Kf`kfc"dlq$)Smb"#p3kNZ)UFHH(+rl'E$*3KNMD[SpMjmlq)-`JqU'"VkE'
Z%B)+ULemLHVVD",h$M-Ae8e,0!aQG4GIVTU6`FhrFEEkHQb%,[mD[dBB[i"$km@
KDmF%UmM$i-0T28%J5-%JDDi6#UABETb4cPkP!AAGD"`$'LhfXI0RTFjJZLa%2+E
@1`G$I*!!)`L,P4@Bb`Y3kJbKDYM-5#%`9C(Pd8e1EchT[5G8,"5L`T*(+X4`2lk
SijEbQGAN5i1INGj)'Vd1K%4mL8&QFX9T6j`ZQ%SMFJG%S6M1FM&9Ab,Q5PE[C9H
#S5RLUpBa-@4cA!`EJN4Zmq(l'I[@MX)p9TI'3)k(!fY'+S@GP6&%$D@ccR,JiHM
Q4aUkTXXDZQEC(ER(k&Cp4Lm2m,1X`lFiUVQ0jbbF'R5E',*ZbJMU4D9XXj**"JV
TMY3S"A95A,3!jZ[Cie,l!Lk$KUcFS#A*!"5&16e'&aH$3@l2k@Q'Uq5dbPhcdVA
CiM3&bd!K('KK)"mb@9c[&e"E!3`%A#3kTV80(EI&!fjkB#JMMhm'C&)CBPc,+BR
bmF34*M%*MUeI`XK"lmVCaRBi!2Z0i1(1iQYYjr6U+JI&`9VGNl-kf"JU*[1[dp9
!D)%qr$XI$S*Qe`ND3fS`3a9"qI9-RJ0i#[CFSqb@9)R%PmQ"Tc%2#"iLBXK`jYj
Mpf3BIj!!P(N-a3CRN!#`*d0Z8QaB*JChUZ!`MC-lkcBcV*14Mf(JITKDKqm8,CV
!SZ44LaMHj8@IT#fD`++H)[14Md"#5!dkkP%B'rY[-@-4ZhP9$"L*#JG@8CMjlk+
kJFB4)[9[ILjpq#3a1+NZb2mF+XJ5AC!!d4X-&C!!)%X83BE5"4Qp4!mF)mMSDb4
)J%l4@5()k&6L#(Y#N!#Fd%VTJRbeXpJm9T!!d@B5C%S(%E82KJT5Zj%3C)N#aBL
89Ne#Q1&AK6$0Si4TKaNf1GN%TJV2mIpNDKN#IP0)h2C!11C-(Mpa%T4p$JEJ'4d
UU2qmp+qrBN&9PUB*bJj"i4rUSQA0I#b@aJqbP-cLUf9T5jYTU8C,VFT5qe&,33j
Tk3GT5kfm9"kLT6h+dZD$,,e05peT5hYSD4-YE9@@@Sme5#`9fje,@pU+TAGTBHN
,,rbIG-R0e@N,5l'`&("kLrJR4K,'(0D0Z9ShCMDK*p1019T'aP`be*M&!#8&JZZ
-B'+B4`(YE980B3k!G(Uf@llG$VEdkpJ#"d%KmFM3`8HZ,M,Spf3R35fMc"SrH9d
*NeV"l%Bpc3#%H!#UX,N-QSbJG4$F2(qD3CMmj#N#ZeVGKJK52#bB)!8G'KeRlD-
J4TiN&Vq5rc%Y@3pieqmk2aDrc1(F[",1R8FcpP[6YFYZq9k$)i+fiCE204VXlBD
#$a3&GpHl,%-k6*'cp`G3m$aN)MXTZ-lR0UVaQAYcl9qiaqk$c'c5NGh6qr&3ThK
S$X'Bi`+P(c8aH!TYEJh#Q,$(j"668h%%"J2m33p&#0!*ddZNUc#FA!86#FmSGbh
$"5GMHi*PecqCkCr`-b9BqDG5+!a0J@fVG##""aR$ba#&b3!#Q6Pj+U3)3FSr*c&
)q5'!,(,-J`&Icm"aK3VEFUUK0N0,lEc`Q`1F$"'AUah&m3hr[*0HTr62rea1RcY
%8%k,,26TPE42-cLQGdM9HSG8DiT"D#jL'Zj-*!H6iKpL!P3Mi@c[ArrI1%5Ji90
jdAFSj4BfiQ)S-iCMdZ#&)-(@eQBma)1p!JJH`lmU`5Nk(,TqG("!0Rk`q+HfFm8
pcpIcJ$R4FqbrFXRFmUB&`b*,NcqJH6&F(j'@&#j,U8&JR2ra)fkiJSr(31C45c!
QCE(*rpc*`9kcP46h(2dDA9(b2iI(cIjL-6D5Plr1S6i$S4PP-CSQ5Dq@YM@)AeU
21BD(58f*VJYS!!NbFM-ad8J%$B!*VTL!1EFMhF50(dX''`1R$m-&!!!M'd&%3e)
$!&IL$e80CN3#%#(LlP6[`8P1[0SVZCJV`qJR15mAJKa0VH05US$'R#FpVQ!TilV
a&1j1M2cq&T!!8XI0R!%YBpfZ'MIMGM*C0jY*%aX-BXE3@qYDif3F3qeTV10BQf%
FkY"8$68(*D,`prpqlrIGGm$KQI6CCjpjIJ!GCMiN%4![%!!3%!!385q9LEpSDX)
ImD0A+*!!dQ%9$PbA,1b4[-EAP+`aC6Hq&NN-HY*%(BLQc$'cjC2P,j9CH`'FXb0
&RmfI'"(YTNe@K")E&dF54hV!!N&Di'FA1Q`H@0QiDk"-"+IX%'@[k@m'9MBYTS(
ETXE0b*61Z'MV[Mf')Q+[lL5&IILd!Y1Q3`L(@NA(eb-8,1SdjAlf'T!!#5$I!-*
Z1Y&f,P,da53HD,pGHAl5TH[#Mc&Z#K@pNfBfQqV%HA4`'8fD2A--J9X81d,2CSi
pGr@G00DT3qQN9cTj)SP)+6VeS*0KB&jEd16q4K0lHU2XkAEekGahdMTH%CfN$1[
YGp)LLAe[Fa(S`Y"lQ$+$+qSpr%c(XXAD$mF-"9fRiqG%*2&JR[90I',LR`AT!cp
3iU*fA!+LY(%c"[CJiP&-E1-6pq"RGb64[S-qk"*k9[Y40d,"h6R#%eNUGHKFbDF
QTPDc+j2UI2[lQjSB1X3@G(ND@k#E9XB@10$*D@b"BhS2XJ9YiP@fS1e4%I5"q'@
`H+bai'5rF-8MI,'%&+bEF+UPBrSS2QMB2DB,lSFDV$I8BpXM5dq0G3!jAP4j2QQ
S'(r-A@NciQeTY0db+,XZY-mm-p5-!Sf%&R-#r)QCXLFQh'25d6J$jE-&Y[Al9Hc
)a+irB!L`p,F[l0rR@i)YH*NB3C)AT54Rp29&kp+M5FQSLaBYqPC+0286jeU)cN[
CD@F2jQ4S'I*+5dY*2TXFA56fIJ%2p9kapNT"CYe*kc#1YFI3BKcAVS!*[B6%8!$
-kE-1mm9f($)B3K@BCDH",lCNMQNK`aRM'@FScM'KK1+)rE$C,C'%f13'Zp+8Q!I
XAa6V-JTqiEb0,PcT51m'Dkq%%q@Bb8f"GU"LEXlJ)U)`1!,'&Ic+P#2mf("%G'X
KS)B4BV,6!9+58h1bG9Tk9MBq$k3RCkAfDGRD-5hhE0fCP*`689&6+AcJB*BZ*re
-0$8e+e8CLQEVNLmUBj+U+1LVK(PPDKXe`[QJAG%&*jmh1dL&X@%VA,@N(2GB&DT
U95ia,%&PX&KB#2$!MG144%'f9LMG`KejGI`b!N"fI-50TVPAKB88%[G+ch9mRIi
R05NXD[-3#"F("jj%Z(ahTA#!6*i1G`CP+Q9)[k%&@h-XV645+-K$al!1!qd!mL4
!eK@)LF-k4+#8Cpd%GF1!Kcmr+KdXCY$'Y9T6lLm@+X1QT#-#ReZ*BH)MFKDUHH$
i6)#Qh(Fqa35[!@U$%+LU"Z+L+AG1+6i14)VQV'@++!lGISGASfD`cMXR6,Na%cj
ZiSU)dZ@2i(#51U(c,0la!E$C"[C8Kdh(@G34Mll8e$6263q6UhKJH@"aGmZ,8*b
`i)m$'Aj*C3'&!B,8cG"5-kZG)Z&9Jp0k!XLNaP[jb&*LqpMEB2Y#c[B93$4,E1r
V9GKHkRkYQ3+9PeD51a61L##BIp6)VT*%b(b+#B8p**!!C4(V8e"f@8K!N!!lp12
IIF(FTBAL3M5MBZ&#VKrA2&c)2I8,ZE@AVT!!-L3HqSH(cCe@5mIA1F[8,5#J186
2LGRS[$Sqf[%q'eL2$cV@3@)"%aIb@+V#*04C#bNZLmYR8b"fNY$fpCe05STQCfK
*@5PDeS&N,FZXTCl0eNAp&PR-1T0P2X0R+5+Ej&1bLi5hQe`bAbZqPY'&T3HQ#kT
!0c9+f8P9(6+L%3&3K`aJbCL6!ab(QVNaC#i2D*2"J!63P)cPi1aD$A"@S'BX#FU
RP%(Qi!*LLekiZ@R`3d-,$rR3iJ&qh9CTB43EQc2(-VSfe'jXMXk$SQNB"9&6EZ#
l6V%cFE'$1$CcF(kI(N-iZak95d"1ieSFdE6a+'!N`8mEr6m"N!!*SN"abia`eJp
bKB*KRDcIGSHVD*f6pGY#USTipfZe"!j"U,@1f)P!!@"+0)k-1K4e8iCFlT5@A%a
fXiRh8$MIl9BcSff82lA$Q4PYrG@HZKGSRK*+aN#)CR,%bp[S`-)AP!00SdN&PPF
8B!R5cB0TUkeGr"*"E%rLTS*-&@"b%9&"CkLC1ZMD`3CH--%9'`"+4%'[G-$ZS4A
hVYdP3P5kDYP(e#e65&1N*Fpq!eMLGHG&&cP,''mUeI[YmDC5)M9dlGbNSPla0r`
8`1+(I2K+@,"pF#m('kjfX&HUEA@ijPCap(`RiU,#c$F4EJNT"3aE0Nk0*KdmQak
Y#6QH01LSr`'jZ$`a3J,Jj'9@TIdQE*@fbmmUEC9I9CS,iVJ'i!d'2LHh$#aIYTU
UYaG0`NY!F"(#pJk8Z'5,#mTL8)J3,9#`d0K(*rZ)X)papQ&J(hUBqS`ePCMU,-L
q,ejM6de9'jLJDJ@XY!E-YCX1$R"jL)XSM!,+ml(pFl53!!S'XI--I*iL"Q3N0(8
F*"+*Nc`-Q$-@b)hQCUAq4-[*eJC58k,C1HR1U!k)`Vjk4QYQD8e5@DRb1dL&-$c
cJY!ci2PTq0#cMbRf-8%I(6UU&(qI6m3"9Ale%JLEBA5Q9L)R40,aI&GZ9j)hhj9
e!G[Ej953!-qS+#Jf6DDJG8i&q6TY&466m1a@'""UZ['Nip[iaGZNLcI*,VE`LdX
`BC!!A9b#RdUCiKYP&k2MCc[Si[c&3XX5iQCe0B3!bV1bdhaIrJBBSF)k40N1G4R
86rhSd*TlM!%fbaKJ)kXZ%jmT$"$MK86R36E*$N)G"b8'!32F3#9A4bV0B@@Ll1L
2YFX(Xp)rd-+3!2if'Da-LpEPT#46,5LE@r98reJZ*cXR@Hb9b4V[bjc0(S$ITiR
d0dJK!Bre1A'5''VdQ(X-aR2(-(!-aFIl80#QSllZji6f9dX`U1'R$`9D0iUcRC'
P)`*Ch!F6+T'd[h[Y0hHJN!$a$4(K*+2H90I84)C0M6XK6"lkS0$%R6ZXB%V$Up'
e[@-'24C*2*HC1BD+BIHf'CI"4)eEC%bdPM+[%8cheGP5jM@#14YM-ZCFim`mhT%
UJkh5aEHhFN,9+#fR5Sh#1p)N3V8Bc01#ic1d$i6qDmef-9PVVSJIBYd54J'b3,4
2("(H'fUhHhCTSZ-6)(rf8A"a8p2N,8`Xr-Y$68+D1MSGKjBH0[#(4G-%1aJT-k'
pH@T-0FAbY3eCER5pD6rHHmAcTCPIF(aYq+RJ-kXIp2kKrBmkrh,V!Qe4piZ'ZFE
hp3q02MGeHm3kmDY(IRlRpbIrl-Krk[YYrlH2l4mFk0Khk*-,ljSZKDlfI#Fbj[l
Qq15jEqAp+222crqr8rrhf62aXjI6-k*QhF@F`amFc-h15[V[U5R*"p*qA2H6%hp
ap,qprFHZZkr@0YqlqIf@2lRedq[rjBIripV5kFr2q*m2r21drrU$Irh`lpllrr2
rckIrqq0rI1hVVlbeq"Y[&#ejThKK`DbArf(MkrRI6Ib(EGrEr*mhr@EA4l[rrV'
rfI(AfaqZr0fUA`5@VAKKhFmfr1hDIe[cbcfrI[bI5[rPrPqeIQlR[jGpqHQ[V&q
qmY'+Vflj,&CHq-@5PqBec*l6f#6*39BDDV!$f9V'!9l!YJNhl*fYRHBjSe*Je4%
D&AI!d$Fik%Ld[qdH5a2NU2B*AJa+@"-+Dj+BEdR9(aD'U4ZKHm5f+,kZEEI8#@r
Rj-d&)*FBUb2F0,iBPG'S'1mjM*XZK1kH'M0lZ0-'3M04i"iE!9*lNk0$SEYQaqe
h1D#,8BGI$EV(%#+pN3m$cc4I2(Zm&XC2VPcc#G'1Kl3ENrGJE**h'JpfZ-H-p1#
3!1c"IFi(*`)JDILejX9T)R66,*UQR)$YUr2C!XSBf5f4m%UBZQ%q6(Z11)XV$B&
)iJm)2+f)5q'@KPDSY!r!)kL%($Qa4dAkGZT1)Mj+a6B2!JNRN38R-C`2aPp,#`K
j1lTfbLBlN!"930&%3jGl$02k-0#(D5pM@L@kffR!#A+mSZCJ1`eDE!G6M`IZ'Q'
'j,#N$K6I*GH1H69P3QS+'G3Q(Gr)+kb0[-*Uq&3'E"B6X'QSM#5@Aj1!68-PIYk
3!!'Ea8jJ`cYk1E""%980p$NL5ppGfG$klPFXG[e99%DCXX0j)dXRA6rDG%Jm-bM
ZF"0Njm4JC#P#9f3U)ar'&$d&K5bb3@`4caTX,`kK-+'E3H`0a$L1YbQ5H(3kI4"
EM#6BS@Ri3`S"Vlj2fFSZ`103SfDV4U2JQ9i8-r0!`)L1e$9I9UeZiqVD&NQX[mc
8Y3dr(mZUe4dbGD(M9jlQkZ,Xm0!TKU$-IS`YL&e@X!ABc6Z6,F#+$`BTM!jfj5C
If9R*fPQe5Y38X"(03)`b0ASfGfr!Bpri2LhpBM6pJj3$Z9TZ6NVZfH6dLlmP1Mm
*e@l'fH5c@Nk+aLT[2dJi%-TV'1Rplf&*lc)r5HqBAk6hI!$!5ZZ3!*'+q$b3!%j
%q*8,)#%,L"6ZEZ'NpMlKB15c296V(M-6LEDU"QQ%D[2Tpdbj$5f-p)0arjHfXNa
FCd[k2@fN6!3"&T2),NCfJj!!i'4ATHcbh3Vjph5(M2`,b"KNMbhjpqAYP,K!)EY
ak#!2VjKH[!K,B3mY*#2K%p(8,#dV&D5BlQab6PT8Zhc!E)kQFUU+++81[SjQA-T
'GNjbMT!!afkVc0",Br,FV8'%eA0hAempSkG$pZXTd``Y%!c+kKD*Z$rq+52ZHqX
MlVNj-#IZ89%ilVHJ5JKZG&dHlMk-SF03eY#R)h-2NpVd3&'RDme@!C5G"mm34QD
#lL""6fVL)Zl4@IjfX3JU34hR)8-B0JpcJlqEY#$h@&*62$L*"6f(#X[MF%JQd[)
MGQSX511S%l*,1Q5AC#!"8M"4Qf(8KUlGXe)icF1,q$C(e)X(-)@1b%0YI)1T@[(
GU1A6NIK-9+#phFH(edkkc21k"l!&ccqMqpTDHUaaJfE*"0&PFCTrjaB,595,[a4
19)YRqLHUaHeqLHU1qN69rXM!mK@Q*b1U1f1fSRSmQBR6"PY4hAR8Ee&p6"(9RG2
#L'UTVDMZe15L+KG4E#4iqU)kaL&[2E,kq4"@qHe1DC82RkDiVM"9&pHZ@rk*+m6
4`B@e@DIA,0GUVF6UGPYfKq!kN!$8L)Z[2-M+Mm'CTfN*U4K*Cbc1#V`HNE9cFAX
94e'%&!iK%YUD"b2Qe21$T@Ym@Jphc(KXMdC%@r`)Z5Kj*`4NiU2GKhR'qb'5mSe
!H)a-$(mH9Jc[q#Q'Jhk*B3A%X)35IaKCi0KB@bF-9cYJYKeUeThA,,!`"8@03'p
*NJmKhK)LH#")4E&@ATMV*B14qbf[Zq*GdLFj6VJi&-8HjedXVdXQi#AhAFjVc!N
N'TXY,*QhaTXpcI4%lR91TS(XKGRh9A*+HEabGm)LU00L8618Za--HSY&DbYYJHQ
ljp*[p'fcQYZD#GcU*hSX#jXA(E*Bp![8+8M@TQGZ#A),'DBX&Qba@q[*E((miG+
QlVD&Gp[ZdR5kXRZL8mab'F4NXrRq3aedNIk-M0dBZ2T#-4h$G*')rpM6%!&'C0!
Rc"`-$,K`dHr35q'r'JkY#p6GS%j#`#D)!TYAaaPeq1R--54G#[&(%N0,*-(k3LS
6V2TGB)h@)3SP)aZDT)-qp5'U-jp5RD'#kD8%!e,9C&49&))Jk$Vaai'JZJeBISU
EqP"b*"QVpM"@rI1`V(VH6eBeqm1U$CUYmQIHN5QrBQ$j#i1+mPmBp&[j2G6GS%j
5P6q6&b`B%*&R3@qHP!9IUUJU#i4686`M9%@ZPM-4"I0j'&pD&(*A"Hmi[&,@8CB
4`aYN'C!!bM,JMm0QJ-[2$,MZ9`E819A((4&Jq"Gf'9VQFRHY&XSFFfjI9I"@UC1
N0-'9GQUXIT99!piH'I"Q5UM@a9%G[20MJ4A@"IGq,1SN(F[HA0@a&Y4mq%NF6A*
EVaX-llEQK#%(`TMJ'HA%)DC0)HQh(J',HkL!C+%32BK6FPAUHTpT2L,'DcIHLjE
UKc5,-qN2Cj&TM%Aq-5b,[1BRLa6ia5)lC*R"(,5ampKi!6PbhH'bSS"P49(Xh0i
BK"1k5aIP#)Z`S0K[dBlVfXDA+Q!2"LZ0NU$i&%IcIEKjKb6Q!$LF&bNU0r*NX3h
Np#T[j`%AMbiT6B!J,*3'THf92c)1"CX[)$M9`Gh[K!`bj%ae#'3M%PN@PEH&"*%
jZTP1YaeGM8I[Fa1Q)Ce(Q45EIBSC+r%$D9VSe*KaJ8`j9CLkP"raap4&d*'QR)c
Pi)aPbRdG3BAbQdEZ`#aR"LlP*cDkh'-CAXQ-S$bC$@FEN!!3'H6f-3#`QE+J1(q
`r#+kpI)*PrQ%K1LZH3'44H4%p0KP4cP5ce(bk!K4Q09S3q-ZUc6SCLjF@S3-*M+
HJ+YA)rGZq5%bNX&KKVNTQ5)@h*!!6!+PjFF-,CQf4Ld`#D(+Ad0Qmd[bp!*L"IG
qqNNbVH(2m#hV0,l&+KiC*h1!lC5&@JmU"350eSc5NPpcA9BYH&M@p$L6M",V5`a
TC!*5ISUljrAND*F'ZSHQ8qC`ahIjHjQ5@84#E1"NjT4c8SCQdk@SI"UjF2X&lck
6$L&R+e+qRS%A#JR$`!6J-4lKahj[kF1DrEkVY)AqApm5D'Pe'BPd@ihMHY4(L$6
6Fm2(UdZh9jq`p!d#Yh+P@cPB*-F+a0DaX",%llA-PX`r@9KT,Y3ZkFp80`,@-m#
(i`8"pS3[aVG9E"3*1"JZpe*4Z"KQ@aR-`-#hKaI2@Td'"VkGFJ1$mXA8p-H+HdJ
F1,X!#VZF*bPXD@@pQp83$V"mVS@#!FXfkHhD)925+C!!Q438p$e'Ph)`h+YrIV`
fmcS!EZ%[FCLim%9ZBdT6$-&Z1jN'`pPI-6@Xp5#*3da[[ppFHThqAhppE8YVF`L
Q`HDfSljY))JcZ[EFh(McmMbBq(6aJhe-$@X`Khf3!)SrfVZQT"jKI42&p3,e!%K
QSGhiTNXrQ'42Z,#mU9N#YA6S4Fpl"!P3S0Qj2'Hcc,0CCYSXcpXX6pNXRj8YhE8
EVdH[afI+RqA9cdS8hbcjY4N'$8SN-Pp5*#Q40Y)[6%Pf')22+H29b[G"B!eEhq3
ERmj$il``B,LTK0h6SYbB%'imQ&!QfpS#2"&6!+Z(J`%R8hDpU)%KjcNCNPHFQeR
&qA$BLV25ciTcV9m9CePe8Z&Rr9@6#Pk99+#L$#CeSbLcP8"DZRI")f5Z+A1E!'#
G'SZ@b3Y8XXffXXeq0HaQYrLjf8Dr0PZL'2XKQDiR&Hk)d+[TlGMbZ8"aTaKR4E$
HA`QIA45r'YeCMF56`'DL2'eJqCS%#)I&h*66J4plH"+$GqA%ARP'955'+AGKVk5
1K3q'8mG#VhrU@'M`4afc[6)b%K9T4E*#6TSZ@M"3EKKBrNZh9*5a1'MKEQ&,Hld
&QL28DDlD'CpfUI"#em9Q5i4@qFDU#bp1SYILF6,5!V8B8Z&5(jE#Gd1failY$09
b3$E-`LA5Y+05T546p`46plI$U[ZBRqS1qDAZ6(SBUVRP$$#L#JG"&BXlYd!"V2*
YdU(&ZAV9I)FZ-E4`)L$%Tb6H0+Y,*)eCiDeDaG*952"`Q%pq1h0X[m!#PHf@NSN
&+X,-%$"hfp)iS9ERM5X9-J*)1[iY*,%9E)&L*)`2d!J'L[MLda&8N@Mk"+jf%*Y
EeTeFF'j-Kc"RidTCQ21mBNU`$'6qR'RlKjJa!CbK,hUj14b&1XrCQK-XSf3p@rH
20-k6$YZeR3Hrb15d9b%mdXpQNdFU#iDQQMRR)!pYAX!(6-!`GKT"c1qF6EF0DN)
*MjqZ%U#!,@LUKbqXrI[aRr3(L28R&h#eP-V8NUqS*I#KM9U3!)5rZde9bdCEY35
i!4!PC'&U,j68cUpr[-Ee#"N(MURAPh#$L-5LMpAVAjCGMmkrf-@8ALJTr3D40)N
jaI8S24hafq4S0E9,Sdp%mH'cp)PI6SB,XNc&"LdRH3!a@4%)5ai*"&5kjZ3#0U3
2lF[N,%h'h+TkHa5R`+T54Edm+)Q%%GS&9Ed4@mI!UJa5,kY12089HM!VKEC,IY"
U1bI8%pciHQAM5-ET3,"d9(LZi5"'3Fel(16*F8%mcXj+8e3ae-0"!lR+HC&R5bQ
Bc1hCer4[A"RVCFT`+dk-hke6P8&ZM*@4a))q94Q(E"dC[mXNC9"!GaN13Kq+3T!
!caN5*HE8!3eq[P6!Jj!!-*[RBFLMNN+8EEIP9G[f6NQdE$BmVQbiXVAkKVH'`Qf
imU*m`pc9S,,!Me0c)%V5RU80mk%RYZ%YDQ@6m,Qj8IS&cU$e''G@GXSF@c"@@IN
KFciGXfAJKcrQQj!!'NVbb%hcE$PflqCjeBr,+qXm9PQRKkfX-rbXV*2mUUcVP+#
2YN5UQQY8`c2$NmJDEckUq&SHM%TN"%F,U[4KBL*@[Dq@6d#cAQh+`!5CqQcLclY
N&a`ejFk1NjY#ZUcT@6Fl2JDZ%a)Q9,N,dA4Gdb%CkN0T'J,"Z3YI)3H4$2N'3lC
KJFBRQM`+%UUBB+TSF@kEAe2RSl"bQd)-Ldd$brG-XD35`IT*B1V!JV#2lB8%hXB
bqUr$C[4f2c0kJemC2Ff'[2IbC%mmH3D)LJ#12Td&Flff58'UEA#kXX%hQrHb`IY
XJiq'h@#&RaZFlGF'Ae%25`DQGM,,aJH#I-aTf5BEES2E33)-R5MfPr%ND4,+SU+
1!,9+KV+VU(0![5a$1948%P!ri'`QS639G4dSP``eU+,!USeQLH%ibU@LN!#)Y,'
(LjJ2$E1@-[Gm+h1dP0%(&$#rRUa#Dc8UQ8cAp+P,HQj+AG+aYUT,1Vj$AG)ffp3
Pe$%RTLkKYMNlH6#1#+-pM!LIU0G*YS@jK%G&QGQ#+Vp9GIPibHAM)HGBlfAK-dl
mYUdVdS!NZ"TD-mJ8Pm94mB!S&T9L*e,cVNjU3S1@T3J%(CT,66'Ld99qTI$GiBR
$YT-"Vdr2N@dUdXZ45cM5Nq4M9l5KQZYd(Z+FLa$F!,J-U#1bicP4Ui!kjd5jRDL
AJ8TbSP)GJEXUFKU3!0GP5%e&(JAU&4PU8%9G"QUh%p9&#P+HUejj(9-UVlq2b`c
RCFE*`QeEHHfQ`0"@+A18DL[P*lQAX`k'XI$qcVN,hmR+L"lXkp0&r6$dGJCH14$
81'(T3G#UPE*H'd,LY&&4+JqB%KZ(`0E2bUX3CKE!-ldecIF-08PF"J1"8Zl#pTQ
li04[M6[iXXeXeiB#,K!8V4ZidFfFkmkZH(k(e%fhU30-!61%9PX$)dB1!@'QUQb
a+&@D9l3*kqB@f#@!9["-1)"@X0SrJ&E3l4G!fe3MDDkI&6)UFXFLlTBlRDQU3GI
`T#[9pbp[c4f3!%)q-'!HeLb6c6#Uk*5CBb"3%DMGi**3)+YDjm+!5+jDQHT'Q1T
q'eCerAkUcZ5AkXTiSL#qD94CHa3R*Ii%U5&G-QqKK$aShXlcZ4DVB)Nh&-1N06@
)A!M1,K%Qi8lF9X"qdk)Nh&("(&6PG)r@-")k$`ZPXG5-D#S6-pZ"dc%-fLTYPKN
'6D1XcUc#a8H0I2ES!9`FU&`mF2,CZmQakTZmLkcfG*HK1-)AjTM6B8EK(1dKi3Q
m*4`[BTS'9`fTFD!#!Hb(K'2C08)A[b@#k5-GEi'd4iIZKp4Vfl@Rd"aQLp(&,rP
AISAdb%kR5if(ZMbKfPaH$@jm49Kb9B'8-G8jaP4R`c,9C6qC+YXITTTMNN*D[qj
eKV6UFchrZVHUJ,,U2Npdc82R(L)Q`cR1#Ff-ZeUV)V8iH908[Si4$H4'fL%rAVL
&drQT9ZXdH4HVeS[+9e9TqP*#aKC8U'-(f1QQ4Ta,@+'4KYDSfD@BC4590kT0"("
#MBDPN!"#B4pVfTX@)qiaYS6j8k'H#Ti5LTjK5d*CZ$2BUc0aTc-0G5)$(8l"i`N
YbKM5XCH,1XhjDZ)%E2q8QM(+F489Xf-q+cYbTXf4af92PGJm09MMb$e9(2R#ALk
b2I)ZfC(ANh0EF9h`T"[Ni&h2,kQ3!)c'bUN4pI@%+,bMAKjML"*T8GM,$Lc%BME
8VENAVJ$!2m%5XFeQ8qKBUpR8fHV8S'k+$5J61m0fpTMAmF3(8Z2S-A+$YMdQ1db
'G"Mc9MD`ZXC"28KXFPlHC)HLKY$c4"+cDa9&a'5+U*!!+D*#YLhE)hTee'cDE(8
,20'dk3-+K4BHVYRG[+,MHF29c&Yc3h#jhDV[B2cCSj0NVLFGi98%SLUF5EY&CSe
NpR(&p5SPfQE2Tm&X!0AEA$H"&elN35Ll-'RmHEiJ`DB'(MAP%!H4&[$clI5MjQ5
&kQ!fjIik,MA!8*K[1NJZDmN"8&KJ$'Aqp(ddp'(m+9@Pj2BZI)-VISq8)B@[%@Z
6f6#C&r-1mhQ(Y8bpVb&4beDfq)(LP#qF`BCqb-a"P-aSS36[jN#F&`AQV,G*l#d
C%)GNrda#Sj)ef-!TA[#RE-Ph0TmJH&""ZmUfXpQC`GT9+5aJ2&-[Z'A'*Y6%"8r
UcaQD'L#K)CC*TGKDR$,5kQ"CZ&Xf3@)VKijFNJif+$(K&5NFAhKiFRU0#9jc`2B
*q4&4rCeJ&HRh`eDN,Aj@T$2mUNL6@%@DYTH+0-frLR4Afm$baiFTb6+)eE``eHQ
SdJR%8CicqI*(A98C66HY84)3m#B`,(c+P&&3iQ!N!ckUA%E',9RC*haI,Z*%j3d
C5CP(b`fZHJM,N!"#@,lq5KM#-Y1@X(ap3L%XkCpd31)lPU3JA#,G#fG6NTp-3Pf
T-8$DGKSPejMU+1jA2LcX`miq21c$`6k#l-2,2MVGYCjDER#m-BfE[-+-ST,)a@q
kH22YpZ)Pe25b+-!%29a)51j+8mH,28)GmY8BDUXa0&4Mb&*Mk%D0SDiD3fmU3c#
q320[8G&d-4kXH6LiqA(`k%i-6(4F5r04dm#LT'Np6-JQU*2fmrlCJH,qfHqMk@q
p-RLRAf"3216UYk"`bJHl$fQrkVF%5,'(&VRklD-+iK-Jl!&5p#G!H+B8a!8J2!&
5r!8J(#-+iPdJ(!(+L(H"#-*-CJ+Z$8+"GB!-"LKc,J(TjFJ5KL`"dKZJ$#0N*pr
fqP`d4a[IbM['@-FB1[)YmBj3!-[@05aETja+dT1D*Q#5RpFpi4%[eREbJI(L(N9
Ykc#3!+H4m4%kR%"6Gr`+0``U+6&T"a+6GNZ*3f26P35Rj5ZF58CMC-3b6!pU0mE
[i5($8m9(N!"1JDie6Z"`cIRd6$%PQPH5PA)`0jq"ZD+`B'k*Rf!Zi4HBZfB,TVj
h#L"SPapJDPG0-,8jIVTJD[20[B1TJ%X1TJ+ZUX(8V$Er`&6"VG-$8j-(XhlmC-"
83q[r'M$9d2SI0jKUD$dp-093pUF"6$@8R4kB3R,S#P+%8@+6LIH6m1r"@0LRR5G
BT%m26pT(R`lKB*p"RX#3!$kp`XXq1dARZeq"H#P2I-`Bja(+"QUdJC*kkp'%3d1
&&@#10ap@K(ph"`018%M!)VU+0jTQi4d#4T!!JkacB*3-)YP%rC!!m3E!QS2)5r2
M018S*Bb'HF5MfG,6-'XeXH6i"%)TkIak!J39dh!P-S!pXCeIbam!S1iD[iN$'kK
C#I9)`5JV82,VM9UAXlN)"NJIBi$dKE#!G*fIJ,68,d#DAp-NE9RA`2*r5MDdr&j
UYLkX-4TeNN"SS+6+!!SMc@A0PUdfMR-MFM38aaZENM9F9VK(D[KYf8VKX5@QT@[
3A"`lD-'f"8U5%RP6F8YXhBHm%6dP#Ca(Gd*T1K*QY1fXkDpDAMcN$9,YYAKBCp[
`Pel34XL)e-V0P3[d#b3c-RBNeR`9Ejk6#N+@m-hA!8)I1*K-DG)eeKLPV2A**pC
S9-&kaPB[K@@VHIkaeDbZUYNUG([@JfB(1P*@hLI%V!FcaaLc"3!L(pahD&r1*pm
Eq0R!4`2I'Y`dm,9p(`kQ$Ajrm29p'`E[$@B0*R9F(2blJG&p(hHNG(`mF&+`r`#
3!bXE384$8J-!DEX393YNQ3"CEC2[eQk8@TCQ$00EKVb-@ZUFfj!!a4L1`0Y0TGD
aP@l)3NKDYlAGG0I6XqY6#)G9Gcd-Vir0H3`B$M''L"M8"A91)Y+)0a(a"m-B%'*
!"%')HRYbFc`lBZccrIr[fq[ETTY!cVPrpc8G9MBN$a%3%!!3%!!3%#(Zhp8V8Bm
(Ia69&(+NK"ACT5,IK)[F8U9XfXGFC"$q-p4,VKN6'DE0NQ!L0LR%K&(4mZK`%-l
"Qr6eKa4RI@c`6M%KTFdp#J6%020d0A$#((2hUA5hA2*ikQdT+cbHZkDaQrmBTN'
1&M*QqBIbT$M(`[SDaCHb3P%qSeZ[kGE*EYd3$B6DY"M#,XiN+8jd!c!m!2k0h9k
@BlGrGIVUp*bbID9TkIEm)qRD[GPF[+b[ReXISk2X!K-P-PLMA1fHS0KN*pDYJR,
k6mplKq#`(DG8K[2JYYEK9M`BjfQ0(PE-I$PA-#UDNq*8!N+&VG(-P5IVbF9'KfU
$80hU4UHPL4#TkSAeC[B5LMdl%-H2ZGjkc&dl&G%4Sfd%r['`'dYTmQkP,Dr6@0D
*(c0qE2MaiUFI2clm0%AX36XGpHA5M0)+MKV!@@A(TXPG)iCqmMI9c6SJ5E3"C5F
d66Sih*9'#4d&$,`b3L,0Z`iS6X9*5"ARUSC#c4c!A#&F+qcf)qQQG4[X)DfQ*bd
h)dGE&XK*PEirp#Hl[6LYm%LaePkD'EBr*)qrqV3pS64$KHpG$E6[$I8mAV`P`06
(kLhZJe1IeD5%,BH%UHI#MIKc1AK`kVN39,RA"FFm4h3NHXJppD6SETKqcIM"k91
l,bkCfKh0A1k,2UFS4ij*bTGe0a!fP850&dbADpbFkAM1G"bBMJq0ePZ-'%i3hGl
Tec`*KT2!F")B4SMK,eEl-9a1$)1h4`M4r`EIC`0$U,I"IA$YFjV+D1EDBTVfh(!
dmc&kI)'86$FYJ%dZ+jZece%e`C5rmLPIQUBmMmFY&8lj+jY5FLY0+6'ETUc(ipQ
+TT6F+NdTj&11dj6$UaKC*@8djFp['8`TP+Cm`kFmDjS#XNVd&8ljKNeCH6G0@GP
LQJ+b9MC90'APhA`clZ$bKY$dj3eZ&lCm1bmZ@9j(S1*U(k0Tlfl"akF)'0D2CbX
[,PN6Sq2kIebqfI#M'T-l-jIAh4&9kYM$QKJpL,K4cmD@3R3l#A%,BR9&9),Z1TF
dC6-0`c)"!T'9CIpLI"a$3,"q2$2qiT+e36UQrmFem``rUM%C*!3B1I5`0XM)@4[
XLK`qC4i0!lJ#j'b(%p&-PIa0Zlf3!%6,eAkLT@i("-lHE&-e-R8*La-!CS4#Xk$
16h'"-L8+--LhbcHc@a,rH+`6[qdX9mbGT4#S(G,(TrK(Tr((0E'L(jG[0[k)3@2
Sq0m(+0F'jGXempLYa#C3G,NeBiUbAKZXJ)4jaKm"T#Ke2IlG$UqL",#bUJ%-3Mk
LFACXF@ahebJMUV--J69eEL8TMVmiK8jT"1+BGb'14pcB)&64Lcb)rSLmS'YIBA&
DZYBNqrk!p8S,lCV5BQeqVXDqAjD"GBAP4e,Y1DP(5R25mGR1ZN%Q!JRKNA)PXJE
Z*98,)q4)2PX`l''E80*bIdjr,U0`V&EVkZMAbdHrHi2IdDprK8F[V*!!QX,(jqL
6ABd(-r@d4B6PSZ9+NjmCB'6Xm)@LTCRjZDCMe6h%9NV25G8HbC`mP1AZFM[Vl&#
pdp#9jlUZ6GIQd05ai"RBAka`mbrAp3GM!05'5EE-i[VdmV6pQ8FbRKYE2NJHm4#
Mh)`bEDUQ1'hr@$)#3KC5&dU1i2UjU0S"9'aG5JF#TB8f`H1"'ZCYaf+1@15!BSl
r+6CefKXXXNKdhCcl#KDA$a(12e*i3(1NY(KX'1dh-ESf,A[XBE(re9E1VZ["@#Y
Rec`$KF@e8Dh*eY&`949V)Q+&0Yb++KEEmU+Y1K*`f4k(M43V"-A#pP5l@(A9UX)
KUU"BAE-TP3r"JMbqTAj8mA8mJNf5+,Eac&P`%K6RUCGkYMUFkUABp[@Q95)dk1r
F+Bk)cP3aDlI@1DRDdB+0`PMRLqd,%PbDaChU'a'bh,Mj*8a'L190fhZf#@clIr+
)iLYVTpX3"J5MhP'!ieh(f4H8-jEka2UB"-"p+4e"*4!ApT5i9,B%-!Me%CZ-,d@
R(1LjVMqF(Xl0b4JV0HSK2@,(pKNIfiCMQbGlE(2R#0*`ZMlfCKcFE$Uf!+CQ(0T
@eN+6F@Jc2l$AG04+1QS51fTlF#4diHbSdB(er-!mpF"elH&dPABX$mbV$DSIdLZ
3!))iM9G$Q#MD!q'dp,(Kb&lm@82c5`d0RheTB@e'CPUCYZLL"fM40-eBeIeLJhA
q6-c+5P-RXhaALLfDj`h6[kA$[F1cA&49+d"hK*3F5A%fE&p#3+UJl,fZS2)f+IB
(K')HPK#D"lGEPGY,Yr&FZ4Y'YlrVk,rCFSZIBQpA2SqcpAJmISUpZMD+2CQZZfI
rC"5lbXFfipKcb69J2ID0qTXNa6BGqhU6FYYS%JjYhQkJfYZKf[b`81hi#pZ09AY
6E94lBXC+V9@lDik2RfTh[HMBUABVG`J!`DT1kXJ$`dR$P(ME18b)$ja,1XFFGHS
PmmVjR`#p4VKRTJI6m+mkKlP"c$peE%#LlmhdJBl&AX"3N!#-C'8V62%kQ!LYl%2
'!RVJ`Gh,`5Mb+d96"pL8dR&@i@%8(i,"BflY8IB45pTF-(9qj9+Nk@GJPc+J68k
Je9Tme!jNpehQIl+Y),X[qp8%QD,mSFB!C,bkq)2X6l8'f@3U5Uh9dJ"NTaM)M!&
QS'#E*(!jkD%LF&Q"pAqK9QQ2PeVpNMBdG+3#5%q$-&d8'YDC"led'cm-Cr%&Z)r
AL`P",e,5G-TT6IR"FUA1ma6rFm+0V6T91cB-RN*5!L8VF1F&A!X*P9ja,jm3ibQ
pLab+FYA"[Ci*iYjlbjA6RKq%N9,@AZhj`4lA[@V2'dMcI!--*K#$SeXrMm2`,'`
GM40lq2"*d["*I2KP$,q-iH1-KZm4%m3!A%@RUmhh"MaAlXh`A2%mLA5E*bR*fDe
ScSSIim@2`SfFdBrfZ!jql-R`lKB6$JD`T4[Jbec!Y!ZHCq!'Ri-29hZQB6ZNf[-
-Rc*YN`XE%Gl"CqJI$c(#e*8!P3A-rBhYR99+SaJ2`%3m,r!r``$2-0,QI`R3rMI
!H$m!pB*R$D9Q@&8#(9NI0l6lB'M(Ff$pYf0%M+I$e*M&Lb"l[%6fH*!!IG'6#V,
M1B(,3Gjb5X&$#RC&T29+MRNX$cIAJNMm[8Gac#N5ZbPlA,HUPG2FXA''[hUC[hK
jMdYddr)`*(rThBeA9h[HiJ0qc!(b&KrfB`i3!"k+NNmQThV*ZhZ`'Ebe%j9Th9*
f5aX+5F1dJ4l0[$q2d2AchK!F&C+,ZJfh2$fG(KGlD4"la-"05G`PLYYa!0Y@caK
bQaji#`2JC,aI0"fdk@##*jZMFED%aTG!j%ZTLIVG51%CaH&(068JC2Dej8U$jh9
XmEdqa*f)f04U&ipK+ie5DE*0LMXLEe#jpQQ+Fp2,ZkU(%`[@Ub4k*%'pe#TklP[
kbNA2UbfHdaj(mFc5S,-EE4DP%5lB[Ke,2De*&k"8VD48#$NV@H%1)Mak30'Cc,2
qP!iIdL5KNKBFS4pK6(Z#5p@#Rl`%R[#*,E(Y&m%)bHX`%-XkXE8AmCk*ZU*k8Mq
ik%k%A0MUSUfc&U4rE09H485SqLJeAM,XEXl05#m[eH5-TE[1Nd9+3#JRCdAdU)'
M)X[UU,!L-AQH#BNj3(UP&@QdkBLMY[2*mkb6BEa@qRFa5@b",GC"k'CZ-5&jVjp
$T1U(+Z)1B9ZVTcJ+F8`ET5@kIkT%90k`Mi5%iJXfNTM3f-+HL)Zf"#'SaqZ!9"4
qB!6l8MTd-X&'MTZ`9cm+SGET2J4ADj1lVpM(JKM*h4Sc-6b1P%L)2S6HKjMMYFc
VGT(i8eN(R3kE1EY6iNlD5VJ6&FedDcEGfJDa@!5QrDkpLT-9JJ'`l!DQH0A"9@9
$A%iD-3+Mea")`3U!9'2K`$DlZe9HpfL'-C!!llG9Sh")[mD*Pa%1a&2ZdH)cIN!
dRV#'",[5MiS6Sjq[A5V4dANB46)10q,&f93clf,1L!F3L2e4-Emjl'Jj215`JMJ
9l)GH81UGBQ)R&r21MIA+C&!bD-5f#QL4@H@[U9BL6a1,T$L6Q#ie#&bUMU+a#eX
QbHNII+2lqS0(dG&[eZ6"mDi-288GZ@,6p%Xh*&bF52bfi@8qYJeZ8HR3f@`QFF"
%%$Vr"EccAm"&NFFd[!k-+cf8%2+493d`I+1N#*1-+NXM''bN4,jl-j6[H1EcU4X
`5)qIUr$cGrbXNQlQ3``4%4XNYVD8$R56lq(R*Ykjhd6GJD3)*%M0+(b"Sc@q$Y0
S[ZI[Y,e"+Fa&a#J(3106M2c'l%'i$E(FPi0h)Zh!3L+F"YrXib6HaBfF4k'Nq%2
TU5"q!86qA5%b&@D4d4!X9fbG1rr@@rNLdM5S#eK8ReFrP`i%iQIKjLjqN!"%[f2
mP`q19Dq6MS$Zi",)MjH1iA-85i+8*cVm@f[B`ih'Mf")hJ85'q9Ahjh'dcQZ"a'
,1MkT0JrH@IqT62kP6IaP*a')p&pAL&`3[m-3+N6Q0iJG$5RKfmNe`3Y2BS!1Kh*
8Fa$f&`&JI`8%9SFSc@mf'Gi`*fe)Ki*KqVIH&HpT[[3I6Q$rh&SPrYA3[9le1J&
I+YpLLU3KYDNH6N!BKkUBj#KajX0K`,H@FK2'NI-!,VmmHZNGT3G@@&+dX#'Z5d@
FZV@L!eAYZ&c9D'109l3fTQL@M5EA66Zj*1N4U0Gjk'8*VfMSD14`a%jT6"raD[C
4NU5UPMB`G(Sf5kiP*j!!G!%r0i4E-1b#TK+!hm`0efGKI'lfP!$d*IMiE$L'BX&
)qNqe%1Y%*eMI`)hPKPdN`0a[,rAFJ-H(-(@BLKbML1Q`BN2PHG[c(T(jq`c2Hai
2VfV[JB`BVk`6+2$aUqCA5G8mb8MF9hZZ3P8I3#V!N!#mbFL2YS%IEB0mY+%5,2I
r2E-ikh&J%TD+q6k!RacTCTBN"XC*bhTj"AS*2crMa2fXBM%`p"QBcr)m`)'R0`*
H(hkZim$Vim$6Fq"0![$dR[%!hRKmR#3"lcSMi&eR!,cV*1#j*1#jZ212`2D!",B
()&l@i3M(CI9I[)m,`+X#FF9lVB!*+U55!-VCLLTqimRE,Al92LYK)0ci*A96XB`
[ZAKDaL[a-SLQM5E40-HkJ!i,&(5p`1NQjqejrN[)BNfhN`6E`4fHhh%8,C)+3Fc
K3SdA[2(mVYiQ)@L4(i,qka3*Z%p"CXhAXQ$695MBRZA&80R58a"!hK@)B`H#8,V
%dEI+#(h2ifFM4prc((fV12V'!(fVN!"#6@R(5-k9d,I4#(dE$G#h88,IB3PpKdh
SZdY#hefBGX*3H(P1'!Q[IEPM*lQbjC3aCR#6b'!EpP"F[ZfaNX3&#Z9jhh8dq@p
H-&9418QS'@eVA5UbX9CEmrm*Q4ceNPQ$R@iN+AH4&-F"f83"6kh6mCk`LJJXXjN
&Q46@hFB6"#A(RSlIk*!!e8cN!'Pb`'R``@c`JF)Z*+3UCP0SFJm,6D3"FRKbMd&
i-Yp+&V'%iPFFSQcf(rKlK#R'D6bZRSV#dBR$A`T(rf6IZf2NS[,r4+Jj-AI$@)5
DVZ1Q821G9cA8I,q+S@BYNN+q*k(QL('S+D8d29kKjNLY3meABF[RF3JeIfF3DSi
BKjS5%)dRE#S5DPBl'K"UE[F,0A9bU1QrjIHQkhXDH)kmSX$ceGiZQq)AH)j`JhL
6aN`T06$06YSb2"k%R'HN'l1)&a!p9!bGKC4K'-E[UkV4K@aL(fAK4)BB0b+[Sd#
1-h4+Nbja)f8p*Uhh-e"l*5@CBK#'pN+`YPd,eI,F`+GZ`D$94Q(SPc`%4B&CbF$
CiKI!r48rrq5'`Mm0$&!Nf,1$0Sk$#IU2b35L%N!Dpl!M0,iJKD)&KU%S*h0a"D(
S$HJ5&XGA244G20&3p(SFiEKdP$11$(m$L!MQ4P[[iab-eK8*4KZk#%E29NKLeq&
SJF'%@SDMNdreNX24l8A$d4L4aX,0Vf&@mBek(T!!0Sc5JkN581-"93p,*dZ239J
k)S@PNYSj'db"U6GH#N`EG*k&H(@@9cm)3,q`G$f[H1Z66)TV@FV0mdfbH9iNjH%
#GaQa-(8l%)+05L!e#mEk*XmDU%m-#f6aSVq8r%"&M"BBQH`,H&Uje@c(kejXpVb
YPlClM)*@&(hkb2-1(H'K$-mlRSAB1(N("+E`L[d%PRM#6b6-Vc"NR5q&V"'rN!"
e#crf&ZZaKeT4V6rah-HC6c-+@QG*35[Gh#F*M@Pq3G&[m,1##id94B4'Zm4q$&l
I&h8K8A)@"qrU,X(EKjpe8L",i&h0`6X&i&hYH9d#la3Uh'N#lcSMm+iV!YjeIZ!
e#'XISQ#D!$X,JQT4"8(YI!5ed3U#@Pr&)U6afFQ%Y38'BDe9c&88eRDe4'#X!Y[
&Y3jXccLUZa#6(aQ(YPi[4qYLSr#fMU2ibbj4r$aeAe+`5bMqNU2iCD$i5mqE%ST
IaXqE*K6h'U'iY`L+Hre3E"$k!X@,23Z[T6mR$)9N,F,HLDE$'i@p)ccXCGeiM5R
`G6BBK,hE&4+4&2D5k'bS6GJlX9$%+1api(X5pMk`B5*KlmJV#AYjQ-6#hRFHYl$
hrDU([42GK$81HaI#U&JS(qADBXkq)4I&$c4(#V8jFK'i`TcR`PVLBEI6K`V$,cp
@ecr,#KFBXJ*4X&F,Xh-3KL1TTfZ149MHXR9L,2G2R+9,$Ql30+-0D4I(`JY,A#L
9I4R#lKj+3U!8"5VBVelbB6ie2XJ6&*CaGpFFpC,lIaRfK&aZRfBaU[V,)CG"NX)
FPU6!ELP"!G0i3aSpQ#UD[6GUN!!#mH%8[J!@V1'&ccj2V8p%ZS,,P+lJJj!!mE,
LG&4B2SK#1%J-QBdN"TFZ!HNL,YATX%8rfQNj[[ZNDjYD3A0Uf`5SD+ALj%CH!@r
Z3fE3YJhUbT0Yd2!H$kfSmDN,pG4%ci9k(K+9E8GLc#LDY)53!(jhq[dlpbNNa#$
-BpA[eRr+#J)CTij!3GHaY"')f`IGdkH18l@%m%H0`Rik-aQUeL0%STcmAPk)UJ5
0(f4&8#`3"m#IcS06*p%Kd-J4#Z"0(5qkNDM2#m$DPh%6!dIE48HVNBifM6Thdp(
k)%TYBMYrpHE"c+N6d!e$U(YHjidZ)25!m(fcUb4QIX3)#&V$6+%+$VQ+(9)A#rD
Ca(#KFAR82rh"P-Z!8TPGHjZNlkH2&*-ZjU5PFKI8em@&XSlk[c-9E@A0E[%Qf%*
"Vmjb1a@'5f4&XaB,*328ECGe"N0"K-)hIB#NDb"A6'cV3i"VBH&e'5qL,MHEjBT
$@`5P,fKIY31B5%9b'+UTHrV+,%dX0(hPRN1C+rHXc!SHA*NP(JX')MY&5aC%2*,
L,61(%ELE)f%c'UUK*Q5Y4BiMV-La9lhNRfFL[%Y3,jRC&"N@Mp9iJaGe&`hCei"
pCD+BQ296aDNp@jdBHKV-P2T2TH+qHYi4jl%&hpCAQj%SpE%ZJ+,"`B3R&+I'+Bi
iKMUf"+1kR5Mqfmi+#NZL'%AK2Sr$YK%DZKA2FD+2L3%UBKIj&a$Z0UR$AVZpYU*
5"LB%H(ND5RQPSY4Z%6!@'"fd!'!XQ!JBXiU!d3Bh&(IKMA5LH4%V#2eB!i3&rmF
JI,mS#+[B493-5803VM)km#U!FYABJh,R$AkJp'-08+lkR`c+r@-*bYSA)jqCC#e
'[[,S+bp'2[-AeQ,N+l1V8)`mLaTITLB38*Mk'Fe4fB%pq0E&*5ZRbDjY-L+$EYi
*'$L`X3a2)m`B3b+8PZR#k@hNd1E&XCp4B`&6X`@&a8I55EEDr8!Y&jTX*F!DGj,
qUTDL4e([Q%ckqd%d(G6+8VGRjXX'5""#2TSj-eqDFSDk#Z2M&5'l8bl`qHqC4`j
Sl9e6+$Fp5P8S+$8Q"j1T2p*6FU&-GdYl2HqLpbD*lSi21XhcAU0r5erE1$aVprG
G2LAqh0VeRmGT&r!N5ECaXEdX$GREGN-*f80&1HKrjY4mU)'piD@+-iqN(c!LK6A
`d)j$YUcF8"JjV2K!'%La-9,18R"SdIHj8Ha%N`F52Y(1iP9$fMJ"!HQ&4c)UTU+
,j4PaBdH%ULJ4rbS6NC'@8hXUH"1fAmI"bA8QQ+DF@[Y*@A"IqhDRl9LMSR8f@"b
mf(X[LVX[+liqbk`dI,r1a8Qi3G`C(mFEV-eeGB+%R,6FF"J9[!*FX*@UZY$5L5f
%k("b#d'm`@'R5e1mR@NS9,5q,1Ee49fRp6pCVedNMZM)$AF('1d[,G0Q9+JjKI6
rIX9IA@R$JY39KP!rN!"eGZhk-YrYPP[1`2R2K'NG3Lcpf[@"11eX)`AGKD8bMU5
Q@J2D)NTD'#MND,KGJC1abGE6U*6ebm#B8pc3B&CSbi#+9F2-0)F4U#PS4Vl#J4C
ji((p-F@R9$JSchK3Nh*'mHCpLeYb`lBlSlZMIkR'9KBeGFm@mLE5UdT&MfBm`d2
54kFm4Gq0cml*N!!NQNMrV-)"AU1M08b'N@!dd#'4F8QC8X8TJY(!Xri$H92-,QP
S$%aGE$"[jKNhEc*TTRQZ!J55NN$*R'4@GJlINDDdd-2XNrc"V*MIK5+LX0H6LKN
0VbqC@8E"rZ!fG0FlS"URMF0XL@XK&8(VSX,QIeeXd($%D9SX-JcAVNePJaZ0'4F
[)b#,UI+BUGY9J`[qMIbB9Xq@R$QS1+LN2P45hGRfk'Md!bR"bN29e'Y4,rPM-EB
p'j!!aYlBl`T409dJlZ31K-N*Jd,5HDTG99hQNBNY8j%Sm&[Qd`BXSF05G4!+N3k
iD2fl&AaZ`1G+-TXLMFmVUhHA1Cp[M#3'TbTLC+T5QDUipi"6Gmh39`0KmaTA)9,
pijXl3k'6lG03f1*aH!MXIRC!1mE4B[`aY2[C2GUPhM`FIKi1Ic81RjCV`TqK+GD
c0e6+4%Z)rN+qK#34mkNAi)K!C4Y`F"%(EqSdilB5YlSDml`Vp'rTP4Z'C`e8*aU
!SkPcUU+6`$('"!j&15FQK*V*%5Tq&Gq"CY!HpdF1S(-1VrpR$U)j"#)cJHJdQ38
CNiF3k8L)LrS!),AIZ(*4%S-8iSa"*6Z+30%GL'09jmI'pGD3!29HrdTUa'LHHXQ
MPk[!U0$+L!Vl!ePQmIGCEF9j9&`5kEQm!B$Q6*bZe'TbPq*r!e&NTSG(U3J-#4Z
Gm@URVlCrV-h3TX*#Ui$m#YK%UXLQd"J)e%`GDci,U3ENH(A#9E-9Phm)KDPal[Y
KSMVj0XYKUH%X9j,F"*&$&m9P,Tc-M4*Nc@c0CFeX'EK4CNY&Rkb0Dqhh%kZ[IZ0
DJ5lHb8%0JJ0b!G*@+"VeQm[F+@*#K,Cah5)9*XD,VKa(iNlHH*KNk,ZqSTj(PI(
UZ&5JkS3Cl[U8ZK$hB*[X()HjrlP9AH1U!9b%+c-G8J-A204FV%M&GAa5ibkLR`i
EJN4@K$QbLDYMc49kEAfh)*D#m"LZQQ0dpL*VB#*D*ZiB4FMMlX%dIkFS%U6ZN9b
LD*jUpQUV5a30keAUqVBG3aMXR$PX$6ZhZ@'@1b2&#2C40%jPMM3RR8XBeE5DM,Y
paJklUqZbYB8%l8"2YJNe9Kc3Ci**U!HheJ!BfdRBI*!!3V%S(VUMcr('rD3`&)%
QECVfDr*i),J!(fk8(Ql%``h5``eiq)Idm!mmc*FHjZ2Klp,$hr&`PI4`&4kZN4k
Z`F-mk@%H(Zk6(Zl$`bcTB4BH(T!!(KkSAG$qQ-mSD0HrmU$pXEZ0J[Ee%`RDFfQ
cN!$!Ule%E&IH,hriDPdJ,L9hi%Kq@QU1SX$PFVpQZhYk`Hbd-`Ri)aiXQ$d6"H0
@cKEK[%&$M2LBm5"2m*RJRVjL'C)!-PFX5fNEa%0p2A-VKi**B0QR29`+MQ#jBJi
a@c&(2,KL$M%VQ#-c@c%R!ilY&IG`0[G`0[FmH8p+EVIG,NfAc#-[8Z$l`aEA+"c
9YPhB[YVA'R3(cJI1Na#XMi9Rpil#(FZGXI&KHL5(GVK96aYGcjUhNM#LP`NC9%b
4'8j[$%)M$d"NCd#-j"EQd'+RpL&B%L[VP3JQ2k(B)MRQV8%hA&EQMLdm25`hXM1
lpChQ'SXZXD5l,"+")a`I6YCB#R$"'*ePl5FD'kU2DAK*YhDqD'RV6Je!c0Q3!+l
#bBKIKHC)q!,E3#$)Ll(`0Mj'R5+EHTQ4PjkEcqmB+'i'H6iB,Ne%42LlIfN@Gll
p353D[ZX[EE[3i,*%p-JrpEmk9qPfce$Y%d0hPT2j63kafhBUYMY$j16'V6Pb(XZ
fdl*IadH'63m2NXUJfD,cGf)3IQcK9M'NE`XU@8mSjN,RYKlD(2XFi$[(##`Zc@$
%+@IN-$1eG90(H'Kh4pLjqbG)[Z&%"8GZd[rUI1A1jGGTR-%R&G[b[fR-Jmf$B)V
'Jj'UFeXT*a0rF'XM9hS5QZ@j`"E*cC!!PZ&Q3$d3fqLDLNQii*Uifce9mD+T,HI
Z0YcfUfaBZJf2@6iNQpbfflFe*IGNJJ4%Beacjb@CJ0AeLZk&9Yfl'rV#3rSq1CJ
,+XmlecG(G[lcVq'&HMJEFGNLLra5Td$9mY#8akHb`U'*#c6YJ5f"Tr'+S6M-'bc
9UFkLm8XEDcEM0JM4A34@0feFFiGLlQ86FHRKBNRK@mi!M%e33M(Xe(GSmQZf)58
f%H64*Gaf!$6KP0cJMYpX#RrkPqC`+i&lijj0VY&Q$'R@a!khEZPBX1I1[ZK@F@p
Pi)[hi25%d@%&XJkh)J6jE50dX4['6QEEE#)R8jZUdYV4T()f3bj!j3@#qi(1jSL
#p!*pj3iX1%-6BJ3`B[5lGc-bR(F#p2c@$19FlU2N0qGZh!6M9i)Nh8qK!ZXd3i-
RZNDq)6%CfX-jc#5$`'K&bQ$QLYE10['VfhBScM[`!'A!(r'e3cY@Y$TLp+IcY6Y
fN!#*f#HT$c@q%L4h#*SMl4aCmBPQU2QpP8Y@Y'UF0&am8@AZE'B-"i(b`@Ca4p"
1,T*ZN`*50`9"C-XE946[piG'2CjPLQd8+B"+@4iZmG")&f%Lp'Y@SH1089)0R-d
mf3NE49`a3QAXjRLUb0fLl29P@J"(h'r2YeEf"LVd!`4rCq2S*PH`-4`SFC80C3I
imI2SX)iB@qliXU5iB"61pVP-6*&`+i%KNqmc,GZ,TJ2Q"Z!`1q6'a!D),HGD1[S
#QB@9B-E!H#VFm6X$`qc&Ek4Z(!l`e,4-HcDXVA"D@R%k*jNU92pAjeQ9`B866%+
AL@VG6UM%#536Y$2"6"H2JrSd2qZ5QmbPG'i*3"2BM@BM&iKBqU8bl@3@2d@,L`M
1)RFLb)8be#Z9e08me[5f2K+p-`$cT6eT9'I"LlT1*dXLU94U&#Je8Pj&*,V!#(-
prarc"m6%""FZP,1lX"b#p!2GHCJq6ThleEN0p"9dDkFj@SaCKrTSb3+ApK(GH5)
leFD5Cp9,9Qap'i9hB(`&!-kT5J2V'%lZ,6eFN6MchDb$bbaEZBK$1ja*-%)+6ZD
hLKCrKX&SdV!ZkQl6()mHrXi8H[AYCmE)rabZ49aLcrfViFUS(XPdiR&F-X[Xi&f
TTr8V&p+5lZR&aLH5Kfa3NRGP9hV5F2!F0iIMG6#MU@%bdCddc"Lqj)mi6HPKECN
9GCa`dC!!F(6j6EmkCdLq$Z4A4RF")*ARX+&MeSM"H&*m96me,Lb4BU0210#F`41
$-aJ*[cC8(MmLH+8fDr+SXZ,iadTFq6C@-Aje$YX18MAlpM08-`cScZ5m*'Fa1@l
JBVUH!5h)J*EJ$l5JSV0`YLhe%T'I$3D)X84`NZ65lG1NDLPpJLS1`&(CF+P4VmI
"jN49dQ$()b$#MHSlJ[6Z&TA8Q04R#d(QQD%$#fp"-mX())@F)#N'9eL,LN6C#-b
A06b3!-SpMbL&YhL*-c"aaJ&[[*6AV`R,S@`2,3F@mqA#K'$#fQ,J6%JJ8cJHmBT
$#AY3J6[EIfpV9"l@j,@[3P*X$!maM4-2$iGHBd-d9h'A'l3AZDJj$"m3I4#"f[3
Z'FBi`iFj`iFj`jJa`rqd-Xa*-f*("X0YD**3LH#2L#3NRH,66i16"`P*q15$ScV
hLThkZE!G#6dDEDU4`3R8-Q"mMNBkXZ$fS@*pZii5)cJBScapVNCTUUF'k#kP`%3
+$j93JKqDJdFBUB0D1S1iFBqUj+*-Z8L`d+(*,amZ&QY4%M9HQ3PI*J5M8'%$Ve$
mH+6-L#LIb8@)j5*)Tf[5QB-)aP5KA6f+VN+'3pMF-L48)%,&Z85Q!ANq+hQQBbZ
bDPk@N5j64#5*"#Bk+P6YBBh0UN6Sp$fi'"FQ)P8#VYK(jU)#0"DJQ%jiRaiT*Jq
DUCN866Y2RRqB@-J6`TB59qCf,ddb*bKr011DL[1'DT6E&I0ZI+6A(!80!+rP@aF
FSUI0[aFEf@3f8+(,m*TC8-#2X5l)Nf`dH8M'dfPUF"NlPmCQAGVKC42j*jXa-3Q
%4!!E@m)4Z'#pl2-jZafYLpR*cF!0!J$"($f-KZKCGcAEMD6Y6(,E4JLFa!4+h',
-5+li2eqF41k[h!%01"BbN!"#&(SjSZRL"ITh#*`l65"fZNHYS#9Pdr#N)ZdT"M#
%M%1TqcB4J&qN!MLUQf%qMUT1)F`ENX&K+SE",pIV"cB4,MS*m8Pa-JT8&5%TMj!
!1-[mYF)14XU)0'Y4dbN[mr0b!N0&Nif"kZf6@Ce9`+c"E9(PK@-&VUS`iJp)kMF
K"@hFq5(&9L&5USf3!0*[)Q5U-KI-kT@j$M6PJK#@GcRfNB#%([!ZY#SmKB)b'Ai
U,`&8&TrB0UB+GbbP$GHp2%ULHI!NUUN6$Fl%m3f+*PPd!ke19'5TX@$'TP[$jE4
4bMd@jS6pBM86`a991[C+VQ3*#T(&2M+%fR"09kh0Z++`&emV6'5Cd0l#"XR6qD8
dT)AJR*-D[-PI`iXR$@8VNd-BBm%B3P6j'1VBjfi0PbTdc%4blTl'F6D9BTNGGBf
f)46+bi1i(d,9hDBmM-$ZMN2#&j9K6`dkiIjY)"@S%,FT2[U!i#(5m4JFmpZ8ZSh
$Q'c4iM*lCiDq(MJj)$E5N!"ZZbC(5cf@)MXTmU2NT"L3!,kE4#b-+#YB!F3m!M9
%Pl3m%iJbU$3kJm2lM!l[0i8,(Pa+8!*H9+IFb,X8UXLU-KPThbUU*-EF4j8LcqC
8,*Up-!Yp5+2aPF9`mBZkJUQ+Vp$-31TSS*GYI9!e',T)db1aif[$%,VBK$'U(AR
X84)@af!`l8-A48dJ4*(J!1-C$S"Q,KkmA4m$5FffAHL%C%5bc`!ZPCT5*&2+"K"
lB4c@XiYYj'pJJ3i"QifVCi0XFQ8Vqa`G0@m+NX`VE5BDp19Gc#Nb"rUC@AZfAVN
l,-*-KUXdE+PjmGM!"PGPSXVfmS#i)r5DGc4K3,-)RGPCd4)9"S915ij[jT0S1XY
bhl"VGlHVa[R)&3b[%hFN[BB%c#Vr!G[e,pbqSHpqQKicI9`8YQaaSG,'T-Al0)Z
`3AUBLb,N"KFMC-h%%G58*V2J8"6Z-HT#i38Y6E2$"M8jY[CaTaC8)c-[R&IL5Z1
LKB)G5Mp5,rQLi@dp'C@k3'3Nh,K#VaSDE!ihVY9MiCLQKDX8&cam5N`6Smd!FZI
"'@a*1FQkEhSj!(Fi54-bpf$+62mLLZB*'JNPERUSCYd),R*$c9MCh%*m('e[!r&
44cXGiVYk(1)HFKTq%FeZ*%-3*NTKZ9D+3G)SjjH,ABj`l33BC9L!UMKGL)%*a2T
fS,ZI,k',Z&$Sj#6[PU8,&2-Jf'j(3e9P9TjG-1@Xq'IP&'2&Lr1D',eKYqp2,B@
PEq*%$6br)CZqTXqS1XiIRH)'EITckAE*ULH6FFVY(*Ad@6,*kA-%33)A$H9Fi$U
*EEJ"hU$%f@CHd+8"2cT(TAY2@XZ3!%lj8%P%)#SUL3k[HdqacI6*Ub4f$MRb8N&
`UNGXT'T"f4G@daH%fATGA@k,B22TkIe3X-,`FiD6d#J!AJr6kd`8p&,iIaH%R[&
A$3YIAIR2FkX(K%pQ,IMC!Q(,Sr5IfRhAA8+UqMCebV([U`qTXj)[*#mAi[%cjQR
e6jI1QL'N#LI96VAPXH5X+fUhm)C`6I)cqYi[2K3bK,m,1A15e`SpDN8Hf+lqG(E
be-[UR`Y6K'A*,bGrmq%h(`PKiBr55'(Cdm+Xj-[*%i36kj+rQ5HX6,iXr#pq9J[
Pdi6IMKH5a`XPR,D2Ir$JqDI(MAYkF-Z9`EL"+pd$3N!S%cjqqYGA[K&q[5#j3qK
EX--Mi&*abN2U(d`6hRrd8H&r(hhdihYQ#+-cK1GR#*-H%jDH'1J@hTJKV&FApLa
,[LdjIh#r-&Ypp0M"j1mNIcAiTYV@,*`EI($DmVd6fS5r6#[TX3Yad`6DY"S[1!!
5HlHkM,%9hRpVdD)[m#2m1eiFZ9#`iN,"FRA+B*[`@h@Hm0)9B8!pmkRAe@ZZ##G
AR4$1G3JG"6p8(def*,mP("EqCHPJBQpb6R,cB&Rh0m,,dSK[IUM15IjPmT[#EiA
8TB-e(bBA*JqS0h,+mM(1mF-RKHR#%R@Mm%2K'Z(idbGA#"H&`Cl9VkZr&Ei8TJi
rqFePSHI#clU&eaHTAlc5*hamcB3([KR6*rcN"m,&mGhMZfHF(bGd,jmf45KF1H2
e'5H&Lr1&Mhrpia-[#4GI%ljpjMG#GSI`c+rlIR5ZHmaj!*!$'!!!*)J!!&Hi!*!
$#!#3!b!!!$mm!!HTm!#3!`TB`!"G`!!!AF!!N!3Z399c-J#3"306C@Fb"h0PCfe
PER46C@Fc"h0PCfePER46C@Fd"h0PCfePER3!!"TZ!*!$!AB!6R&+JfBL3Hd!)#!
m2c`!!#)mUI!!!8T"CJ4+3'F+5%")35#!)8%!"%+R3IVrcY$m!3![##mm!!!CELm
$B3!#V&52Cd"#1!TH3UF[2%4"9%%r2!69U"p`!4(!#Pj+RfFB6R%`2+P`TdC$qJ!
U)SK"qJ!J-$bTF+C(5S0R"(!"6R91l3!L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[r
f5KpQ%NMRi1""q[rU80"1ZJ@Z60m("bmkrpj1G@"b38a"4%4$69!!!`#30&"b3@e
)jf$`G&#I`Lp)!#!J6b*8-@N!&!!B)8!!*$&m!!%!,0+4)8%!,U!#hm*-h`m'6R9
+1!THC``J+J!)C``J3#!3C`B[1[q%6R9)jam'3IVrRR!-)LS!"-+i!aTKT'B!!6j
)H[q16VS(EPK2X(Vr@QB!!3kK'Li)##S!3!!%C`BJH!+QS"XX+J!%+LS!#"JU!!5
Ae*A8)$Vr9U%H2cJ#)'B!!1a86ba))$Vr4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IV
r1##!5S9Q"+%LB!3J4D!RCJ!!Y#T))!j3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S
![#m95(Vr!LmkrZ)[1[lL,cVqbLmkrXS[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#Y
J"#"0S#-J6U!I)%HJ'c(I!L"JB#"1S"mJ4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%f
JD3)!!"q!!5"0S'V9e0I83IVqGNU3!'F)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8c
IB2KJ!2kq2`!J6U!I)%HJ'c(I!L$9e0I8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!
!51F!1#KZ!!a(q[iU4IVq+L!8X**Y"#!5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!
%-$crf8cI(!"1ANje6PErb%MR(MJQ,J!)+#i!$#KZ!"""q[fk,8Mre%)ZrmLK'Le
)rma96kJF-"mk!!a&!!"[A%KZrq``"90&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)
RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()"(`'TQb"Zrr"+N!"R%&92,`LTTM!I5-"
b"-#"Cm3[,[r`UD0J["!Z!"4R#PP2,VJ#TL"IS"Xr2+$m6VS%KP42,8$rd%U!C`!
"RLm!6VS$ePK25J"R#R!"(8!!&Nlk!KK)E[rN5'lri%KZrpK1ZJ9U6qm!$#!Zrq#
K(Le)rp`J#'F!!@3J,[rNS4iY52rS)!KR!!&8,blrj#m)6VS&Z&"2)!0Q!!#Q@8m
[2%024%9#CkJI)"mY32r`5S"R!!#1)%!L8()Bdm%[#8kk",4B6h)$X%&QGL!0)%"
`+0(!,8Mrp#*Zrr!N8A!BeF!Y5[ri,`T1ZJ5k@%mY32rm)'lrm+!T8%SQE[r8*dS
!+&P2,blrm%kk&F`J(h,Sd)&4J#G!!#a96dKkrM)[,[rd5'lrr#m-,`3[,[rF,bl
ri#mZrqK1ZJV'9%m[,[r`UD-NE[r8*@lrd!!-*@lrh!!3*@lri!!8*@lrk!!B2cb
KQ%kk!eC86bC!2cbSRdkk!dT86b)!)!Z`J@B%F!"J!R!")!!P3!!F*83!)#9-!#4
)H[[-2cbJr$mmS2a1ZJ,i9%mI!%kk&9)r2+'B6VS$$&425S"R"(!"S*JJI!!!!9S
`%%M!i)"b"V#"CJa"qJ#Z)R`!!!-m)SJGI!!"rmJJE[r-S"Y96kJF-"mk!!a&!!"
[G%KZrq``"90&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#
S$L!I,8$rm()"(`'TQe92,blrm+QQ-"p)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"
96bm+UDB`(dM!FJ6!J@HU,`UTSf#N%#lrb"e!!"C-haai6PiJAdr[!!j1d%j@rra
)j`!`3Llrr$mmS2a1ZJ)X9%mN3%U!Ce`[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cb
Jr$mmS2a1ZJ(H9%mI!%kk&$JJ5b"S!"#J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD
`J@B+F!!JI!!!!c`JJ"em!!(rr"!Zrra-h``!6Pj1G8j@rqK)jami@8qTG5!I+J"
)E[rSU(3J$5"!)""bKY#",8$rr#"!A%K$l[rX)YJLf&P2,ca%394"2c`%eDQJ)"m
S3#"!*&!b+J!)NQS!"$`"0#S!"T4U!!)q!MBZrr*)`cJZrqj)a*D%1!&)a*D%DJ*
5Jq+$282rpMBZrr")`cJZrqa)a*D%1!*)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrS
b,[rddN)p3Iri@8p#TdKZrr4)HJ"QFJ%I!A)"2`&brbm"3LG#TkN6)"mQ3#m!U(-
'K3#3!hJ[$#",F"$4`#m)U2CC6kPe)"q`K@3#B2496kPd%"pQ!Q$fF2mr!%*R)"q
J-Lm,U43[$+QM,blrk+Kc60mFq%jH6R8!!J!!6PB!!%MR!$!NEJ!))!SQ3#"!)LJ
!!Jb"38a"4'B@)LJ!"Jb"4%008'B+-#J!#R)$X%&R"(!!B!*`!8cI$!"1ANje,`T
C6cmmU'j`!4m!6VS5H#"I*%KC6cmmUQj`!4m!6VS5CL*I)%Uab@B'-$`#!'!%-$`
%!#4I6R919J!!,`-f,J!)-!0)`!+!!!!)!%U!E`4`!@!#F!!Q(djH6R919[rm51F
F!$BZ!!Jr!dkkrma86ae!rrab!E!"CK!#3`Ir6VVrJ,"$EJ4`!'!S@8mr2+LIF!%
I!%kk%I!J(bS!@8mr!amZrra1ZK(J)"mS!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!
i,J!)*'i!#L"+)"!Q3#"!-K!-38&%CLJb+!!#$%&$8QBH0J4brlC"CaSJ+!!%FKM
LU!+!!*!$rc)$5-'`J@F%F!"J!R!"(8!!$NcI$"K1AL"IA%p1d%j@!!"96dKZ!!K
`rcm!6VVrNK!ICa)JEJ!))#J!"()BiUJ#3!$rB!*`rdjH6R919J!!98p)EJ!)F2m
r!%kkrf33(fF3)'i!##!S!!3#J!$rN!0J!R$r6Pj1G8j@!!")jaJi*Qi!##KZ!!`
J5c#m!`&`!#4-*)!Q2!!!!56ANJD5!!!#5!D5!*!$)#Jm!*!$J0Q5fC)S2!!!"*!
!fC,ANYQ5"T)!N!0m"T)!!)!!F!!NEJ!3*)!'NJ#3!b3'NJ#3!b!'NJ#3!dJ'NJ#
3!cj#3%cI("K1ANje6PErj%MR(cJQEJ!)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R
!,8crm(")fF!Y62rdF$lC`#!-N!#,X)9M"R"P6[S!XN*!2J"#3$e!rq3f"h!NYN"
N5(!%YN"N"(!!B!a`!$!$@B"U!PD!j)"i!$J$,86rq0LZrqJN4"5!)#lrq0#!d+l
rm#"!-+lrj(!"&"*b!")#if$4E[rN8NGJX%*!2J"`!6`!0JG`(lC!C%4`!EC!C!4
`!'!-F!!`!e1!DJ*5J1+!H!!i!be%rrcBV[rX*%38J#!Zrrc3J0#Zrr3J3$#'F!%
8%R)!%J,MB0a!8NGJY%*!60mFq%jH6R919[r`51FI1#4Z!!JQEJ!-1Li!%#KZ!"*
#3$`!-J9`!$!"d)!d"R)!-J+`J@m83N!d"R)!-J,5JG+-)%%`J&*'B0T#3$`!F!)
p32rb0JDf4@3!!,K#3$i!3N!p32r`F!!`!q@!d)SJ3#!3,8$rp$)'F!!`!G#,)%!
B%(B!&J5f4f-!!))`,[rfFJ(!3G&Zrr"`!$!$8i!d"h)!-J+`J@mq1#lrm(B!0J3
Y3rrmeS2@M#"$5P"Q%L!Zrrc3J0#-)%!`V[rb9'lrmM)Zrr"`!$!"d)$3M#"!-"!
p32r`B"B`"G"!d%Bd,[r`FJ!b!Y+"dS`J36#!8NFJ,[rdiSJY32rdB!$rE&*'B!$
r4%cI(2K1ANje6PErr%MR($!NEJ!)0Li!$#CZ!!ib!h!!-!(QJ$J!-!0b"m""1J"
`!#e!rr`d"()!-J,5LL""%K"`!"!"0!9b!$)#iU"b!F#"dDlrr#)ZrrcMLG+,)%%
b%(!!-!%Y32rm8N8`"A))X%&Q"N*!1J"54$)Z!"*`!$!"d)#`V[rmB`*JUK!Zrrm
5,J!6dJ'3!!&-h``i6Pj1G8j@rra)jamJ*'i!#$JZ!!`k,J!1-J4`!$!"jS!m!$)
%G!I#3Mi"GJ!f!0D+)%-3%(3!&!!Y3[rmF!!`!63&FJ!b!Y#"jS"b!V#"C`ab!E#
"Cb"+J'FdB$)d"R)!-J*8JG++)%%5%(!!%!&b%11SJDlrr$3'FJ!b!P+"dSSJ34)
3F!!3!H')JDlrr#!Zrr`d"h)!-J,LU#e!rra`rh)J0J9d!$3$NS,LU-"Zrrj-h`6
i6Pj1G8j@rpK)jami*Qi!##KZ!!iJ2!!!!564VJ!5)$`!!!*)dDi!%L!Z!")Y32r
XFL$6VJ!5)Li!%Le"rr!N2!#3!i$9VJ!5*#i!%Le#rr3N5aJ5GJ!@"#e$rrMQJhS
(aN953ce$rp`Q,[riiS0k!mC&9%-p3rrQGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[r
LH!(VC&0%286ri#SZrrKq!FU(C`Kk!$S%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!
5,`!r!e*+,`T1Z[mk6qm!$ZG!d@lrj#mZ!")[,[r`2`-[,[rX6VS,#%r[!!i[,[r
d2`-[,[rX,blrm%kkr+a2l`!13N!p32rB-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[r
S,blrp$mZrq3[#dkkrBj2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00
Zrq4J($mZrqBr,[rN,`Y1Z[h`8%mp32rD-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*
ZrpK`!$!"d)`J3%)3B!$rHM!ZrpU`E[rJCJ!!P$!Zrq*R1L4!2blrk#mZrr3r,[r
N,`Y1Z[d'6qm!$")!)!T`!"!"28$rfR3!0!$8V[rX)%)3%()!%J$6E[rNB"`r,[r
Q2blrj#m,6VVpD&"228$rfM!ZrqE4E[rN9QlrfM!ZrpT6E[rD5N"R!2m!1#lrf(B
!0J3Y3rrm8i2@M#"$%"!L,[rmdS`J34#!8Qlrf'$1%#lrhG!ZrpXd,[rB8Qlrf()
!-J,5M#""%)"J!2kq-Llrj(!!-!&HJ1D!60mFq%jH6R919[q-51FI1#CZ!!JU,J!
-+'i!%#`Z!"3Y5rr)F#6A`#e,rq"`)0I!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0H
Zrj3J2!!!!NM4V[q8F#$4V[q8+$`!N!1!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDl
rP#eZrj6rZ0HZrj3YE[q8rlcCV[q8,@lrP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDl
rP#!Zrj53!)b`K@-+F'8p3!!S6[S'HR!!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#e
Zrk6rN!!YI!!!J!$rk%KZrqJ[,[qN)'i!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#4
Zrj!!8NUel[qSBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!
!,8Mrl#!)C`iJE[q3!#*Zrk3J,[rXSLiNE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!
N6T!!8%mJ,[r`X+lrp'3+F'Fp3!!S6[S&`#"Zrj!!8UlrN!!3%"e!rk"b!")!dN&
636e"rp!`,[r3d%!p32r5)'i!(#!3d+i!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%k
kqr*2l`!1-J!J#R!!-!(4V[q3!#m-,blrY$mm!53[,[qi6VS(ZNr[!!i[,[qm2c`
"*#mZrlJ[,[qd6VVjA%r[!!iN3#m-,blrZ$mZrp![,[q3!%kkqk"2l`!1-J!J#R!
!-!(4V[q3!#m-,blrY$mZrp![,[qi6VS(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VV
j#Nr[!!j`!#i!3N!p32q-,@i!)2qX)'lrV,(Zrl"N!!5S3N!p32qB$'i#52qBC!!
!`M!ZriaQ!!#-*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e
)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!"
)E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ4#)'lrN!"5V[q3!")
3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+
),J"6E[q-B!$r1!4Z!NMrQ!aZ!3$rQ'33)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$J
ZrjKf!$B%,82rq0D$eUlrc#"$-"!p32qD)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F
!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHl
rT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8V
rN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q
3!")3F!!3!63Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@l
rQL!(jUJZ!*PZria#3$e!rjJ`,[qBX'lrdQ3!!-)`,[q-CJ!!M#4Zrj!!8NUel[q
SBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`i
JE[q3!#*Zrk3J,[rXSLiNE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r
`X+lrp'3+F'Fp3!!S6[S#@#"Zrj!!8UlrN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&
ZrjJb,[qBF!!`!G#!d+lre#"!-"!p32qB)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$J
ZrjKf!$B%,82rr0D$eUlrj#"$-"!p32qH)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F
!!-)-EJ!BriaL!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHl
rT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8V
rN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q
3!")3F!!3!63Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@l
rRL!(jUJZ!*PZri`JE[qX-LlrRR!!-!'4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'l
rV&+Zrk`3J#"Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!
`,[qD8flrQNT!C`$lhL"Zrj45V[q8%"!JE[qX8UlrV"#!B0a@E[qD)'i!'0('-Ll
rRR!!-!%LE[qXNqi!)*!!LC(!,8MrP$!ZrjTR*L"Z!"M4aV(Zrj4M'L"Zrj45V[q
8%"!JE[qX8UlrV"#!8flrQQ$8,@i!)2q8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!
3)'lrV&+Zrk`3J'$F)'lrV,(Zrl"R#("R28!!+'!8)'lrV*(Z!#!LEJ!F)SK#3$e
!!#K-haci6PiJAdr[!#"1d!"`2!!q)!!!H#!q-#!Q*L"i)$`p-c)!!$T$Efe`FQ9
cFfP[EMT%C@0[EA"bCA0cD@pZ-$-`-5jM!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!
!1N0[EA"bCA0cD@pZ1N4PBfpYF(*PFh0TEfi`-c!a,Q-!!%j@rqK)jami2Li!##K
Z!!`f,J!+F!!`!cJ(FJ!b"*!!JA)"X)&[!!'d286rk$e$rqT5E[rS-#lrk,"Z!!T
N(()!-J$5M#""%"!d"h)!-J,5M#""%K#`!@3#B0C6E[rU-#lrkV"(Baab!$)!dS`
J34!30!Gb!$)#dS`J34)3X!&M!Q$B-#lrk,"ZrqTP!Q"b1#lrk(B!0J3Y3rr`eS`
N3a)5F!!3!6e!rq`k,[rUH!!i"5e%rr6BM#C%%"-8J"DZrqdJ,[r`d)$3VJ!3)%!
`%$e!rq`L,[rddS(5VJ!3)%%b%#3Zrr$8JY5Z!"!J3M#")Llrp0+"dUi!%#""-)"
J!2mb-#lrkV"(CJC54f!!r`3i"hB!0J3Y3rrieS`N3a)5F!!3!6e!rq`m,[rUHJ!
k"Le&rrcDM#C&%"-8J"DZrqdJ,[rid)$3VJ!3)%!`%$e!rq`L,[rmdS(5VJ!3)%%
b%#3ZrrM8JY5Z!"!J3M#")Llrr0+"dUi!%#""-)!J,[rm)Llrq*!!J63Z!!Tb!$)
#*#lrr&+#NS+`J@`H,bi!%#m-2`Br"%kkrPa2l`!--#lrkP*!2J"J!2jF,bi!%#m
-2bi!#M!ZrqT53$m!6VVq0Nr[!!`pE[rU!!TJ!2ii60mFq%jH6R919[rN51FI1#4
Z!!Jk,J!-*Qi!$LKZ!")Y62r`)$`!!!%NfF!Y62rd3N!m!$B'YN9N,(J!1!-Y42r
if)SJ4"!3)Llrq0+Zrr!J34#!)#lrq0#!d+lrp#"!-)054Q$1,blrp#mZrr!r"8*
R6VVpXNr[!!a#3$`!0JDf4@35F!!`!p#Zrr!J3%S3CJ454Q$SF!!Y32rN0JDf4@3
!!+K+3fFb)#lrj(J!1!-Y42rmf+lrm#"%&""b!")#*Llrr&1$eUlrm#"$&K"d!"3
$NS,MU#e!rq3d"R)!-J,5V[r`)%%5%(!!%!%q!#eZrq6rl(!!,8$rk$!(8dG+3'F
J)#lrk11))Llrl(3"`S+!J5e!rqJJ,[rXiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)
3F!!`!H@!d)XJ3##ZrqK54P+Zrq4J!2p860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*
I%Km`(dS"C`5R4Q!#SdBZL%l4)Pm5(c!I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!
&!*!'!3!!!Bp*!!'153!!"'`"%jYJ"&i!N!-F!p)!&%4*9%`!$3#U38a59!!+!9*
69&)J!!%"eP"cCA3!!!(Z4%a24`!#!IT69&)M!!!#(P"*3e3!!!)UGQ9bF`!"!MC
MD@0Z!!!#6NP$6di!!!*D5801)`!%!QC'8N9'!!3#SN*14%`!!3,H399c-J!!![C
KGA0d!!%$!QPME$J!!!-D3dp%43!(!bC%394"!!!$KP0*@N8!!!15DfPZC!!!!jj
'C@&d!!!$UJ3"rrmJ!*!)KIrr*!!!J!%E'(!!Krrr!*!$eJ#3"BErrb3!!5B"'aJ
3!)$rr`!!!DF!N!@errmJ!!)&!*!&J[rr!!!#G`#3"!2SrrmJ!!,9!*!&L2rr!!!
$!3#3"!)!rrm!!!2C!*!%!J(rr`!!""F!N!3%5`!S"!!5i!%6QL`%Vrrr!!!6-!#
3"!%(!$3J!"0Z!*!%"!(rrb!!"'-!N!@#rrmJ!!4c!*!&KIrr*!!%J`%6QK!!Krr
r)!!%N`#3"BErrb3!"+-"'aL!!)$rrb!!",-!N!@"rrmJ!!6$!*!&L2rr)!!%d`#
3"!)!rrmJ!!6P!*!%!J(rrb!!"28!N!3%Vrrr!!!8(!#3"!)!N!-J!!8&!*!%!J%
!"b!!"48!N!@!rrm!!!8K!*!%!qMrrb!!#9J!N!3%5`!3"!!4#J%6QS`""`!F)!!
4)`#3"B$rr`!!#A3!N!3$k2rr!!!*Y!#3"3,rrb!!%0S!N!8"rrmJ!"$i!*!%"%[
rr`3!%6m"%jSN"%[rr`3!%Q8"%jSS!)$rr`!!&#`!N!@"rrm!!"8`!*!&J[rr!!!
@0!#3"B2rr`!!&cJ!N!@%rrm!!"Jm!*!&J2rr!!!C3!#3"B(rr`!!'8X!N!@#rrm
!!"P@!*!&Jrrr!!!CB3#3"B6rr`!!'@`!N!3"!2rr!!!CG`#3"B$rr`!!'CF!N!G
!!!!Cc`#3"B6rr`!!'I-!N!G2!!!Cp`#3"B6rr`!!'P)!N!8"!&iF!"j@!41D)!!
#!'JF!*!!(`%6QMJ!!`"b(!#X0!%6QN!!"!"m(!$cSJ%6QM`!"3#'(!%P,`%6QP!
!"J#3!"`"5%i"%jT-!!$rrbJ"Ffd!N!8(rrm!!A2*!*!'rrmS!'!B!*!%rj!%!!&
cL3#3"B$rr`!"FjF!N!Err`!"MMX!N!3'F(*[EA"d#-3JFh9QCQPi#dPZFf9bG#"
%DA0V#d9iDA0dD@jR)&"A#dPZFf9bG#"%DA0V#d9iDA0dD@jR)&"A$NphEQ9b)(*
PFfpeFQ0P$NphEQ9b)(*PFfpeFQ0P#90PCfePER3J-3P6C@GYC@jd)$)*8f9RE@9
ZG#!c#90PCfePER3J03P6C@GYC@jd)$B*8f9RE@9ZG#!f"dF:
Changes to tests/all.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# all.tcl --
#
# This file contains a top-level script to run all of the Tcl
# tests.  Execute it by invoking "source all.test" when running tcltest
# in this directory.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
# 
# RCS: @(#) $Id: all.tcl,v 1.10 2000/04/10 17:18:56 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set ::tcltest::testSingleFile false






|


|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# all.tcl --
#
# This file contains a top-level script to run all of the Tcl
# tests.  Execute it by invoking "source all.test" when running tcltest
# in this directory.
#
# Copyright (c) 1998-2000 Ajuba Solutions.
# All rights reserved.
# 
# RCS: @(#) $Id: all.tcl,v 1.10.2.1 2000/07/27 01:39:20 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set ::tcltest::testSingleFile false
Changes to tests/binary.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the tclBinary.c file and the "binary" Tcl command. 
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: binary.test,v 1.7 2000/04/10 17:18:57 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test binary-2.1 {DupByteArrayInternalRep} {












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the tclBinary.c file and the "binary" Tcl command. 
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: binary.test,v 1.7.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test binary-2.1 {DupByteArrayInternalRep} {
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

test binary-1.3 {Tcl_BinaryObjCmd: format error} {
    list [catch {binary f} msg] $msg
} {1 {wrong # args: should be "binary format formatString ?arg arg ...?"}}
test binary-1.4 {Tcl_BinaryObjCmd: format} {
    binary format ""
} {}



test binary-2.1 {Tcl_BinaryObjCmd: format} {
    list [catch {binary format a } msg] $msg
} {1 {not enough arguments for all format specifiers}}
test binary-2.2 {Tcl_BinaryObjCmd: format} {
    binary format a0 foo







<







36
37
38
39
40
41
42

43
44
45
46
47
48
49

test binary-1.3 {Tcl_BinaryObjCmd: format error} {
    list [catch {binary f} msg] $msg
} {1 {wrong # args: should be "binary format formatString ?arg arg ...?"}}
test binary-1.4 {Tcl_BinaryObjCmd: format} {
    binary format ""
} {}



test binary-2.1 {Tcl_BinaryObjCmd: format} {
    list [catch {binary format a } msg] $msg
} {1 {not enough arguments for all format specifiers}}
test binary-2.2 {Tcl_BinaryObjCmd: format} {
    binary format a0 foo
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
    catch {binary ""} result
    set result
} {bad option "": must be format or scan}

# cleanup
::tcltest::cleanupTests
return



















<
<
<
<
<
<
<
<
<
<
<
<
1459
1460
1461
1462
1463
1464
1465












    catch {binary ""} result
    set result
} {bad option "": must be format or scan}

# cleanup
::tcltest::cleanupTests
return












Changes to tests/clock.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands covered:  clock
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: clock.test,v 1.13 2000/04/10 17:18:57 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test clock-1.1 {clock tests} {












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands covered:  clock
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: clock.test,v 1.13.2.2 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test clock-1.1 {clock tests} {
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    after 10
    set end [clock clicks]
    expr "$end > $start"
} {1}
test clock-2.3 {clock clicks tests} {
    list [catch {clock clicks foo} msg] $msg
} {1 {bad switch "foo": must be -milliseconds}}
test clock-2.3 {clock clicks tests} {
    expr [clock clicks -milliseconds]+1
    concat {}
} {}
test clock-2.2 {clock clicks tests, millisecond timing test} {
    set start [clock clicks -milli]
    after 10
    set end [clock clicks -milli]
    # assume, even with slow interp'ing, the diff is less than 60 msecs
    expr {($end > $start) && (($end - $start) < 60)}
} {1}








|



|







34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    after 10
    set end [clock clicks]
    expr "$end > $start"
} {1}
test clock-2.3 {clock clicks tests} {
    list [catch {clock clicks foo} msg] $msg
} {1 {bad switch "foo": must be -milliseconds}}
test clock-2.4 {clock clicks tests} {
    expr [clock clicks -milliseconds]+1
    concat {}
} {}
test clock-2.5 {clock clicks tests, millisecond timing test} {
    set start [clock clicks -milli]
    after 10
    set end [clock clicks -milli]
    # assume, even with slow interp'ing, the diff is less than 60 msecs
    expr {($end > $start) && (($end - $start) < 60)}
} {1}

333
334
335
336
337
338
339





340
341
342
343
344
345
346
    foreach i {91 92 93 94 95 96} {
      set dec1th [clock scan 12/1/$i -gmt 1]
      set monday [clock scan "monday 1 week ago" -base $dec1th -gmt 1]
      lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
    }
    set res
} {1991-11-25 1992-11-30 1993-11-29 1994-11-28 1995-11-27 1996-11-25}






# clock seconds
test clock-5.1 {clock seconds tests} {
    expr [clock seconds]+1
    concat {}
} {}
test clock-5.2 {clock seconds tests} {







>
>
>
>
>







333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
    foreach i {91 92 93 94 95 96} {
      set dec1th [clock scan 12/1/$i -gmt 1]
      set monday [clock scan "monday 1 week ago" -base $dec1th -gmt 1]
      lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
    }
    set res
} {1991-11-25 1992-11-30 1993-11-29 1994-11-28 1995-11-27 1996-11-25}
test clock-4.41 {ago with multiple relative units} {
    set base [clock scan "12/31/1999 00:00:00"]
    set res [clock scan "2 days 2 hours ago" -base $base]
    expr {$base - $res}
} 180000

# clock seconds
test clock-5.1 {clock seconds tests} {
    expr [clock seconds]+1
    concat {}
} {}
test clock-5.2 {clock seconds tests} {
Changes to tests/cmdAH.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# The file tests the tclCmdAH.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1998 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdAH.test,v 1.10 2000/04/10 17:18:57 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

global env












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# The file tests the tclCmdAH.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1998 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdAH.test,v 1.10.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

global env
1487
1488
1489
1490
1491
1492
1493







1494
1495
1496
1497
1498

1499
1500
1501
1502
1503
1504
1505


1506


1507
1508
1509
1510












































1511
1512
1513
1514
1515
1516
1517
    list [catch {file t x} msg] $msg
} {1 {ambiguous option "t": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}}
test cmdAH-30.8 {Tcl_FileObjCmd: error conditions} {
    list [catch {file dirname ~woohgy} msg] $msg
} {1 {user "woohgy" doesn't exist}}

# channels








test cmdAH-31.1 {Tcl_FileObjCmd: channels, too many args} {
    list [catch {file channels a b} msg] $msg
} {1 {wrong # args: should be "file channels ?pattern?"}}
test cmdAH-31.2 {Tcl_FileObjCmd: channels, too many args} {

    file chan
} {stderr stdout stdin}
test cmdAH-31.3 {Tcl_FileObjCmd: channels, too many args} {
    string equal [file channels] [file channels *]
} {1}
test cmdAH-31.4 {Tcl_FileObjCmd: channels} {
    set old [file channels gorp.file]


    set f [open gorp.file w]


    set new [file channels file*]
    close $f
    string equal $f $new
} {1}













































# cleanup
catch {testsetplatform $platform}
catch {unset platform}

# Tcl_ForObjCmd is tested in for.test








>
>
>
>
>
>
>





>
|
|
|


|
|
>
>
|
>
>
|
<
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519

1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
    list [catch {file t x} msg] $msg
} {1 {ambiguous option "t": must be atime, attributes, channels, copy, delete, dirname, executable, exists, extension, isdirectory, isfile, join, lstat, mtime, mkdir, nativename, owned, pathtype, readable, readlink, rename, rootname, size, split, stat, tail, type, volumes, or writable}}
test cmdAH-30.8 {Tcl_FileObjCmd: error conditions} {
    list [catch {file dirname ~woohgy} msg] $msg
} {1 {user "woohgy" doesn't exist}}

# channels
# In testing 'file channels', we need to make sure that a channel
# created in one interp isn't visible in another.

interp create simpleInterp
interp create -safe safeInterp
interp c
safeInterp expose file file

test cmdAH-31.1 {Tcl_FileObjCmd: channels, too many args} {
    list [catch {file channels a b} msg] $msg
} {1 {wrong # args: should be "file channels ?pattern?"}}
test cmdAH-31.2 {Tcl_FileObjCmd: channels, too many args} {
    # Normal interps start out with only the standard channels
    lsort [simpleInterp eval [list file chan]]
} [lsort {stderr stdout stdin}]
test cmdAH-31.3 {Tcl_FileObjCmd: channels, globbing} {
    string equal [file channels] [file channels *]
} {1}
test cmdAH-31.4 {Tcl_FileObjCmd: channels, globbing} {
    lsort [file channels std*]
} [lsort {stdout stderr stdin}]

set newFileId [open gorp.file w]

test cmdAH-31.5 {Tcl_FileObjCmd: channels} {
    set res [file channels $newFileId]

    string equal $newFileId $res
} {1}
test cmdAH-31.6 {Tcl_FileObjCmd: channels in other interp} {
    # Safe interps start out with no channels
    safeInterp eval [list file channels]
} {}
test cmdAH-31.7 {Tcl_FileObjCmd: channels in other interp} {
    list [catch {safeInterp eval [list puts $newFileId "hello"]} msg] $msg
} [list 1 "can not find channel named \"$newFileId\""]

interp share {} $newFileId safeInterp
interp share {} stdout safeInterp

test cmdAH-31.8 {Tcl_FileObjCmd: channels in other interp} {
    # $newFileId should now be visible in both interps
    list [file channels $newFileId] \
	    [safeInterp eval [list file channels $newFileId]]
} [list $newFileId $newFileId]
test cmdAH-31.9 {Tcl_FileObjCmd: channels in other interp} {
    lsort [safeInterp eval [list file channels]]
} [lsort [list stdout $newFileId]]
test cmdAH-31.10 {Tcl_FileObjCmd: channels in other interp} {
    # we can now write to $newFileId from slave
    safeInterp eval [list puts $newFileId "hello"]
} {}

interp transfer {} $newFileId safeInterp

test cmdAH-31.11 {Tcl_FileObjCmd: channels in other interp} {
    # $newFileId should now be visible only in safeInterp
    list [file channels $newFileId] \
	    [safeInterp eval [list file channels $newFileId]]
} [list {} $newFileId]
test cmdAH-31.12 {Tcl_FileObjCmd: channels in other interp} {
    lsort [safeInterp eval [list file channels]]
} [lsort [list stdout $newFileId]]
test cmdAH-31.13 {Tcl_FileObjCmd: channels in other interp} {
    safeInterp eval [list close $newFileId]
    safeInterp eval [list file channels]
} {stdout}

# This shouldn't work, but just in case a test above failed...
catch {close $newFileId}

interp delete safeInterp
interp delete simpleInterp

# cleanup
catch {testsetplatform $platform}
catch {unset platform}

# Tcl_ForObjCmd is tested in for.test

Changes to tests/cmdIL.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This file contains a collection of tests for the procedures in the
# file tclCmdIL.c.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdIL.test,v 1.12 2000/04/10 17:18:57 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test cmdIL-1.1 {Tcl_LsortObjCmd procedure} {










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This file contains a collection of tests for the procedures in the
# file tclCmdIL.c.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdIL.test,v 1.12.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test cmdIL-1.1 {Tcl_LsortObjCmd procedure} {
78
79
80
81
82
83
84
















85
86
87
88
89
90
91
test cmdIL-1.22 {Tcl_LsortObjCmd procedure, unique sort} {
    lsort -integer -unique {3 1 2 3 1 4 3}
} {1 2 3 4}
test cmdIL-1.23 {Tcl_LsortObjCmd procedure, unique sort with index} {
    # lsort -unique should return the last unique item
    lsort -unique -index 0 {{a b} {c b} {a c} {d a}}
} {{a c} {c b} {d a}}

















# Can't think of any good tests for the MergeSort and MergeLists
# procedures, except a bunch of random lists to sort.

test cmdIL-2.1 {MergeSort and MergeLists procedures} {
    set result {}
    set r 1435753299







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
test cmdIL-1.22 {Tcl_LsortObjCmd procedure, unique sort} {
    lsort -integer -unique {3 1 2 3 1 4 3}
} {1 2 3 4}
test cmdIL-1.23 {Tcl_LsortObjCmd procedure, unique sort with index} {
    # lsort -unique should return the last unique item
    lsort -unique -index 0 {{a b} {c b} {a c} {d a}}
} {{a c} {c b} {d a}}
test cmdIL-1.24 {Tcl_LsortObjCmd procedure, order of -index and -command} {
    catch {rename 1 ""}
    proc testcmp {a b} {return [string compare $a $b]}
    set l [list [list a b] [list c d]]
    set result [list [catch {lsort -command testcmp -index 1 $l} msg] $msg]
    rename testcmp ""
    set result
} [list 0 [list [list a b] [list c d]]]
test cmdIL-1.25 {Tcl_LsortObjCmd procedure, order of -index and -command} {
    catch {rename 1 ""}
    proc testcmp {a b} {return [string compare $a $b]}
    set l [list [list a b] [list c d]]
    set result [list [catch {lsort -index 1 -command testcmp $l} msg] $msg]
    rename testcmp ""
    set result
} [list 0 [list [list a b] [list c d]]]

# Can't think of any good tests for the MergeSort and MergeLists
# procedures, except a bunch of random lists to sort.

test cmdIL-2.1 {MergeSort and MergeLists procedures} {
    set result {}
    set r 1435753299
Changes to tests/execute.test.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: execute.test,v 1.8 2000/04/10 17:18:58 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {eval namespace delete [namespace children :: test_ns_*]}







|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: execute.test,v 1.8.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {eval namespace delete [namespace children :: test_ns_*]}
578
579
580
581
582
583
584






585
586
587
588
589
590
591
        set x {}
        $x
        append x { }
        $x
    }
    p
} {}







# cleanup
catch {eval namespace delete [namespace children :: test_ns_*]}
catch {rename foo ""}
catch {rename p ""}
catch {rename {} ""}
catch {rename { } ""}







>
>
>
>
>
>







578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
        set x {}
        $x
        append x { }
        $x
    }
    p
} {}

test execute-6.2 {Evaluate an expression in a variable; compile the first time, do not the second} {
    set w {3*5}
    proc a {obj} {expr $obj}
    set res "[a $w]:[a $w]"
} {15:15}

# cleanup
catch {eval namespace delete [namespace children :: test_ns_*]}
catch {rename foo ""}
catch {rename p ""}
catch {rename {} ""}
catch {rename { } ""}
Changes to tests/fCmd.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the tclFCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: fCmd.test,v 1.8 2000/04/10 17:18:59 ericm Exp $
#

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the tclFCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: fCmd.test,v 1.8.2.1 2001/04/03 22:54:38 hobbs Exp $
#

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

505
506
507
508
509
510
511
512
513
514
515
516
517


518
519
520
521
522
523
524
    file rename tf1 /tmp
    glob tf* /tmp/tf1
} {/tmp/tf1}
test fCmd-6.20 {CopyRenameOneFile: errno == EXDEV} {pcOnly} {
    catch {file delete -force c:/tcl8975@ d:/tcl8975@}
    file mkdir c:/tcl8975@
    if [catch {file rename c:/tcl8975@ d:/}] {
	list d:/tcl8975@
    } else {
	set msg [glob c:/tcl8975@ d:/tcl8975@]
	file delete -force d:/tcl8975@
	set msg
    }


} {d:/tcl8975@}
test fCmd-6.21 {CopyRenameOneFile: copy/rename: S_ISDIR(source)} \
	{unixOnly notRoot} {
    cleanup /tmp
    file mkdir td1
    file rename td1 /tmp
    glob td* /tmp/td*







|



<

>
>







505
506
507
508
509
510
511
512
513
514
515

516
517
518
519
520
521
522
523
524
525
    file rename tf1 /tmp
    glob tf* /tmp/tf1
} {/tmp/tf1}
test fCmd-6.20 {CopyRenameOneFile: errno == EXDEV} {pcOnly} {
    catch {file delete -force c:/tcl8975@ d:/tcl8975@}
    file mkdir c:/tcl8975@
    if [catch {file rename c:/tcl8975@ d:/}] {
	set msg d:/tcl8975@
    } else {
	set msg [glob c:/tcl8975@ d:/tcl8975@]
	file delete -force d:/tcl8975@

    }
    file delete -force c:/tcl8975@
    set msg
} {d:/tcl8975@}
test fCmd-6.21 {CopyRenameOneFile: copy/rename: S_ISDIR(source)} \
	{unixOnly notRoot} {
    cleanup /tmp
    file mkdir td1
    file rename td1 /tmp
    glob td* /tmp/td*
Changes to tests/foreach.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands covered:  foreach, continue, break
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: foreach.test,v 1.6 2000/04/10 17:18:59 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset a}












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands covered:  foreach, continue, break
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: foreach.test,v 1.6.2.1 2001/08/07 15:41:20 msofer Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset a}
206
207
208
209
210
211
212









213
214
215
216
217
218
219
    set a
} {a b}
test foreach-5.3 {break tests} {catch {break foo} msg} 1
test foreach-5.4 {break tests} {
    catch {break foo} msg
    set msg
} {wrong # args: should be "break"}










# Test for incorrect "double evaluation" semantics

test foreach-6.1 {delayed substitution of body} {knownBug} {
    proc foo {} {
       set a 0
       foreach a [list 1 2 3] "







>
>
>
>
>
>
>
>
>







206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
    set a
} {a b}
test foreach-5.3 {break tests} {catch {break foo} msg} 1
test foreach-5.4 {break tests} {
    catch {break foo} msg
    set msg
} {wrong # args: should be "break"}
# Check for bug #406709 
test foreach-5.5 {break tests} {
    proc a {} {
	set a 1
	foreach b b {list [concat a; break]; incr a}
	incr a
    }
    a
} {2}

# Test for incorrect "double evaluation" semantics

test foreach-6.1 {delayed substitution of body} {knownBug} {
    proc foo {} {
       set a 0
       foreach a [list 1 2 3] "
Changes to tests/http.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Commands covered:  http::config, http::geturl, http::wait, http::reset
#
# This file contains a collection of tests for the http script library.
# Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#
# RCS: @(#) $Id: http.test,v 1.19 2000/04/22 07:07:59 sandeep Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}
set tcltest::testConstraints(notLinux) \
	[expr ![string equal Linux $tcl_platform(os)]]








|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Commands covered:  http::config, http::geturl, http::wait, http::reset
#
# This file contains a collection of tests for the http script library.
# Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 by Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#
# RCS: @(#) $Id: http.test,v 1.19.2.2 2000/06/02 23:44:07 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}
set tcltest::testConstraints(notLinux) \
	[expr ![string equal Linux $tcl_platform(os)]]
286
287
288
289
290
291
292









293
294
295
296
297
298
299
	puts $errorInfo
	error $err
    }

    list [http::status $t] [http::code $t]
} {ok {HTTP/1.0 200 Data follows}}











test http-4.1 {http::Event} {
    set token [http::geturl $url]
    upvar #0 $token data
    array set meta $data(meta)
    expr ($data(totalsize) == $meta(Content-Length))
} 1







>
>
>
>
>
>
>
>
>







286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
	puts $errorInfo
	error $err
    }

    list [http::status $t] [http::code $t]
} {ok {HTTP/1.0 200 Data follows}}

test http-3.13 {http::geturl socket leak test} {
    set chanCount [llength [file channels]]
    for {set i 0} {$i < 3} {incr i} {
	catch {http::geturl $badurl -timeout 5000}
    }

    # No extra channels should be taken
    expr {[llength [file channels]] == $chanCount}
} 1

test http-4.1 {http::Event} {
    set token [http::geturl $url]
    upvar #0 $token data
    array set meta $data(meta)
    expr ($data(totalsize) == $meta(Content-Length))
} 1
Changes to tests/interp.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the multiple interpreter facility of Tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: interp.test,v 1.11 2000/04/10 17:19:00 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# The set of hidden commands is platform dependent:












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file tests the multiple interpreter facility of Tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: interp.test,v 1.11.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# The set of hidden commands is platform dependent:
631
632
633
634
635
636
637
638



639
640
641
642
643
644
645

#
# Test robustness of Tcl_DeleteInterp when applied to a slave interpreter.
# If there are bugs in the implementation these tests are likely to expose
# the bugs as a core dump.
#

if {[info commands testinterpdelete] != ""} {



    test interp-18.1 {testing Tcl_DeleteInterp vs slaves} {
	list [catch {testinterpdelete} msg] $msg
    } {1 {wrong # args: should be "testinterpdelete path"}}
    test interp-18.2 {testing Tcl_DeleteInterp vs slaves} {
	catch {interp delete a}
	interp create a
	testinterpdelete a







|
>
>
>







631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648

#
# Test robustness of Tcl_DeleteInterp when applied to a slave interpreter.
# If there are bugs in the implementation these tests are likely to expose
# the bugs as a core dump.
#

if {[info commands testinterpdelete] == ""} {
    puts "This application hasn't been compiled with the \"testinterpdelete\""
    puts "command, so I can't test slave delete calls"
} else {
    test interp-18.1 {testing Tcl_DeleteInterp vs slaves} {
	list [catch {testinterpdelete} msg] $msg
    } {1 {wrong # args: should be "testinterpdelete path"}}
    test interp-18.2 {testing Tcl_DeleteInterp vs slaves} {
	catch {interp delete a}
	interp create a
	testinterpdelete a
2348
2349
2350
2351
2352
2353
2354


















2355
2356
2357
2358
2359
2360
2361
    catch {unset a}
    set result [testMyNewSet "ok"]
    rename testMyNewSet {}
    rename mySet {}
    rename myNewSet {}
    set result
} ok



















# cleanup
foreach i [interp slaves] {
  interp delete $i
}
::tcltest::cleanupTests
return







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
    catch {unset a}
    set result [testMyNewSet "ok"]
    rename testMyNewSet {}
    rename mySet {}
    rename myNewSet {}
    set result
} ok

test interp-32.1 { parent's working directory should
                   be inherited by a child interp } {
    set parent [pwd]
    set i [interp create]
    set child [$i eval pwd]
    interp delete $i
    file mkdir cwd_test
    cd cwd_test
    lappend parent [pwd]
    set i [interp create]
    lappend child [$i eval pwd]
    cd ..
    file delete cwd_test
    interp delete $i
    expr {[string equal $parent $child] ? 1 :
             "\{$parent\} != \{$child\}"}
} 1

# cleanup
foreach i [interp slaves] {
  interp delete $i
}
::tcltest::cleanupTests
return
Added tests/iogt.test.
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
# -*- tcl -*-
# Commands covered:  transform, and stacking in general
#
# This file contains a collection of tests for Giot
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 2000 Ajuba Solutions.
# Copyright (c) 2000 Andreas Kupries.
# All rights reserved.
# 
# RCS: @(#) $Id: iogt.test,v 1.1.4.1 2000/07/27 01:39:20 hobbs Exp $


if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testchannel] == ""} {
    puts "Skipping io tests. This application does not seem to have the"
    puts "testchannel command that is needed to run these tests."
    return
}

::tcltest::saveState

#::tcltest::makeFile contents name

::tcltest::makeFile {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=} dummy

# " capture coloring of quotes

::tcltest::makeFile {} dummyout

::tcltest::makeFile {
#!/usr/local/bin/tclsh
# -*- tcl -*-
# echo server
#
# arguments, options: port to listen on for connections.
#                     delay till echo of first block
#                     delay between blocks
#                     blocksize ...

set port   [lindex $argv 0]
set fdelay [lindex $argv 1]
set idelay [lindex $argv 2]
set bsizes [lrange $argv 3 end]
set c      0

proc newconn {sock rhost rport} {
    global c fdelay
    incr   c

    #puts stdout "C $sock $rhost $rport / $fdelay" ; flush stdout

    upvar #0 c$c conn
    set conn(after) {}
    set conn(state) 0
    set conn(size)  0
    set conn(data)  ""
    set conn(delay) $fdelay

    fileevent  $sock readable [list echoGet $c $sock]
    fconfigure $sock -translation binary -buffering none -blocking 0
}

proc echoGet {c sock} {
    global fdelay
    upvar #0 c$c conn

    if {[eof $sock]} {
	# one-shot echo
	exit
    }

    append conn(data) [read $sock]

    #puts stdout "G $c $sock $conn(data) <<$conn(data)>>" ; flush stdout

    if {$conn(after) == {}} {
	set conn(after) [after $conn(delay) [list echoPut $c $sock]]
    }
}

proc echoPut {c sock} {
    global idelay fdelay bsizes
    upvar #0 c$c conn

    if {[string length $conn(data)] == 0} {
	#puts stdout "C $c $sock" ; flush stdout
	# auto terminate
	close $sock
	exit
	#set conn(delay) $fdelay
	return
    }


    set conn(delay) $idelay

    set n [lindex $bsizes $conn(size)]

    #puts stdout "P $c $sock $n >>" ; flush stdout

    #puts __________________________________________
    #parray conn
    #puts n=<$n>


    if {[string length $conn(data)] >= $n} {
	puts -nonewline $sock [string range $conn(data) 0 $n]
	set conn(data) [string range $conn(data) [incr n] end]
    }

    incr conn(size)
    if {$conn(size) >= [llength $bsizes]} {
	set conn(size) [expr {[llength $bsizes]-1}]
    }

    set conn(after) [after $conn(delay) [list echoPut $c $sock]]
}

#fileevent stdin readable {exit ;#cut}

# main
socket -server newconn $port
vwait forever
} __echo_srv__.tcl


########################################################################

proc fevent {fdelay idelay blocks script data} {
    # start and initialize an echo server, prepare data
    # transmission, then hand over to the test script.
    # this has to start real transmission via 'flush'.
    # The server is stopped after completion of the test.

    # fixed port, not so good. lets hope for the best, for now.
    set port 4000

    eval exec tclsh __echo_srv__.tcl \
	    $port $fdelay $idelay $blocks >@stdout &

    after 500

    #puts stdout "> $port" ; flush stdout

    set         sk [socket localhost $port]
    fconfigure $sk           \
	    -blocking   0    \
	    -buffering  full \
	    -buffersize [expr {10+[llength $data]}]

    puts -nonewline $sk $data

    # The channel is prepared to go off.

    #puts stdout ">>>>>" ; flush stdout

    uplevel #0 set sock $sk
    set res [uplevel #0 $script]

    catch {close $sk}
    return $res
}

# --------------------------------------------------------------
# utility transformations ...

proc id {op data} {
    switch -- $op {
	create/write -
	create/read  -
	delete/write -
	delete/read  -
	clear_read   {;#ignore}
	flush/write -
	flush/read  -
	write       -
	read        {
	    return $data
	}
	query/maxRead {return -1}
    }
}

proc id_optrail {var op data} {
    upvar #0 $var trail

    lappend trail $op

    switch -- $op {
	create/write	-	create/read	-
	delete/write	-	delete/read	-
	flush/read	-
	clear/read	{ #ignore }
	flush/write	-
	write		-
	read		{
	    return $data
	}
	query/maxRead	{
	    return -1
	}
	default		{
	    lappend trail "error $op"
	    error $op
	}
    }
}


proc id_fulltrail {var op data} {
    upvar #0 $var trail

    #puts stdout ">> $var $op $data" ; flush stdout

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set res *ignored*
	}
	flush/write -	flush/read  -
	write       -
	read        {
	    set res $data
	}
	query/maxRead {
	    set res -1
	}
    }

    #catch {puts stdout "\t>* $res" ; flush stdout}
    #catch {puts stdout "x$res"} msg

    lappend trail [list $op $data $res]
    return $res
}

proc counter {var op data} {
    upvar #0 $var n

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {;#ignore}
	flush/write  -	flush/read   {return {}}
	write {
	    return $data
	}
	read  {
	    if {$n > 0} {
		incr n -[string length $data]
		if {$n < 0} {
		    set n 0
		}
	    }
	    return $data
	}
	query/maxRead {
	    return $n
	}
    }
}


proc counter_audit {var vtrail op data} {
    upvar #0 $var n $vtrail trail

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set res {}
	}
	flush/write  -	flush/read   {
	    set res {}
	}
	write {
	    set res $data
	}
	read  {
	    if {$n > 0} {
		incr n -[string length $data]
		if {$n < 0} {
		    set n 0
		}
	    }
	    set res $data
	}
	query/maxRead {
	    set res $n
	}
    }

    lappend trail [list counter:$op $data $res]
    return $res
}


proc rblocks {var vtrail n op data} {
    upvar #0 $var buf $vtrail trail

    set res {}

    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {
	    set buf {}
	}
	flush/write {
	}
	flush/read  {
	    set res $buf
	    set buf {}
	}
	write       {
	    set data
	}
	read        {
	    append buf $data

	    set b [expr {$n * ([string length $buf] / $n)}]

	    append op " $n [string length $buf] :- $b"

	    set res [string range $buf 0 [incr b -1]]
	    set buf [string range $buf [incr b] end]
	    #return $res
	}
	query/maxRead {
	    set res -1
	}
    }

    lappend trail [list rblock | $op $data $res | $buf]
    return $res
}


# --------------------------------------------------------------
# ... and convenience procedures to stack them

proc identity {-attach channel} {
    testchannel transform $channel -command id
}

proc audit_ops {var -attach channel} {
    testchannel transform $channel -command [list id_optrail $var]
}

proc audit_flow {var -attach channel} {
    testchannel transform $channel -command [list id_fulltrail $var]
}

proc stopafter {var n -attach channel} {
    upvar #0 $var vn
    set vn $n
    testchannel transform $channel -command [list counter $var]
}

proc stopafter_audit {var trail n -attach channel} {
    upvar #0 $var vn
    set vn $n
    testchannel transform $channel -command [list counter_audit $var $trail]
}

proc rblocks_t {var trail n -attach channel} {
    testchannel transform $channel -command [list rblocks $var $trail $n]
}

# --------------------------------------------------------------
# serialize an array, with keys in sorted order.

proc array_sget {v} {
    upvar $v a

    set res [list]
    foreach n [lsort [array names a]] {
	lappend res $n $a($n)
    }
    set res
}

proc asort {alist} {
    # sort a list of key/value pairs by key, removes duplicates too.

    array set  a $alist
    array_sget a
}

########################################################################


test iogt-1.1 {stack/unstack} {
    set fh [open dummy r]
    identity -attach $fh
    testchannel unstack $fh
    close   $fh
} {}

test iogt-1.2 {stack/close} {
    set fh [open dummy r]
    identity -attach $fh
    close   $fh
} {}

test iogt-1.3 {stack/unstack, configuration, options} {
    set fh [open dummy r]
    set ca [asort [fconfigure $fh]]
    identity -attach $fh
    set cb [asort [fconfigure $fh]]
    testchannel unstack $fh
    set cc [asort [fconfigure $fh]]
    close $fh

    # With this system none of the buffering, translation and
    # encoding option may change their values with channels
    # stacked upon each other or not.

    # cb == ca == cc

    list [string equal $ca $cb] [string equal $cb $cc] [string equal $ca $cc]
} {1 1 1}

test iogt-1.4 {stack/unstack, configuration} {
    set fh [open dummy r]
    set ca [asort [fconfigure $fh]]
    identity -attach $fh
    fconfigure $fh \
	    -buffering   line \
	    -translation cr   \
	    -encoding    shiftjis
    testchannel unstack $fh
    set cc [asort [fconfigure $fh]]

    set res [list \
	    [string equal $ca $cc]   \
	    [fconfigure $fh -buffering]  \
	    [fconfigure $fh -translation] \
	    [fconfigure $fh -encoding]    \
	    ]

    close $fh
    set res
} {0 line cr shiftjis}

test iogt-2.0 {basic I/O going through transform} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    identity -attach $fin
    identity -attach $fout

    fcopy $fin $fout

    close $fin
    close $fout

    set fin  [open dummy    r]
    set fout [open dummyout r]

    set res     [string equal [set in [read $fin]] [set out [read $fout]]]
    lappend res [string length $in] [string length $out]

    close $fin
    close $fout

    set res
} {1 71 71}


test iogt-2.1 {basic I/O, operation trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set ain [list] ; set aout [list]
    audit_ops ain  -attach $fin
    audit_ops aout -attach $fout

    fconfigure $fin  -buffersize 10
    fconfigure $fout -buffersize 5

    fcopy $fin $fout

    close $fin
    close $fout

    set res "[join $ain \n]\n--------\n[join $aout \n]"
} {create/read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
read
query/maxRead
flush/read
query/maxRead
delete/read
--------
create/write
write
write
write
write
write
write
write
write
flush/write
delete/write}

test iogt-2.2 {basic I/O, data trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set ain [list] ; set aout [list]
    audit_flow ain  -attach $fin
    audit_flow aout -attach $fout

    fconfigure $fin  -buffersize 10
    fconfigure $fout -buffersize 5

    fcopy $fin $fout

    close $fin
    close $fout

    set res "[join $ain \n]\n--------\n[join $aout \n]"
} {create/read {} *ignored*
query/maxRead {} -1
read abcdefghij abcdefghij
query/maxRead {} -1
read klmnopqrst klmnopqrst
query/maxRead {} -1
read uvwxyz0123 uvwxyz0123
query/maxRead {} -1
read 456789,./? 456789,./?
query/maxRead {} -1
read {><;'\|":[]} {><;'\|":[]}
query/maxRead {} -1
read {\}\{`~!@#$} {\}\{`~!@#$}
query/maxRead {} -1
read %^&*()_+-= %^&*()_+-=
query/maxRead {} -1
read {
} {
}
query/maxRead {} -1
flush/read {} {}
query/maxRead {} -1
delete/read {} *ignored*
--------
create/write {} *ignored*
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
flush/write {} {}
delete/write {} *ignored*}


test iogt-2.3 {basic I/O, mixed trail} {unixOnly} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set trail [list]
    audit_flow trail -attach $fin
    audit_flow trail -attach $fout

    fconfigure $fin  -buffersize 20
    fconfigure $fout -buffersize 10

    fcopy $fin $fout

    close $fin
    close $fout

    join $trail \n
} {create/read {} *ignored*
create/write {} *ignored*
query/maxRead {} -1
read abcdefghijklmnopqrst abcdefghijklmnopqrst
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
query/maxRead {} -1
read uvwxyz0123456789,./? uvwxyz0123456789,./?
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
query/maxRead {} -1
read {><;'\|":[]\}\{`~!@#$} {><;'\|":[]\}\{`~!@#$}
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
query/maxRead {} -1
read {%^&*()_+-=
} {%^&*()_+-=
}
query/maxRead {} -1
flush/read {} {}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
query/maxRead {} -1
delete/read {} *ignored*
flush/write {} {}
delete/write {} *ignored*}


test iogt-3.0 {Tcl_Channel valid after stack/unstack, fevent handling} \
	{unknownFailure} {
    # This test to check the validity of aquired Tcl_Channel references is
    # not possible because even a backgrounded fcopy will immediately start
    # to copy data, without waiting for the event loop. This is done only in
    # case of an underflow on the read size!. So stacking transforms after the
    # fcopy will miss information, or are not used at all.
    #
    # I was able to circumvent this by using the echo.tcl server with a big
    # delay, causing the fcopy to underflow immediately.

    proc DoneCopy {n {err {}}} {
	global copy ; set copy 1
    }

    set fin  [open dummy    r]

    fevent 1000 500 {20 20 20 10 1 1} {
	close $fin

	set          fout [open dummyout w]

	flush $sock ; # now, or fcopy will error us out
	# But the 1 second delay should be enough to
	# initialize everything else here.

	fcopy $sock $fout -command DoneCopy

	# transform after fcopy got its handles !
	# They should be still valid for fcopy.

	set trail [list]
	audit_ops trail -attach $fout

	vwait copy
    } [read $fin] ; # {}

    close $fout

    rename DoneCopy {}

    # Check result of copy.

    set fin  [open dummy    r]
    set fout [open dummyout r]

    set res [string equal [read $fin] [read $fout]]

    close $fin
    close $fout

    list $res $trail
} {1 {create/write create/read write flush/write flush/read delete/write delete/read}}


test iogt-4.0 {fileevent readable, after transform} {unknownFailure} {
    set fin  [open dummy    r]
    set data [read $fin]
    close $fin

    set trail [list]
    set got   [list]

    proc Done {args} {
	global stop
	set    stop 1
    }

    proc Get {sock} {
	global trail got
	if {[eof $sock]} {
	    Done
	    lappend trail "xxxxxxxxxxxxx"
	    close $sock
	    return
	}
	lappend trail "vvvvvvvvvvvvv"
	lappend trail "\tgot: [lappend got "\[\[[read $sock]\]\]"]"
	lappend trail "============="
	#puts stdout $__ ; flush stdout
	#read $sock
    }

    fevent 1000 500 {20 20 20 10 1} {
	audit_flow trail   -attach $sock
	rblocks_t  rbuf trail 23 -attach $sock

	fileevent $sock readable [list Get $sock]

	flush $sock ; # now, or fcopy will error us out
	# But the 1 second delay should be enough to
	# initialize everything else here.

	vwait stop
    } $data


    rename Done {}
    rename Get {}

    join [list [join $got \n] ~~~~~~~~ [join $trail \n]] \n
} {[[]]
[[abcdefghijklmnopqrstuvw]]
[[xyz0123456789,./?><;'\|]]
[[]]
[[]]
[[":[]\}\{`~!@#$%^&*()]]
[[]]
~~~~~~~~
create/write {} *ignored*
create/read {} *ignored*
rblock | create/write {} {} | {}
rblock | create/read {} {} | {}
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
read abcdefghijklmnopqrstu abcdefghijklmnopqrstu
query/maxRead {} -1
rblock | {read 23 21 :- 0} abcdefghijklmnopqrstu {} | abcdefghijklmnopqrstu
rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
query/maxRead {} -1
	got: {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
query/maxRead {} -1
read vwxyz0123456789,./?>< vwxyz0123456789,./?><
query/maxRead {} -1
rblock | {read 23 42 :- 23} vwxyz0123456789,./?>< abcdefghijklmnopqrstuvw | xyz0123456789,./?><
rblock | query/maxRead {} -1 | xyz0123456789,./?><
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | xyz0123456789,./?><
query/maxRead {} -1
read {;'\|":[]\}\{`~!@#$%^&} {;'\|":[]\}\{`~!@#$%^&}
query/maxRead {} -1
rblock | {read 23 40 :- 23} {;'\|":[]\}\{`~!@#$%^&} {xyz0123456789,./?><;'\|} | {":[]\}\{`~!@#$%^&}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&}
query/maxRead {} -1
read *( *(
query/maxRead {} -1
rblock | {read 23 19 :- 0} *( {} | {":[]\}\{`~!@#$%^&*(}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*(}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*(}
query/maxRead {} -1
read ) )
query/maxRead {} -1
rblock | {read 23 20 :- 0} ) {} | {":[]\}\{`~!@#$%^&*()}
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*()}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {":[]\}\{`~!@#$%^&*()}
query/maxRead {} -1
flush/read {} {}
rblock | flush/read {} {":[]\}\{`~!@#$%^&*()} | {}
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]} {[[":[]\}\{`~!@#$%^&*()]]}
=============
vvvvvvvvvvvvv
rblock | query/maxRead {} -1 | {}
query/maxRead {} -1
	got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'\|]]} {[[]]} {[[]]} {[[":[]\}\{`~!@#$%^&*()]]} {[[]]}
xxxxxxxxxxxxx
rblock | flush/write {} {} | {}
rblock | delete/write {} {} | {}
rblock | delete/read {} {} | {}
flush/write {} {}
delete/write {} *ignored*
delete/read {} *ignored*}  ; # catch unescaped quote "


test iogt-5.0 {EOF simulation} {unknownFailure} {
    set fin  [open dummy    r]
    set fout [open dummyout w]

    set trail [list]

    audit_flow trail -attach $fin
    stopafter_audit d trail 20 -attach   $fin
    audit_flow trail -attach $fout

    fconfigure $fin  -buffersize 20
    fconfigure $fout -buffersize 10

    fcopy   $fin $fout
    testchannel unstack $fin

    # now copy the rest in the channel
    lappend trail {**after unstack**}

    fcopy $fin $fout

    close $fin
    close $fout

    join $trail \n
} {create/read {} *ignored*
counter:create/read {} {}
create/write {} *ignored*
counter:query/maxRead {} 20
query/maxRead {} -1
read {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=
} {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'\|":[]\}\{`~!@#$%^&*()_+-=
}
query/maxRead {} -1
flush/read {} {}
counter:read abcdefghijklmnopqrst abcdefghijklmnopqrst
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
counter:query/maxRead {} 0
counter:flush/read {} {}
counter:delete/read {} {}
**after unstack**
query/maxRead {} -1
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
write {><;'\|":[]} {><;'\|":[]}
write {\}\{`~!@#$} {\}\{`~!@#$}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
query/maxRead {} -1
delete/read {} *ignored*
flush/write {} {}
delete/write {} *ignored*}





proc constX {op data} {
    # replace anything coming in with a same-length string of x'es.
    switch -- $op {
	create/write -	create/read  -
	delete/write -	delete/read  -
	clear_read   {;#ignore}
	flush/write -	flush/read  -
	write       -
	read        {
	    return [string repeat x [string length $data]]
	}
	query/maxRead {return -1}
    }
}

proc constx {-attach channel} {
    testchannel transform $channel -command constX
}

test iogt-6.0 {Push back} {
    set f [open dummy r]

    # contents of dummy = "abcdefghi..."
    read $f 3 ; # skip behind "abc"

    constx -attach $f

    # expect to get "xxx" from the transform because
    # of unread "def" input to transform which returns "xxx".
    #
    # Actually the IO layer pre-read the whole file and will
    # read "def" directly from the buffer without bothering
    # to consult the newly stacked transformation. This is
    # wrong.

    set res [read $f 3]
    close $f
    set res
} {xxx}

test iogt-6.1 {Push back and up} {knownBug} {
    set f [open dummy r]

    # contents of dummy = "abcdefghi..."
    read $f 3 ; # skip behind "abc"

    constx -attach $f
    set res [read $f 3]

    testchannel unstack $f
    append res [read $f 3]
    close $f
    set res
} {xxxghi}


# cleanup
foreach file [list dummy dummyout __echo_srv__.tcl] {
    ::tcltest::removeFile $file
}
::tcltest::restoreState
::tcltest::cleanupTests
return
Changes to tests/msgcat.test.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# Copyright (c) 1998 Mark Harrison.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: msgcat.test,v 1.8 2000/04/11 21:16:18 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[catch {package require msgcat 1.0}]} {







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# Copyright (c) 1998 Mark Harrison.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: msgcat.test,v 1.8.2.1 2000/08/03 21:40:55 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[catch {package require msgcat 1.0}]} {
397
398
399
400
401
402
403



404
405
406
407
408
409
} "this is a test"
test msgcat-7.2 {::msgcat::mc, extra args go through to format} {
    ::msgcat::mc format2 "good test"
} "this is a good test"
test msgcat-7.3 {::msgcat::mc, errors from format are propagated} {
    catch {::msgcat::mc format3 "good test"}
} 1




# Reset the locale
::msgcat::mclocale $oldlocale

::tcltest::cleanupTests
return







>
>
>






397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
} "this is a test"
test msgcat-7.2 {::msgcat::mc, extra args go through to format} {
    ::msgcat::mc format2 "good test"
} "this is a good test"
test msgcat-7.3 {::msgcat::mc, errors from format are propagated} {
    catch {::msgcat::mc format3 "good test"}
} 1
test msgcat-7.4 {::msgcat::mc, extra args are given to unknown} {
    ::msgcat::mc "this is a %s" "good test"
} "this is a good test"

# Reset the locale
::msgcat::mclocale $oldlocale

::tcltest::cleanupTests
return
Changes to tests/opt.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Package covered:  opt1.0/optparse.tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: opt.test,v 1.6 2000/04/10 17:19:02 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# the package we are going to test













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Package covered:  opt1.0/optparse.tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: opt.test,v 1.6.2.1 2000/08/07 21:32:11 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# the package we are going to test
29
30
31
32
33
34
35
36

37

38
39
40
41
42
43
44
45
set n $::tcl::OptDescN

test opt-1.1 {OptKeyRegister / check that auto allocation is skipping existing keys} {
    list [::tcl::OptKeyRegister {} $n] [::tcl::OptKeyRegister {} [expr $n+1]] [::tcl::OptKeyRegister {}]
} "$n [expr $n+1] [expr $n+2]"

test opt-2.1 {OptKeyDelete} {
    list [::tcl::OptKeyRegister {} testkey] [::tcl::OptKeyDelete testkey] \

	    [catch {::tcl::OptKeyDelete testkey} msg] $msg;

} {testkey {} 1 {can't unset "OptDesc(testkey)": no such element in array}}


test opt-3.1 {OptParse / temp key is removed} {
    set n $::tcl::OptDescN
    set prev [array names ::tcl::OptDesc]
    ::tcl::OptKeyRegister {} $n
    list [info exists ::tcl::OptDesc($n)]\







|
>
|
>
|







29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
set n $::tcl::OptDescN

test opt-1.1 {OptKeyRegister / check that auto allocation is skipping existing keys} {
    list [::tcl::OptKeyRegister {} $n] [::tcl::OptKeyRegister {} [expr $n+1]] [::tcl::OptKeyRegister {}]
} "$n [expr $n+1] [expr $n+2]"

test opt-2.1 {OptKeyDelete} {
    list [::tcl::OptKeyRegister {} testkey] \
	    [info exists ::tcl::OptDesc(testkey)] \
	    [::tcl::OptKeyDelete testkey] \
	    [info exists ::tcl::OptDesc(testkey)]
} {testkey 1 {} 0}


test opt-3.1 {OptParse / temp key is removed} {
    set n $::tcl::OptDescN
    set prev [array names ::tcl::OptDesc]
    ::tcl::OptKeyRegister {} $n
    list [info exists ::tcl::OptDesc($n)]\
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

test opt-8.7 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarincr l {1 2} -9
    set l
} {a {b c -2 e} f}

test opt-8.8 {List utilities} {
    set l {{b c 7 e} f}
    ::tcl::Lfirst $l
} {b c 7 e}


test opt-8.9 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lrest $l
} {{b c 7 e} f}

test opt-8.10 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarpop l
    set l
} {{b c 7 e} f}

test opt-8.11 {List utilities} {







<
<
<
<
<
<
<
<
<
<
<







133
134
135
136
137
138
139











140
141
142
143
144
145
146

test opt-8.7 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarincr l {1 2} -9
    set l
} {a {b c -2 e} f}












test opt-8.10 {List utilities} {
    set l {a {b c 7 e} f}
    ::tcl::Lvarpop l
    set l
} {{b c 7 e} f}

test opt-8.11 {List utilities} {
Changes to tests/pkgMkIndex.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This file contains tests for the pkg_mkIndex command.
# Note that the tests are limited to Tcl scripts only, there are no shared
# libraries against which to test.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors.  No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: pkgMkIndex.test,v 1.16 2000/04/10 17:19:03 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set origDir [pwd]










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This file contains tests for the pkg_mkIndex command.
# Note that the tests are limited to Tcl scripts only, there are no shared
# libraries against which to test.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors.  No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: pkgMkIndex.test,v 1.16.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

set origDir [pwd]
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
    set dirPath [lindex $parsed 1]
    set patternList [lindex $parsed 2]

    file mkdir $dirPath
 
    if {[catch {
	file delete [file join $dirPath pkgIndex.tcl]
	eval pkg_mkIndex $options $dirPath $patternList
    } err]} {
	return [list 1 $err]
    }

    return [list 0 {}]
}








|







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
    set dirPath [lindex $parsed 1]
    set patternList [lindex $parsed 2]

    file mkdir $dirPath
 
    if {[catch {
	file delete [file join $dirPath pkgIndex.tcl]
	eval pkg_mkIndex $options [list $dirPath] $patternList
    } err]} {
	return [list 1 $err]
    }

    return [list 0 {}]
}

357
358
359
360
361
362
363




















364
365
366
367
368
369
370
371
} {0 {{football:1.0 {tclPkgSetup {samename.tcl source {::college::team ::pro::team}}}}}}

# Proc names with embedded spaces are properly listed (ie, correct number of
# braces) in result
test pkgMkIndex-13.1 {proc names with embedded spaces} {
    pkgtest::runIndex -lazy $fullPkgPath spacename.tcl
} {0 {{spacename:1.0 {tclPkgSetup {spacename.tcl source {{a b} {c d}}}}}}}





















# cleanup

namespace delete pkgtest
cd $origDir
::tcltest::cleanupTests
return








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
} {0 {{football:1.0 {tclPkgSetup {samename.tcl source {::college::team ::pro::team}}}}}}

# Proc names with embedded spaces are properly listed (ie, correct number of
# braces) in result
test pkgMkIndex-13.1 {proc names with embedded spaces} {
    pkgtest::runIndex -lazy $fullPkgPath spacename.tcl
} {0 {{spacename:1.0 {tclPkgSetup {spacename.tcl source {{a b} {c d}}}}}}}

# Test the pkg_compareExtension helper function
test pkgMkIndex-14.1 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so .so
} 1
test pkgMkIndex-14.2 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.bar .so
} 0
test pkgMkIndex-14.3 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1 .so
} 1
test pkgMkIndex-14.4 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1.2 .so
} 1
test pkgMkIndex-14.5 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo .so
} 0
test pkgMkIndex-14.6 {pkg_compareExtension} {unixOnly} {
    pkg_compareExtension foo.so.1.2.bar .so
} 0

# cleanup

namespace delete pkgtest
cd $origDir
::tcltest::cleanupTests
return

Changes to tests/regexp.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  regexp, regsub
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: regexp.test,v 1.13 2000/04/10 21:08:27 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset foo}













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  regexp, regsub
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: regexp.test,v 1.13.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

catch {unset foo}
522
523
524
525
526
527
528








529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
    # Go to index 1; a* matches the lambda (or {}) there then stops.   Recall
    #   that a* matches zero or more "a"'s; thus it matches the string "b", as
    #   there are zero or more "a"'s there.
    # Go to index 2; a* matches the "a" there then stops.
    # Go to index 3; this is past the end of the string, so stop.
    regexp -all -inline {a*} aba
} {a {} a}









# cleanup
::tcltest::cleanupTests
return





















>
>
>
>
>
>
>
>




<
<
<
<
<
<
<
<
<
<
<
<
<
<
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540














    # Go to index 1; a* matches the lambda (or {}) there then stops.   Recall
    #   that a* matches zero or more "a"'s; thus it matches the string "b", as
    #   there are zero or more "a"'s there.
    # Go to index 2; a* matches the "a" there then stops.
    # Go to index 3; this is past the end of the string, so stop.
    regexp -all -inline {a*} aba
} {a {} a}
test regexp-18.11 {regexp -all} {
    regexp -all -inline {^a} aaaa
} {a}

test regexp-19.1 {regsub null replacement} {
    regsub -all {@} {@hel@lo@} "\0a\0" result
    list $result [string length $result]
} "\0a\0hel\0a\0lo\0a\0 14"

# cleanup
::tcltest::cleanupTests
return














Changes to tests/scan.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  scan
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: scan.test,v 1.10 2000/04/10 17:19:04 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test scan-1.1 {BuildCharSet, CharInSet} {













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  scan
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: scan.test,v 1.10.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test scan-1.1 {BuildCharSet, CharInSet} {
319
320
321
322
323
324
325





























326
327
328
329
330
331
332
    catch {unset z}; array set z {}
    set result [list [catch {scan {abc def ghi} {%s%s%s} x z y} msg] \
	    $msg $x]
    unset y
    unset z
    set result
} {1 {couldn't set variable "z"couldn't set variable "y"} abc}






























test scan-5.1 {integer scanning} {
    set a {}; set b {}; set c {}; set d {}
    list [scan "-20 1476 \n33 0" "%d %d %d %d" a b c d] $a $b $c $d
} {4 -20 1476 33 0}
test scan-5.2 {integer scanning} {
    set a {}; set b {}; set c {}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
    catch {unset z}; array set z {}
    set result [list [catch {scan {abc def ghi} {%s%s%s} x z y} msg] \
	    $msg $x]
    unset y
    unset z
    set result
} {1 {couldn't set variable "z"couldn't set variable "y"} abc}

# procedure that returns the range of integers

proc int_range {} {
    for { set MIN_INT 1 } { $MIN_INT > 0 } {} {
	set MIN_INT [expr { $MIN_INT << 1 }]
    }
    set MAX_INT [expr { ~ $MIN_INT }]
    return [list $MIN_INT $MAX_INT]
}

test scan-4.62 {scanning of large and negative octal integers} {
    foreach { MIN_INT MAX_INT } [int_range] {}
    set scanstring [format {%o %o %o} -1 $MIN_INT $MAX_INT]
    list [scan $scanstring {%o %o %o} a b c] \
	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
} {3 1 1 1}
test scan-4.63 {scanning of large and negative hex integers} {
    foreach { MIN_INT MAX_INT } [int_range] {}
    set scanstring [format {%x %x %x} -1 $MIN_INT $MAX_INT]
    list [scan $scanstring {%x %x %x} a b c] \
	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
} {3 1 1 1}

# clean up from last two tests

catch {
    rename int_range {}
}

test scan-5.1 {integer scanning} {
    set a {}; set b {}; set c {}; set d {}
    list [scan "-20 1476 \n33 0" "%d %d %d %d" a b c d] $a $b $c $d
} {4 -20 1476 33 0}
test scan-5.2 {integer scanning} {
    set a {}; set b {}; set c {}
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
    set msg [scan "10 20 30" {%100$d %5$d %200$d}]
    list [llength $msg] [lindex $msg 99] [lindex $msg 4] [lindex $msg 199]
} {200 10 20 30}

# cleanup
::tcltest::cleanupTests
return





















<
<
<
<
<
<
<
<
<
<
<
<
<
<
655
656
657
658
659
660
661














    set msg [scan "10 20 30" {%100$d %5$d %200$d}]
    list [llength $msg] [lindex $msg 99] [lindex $msg 4] [lindex $msg 199]
} {200 10 20 30}

# cleanup
::tcltest::cleanupTests
return














Changes to tests/socket.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands tested in this file: socket.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: socket.test,v 1.14 2000/04/10 17:19:04 ericm Exp $

# Running socket tests with a remote server:
# ------------------------------------------
# 
# Some tests in socket.test depend on the existence of a remote server to
# which they connect. The remote server must be an instance of tcltest and it
# must run the script found in the file "remote.tcl" in this directory. You







|




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Commands tested in this file: socket.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: socket.test,v 1.14.2.1 2000/07/27 01:39:21 hobbs Exp $

# Running socket tests with a remote server:
# ------------------------------------------
# 
# Some tests in socket.test depend on the existence of a remote server to
# which they connect. The remote server must be an instance of tcltest and it
# must run the script found in the file "remote.tcl" in this directory. You
63
64
65
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
# using the remote server are not performed.

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testthread command

set ::tcltest::testConstraints(testthread) \
	[expr {[info commands testthread] != {}}]


#
# If remoteServerIP or remoteServerPort are not set, check in the
# environment variables for externally set values.
#

if {![info exists remoteServerIP]} {







|



>







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# using the remote server are not performed.

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testthread and exec commands

set ::tcltest::testConstraints(testthread) \
	[expr {[info commands testthread] != {}}]
set ::tcltest::testConstraints(exec) [expr {[info commands exec] != {}}]

#
# If remoteServerIP or remoteServerPort are not set, check in the
# environment variables for externally set values.
#

if {![info exists remoteServerIP]} {
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
    set sock ""
    set s2 [socket 127.0.0.1 2400]
    vwait sock
    puts $s2 one
    flush $s2
    after 500
    fconfigure $sock -blocking 0
    set result [gets $sock]
    lappend result [gets $sock]
    fconfigure $sock -blocking 1
    puts $s2 two
    flush $s2
    fconfigure $sock -blocking 0
    lappend result [gets $sock]
    fconfigure $sock -blocking 1
    close $s2
    close $s
    close $sock
    set result
} {one {} two}


test socket-3.1 {socket conflict} {socket stdio} {
    removeFile script
    set f [open script w]
    puts $f {
	set f [socket -server accept 2828]







|
|




|





|







548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
    set sock ""
    set s2 [socket 127.0.0.1 2400]
    vwait sock
    puts $s2 one
    flush $s2
    after 500
    fconfigure $sock -blocking 0
    set result a:[gets $sock]
    lappend result b:[gets $sock]
    fconfigure $sock -blocking 1
    puts $s2 two
    flush $s2
    fconfigure $sock -blocking 0
    lappend result c:[gets $sock]
    fconfigure $sock -blocking 1
    close $s2
    close $s
    close $sock
    set result
} {a:one b: c:two}


test socket-3.1 {socket conflict} {socket stdio} {
    removeFile script
    set f [open script w]
    puts $f {
	set f [socket -server accept 2828]
1272
1273
1274
1275
1276
1277
1278

1279
1280
1281
1282
1283
1284
1285
    fileevent $c readable "readlittle $c"
    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $socket10_13_test_server}
    list $spurious $len
} {0 2690}

test socket-11.12 {testing EOF stickyness} {socket doTestsWithRemoteServer} {
    set counter 0
    set done 0
    proc count_up {s} {
	global counter done after_id
	set l [gets $s]
	if {[eof $s]} {







>







1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
    fileevent $c readable "readlittle $c"
    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $socket10_13_test_server}
    list $spurious $len
} {0 2690}

test socket-11.12 {testing EOF stickyness} {socket doTestsWithRemoteServer} {
    set counter 0
    set done 0
    proc count_up {s} {
	global counter done after_id
	set l [gets $s]
	if {[eof $s]} {
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311

1312
1313
1314
1315
1316
1317
1318
    sendCommand {
	set socket10_14_test_server [socket -server accept 2836]
	proc accept {s a p} {
	    after 100 close $s
	}
    }
    set c [socket $remoteServerIP 2836]
    fileevent $c readable "count_up $c"
    set after_id [after 1000 timed_out]
    vwait done
    sendCommand {close $socket10_14_test_server}
    set done
} {EOF is sticky}

test socket-11.13 {testing async write, async flush, async close} \
	{socket doTestsWithRemoteServer} {
    proc readit {s} {
	global count done
	set l [read $s]
	incr count [string length $l]
	if {[eof $s]} {







|





>







1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
    sendCommand {
	set socket10_14_test_server [socket -server accept 2836]
	proc accept {s a p} {
	    after 100 close $s
	}
    }
    set c [socket $remoteServerIP 2836]
    fileevent $c readable [list count_up $c]
    set after_id [after 1000 timed_out]
    vwait done
    sendCommand {close $socket10_14_test_server}
    set done
} {EOF is sticky}

test socket-11.13 {testing async write, async flush, async close} \
	{socket doTestsWithRemoteServer} {
    proc readit {s} {
	global count done
	set l [read $s]
	incr count [string length $l]
	if {[eof $s]} {
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $l}
    set count
} 65566

test socket-12.1 {testing inheritance of server sockets} \
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 creates the server socket, launches script1,
    # waits a second, and exits.  The server socket will now
    # be closed unless script1 inherited it.

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f {
	package require tcltest
	set f [socket -server accept 2828]
	proc accept { file addr port } {
	    close $file
	}
	exec $::tcltest::tcltest script1 &
	close $f
	after 1000 exit
	vwait forever
    }
    close $f
	
    # Launch script2 and wait 5 seconds







|
<


















|

<




|







1362
1363
1364
1365
1366
1367
1368
1369

1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389

1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
    set timer [after 10000 "set done timed_out"]
    vwait done
    after cancel $timer
    sendCommand {close $l}
    set count
} 65566

test socket-12.1 {testing inheritance of server sockets} {socket exec} {

    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 creates the server socket, launches script1,
    # waits a second, and exits.  The server socket will now
    # be closed unless script1 inherited it.

    set f [open script2 w]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {

	set f [socket -server accept 2828]
	proc accept { file addr port } {
	    close $file
	}
	exec $tclsh script1 &
	close $f
	after 1000 exit
	vwait forever
    }
    close $f
	
    # Launch script2 and wait 5 seconds
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
	set x {server socket was inherited}
    }

    removeFile script1
    removeFile script2
    set x
} {server socket was not inherited}
test socket-12.2 {testing inheritance of client sockets} \
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 opens the client socket and writes to it.  It then
    # launches script1 and exits.  If the child process inherited the
    # client socket, the socket will still be open.

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f {
	set f [socket 127.0.0.1 2829]
	exec $::tcltest::tcltest script1 &
	puts $f testing
	flush $f
	after 1000 exit
	vwait forever
    }
    close $f

    # Create the server socket

    set server [socket -server accept 2829]
    proc accept { file host port } {

	# When the client connects, establish the read handler
	global server
	close $server
	fileevent $file readable [list getdata $file]
	fconfigure $file -buffering line -blocking 0
	return
    }
    proc getdata { file } {

	# Read handler on the accepted socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }







|
<


















|


|











<








<







1413
1414
1415
1416
1417
1418
1419
1420

1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453

1454
1455
1456
1457
1458
1459
1460
1461

1462
1463
1464
1465
1466
1467
1468
	set x {server socket was inherited}
    }

    removeFile script1
    removeFile script2
    set x
} {server socket was not inherited}
test socket-12.2 {testing inheritance of client sockets} {socket exec} {

    removeFile script1
    removeFile script2

    # Script1 is just a 10 second delay.  If the server socket
    # is inherited, it will be held open for 10 seconds

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    # Script2 opens the client socket and writes to it.  It then
    # launches script1 and exits.  If the child process inherited the
    # client socket, the socket will still be open.

    set f [open script2 w]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {
	set f [socket 127.0.0.1 2829]
	exec $tclsh script1 &
	puts $f testing
	flush $f
	after 1000 exit
	vwait forever
    }
    close $f

    # Create the server socket

    set server [socket -server accept 2829]
    proc accept { file host port } {

	# When the client connects, establish the read handler
	global server
	close $server
	fileevent $file readable [list getdata $file]
	fconfigure $file -buffering line -blocking 0
	return
    }
    proc getdata { file } {

	# Read handler on the accepted socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
    if {!$failed} {
	vwait failed
    }
    removeFile script1
    removeFile script2
    set x
} {client socket was not inherited}
test socket-12.3 {testing inheritance of accepted sockets} \
	{socket doTestsWithRemoteServer} {
    removeFile script1
    removeFile script2

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    set f [open script2 w]
    puts $f [list set tcltest $::tcltest::tcltest]
    puts $f {
	set server [socket -server accept 2930]
	proc accept { file host port } {
	    global tcltest
	    puts $file {test data on socket}
	    exec $::tcltest::tcltest script1 &
	    after 1000 exit
	}
	vwait forever
    }
    close $f

    # Launch the script2 process and connect to it.  See how long
    # the socket stays open

    exec $::tcltest::tcltest script2 &

    after 1000 set ok_to_proceed 1
    vwait ok_to_proceed

    set f [socket 127.0.0.1 2930]
    fconfigure $f -buffering full -blocking 0
    fileevent $f readable [list getdata $f]

    # If the socket is still open after 5 seconds, the script1 process
    # must have inherited the accepted socket.

    set failed 0
    after 5000 set failed 1

    proc getdata { file } {

	# Read handler on the client socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }







|
<











|

|

|

|














|










<







1496
1497
1498
1499
1500
1501
1502
1503

1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546

1547
1548
1549
1550
1551
1552
1553
    if {!$failed} {
	vwait failed
    }
    removeFile script1
    removeFile script2
    set x
} {client socket was not inherited}
test socket-12.3 {testing inheritance of accepted sockets} {socket exec} {

    removeFile script1
    removeFile script2

    set f [open script1 w]
    puts $f {
	after 10000 exit
	vwait forever
    }
    close $f

    set f [open script2 w]
    puts $f [list set tclsh $::tcltest::tcltest]
    puts $f {
	set server [socket -server accept 2931]
	proc accept { file host port } {
	    global tclsh
	    puts $file {test data on socket}
	    exec $tclsh script1 &
	    after 1000 exit
	}
	vwait forever
    }
    close $f

    # Launch the script2 process and connect to it.  See how long
    # the socket stays open

    exec $::tcltest::tcltest script2 &

    after 1000 set ok_to_proceed 1
    vwait ok_to_proceed

    set f [socket 127.0.0.1 2931]
    fconfigure $f -buffering full -blocking 0
    fileevent $f readable [list getdata $f]

    # If the socket is still open after 5 seconds, the script1 process
    # must have inherited the accepted socket.

    set failed 0
    after 5000 set failed 1

    proc getdata { file } {

	# Read handler on the client socket.
	global x
	global failed
	set status [catch {read $file} data]
	if {$status != 0} {
	    set x {read failed, error was $data}
	    catch { close $file }
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
   flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
::tcltest::cleanupTests
flush stdout
return


















<
<
<
<
<
<
<
<
<
<
<
1634
1635
1636
1637
1638
1639
1640











   flush $commandSocket
}
catch {close $commandSocket}
catch {close $remoteProcChan}
::tcltest::cleanupTests
flush stdout
return











Changes to tests/stack.test.
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
26
27
28
# Tests that the stack size is big enough for the application.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stack.test,v 1.8 2000/04/10 17:19:04 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Note that a failure in this test results in a crash of the executable.





















test stack-1.1 {maxNestingDepth reached on infinite recursion} {
    proc recurse {} { return [recurse] }
    catch {recurse} rv
    rename recurse {}
    set rv
} {too many nested calls to Tcl_EvalObj (infinite loop?)}

# cleanup






|




|







>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Tests that the stack size is big enough for the application.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stack.test,v 1.8.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Note that a failure in this test results in a crash of the executable.
# In order to avoid that, we do a basic check of the current stacksize.
# This size can be changed with ulimit (ksh/bash/sh) or limit (csh/tcsh).

# This doesn't catch all cases, for example threads of lower stacksize
# can still squeak through.  A core check is really needed. -- JH

if {[string equal $::tcl_platform(platform) "unix"]} {
    set stackSize [exec /bin/sh -c "ulimit -s"]
    if {[string is integer $stackSize] && ($stackSize < 2400)} {
        puts stderr "WARNING: the default application stacksize of $stackSize\
                may cause Tcl to\ncrash due to stack overflow before the\
                recursion limit is reached.\nA minimum stacksize of 2400\
                kbytes is recommended.\nSkipping inifite recursion test."
        set ::tcltest::testConstraints(minStack2400) 0
    } else {
        set ::tcltest::testConstraints(minStack2400) 1
    }
} else {
    set ::tcltest::testConstraints(minStack2400) 1
}

test stack-1.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
    proc recurse {} { return [recurse] }
    catch {recurse} rv
    rename recurse {}
    set rv
} {too many nested calls to Tcl_EvalObj (infinite loop?)}

# cleanup
Changes to tests/string.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  string
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: string.test,v 1.23 2000/04/10 17:19:04 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testobj command













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  string
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: string.test,v 1.23.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

# Some tests require the testobj command
251
252
253
254
255
256
257






258
259
260
261
262
263
264
} 0
test string-5.17 {string index, bad integer} {
    list [catch {string index "abc" 08} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
    list [catch {string index "abc" end-00289} msg] $msg
} {1 {expected integer but got "-00289" (looks like invalid octal number)}}








proc largest_int {} {
    # This will give us what the largest valid int on this machine is,
    # so we can test for overflow properly below on >32 bit systems
    set int 1
    set exp 7; # assume we get at least 8 bits







>
>
>
>
>
>







251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
} 0
test string-5.17 {string index, bad integer} {
    list [catch {string index "abc" 08} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
    list [catch {string index "abc" end-00289} msg] $msg
} {1 {expected integer but got "-00289" (looks like invalid octal number)}}
test string-5.19 {string index, bytearray object out of bounds} {
    string index [binary format I* {0x50515253 0x52}] -1
} {}
test string-5.20 {string index, bytearray object out of bounds} {
    string index [binary format I* {0x50515253 0x52}] 20
} {}


proc largest_int {} {
    # This will give us what the largest valid int on this machine is,
    # so we can test for overflow properly below on >32 bit systems
    set int 1
    set exp 7; # assume we get at least 8 bits
676
677
678
679
680
681
682









683
684
685
686
687
688
689
} aueue\334\0EU
test string-10.13 {string map, -nocase unicode} {
    string map -nocase [list \374 ue UE \334] "a\374ueUE\000EU"
} aue\334\334\0EU
test string-10.14 {string map, -nocase null arguments} {
    string map -nocase {{} abc} foo
} foo










test string-11.1 {string match, too few args} {
    list [catch {string match a} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
test string-11.2 {string match, too many args} {
    list [catch {string match a b c d} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}







>
>
>
>
>
>
>
>
>







682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
} aueue\334\0EU
test string-10.13 {string map, -nocase unicode} {
    string map -nocase [list \374 ue UE \334] "a\374ueUE\000EU"
} aue\334\334\0EU
test string-10.14 {string map, -nocase null arguments} {
    string map -nocase {{} abc} foo
} foo
test string-10.15 {string map, one pair case} {
    string map -nocase {abc 32} aAbCaBaAbAbcAb
} {a32aBaAb32Ab}
test string-10.16 {string map, one pair case} {
    string map -nocase {ab 4321} aAbCaBaAbAbcAb
} {a4321C4321a43214321c4321}
test string-10.17 {string map, one pair case} {
    string map {Ab 4321} aAbCaBaAbAbcAb
} {a4321CaBa43214321c4321}

test string-11.1 {string match, too few args} {
    list [catch {string match a} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
test string-11.2 {string match, too many args} {
    list [catch {string match a b c d} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
794
795
796
797
798
799
800





































801
802
803
804
805
806
807
} 0
test string-11.37 {string match nocase} {
    string match -nocase {[A-fh-Z]} g
} 0
test string-11.38 {string match case, reverse range} {
    string match {[A-fh-Z]} g
} 1






































test string-12.1 {string range} {
    list [catch {string range} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
test string-12.2 {string range} {
    list [catch {string range a 1} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
} 0
test string-11.37 {string match nocase} {
    string match -nocase {[A-fh-Z]} g
} 0
test string-11.38 {string match case, reverse range} {
    string match {[A-fh-Z]} g
} 1
test string-11.39 {string match, *\ case} {
    string match {*\abc} abc
} 1
test string-11.40 {string match, *special case} {
    string match {*[ab]} abc
} 0
test string-11.41 {string match, *special case} {
    string match {*[ab]*} abc
} 1
test string-11.42 {string match, *special case} {
    string match "*\\" "\\"
} 0
test string-11.43 {string match, *special case} {
    string match "*\\\\" "\\"
} 1
test string-11.44 {string match, *special case} {
    string match "*???" "12345"
} 1
test string-11.45 {string match, *special case} {
    string match "*???" "12"
} 0
test string-11.46 {string match, *special case} {
    string match "*\\*" "abc*"
} 1
test string-11.47 {string match, *special case} {
    string match "*\\*" "*"
} 1
test string-11.48 {string match, *special case} {
    string match "*\\*" "*abc"
} 0
test string-11.49 {string match, *special case} {
    string match "?\\*" "a*"
} 1
test string-11.50 {string match, *special case} {
    string match "\\" "\\"
} 0


test string-12.1 {string range} {
    list [catch {string range} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
test string-12.2 {string range} {
    list [catch {string range a 1} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
880
881
882
883
884
885
886






















887
888
889
890
891
892
893
} {abcabcabc}
test string-13.6 {string repeat} {
    string repeat abc -1
} {}
test string-13.7 {string repeat} {
    list [catch {string repeat abc end} msg] $msg
} {1 {expected integer but got "end"}}























test string-14.1 {string replace} {
    list [catch {string replace} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}
test string-14.2 {string replace} {
    list [catch {string replace a 1} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
} {abcabcabc}
test string-13.6 {string repeat} {
    string repeat abc -1
} {}
test string-13.7 {string repeat} {
    list [catch {string repeat abc end} msg] $msg
} {1 {expected integer but got "end"}}
test string-13.8 {string repeat} {
    string repeat {} -1000
} {}
test string-13.9 {string repeat} {
    string repeat {} 0
} {}
test string-13.10 {string repeat} {
    string repeat def 0
} {}
test string-13.11 {string repeat} {
    string repeat def 1
} def
test string-13.12 {string repeat} {
    string repeat ab\u7266cd 3
} ab\u7266cdab\u7266cdab\u7266cd
test string-13.13 {string repeat} {
    string repeat \x00 3
} \x00\x00\x00
test string-13.14 {string repeat} {
    # The string range will ensure us that string repeat gets a unicode string
    string repeat [string range ab\u7266cd 2 3] 3
} \u7266c\u7266c\u7266c

test string-14.1 {string replace} {
    list [catch {string replace} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}
test string-14.2 {string replace} {
    list [catch {string replace a 1} msg] $msg
} {1 {wrong # args: should be "string replace string first last ?string?"}}
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
test string-22.13 {string wordstart, unicode} {
    string wordstart "\uc700\uc700 abc" 8
} 3

# cleanup
::tcltest::cleanupTests
return













<
<
<
<
<
<
1233
1234
1235
1236
1237
1238
1239






test string-22.13 {string wordstart, unicode} {
    string wordstart "\uc700\uc700 abc" 8
} 3

# cleanup
::tcltest::cleanupTests
return






Changes to tests/stringObj.test.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# Copyright (c) 1995-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stringObj.test,v 1.10 2000/04/10 17:19:04 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# Copyright (c) 1995-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stringObj.test,v 1.10.2.2 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {
317
318
319
320
321
322
323
324
325





326
327
328
329
330
331



332
333
334
335
336
337



338
339
340
341
342
343




344
345
346
347
348
349
350
351
    set q
} {a b c d e f a ü b å c ï}

test stringObj-10.1 {Tcl_GetRange with all byte-size chars} {
    set x "abcdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {none bcde string string}
test stringObj-10.2 {Tcl_GetRange with some mixed width chars} {





    set x "abcïïdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {none bcïïde string string}
test stringObj-10.3 {Tcl_GetRange with some mixed width chars} {
    set x "abcïïdef"



    string length $x
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} {string bcïïde string string}
test stringObj-10.4 {Tcl_GetRange with some mixed width chars} {
    set a "ïa¿b®cï¿d®"



    set result [list]
    while {[string length $a] > 0} {
	set a [string range $a 1 end-1]
	lappend result $a
    }
    set result




} {a¿b®cï¿d ¿b®cï¿ b®cï ®c {}}

test stringObj-11.1 {UpdateStringOfString} {
    set x 2345
    list [string index $x end] [testobj objtype $x] [incr x] \
	    [testobj objtype $x]
} {5 string 2346 int}








|

>
>
>
>
>



|

|
>
>
>



|

|
>
>
>






>
>
>
>
|







317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
    set q
} {a b c d e f a ü b å c ï}

test stringObj-10.1 {Tcl_GetRange with all byte-size chars} {
    set x "abcdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} [list none bcde string string]
test stringObj-10.2 {Tcl_GetRange with some mixed width chars} {
    # Because this test does not use \uXXXX notation below instead of
    # hardcoding the values, it may fail in multibyte locales.  However,
    # we need to test that the parser produces untyped objects even when there
    # are high-ASCII characters in the input (like "ï").  I don't know what
    # else to do but inline those characters here.
    set x "abcïïdef"
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} [list none "bc\u00EF\u00EFde" string string]
test stringObj-10.3 {Tcl_GetRange with some mixed width chars} {
    # set x "abcïïdef"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set x "abc\u00EF\u00EFdef"
    string length $x
    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
	    [testobj objtype $x] [testobj objtype $y]
} [list string "bc\u00EF\u00EFde" string string]
test stringObj-10.4 {Tcl_GetRange with some mixed width chars} {
    # set a "ïa¿b®cï¿d®"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
    set result [list]
    while {[string length $a] > 0} {
	set a [string range $a 1 end-1]
	lappend result $a
    }
    set result
} [list a\u00BFb\u00AEc\u00EF\u00BFd	\
	\u00BFb\u00AEc\u00EF\u00BF	\
	b\u00AEc\u00EF			\
	\u00AEc				\
	{}]

test stringObj-11.1 {UpdateStringOfString} {
    set x 2345
    list [string index $x end] [testobj objtype $x] [incr x] \
	    [testobj objtype $x]
} {5 string 2346 int}

383
384
385
386
387
388
389
390



391
392
393



394
395
396
397
398
399
400
    set a "abcdef"
    list [string length $a] [string length $a]
} {6 6}
test stringObj-13.4 {Tcl_GetCharLength with mixed width chars} {
    string length "®" 
} 1
test stringObj-13.5 {Tcl_GetCharLength with mixed width chars} {
    string length "○○" 



} 6
test stringObj-13.6 {Tcl_GetCharLength with mixed width chars} {
    set a "ïa¿b®cï¿d®"



    list [string length $a] [string length $a]
} {10 10}

testobj freeallvars

# cleanup
::tcltest::cleanupTests







|
>
>
>


|
>
>
>







398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
    set a "abcdef"
    list [string length $a] [string length $a]
} {6 6}
test stringObj-13.4 {Tcl_GetCharLength with mixed width chars} {
    string length "®" 
} 1
test stringObj-13.5 {Tcl_GetCharLength with mixed width chars} {
    # string length "○○" 
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    string length "\u00EF\u00BF\u00AE\u00EF\u00BF\u00AE"
} 6
test stringObj-13.6 {Tcl_GetCharLength with mixed width chars} {
    # set a "ïa¿b®cï¿d®"
    # Use \uXXXX notation below instead of hardcoding the values, otherwise
    # the test will fail in multibyte locales.
    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
    list [string length $a] [string length $a]
} {10 10}

testobj freeallvars

# cleanup
::tcltest::cleanupTests
Changes to tests/subst.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  subst
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: subst.test,v 1.6 2000/04/10 17:19:05 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test subst-1.1 {basics} {








|




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Commands covered:  subst
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1994 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: subst.test,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

test subst-1.1 {basics} {
105
106
107
108
109
110
111











112
113


114
115
116
117
118
119
120
121
122
123






124















125















126



    subst -novariables {abc $x [expr 1+2] \\\x41}
} {abc $x 3 \A}
test subst-7.7 {switches} {
    set x 123
    subst -nov -nob -noc {abc $x [expr 1+2] \\\x41}
} {abc $x [expr 1+2] \\\x41}












# cleanup
::tcltest::cleanupTests


return


























































>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
|
|
|
|
|
|
|
|
|

>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
    subst -novariables {abc $x [expr 1+2] \\\x41}
} {abc $x 3 \A}
test subst-7.7 {switches} {
    set x 123
    subst -nov -nob -noc {abc $x [expr 1+2] \\\x41}
} {abc $x [expr 1+2] \\\x41}

test subst-8.1 {return in a subst} {
    subst {foo [return {x}; bogus code] bar}
} {foo x bar}
test subst-8.2 {return in a subst} {
    subst {foo [return x ; bogus code] bar}
} {foo x bar}
test subst-8.3 {return in a subst} {
    subst {foo [if 1 { return {x}; bogus code }] bar}
} {foo x bar}
test subst-8.4 {return in a subst} {
    subst {[eval {return hi}] there}
} {hi there}
test subst-8.5 {return in a subst} {
    subst {foo [return {]}; bogus code] bar}
} {foo ] bar}
test subst-8.6 {return in a subst} {
    subst {foo [return {x}; bogus code bar}
} {foo x}
test subst-8.7 {return in a subst, parse error} {
    subst {foo [return {x} ; set a {}" ; stuff] bar}
} {foo xset a {}" ; stuff] bar}
test subst-8.8 {return in a subst, parse error} {
    subst {foo [return {x} ; set bar baz ; set a {}" ; stuff] bar}
} {foo xset bar baz ; set a {}" ; stuff] bar}

test subst-9.1 {error in a subst} {
    list [catch {subst {[error foo; bogus code]bar}} msg] $msg
} {1 foo}
test subst-9.2 {error in a subst} {
    list [catch {subst {[if 1 { error foo; bogus code}]bar}} msg] $msg
} {1 foo}

test subst-10.1 {break in a subst} {
    subst {foo [break; bogus code] bar}
} {foo  bar}
test subst-10.2 {break in a subst} {
    subst {foo [break; return x; bogus code] bar}
} {foo  bar}
test subst-10.3 {break in a subst} {
    subst {foo [if 1 { break; bogus code}] bar}
} {foo  bar}
test subst-10.4 {break in a subst, parse error} {
    subst {foo [break ; set a {}{} ; stuff] bar}
} {foo set a {}{} ; stuff] bar}
test subst-10.5 {break in a subst, parse error} {
    subst {foo [break ;set bar baz ;set a {}{} ; stuff] bar}
} {foo set bar baz ;set a {}{} ; stuff] bar}

test subst-11.1 {continue in a subst} {
    subst {foo [continue; bogus code] bar}
} {foo  bar}
test subst-11.2 {continue in a subst} {
    subst {foo [continue; return x; bogus code] bar}
} {foo  bar}
test subst-11.3 {continue in a subst} {
    subst {foo [if 1 { continue; bogus code}] bar}
} {foo  bar}
test subst-11.4 {continue in a subst, parse error} {
    subst {foo [continue ; set a {}{} ; stuff] bar}
} {foo set a {}{} ; stuff] bar}
test subst-11.5 {continue in a subst, parse error} {
    subst {foo [continue ;set bar baz ;set a {}{} ; stuff] bar}
} {foo set bar baz ;set a {}{} ; stuff] bar}

# cleanup
::tcltest::cleanupTests
return
Changes to tests/unixInit.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# The file tests the functions in the tclUnixInit.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: unixInit.test,v 1.13 2000/04/10 17:19:05 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info exists env(TCL_LIBRARY)]} {












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# The file tests the functions in the tclUnixInit.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: unixInit.test,v 1.13.2.1 2001/04/03 22:54:38 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info exists env(TCL_LIBRARY)]} {
146
147
148
149
150
151
152


















153
154
155
156
157
158
159
    set x
} [list /tmp/sparkly/lib/tcl[info tclversion] /tmp/lib/tcl[info tclversion]]
test unixInit-2.7 {TclpInitLibraryPath: compiled-in library path} \
	{emptyTest unixOnly} {
    # would need test command to get defaultLibDir and compare it to
    # [lindex $auto_path end]
} {}


















test unixInit-3.1 {TclpSetInitialEncodings} {unixOnly installedTcl} {
    set env(LANG) C

    set f [open "|[list $::tcltest::tcltest]" w+]
    fconfigure $f -buffering none
    puts $f {puts [encoding system]; exit}
    set enc [gets $f]







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
    set x
} [list /tmp/sparkly/lib/tcl[info tclversion] /tmp/lib/tcl[info tclversion]]
test unixInit-2.7 {TclpInitLibraryPath: compiled-in library path} \
	{emptyTest unixOnly} {
    # would need test command to get defaultLibDir and compare it to
    # [lindex $auto_path end]
} {}
test unixInit-2.8 {TclpInitLibraryPath: all absolute pathtype} {unixOnly} {
    file delete -force /tmp/sparkly
    file delete -force /tmp/lib
    file mkdir /tmp/sparkly
    file copy $::tcltest::tcltest /tmp/sparkly/tcltest

    file mkdir /tmp/lib/tcl[info tclversion]
    close [open /tmp/lib/tcl[info tclversion]/init.tcl w]

    set allAbsolute 1
    foreach dir [getlibpath /tmp/sparkly/tcltest] {
	set allAbsolute [expr {$allAbsolute \
		&& [string equal absolute [file pathtype $dir]]}]
    }
    file delete -force /tmp/sparkly
    file delete -force /tmp/lib
    set allAbsolute
} 1
test unixInit-3.1 {TclpSetInitialEncodings} {unixOnly installedTcl} {
    set env(LANG) C

    set f [open "|[list $::tcltest::tcltest]" w+]
    fconfigure $f -buffering none
    puts $f {puts [encoding system]; exit}
    set enc [gets $f]
Changes to tests/util.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# This file is a Tcl script to test the code in the file tclUtil.c.
# This file is organized in the standard fashion for Tcl tests.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: util.test,v 1.7 2000/04/10 17:19:06 ericm Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# This file is a Tcl script to test the code in the file tclUtil.c.
# This file is organized in the standard fashion for Tcl tests.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: util.test,v 1.7.2.1 2001/07/16 23:14:13 hobbs Exp $

if {[lsearch [namespace children] ::tcltest] == -1} {
    package require tcltest
    namespace import -force ::tcltest::*
}

if {[info commands testobj] == {}} {
58
59
60
61
62
63
64




65
66
67
68
69
70
71
} {a b\\  c}
test util-4.4 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a {b } c
} {a b c}
test util-4.5 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a { } c
} {a c}





test util-5.1 {Tcl_StringMatch} {
    string match ab*c abc
} 1
test util-5.2 {Tcl_StringMatch} {
    string match ab**c abc
} 1







>
>
>
>







58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
} {a b\\  c}
test util-4.4 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a {b } c
} {a b c}
test util-4.5 {Tcl_ConcatObj - backslash-space at end of argument} {
    concat a { } c
} {a c}
test util-4.6 {Tcl_ConcatObj - utf-8 sequence with "whitespace" char} {
    # Check for Bug #227512.  If this violates C isspace, then it returns \xc3.
    concat \xe0
} \xe0

test util-5.1 {Tcl_StringMatch} {
    string match ab*c abc
} 1
test util-5.2 {Tcl_StringMatch} {
    string match ab**c abc
} 1
Added tools/configure.


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --with-tcl=DIR          use Tcl 8.3 binaries from DIR"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=man2tcl.c

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# RCS: @(#) $Id: configure,v 1.1.2.1 2001/04/03 22:10:13 hobbs Exp $

# Recover information that Tcl computed with its configure script.

#--------------------------------------------------------------------
#       See if there was a command-line option for where Tcl is;  if
#       not, assume that its top-level directory is a sibling of ours.
#--------------------------------------------------------------------

# Check whether --with-tcl or --without-tcl was given.
if test "${with_tcl+set}" = set; then
  withval="$with_tcl"
  TCL_BIN_DIR=$withval
else
  TCL_BIN_DIR=`cd ../../tcl8.3$TCL_PATCH_LEVEL/unix; pwd`
fi

if test ! -d $TCL_BIN_DIR; then
    { echo "configure: error: Tcl directory $TCL_BIN_DIR doesn't exist" 1>&2; exit 1; }
fi
if test ! -f $TCL_BIN_DIR/tclConfig.sh; then
    { echo "configure: error: There's no tclConfig.sh in $TCL_BIN_DIR;  perhaps you didn't specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?" 1>&2; exit 1; }
fi

. $TCL_BIN_DIR/tclConfig.sh

TCL_WIN_VERSION=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

CC=$TCL_CC






trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tcl.hpj" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@TCL_WIN_VERSION@%$TCL_WIN_VERSION%g
s%@CC@%$CC%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tcl.hpj"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to tools/man2help.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# man2help.tcl --
#
# This file defines procedures that work in conjunction with the
# man2tcl program to generate a Windows help file from Tcl manual
# entries.
#
# Copyright (c) 1996 by Sun Microsystems, Inc.
#
# RCS: @(#) $Id: man2help.tcl,v 1.6 1999/12/22 22:59:59 hobbs Exp $
# 

#
# PASS 1
#

proc generateContents {basename version files} {








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# man2help.tcl --
#
# This file defines procedures that work in conjunction with the
# man2tcl program to generate a Windows help file from Tcl manual
# entries.
#
# Copyright (c) 1996 by Sun Microsystems, Inc.
#
# RCS: @(#) $Id: man2help.tcl,v 1.6.2.1 2001/04/03 22:54:38 hobbs Exp $
# 

#
# PASS 1
#

proc generateContents {basename version files} {
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    puts "Generating man pages for $dir..."
    foreach f [lsort [glob [file join $dir *.\[13n\]]]] {
	do $f
    }
}

# process command line arguments

if {$argc < 3} {
    puts stderr "usage: $argv0 projectName version manFiles..."
    exit 1
}

set baseName [lindex $argv 0]
set version [lindex $argv 1]
set files {}
foreach i [lrange $argv 2 end] {
    set i [file join $i]
    if {[file isdir $i]} {
	foreach f [lsort [glob [file join $i *.\[13n\]]]] {
	    lappend files $f
	}
    } elseif {[file exists $i]} {
	lappend files $i
    }
}

source [file join [file dir $argv0] index.tcl]
generateContents $baseName $version $files
source [file join [file dir $argv0] man2help2.tcl]
generateHelp $baseName $files







|

















|











94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    puts "Generating man pages for $dir..."
    foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
	do $f
    }
}

# process command line arguments

if {$argc < 3} {
    puts stderr "usage: $argv0 projectName version manFiles..."
    exit 1
}

set baseName [lindex $argv 0]
set version [lindex $argv 1]
set files {}
foreach i [lrange $argv 2 end] {
    set i [file join $i]
    if {[file isdir $i]} {
	foreach f [lsort [glob -directory $i "*.\[13n\]"]] {
	    lappend files $f
	}
    } elseif {[file exists $i]} {
	lappend files $i
    }
}

source [file join [file dir $argv0] index.tcl]
generateContents $baseName $version $files
source [file join [file dir $argv0] man2help2.tcl]
generateHelp $baseName $files
Changes to tools/man2html.tcl.
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Given a directory as argument, translate all the man pages in
# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    foreach f [lsort [glob $dir/*.\[13n\]]] {
	do $f	;# defined in man2html1.tcl & man2html2.tcl
    }
}


if {$argc < 2} {
    puts stderr "usage: $argv0 html_dir tcl_dir packages..."







|







71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Given a directory as argument, translate all the man pages in
# that directory.
#
# Arguments:
# dir -			Name of the directory.

proc doDir dir {
    foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
	do $f	;# defined in man2html1.tcl & man2html2.tcl
    }
}


if {$argc < 2} {
    puts stderr "usage: $argv0 html_dir tcl_dir packages..."
Changes to tools/tcl.wse.in.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  Japanese Font Size=10
  Start Gradient=0 0 255
  End Gradient=0 0 0
  Windows Flags=00000000000000010010110000001000
  Log Pathname=%MAINDIR%\INSTALL.LOG
  Message Font=MS Sans Serif
  Font Size=8
  Disk Label=tcl8.3.1
  Disk Filename=setup
  Patch Flags=0000000000000001
  Patch Threshold=85
  Patch Memory=4000
  Variable Name1=_SYS_
  Variable Default1=C:\WINDOWS\SYSTEM
  Variable Flags1=00001000







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  Japanese Font Size=10
  Start Gradient=0 0 255
  End Gradient=0 0 0
  Windows Flags=00000000000000010010110000001000
  Log Pathname=%MAINDIR%\INSTALL.LOG
  Message Font=MS Sans Serif
  Font Size=8
  Disk Label=tcl8.3.3
  Disk Filename=setup
  Patch Flags=0000000000000001
  Patch Threshold=85
  Patch Memory=4000
  Variable Name1=_SYS_
  Variable Default1=C:\WINDOWS\SYSTEM
  Variable Flags1=00001000
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
end
item: Set Variable
  Variable=APPTITLE
  Value=Tcl/Tk %PATCHLEVEL% for Windows
end
item: Set Variable
  Variable=URL
  Value=http://dev.scriptics.com/registration/%PATCHLEVEL%.html
end
item: Set Variable
  Variable=GROUP
  Value=Tcl
end
item: Set Variable
  Variable=DISABLED







|







50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
end
item: Set Variable
  Variable=APPTITLE
  Value=Tcl/Tk %PATCHLEVEL% for Windows
end
item: Set Variable
  Variable=URL
  Value=http://tcl.activestate.com/
end
item: Set Variable
  Variable=GROUP
  Value=Tcl
end
item: Set Variable
  Variable=DISABLED
1025
1026
1027
1028
1029
1030
1031





1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046





1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkDecls.h
  Destination=%MAINDIR%\include\tkDecls.h
  Flags=0000000000000010
end





item: Install File
  Source=${__TKBASEDIR__}\generic\tkIntXlibDecls.h
  Destination=%MAINDIR%\include\tkIntXlibDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tcl.h
  Destination=%MAINDIR%\include\tcl.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tclDecls.h
  Destination=%MAINDIR%\include\tclDecls.h
  Flags=0000000000000010
end





item: End Block
end
item: If/While Statement
  Variable=COMPONENTS
  Value=A
  Flags=00001010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat1.0\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.0\pkgIndex.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat1.0\msgcat.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.0\msgcat.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\tcltest1.0\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\tcltest1.0\pkgIndex.tcl
  Flags=0000000000000010
end







>
>
>
>
>















>
>
>
>
>








|
|



|
|







1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkDecls.h
  Destination=%MAINDIR%\include\tkDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkPlatDecls.h
  Destination=%MAINDIR%\include\tkPlatDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\generic\tkIntXlibDecls.h
  Destination=%MAINDIR%\include\tkIntXlibDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tcl.h
  Destination=%MAINDIR%\include\tcl.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tclDecls.h
  Destination=%MAINDIR%\include\tclDecls.h
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\generic\tclPlatDecls.h
  Destination=%MAINDIR%\include\tclPlatDecls.h
  Flags=0000000000000010
end
item: End Block
end
item: If/While Statement
  Variable=COMPONENTS
  Value=A
  Flags=00001010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.1\pkgIndex.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\msgcat\msgcat.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\msgcat1.1\msgcat.tcl
  Flags=0000000010000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\tcltest1.0\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\tcltest1.0\pkgIndex.tcl
  Flags=0000000000000010
end
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
end
item: Install File
  Source=${__TCLBASEDIR__}\library\encoding\big5.enc
  Destination=%MAINDIR%\lib\tcl%VER%\encoding\big5.enc
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt0.4\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt0.4\optparse.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\optparse.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http2.3\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http2.3\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\http.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\library\msgbox.tcl
  Destination=%MAINDIR%\lib\tk%VER%\msgbox.tcl
  Flags=0000000000000010







|




|




|




|







1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
end
item: Install File
  Source=${__TCLBASEDIR__}\library\encoding\big5.enc
  Destination=%MAINDIR%\lib\tcl%VER%\encoding\big5.enc
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\opt\optparse.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\opt0.4\optparse.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http\pkgIndex.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\pkgIndex.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TCLBASEDIR__}\library\http\http.tcl
  Destination=%MAINDIR%\lib\tcl%VER%\http2.3\http.tcl
  Flags=0000000000000010
end
item: Install File
  Source=${__TKBASEDIR__}\library\msgbox.tcl
  Destination=%MAINDIR%\lib\tk%VER%\msgbox.tcl
  Flags=0000000000000010
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
end
item: Set Variable
  Variable=MAINDIR
  Value=%MAINDIR%
  Flags=00010100
end
item: Include Script
  Pathname=\\pop\tools\1.2\win32-ix86\wise\INCLUDE\uninstal.wse
end
item: Check Configuration
  Flags=10111011
end
item: Get Registry Key Value
  Variable=GROUPDIR
  Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders







|







2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
end
item: Set Variable
  Variable=MAINDIR
  Value=%MAINDIR%
  Flags=00010100
end
item: Include Script
  Pathname=D:\win32-ix86\wise\INCLUDE\uninstal.wse
end
item: Check Configuration
  Flags=10111011
end
item: Get Registry Key Value
  Variable=GROUPDIR
  Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
end
item: Add Directory to Path
  Directory=%MAINDIR%\bin
end
item: Check Configuration
  Flags=10111011
end
item: Set Variable
  Variable=TO_SCRIPTICS
  Value=A
end
item: Else Statement
end
item: Set Variable
  Variable=TO_SCRIPTICS
end
item: End Block
end
item: Wizard Block
  Direction Variable=DIRECTION
  Display Variable=DISPLAY
  Bitmap Pathname=%_WISE_%\DIALOGS\TEMPLATE\WIZARD.BMP
  X Position=9







<
<
<
<
<
<
<
<
<







2216
2217
2218
2219
2220
2221
2222









2223
2224
2225
2226
2227
2228
2229
end
item: Add Directory to Path
  Directory=%MAINDIR%\bin
end
item: Check Configuration
  Flags=10111011
end









item: End Block
end
item: Wizard Block
  Direction Variable=DIRECTION
  Display Variable=DISPLAY
  Bitmap Pathname=%_WISE_%\DIALOGS\TEMPLATE\WIZARD.BMP
  X Position=9
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
      Text Spanish=%APPTITLE% se ha instalado con éxito.
      Text Spanish=
      Text Spanish=Presione el botón Terminar para salir de esta instalación.
      Text Italian=L'installazione %APPTITLE% è stata portata a termine con successo.
      Text Italian=
      Text Italian=Premere il pulsante Fine per uscire dall'installazione.
    end
    item: Checkbox
      Rectangle=88 143 245 157
      Variable=TO_SCRIPTICS
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000010000000000000011
      Text=Show me important information about
      Text=
    end
    item: Static
      Rectangle=99 156 245 170
      Enabled Color=00000000000000001111111111111111
      Create Flags=01010000000000000000000000000000
      Text=Tcl/Tk %VER% and TclPro
    end
  end
end
item: End Block
end
item: Check Configuration
  Flags=10111011
end
item: If/While Statement
  Variable=TO_SCRIPTICS
  Value=A
  Flags=00000010
end
item: Execute Program
  Command Line=%URL%
end
item: End Block
end
item: Execute Program
  Pathname=explorer
  Command Line=%GROUP%
end
item: End Block
end







<
<
<
<
<
<
<
<
<
<
<
<
<
<







<
<
<
<
<
<
<
<
<
<






2314
2315
2316
2317
2318
2319
2320














2321
2322
2323
2324
2325
2326
2327










2328
2329
2330
2331
2332
2333
      Text Spanish=%APPTITLE% se ha instalado con éxito.
      Text Spanish=
      Text Spanish=Presione el botón Terminar para salir de esta instalación.
      Text Italian=L'installazione %APPTITLE% è stata portata a termine con successo.
      Text Italian=
      Text Italian=Premere il pulsante Fine per uscire dall'installazione.
    end














  end
end
item: End Block
end
item: Check Configuration
  Flags=10111011
end










item: Execute Program
  Pathname=explorer
  Command Line=%GROUP%
end
item: End Block
end
Changes to tools/tclSplash.bmp.

cannot compute difference between binary files

Changes to unix/Makefile.in.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.63 2000/04/25 20:58:48 hobbs Exp $

VERSION 		= @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.63.2.4 2001/04/03 23:00:17 hobbs Exp $

VERSION 		= @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
	tclThreadTest.o	tclUnixTest.o tclXtNotify.o tclXtTest.o 

GENERIC_OBJS = regcomp.o regexec.o regfree.o regerror.o tclAlloc.o \
	tclAsync.o tclBasic.o tclBinary.o \
	tclCkalloc.o tclClock.o tclCmdAH.o tclCmdIL.o tclCmdMZ.o \
	tclCompCmds.o tclCompExpr.o tclCompile.o tclDate.o tclEncoding.o \
	tclEnv.o tclEvent.o tclExecute.o tclFCmd.o tclFileName.o tclGet.o \
	tclHash.o tclHistory.o tclIndexObj.o tclInterp.o tclIO.o \
	tclIOCmd.o tclIOSock.o tclIOUtil.o tclLink.o tclListObj.o \
	tclLiteral.o tclLoad.o tclMain.o tclNamesp.o tclNotify.o \
	tclObj.o tclPanic.o tclParse.o tclParseExpr.o tclPipe.o \
	tclPkg.o tclPosixStr.o tclPreserve.o tclProc.o tclRegexp.o \
	tclResolve.o tclResult.o tclScan.o tclStringObj.o tclThread.o \
	tclStubInit.o tclStubLib.o tclTimer.o tclUtf.o tclUtil.o tclVar.o

STUB_LIB_OBJS = tclStubLib.o ${COMPAT_OBJS}







|
|







262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
	tclThreadTest.o	tclUnixTest.o tclXtNotify.o tclXtTest.o 

GENERIC_OBJS = regcomp.o regexec.o regfree.o regerror.o tclAlloc.o \
	tclAsync.o tclBasic.o tclBinary.o \
	tclCkalloc.o tclClock.o tclCmdAH.o tclCmdIL.o tclCmdMZ.o \
	tclCompCmds.o tclCompExpr.o tclCompile.o tclDate.o tclEncoding.o \
	tclEnv.o tclEvent.o tclExecute.o tclFCmd.o tclFileName.o tclGet.o \
	tclHash.o tclHistory.o tclIndexObj.o tclInterp.o tclIO.o tclIOCmd.o \
	tclIOGT.o tclIOSock.o tclIOUtil.o tclLink.o tclListObj.o \
	tclLiteral.o tclLoad.o tclMain.o tclNamesp.o tclNotify.o \
	tclObj.o tclPanic.o tclParse.o tclParseExpr.o tclPipe.o \
	tclPkg.o tclPosixStr.o tclPreserve.o tclProc.o tclRegexp.o \
	tclResolve.o tclResult.o tclScan.o tclStringObj.o tclThread.o \
	tclStubInit.o tclStubLib.o tclTimer.o tclUtf.o tclUtil.o tclVar.o

STUB_LIB_OBJS = tclStubLib.o ${COMPAT_OBJS}
320
321
322
323
324
325
326

327
328
329
330
331
332
333
	$(GENERIC_DIR)/tclGet.c \
	$(GENERIC_DIR)/tclHash.c \
	$(GENERIC_DIR)/tclHistory.c \
	$(GENERIC_DIR)/tclIndexObj.c \
	$(GENERIC_DIR)/tclInterp.c \
	$(GENERIC_DIR)/tclIO.c \
	$(GENERIC_DIR)/tclIOCmd.c \

	$(GENERIC_DIR)/tclIOSock.c \
	$(GENERIC_DIR)/tclIOUtil.c \
	$(GENERIC_DIR)/tclLink.c \
	$(GENERIC_DIR)/tclListObj.c \
	$(GENERIC_DIR)/tclLiteral.c \
	$(GENERIC_DIR)/tclLoad.c \
	$(GENERIC_DIR)/tclMain.c \







>







320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
	$(GENERIC_DIR)/tclGet.c \
	$(GENERIC_DIR)/tclHash.c \
	$(GENERIC_DIR)/tclHistory.c \
	$(GENERIC_DIR)/tclIndexObj.c \
	$(GENERIC_DIR)/tclInterp.c \
	$(GENERIC_DIR)/tclIO.c \
	$(GENERIC_DIR)/tclIOCmd.c \
	$(GENERIC_DIR)/tclIOGT.c \
	$(GENERIC_DIR)/tclIOSock.c \
	$(GENERIC_DIR)/tclIOUtil.c \
	$(GENERIC_DIR)/tclLink.c \
	$(GENERIC_DIR)/tclListObj.c \
	$(GENERIC_DIR)/tclLiteral.c \
	$(GENERIC_DIR)/tclLoad.c \
	$(GENERIC_DIR)/tclMain.c \
430
431
432
433
434
435
436
437
438
439
440



441
442
443
444
445
446
447
448
449
450
451
452
453
454
	${CC} @LDFLAGS@ ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tclsh

tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST}
	${CC} @LDFLAGS@ ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tcltest


# Note, in the target below TCL_LIBRARY needs to be set or else
# "make test" won't work in the case where the compilation directory
# isn't the same as the source directory.




test: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
	./tcltest $(TOP_DIR)/tests/all.tcl $(TCLTESTARGS)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \







<



>
>
>






|







431
432
433
434
435
436
437

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
	${CC} @LDFLAGS@ ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tclsh

tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST}
	${CC} @LDFLAGS@ ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
		@TCL_LD_SEARCH_FLAGS@ -o tcltest


# Note, in the target below TCL_LIBRARY needs to be set or else
# "make test" won't work in the case where the compilation directory
# isn't the same as the source directory.
# Specifying TESTFLAGS on the command line is the standard way to pass
# args to tcltest, ie:
#	% make test TESTFLAGS="-verbose bps -file fileName.test"

test: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
	./tcltest $(TOP_DIR)/tests/all.tcl $(TESTFLAGS) $(TCLTESTARGS)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
	LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH; \
	LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
	SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
	TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
# only run by hand as yacc is not available in all environments.
# The name of the .c file is different than the name of the .y file
# so that make doesn't try to automatically regenerate the .c file.

gendate:
	yacc -l $(GENERIC_DIR)/tclGetDate.y
	sed -e 's/yy/TclDate/g' -e '/^#include <values.h>/d' \
	    -e 's?SCCSID?RCS: @(#) $$Id: Makefile.in,v 1.63 2000/04/25 20:58:48 hobbs Exp $$?' \
	    -e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \
	    -e '/TclDatenewstate:/d' -e '/#pragma/d' \
	    -e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \
	    <y.tab.c >$(GENERIC_DIR)/tclDate.c
	rm y.tab.c

# The following targets generate the shared libraries in dltest that







|







472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
# only run by hand as yacc is not available in all environments.
# The name of the .c file is different than the name of the .y file
# so that make doesn't try to automatically regenerate the .c file.

gendate:
	yacc -l $(GENERIC_DIR)/tclGetDate.y
	sed -e 's/yy/TclDate/g' -e '/^#include <values.h>/d' \
	    -e 's?SCCSID?RCS: @(#) $$Id: Makefile.in,v 1.63.2.4 2001/04/03 23:00:17 hobbs Exp $$?' \
	    -e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \
	    -e '/TclDatenewstate:/d' -e '/#pragma/d' \
	    -e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \
	    <y.tab.c >$(GENERIC_DIR)/tclDate.c
	rm y.tab.c

# The following targets generate the shared libraries in dltest that
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565

566
567
568
569
570
571
572
573

574
575


576





577
578
579
580









581
582
583
584
585
586
587
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		mkdir -p $$i; \
		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@for i in http2.3 http1.0 opt0.4 encoding msgcat1.0 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		mkdir -p $(SCRIPT_INSTALL_DIR)/$$i; \
		chmod 755 $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@if test ! -x $(SRC_DIR)/install-sh; then \
	    chmod +x $(SRC_DIR)/install-sh; \
	    fi
	@echo "Installing header files";
	@for i in $(GENERIC_DIR)/tcl.h $(GENERIC_DIR)/tclDecls.h ; \

	    do \
	    $(INSTALL_DATA) $$i $(INCLUDE_INSTALL_DIR); \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(TOP_DIR)/library/*.tcl $(TOP_DIR)/library/tclIndex $(UNIX_DIR)/tclAppInit.c $(UNIX_DIR)/ldAix; \
	    do \
	    $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR); \
	    done;

	@for i in http2.3 http1.0 opt0.4 msgcat1.0 tcltest1.0; \
	    do \


	    echo "Installing library $$i directory"; \





	    for j in $(TOP_DIR)/library/$$i/*.tcl ; \
		do \
		$(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/$$i; \
		done; \









	    done;
	@echo "Installing library encoding directory";
	@for i in $(TOP_DIR)/library/encoding/*.enc ; do \
		$(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/encoding; \
	done;

install-doc: doc







|












|
>








>
|

>
>
|
>
>
>
>
>
|
|
|
|
>
>
>
>
>
>
>
>
>







548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		mkdir -p $$i; \
		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@for i in http2.3 http1.0 opt0.4 encoding msgcat1.1 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		mkdir -p $(SCRIPT_INSTALL_DIR)/$$i; \
		chmod 755 $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@if test ! -x $(SRC_DIR)/install-sh; then \
	    chmod +x $(SRC_DIR)/install-sh; \
	    fi
	@echo "Installing header files";
	@for i in $(GENERIC_DIR)/tcl.h $(GENERIC_DIR)/tclDecls.h \
		$(GENERIC_DIR)/tclPlatDecls.h ; \
	    do \
	    $(INSTALL_DATA) $$i $(INCLUDE_INSTALL_DIR); \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(TOP_DIR)/library/*.tcl $(TOP_DIR)/library/tclIndex $(UNIX_DIR)/tclAppInit.c $(UNIX_DIR)/ldAix; \
	    do \
	    $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR); \
	    done;
	@echo "Installing library http1.0 directory";
	@for j in $(TOP_DIR)/library/http1.0/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http1.0; \
	    done;
	@echo "Installing library http2.3 directory";
	@for j in $(TOP_DIR)/library/http/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/http2.3; \
	    done;
	@echo "Installing library opt0.4 directory";
	@for j in $(TOP_DIR)/library/opt/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/opt0.4; \
	    done;
	@echo "Installing library msgcat1.1 directory";
	@for j in $(TOP_DIR)/library/msgcat/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/msgcat1.1; \
	    done;
	@echo "Installing library tcltest1.0 directory";
	@for j in $(TOP_DIR)/library/tcltest1.0/*.tcl ; \
	    do \
	    $(INSTALL_DATA) $$j $(SCRIPT_INSTALL_DIR)/tcltest1.0; \
	    done;
	@echo "Installing library encoding directory";
	@for i in $(TOP_DIR)/library/encoding/*.enc ; do \
		$(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/encoding; \
	done;

install-doc: doc
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
	rm -rf Makefile config.status config.cache config.log tclConfig.sh \
		$(PACKAGE).* prototype
	if test -f dltest/Makefile; then cd dltest; $(MAKE) distclean; fi

depend:
	makedepend -- $(DEPEND_SWITCHES) -- $(SRCS)

bp: $(UNIX_DIR)/bp.c
	$(CC) $(CC_SWITCHES) $(UNIX_DIR)/bp.c -o bp

# Test binaries.  The rules for tclTestInit.o and xtTestInit.o are
# complicated because they are compiled from tclAppInit.c.  Can't use
# the "-o" option because this doesn't work on some strange compilers
# (e.g. UnixWare).

tclTestInit.o: $(UNIX_DIR)/tclAppInit.c
	@if test -f tclAppInit.o ; then \







<
<
<







661
662
663
664
665
666
667



668
669
670
671
672
673
674
	rm -rf Makefile config.status config.cache config.log tclConfig.sh \
		$(PACKAGE).* prototype
	if test -f dltest/Makefile; then cd dltest; $(MAKE) distclean; fi

depend:
	makedepend -- $(DEPEND_SWITCHES) -- $(SRCS)




# Test binaries.  The rules for tclTestInit.o and xtTestInit.o are
# complicated because they are compiled from tclAppInit.c.  Can't use
# the "-o" option because this doesn't work on some strange compilers
# (e.g. UnixWare).

tclTestInit.o: $(UNIX_DIR)/tclAppInit.c
	@if test -f tclAppInit.o ; then \
778
779
780
781
782
783
784



785
786
787
788
789
790
791

tclIO.o: $(GENERIC_DIR)/tclIO.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIO.c

tclIOCmd.o: $(GENERIC_DIR)/tclIOCmd.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOCmd.c




tclIOSock.o: $(GENERIC_DIR)/tclIOSock.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOSock.c

tclIOUtil.o: $(GENERIC_DIR)/tclIOUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOUtil.c

tclLink.o: $(GENERIC_DIR)/tclLink.c







>
>
>







796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812

tclIO.o: $(GENERIC_DIR)/tclIO.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIO.c

tclIOCmd.o: $(GENERIC_DIR)/tclIOCmd.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOCmd.c

tclIOGT.o: $(GENERIC_DIR)/tclIOGT.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOGT.c

tclIOSock.o: $(GENERIC_DIR)/tclIOSock.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOSock.c

tclIOUtil.o: $(GENERIC_DIR)/tclIOUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOUtil.c

tclLink.o: $(GENERIC_DIR)/tclLink.c
1068
1069
1070
1071
1072
1073
1074





1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086

1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098

1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
	echo "%define _rpmdir `pwd`/RPMS" >> THIS.TCL.SPEC
	cat tcl.spec >> THIS.TCL.SPEC
	mkdir -p RPMS/i386
	rpm -bb THIS.TCL.SPEC
	mv RPMS/i386/*.rpm .
	rm -rf RPMS THIS.TCL.SPEC






#
# Target to create a proper Tcl distribution from information in the
# master source directory.  DISTDIR must be defined to indicate where
# to put the distribution.
#

DISTROOT =	/tmp/dist
DISTNAME =	tcl@TCL_VERSION@@TCL_PATCH_LEVEL@
ZIPNAME =	tcl@TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@@TCL_PATCH_LEVEL@.zip
DISTDIR =	$(DISTROOT)/$(DISTNAME)
$(UNIX_DIR)/configure: $(UNIX_DIR)/configure.in
	autoconf $(UNIX_DIR)/configure.in > $(UNIX_DIR)/configure

dist: $(UNIX_DIR)/configure
	rm -rf $(DISTDIR)
	mkdir $(DISTDIR)
	mkdir $(DISTDIR)/unix
	cp -p $(UNIX_DIR)/*.c $(UNIX_DIR)/*.h $(DISTDIR)/unix
	rm -f $(DISTDIR)/unix/bp.c
	cp $(UNIX_DIR)/Makefile.in $(DISTDIR)/unix
	chmod 664 $(DISTDIR)/unix/Makefile.in
	cp $(UNIX_DIR)/configure $(UNIX_DIR)/configure.in \
		$(UNIX_DIR)/tcl.m4 $(UNIX_DIR)/aclocal.m4 \
		$(UNIX_DIR)/tclConfig.sh.in $(UNIX_DIR)/install-sh \
		$(UNIX_DIR)/README $(UNIX_DIR)/ldAix \

		$(DISTDIR)/unix
	chmod 775 $(DISTDIR)/unix/configure $(DISTDIR)/unix/configure.in
	chmod 775 $(DISTDIR)/unix/ldAix
	chmod +x $(DISTDIR)/unix/install-sh

	$(TCL_EXE) $(UNIX_DIR)/mkLinks.tcl \
		$(UNIX_DIR)/../doc/*.[13n] > $(DISTDIR)/unix/mkLinks
	chmod +x $(DISTDIR)/unix/mkLinks
	mkdir $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.c $(GENERIC_DIR)/*.h $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.decls $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/README $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/tclGetDate.y $(DISTDIR)/generic
	cp -p $(TOP_DIR)/changes $(TOP_DIR)/ChangeLog $(TOP_DIR)/README* \
		$(TOP_DIR)/license.terms $(DISTDIR)
	mkdir $(DISTDIR)/library
	cp -p $(TOP_DIR)/license.terms $(TOP_DIR)/library/*.tcl \
		$(TOP_DIR)/library/tclIndex $(DISTDIR)/library
	for i in http2.3 http1.0 opt0.4 msgcat1.0 reg1.0 dde1.1 tcltest1.0; \
	    do \
		mkdir $(DISTDIR)/library/$$i ;\
		cp -p $(TOP_DIR)/library/$$i/*.tcl $(DISTDIR)/library/$$i; \
	    done;
	mkdir $(DISTDIR)/library/encoding
	cp -p $(TOP_DIR)/library/encoding/*.enc $(DISTDIR)/library/encoding
	mkdir $(DISTDIR)/doc







>
>
>
>
>












>
|

<
|

<





|
>




<
<
<
<










|







1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115

1116
1117

1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128




1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
	echo "%define _rpmdir `pwd`/RPMS" >> THIS.TCL.SPEC
	cat tcl.spec >> THIS.TCL.SPEC
	mkdir -p RPMS/i386
	rpm -bb THIS.TCL.SPEC
	mv RPMS/i386/*.rpm .
	rm -rf RPMS THIS.TCL.SPEC

mklinks:
	$(TCL_EXE) $(UNIX_DIR)/mkLinks.tcl \
		$(UNIX_DIR)/../doc/*.[13n] > $(UNIX_DIR)/mkLinks
	chmod +x $(UNIX_DIR)/mkLinks

#
# Target to create a proper Tcl distribution from information in the
# master source directory.  DISTDIR must be defined to indicate where
# to put the distribution.
#

DISTROOT =	/tmp/dist
DISTNAME =	tcl@TCL_VERSION@@TCL_PATCH_LEVEL@
ZIPNAME =	tcl@TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@@TCL_PATCH_LEVEL@.zip
DISTDIR =	$(DISTROOT)/$(DISTNAME)
$(UNIX_DIR)/configure: $(UNIX_DIR)/configure.in
	autoconf $(UNIX_DIR)/configure.in > $(UNIX_DIR)/configure

dist: $(UNIX_DIR)/configure mklinks
	rm -rf $(DISTDIR)

	mkdir -p $(DISTDIR)/unix
	cp -p $(UNIX_DIR)/*.c $(UNIX_DIR)/*.h $(DISTDIR)/unix

	cp $(UNIX_DIR)/Makefile.in $(DISTDIR)/unix
	chmod 664 $(DISTDIR)/unix/Makefile.in
	cp $(UNIX_DIR)/configure $(UNIX_DIR)/configure.in \
		$(UNIX_DIR)/tcl.m4 $(UNIX_DIR)/aclocal.m4 \
		$(UNIX_DIR)/tclConfig.sh.in $(UNIX_DIR)/install-sh \
		$(UNIX_DIR)/README $(UNIX_DIR)/ldAix $(UNIX_DIR)/tcl.spec \
		$(UNIX_DIR)/mkLinks \
		$(DISTDIR)/unix
	chmod 775 $(DISTDIR)/unix/configure $(DISTDIR)/unix/configure.in
	chmod 775 $(DISTDIR)/unix/ldAix
	chmod +x $(DISTDIR)/unix/install-sh




	mkdir $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.c $(GENERIC_DIR)/*.h $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/*.decls $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/README $(DISTDIR)/generic
	cp -p $(GENERIC_DIR)/tclGetDate.y $(DISTDIR)/generic
	cp -p $(TOP_DIR)/changes $(TOP_DIR)/ChangeLog $(TOP_DIR)/README* \
		$(TOP_DIR)/license.terms $(DISTDIR)
	mkdir $(DISTDIR)/library
	cp -p $(TOP_DIR)/license.terms $(TOP_DIR)/library/*.tcl \
		$(TOP_DIR)/library/tclIndex $(DISTDIR)/library
	for i in http http1.0 opt msgcat reg1.0 dde1.1 tcltest1.0; \
	    do \
		mkdir $(DISTDIR)/library/$$i ;\
		cp -p $(TOP_DIR)/library/$$i/*.tcl $(DISTDIR)/library/$$i; \
	    done;
	mkdir $(DISTDIR)/library/encoding
	cp -p $(TOP_DIR)/library/encoding/*.enc $(DISTDIR)/library/encoding
	mkdir $(DISTDIR)/doc
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146

1147
1148
1149

1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
		$(TOP_DIR)/tests/httpd $(TOP_DIR)/tests/*.tcl \
		$(DISTDIR)/tests
	mkdir $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/tests/pkg/*.tcl $(DISTDIR)/tests/pkg
	mkdir $(DISTDIR)/win
	cp $(TOP_DIR)/win/Makefile.in $(DISTDIR)/win
	cp $(TOP_DIR)/win/configure.in \
		$(TOP_DIR)/win/configure \
		$(TOP_DIR)/win/tclConfig.sh.in \
		$(TOP_DIR)/win/tcl.m4 $(TOP_DIR)/win/aclocal.m4 \
		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h $(TOP_DIR)/win/*.rc \

		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.bat $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/makefile.* $(DISTDIR)/win

	cp -p $(TOP_DIR)/win/README $(DISTDIR)/win
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/win
	mkdir $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \
		$(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/porting.notes $(TOP_DIR)/mac/README $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.exp $(TOP_DIR)/mac/*.pch $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.doc $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.html $(DISTDIR)/mac
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/mac
	mkdir $(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/*.c $(UNIX_DIR)/dltest/Makefile.in \
		$(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/configure.in $(UNIX_DIR)/dltest/configure \
		$(UNIX_DIR)/dltest/README $(DISTDIR)/unix/dltest
	mkdir $(DISTDIR)/tools
	cp -p $(TOP_DIR)/tools/Makefile.in \
	    $(TOP_DIR)/tools/README \
	    $(TOP_DIR)/tools/configure.in \
	    $(TOP_DIR)/tools/*.tcl \
	    $(TOP_DIR)/tools/man2tcl.c \
	    $(TOP_DIR)/tools/tcl.wse.in \
	    $(TOP_DIR)/tools/*.bmp \
	    $(TOP_DIR)/tools/tcl.hpj.in \
		$(DISTDIR)/tools

#
# The following target can only be used for non-patch releases.  Use
# the "allpatch" target below for patch releases.
#








|
<



|
>



>



|
|



|
<







|
<
|
|
<
|
<
|







1156
1157
1158
1159
1160
1161
1162
1163

1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181

1182
1183
1184
1185
1186
1187
1188
1189

1190
1191

1192

1193
1194
1195
1196
1197
1198
1199
1200
		$(TOP_DIR)/tests/httpd $(TOP_DIR)/tests/*.tcl \
		$(DISTDIR)/tests
	mkdir $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/tests/pkg
	cp -p $(TOP_DIR)/tests/pkg/*.tcl $(DISTDIR)/tests/pkg
	mkdir $(DISTDIR)/win
	cp $(TOP_DIR)/win/Makefile.in $(DISTDIR)/win
	cp $(TOP_DIR)/win/configure.in $(TOP_DIR)/win/configure \

		$(TOP_DIR)/win/tclConfig.sh.in \
		$(TOP_DIR)/win/tcl.m4 $(TOP_DIR)/win/aclocal.m4 \
		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h \
		$(TOP_DIR)/win/*.ico $(TOP_DIR)/win/*.rc \
		$(DISTDIR)/win
	cp -p $(TOP_DIR)/win/*.bat $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/makefile.* $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/tcl.hpj.in $(DISTDIR)/win
	cp -p $(TOP_DIR)/win/README $(DISTDIR)/win
	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/win
	mkdir $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx \
		$(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \
		$(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/porting.notes $(TOP_DIR)/mac/README $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.exp $(TOP_DIR)/mac/*.pch $(DISTDIR)/mac
	cp -p $(TOP_DIR)/mac/*.doc $(TOP_DIR)/mac/*.html $(DISTDIR)/mac

	cp -p $(TOP_DIR)/license.terms $(DISTDIR)/mac
	mkdir $(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/*.c $(UNIX_DIR)/dltest/Makefile.in \
		$(DISTDIR)/unix/dltest
	cp -p $(UNIX_DIR)/dltest/configure.in $(UNIX_DIR)/dltest/configure \
		$(UNIX_DIR)/dltest/README $(DISTDIR)/unix/dltest
	mkdir $(DISTDIR)/tools
	cp -p $(TOP_DIR)/tools/Makefile.in $(TOP_DIR)/tools/README \

		$(TOP_DIR)/tools/configure $(TOP_DIR)/tools/configure.in \
		$(TOP_DIR)/tools/*.tcl $(TOP_DIR)/tools/man2tcl.c \

		$(TOP_DIR)/tools/tcl.wse.in $(TOP_DIR)/tools/*.bmp \

		$(TOP_DIR)/tools/tcl.hpj.in \
		$(DISTDIR)/tools

#
# The following target can only be used for non-patch releases.  Use
# the "allpatch" target below for patch releases.
#

Changes to unix/README.
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
release should compile and run either "out of the box" or with trivial
changes on any UNIX-like system that approximates POSIX, BSD, or System
V.  We know that it runs on workstations from Sun, H-P, DEC, IBM, and
SGI, as well as PCs running Linux, BSDI, and SCO UNIX.  To compile for
a PC running Windows, see the README file in the directory ../win.  To
compile for a Macintosh, see the README file in the directory ../mac.

RCS: @(#) $Id: README,v 1.11 2000/04/26 17:31:21 hobbs Exp $

How To Compile And Install Tcl:
-------------------------------

(a) Check for patches as described in ../README.

(b) If you have already compiled Tcl once in this directory and are now







|







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
release should compile and run either "out of the box" or with trivial
changes on any UNIX-like system that approximates POSIX, BSD, or System
V.  We know that it runs on workstations from Sun, H-P, DEC, IBM, and
SGI, as well as PCs running Linux, BSDI, and SCO UNIX.  To compile for
a PC running Windows, see the README file in the directory ../win.  To
compile for a Macintosh, see the README file in the directory ../mac.

RCS: @(#) $Id: README,v 1.11.2.1 2001/04/03 22:08:33 hobbs Exp $

How To Compile And Install Tcl:
-------------------------------

(a) Check for patches as described in ../README.

(b) If you have already compiled Tcl once in this directory and are now
119
120
121
122
123
124
125
126
127
128
129
130
131
132
directory.  You should then see a printout of the test files processed.
If any errors occur, you'll see a much more substantial printout for
each error.  See the README file in the "tests" directory for more
information on the test suite.  Note: don't run the tests as superuser:
this will cause several of them to fail.  If a test is failing
consistently, please send us a bug report with as much detail as you
can manage.  Please use the online database at
	http://dev.scriptics.com/ticket/

The Tcl test suite is very sensitive to proper implementation of
ANSI C library procedures such as sprintf and sscanf.  If the test
suite generates errors, most likely they are due to non-conformance
of your system's ANSI C library;  such problems are unlikely to
affect any real applications so it's probably safe to ignore them.







|






119
120
121
122
123
124
125
126
127
128
129
130
131
132
directory.  You should then see a printout of the test files processed.
If any errors occur, you'll see a much more substantial printout for
each error.  See the README file in the "tests" directory for more
information on the test suite.  Note: don't run the tests as superuser:
this will cause several of them to fail.  If a test is failing
consistently, please send us a bug report with as much detail as you
can manage.  Please use the online database at
	http://tcl.sourceforge.net/

The Tcl test suite is very sensitive to proper implementation of
ANSI C library procedures such as sprintf and sscanf.  If the test
suite generates errors, most likely they are due to non-conformance
of your system's ANSI C library;  such problems are unlikely to
affect any real applications so it's probably safe to ignore them.
Added unix/configure.


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --enable-gcc            allow use of gcc if available [--disable-gcc]"
ac_help="$ac_help
  --enable-threads        build with threads"
ac_help="$ac_help
  --enable-64bit          enable 64bit support (where applicable)"
ac_help="$ac_help
  --enable-64bit-vis      enable 64bit Sparc VIS support"
ac_help="$ac_help
  --disable-load          disallow dynamic loading and "load" command"
ac_help="$ac_help
  --enable-symbols        build with debugging symbols [--disable-symbols]"
ac_help="$ac_help
  --enable-shared         build and link with shared libraries [--enable-shared]"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=../generic/tcl.h

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# RCS: @(#) $Id: configure.in,v 1.57.2.2 2001/04/03 22:54:39 hobbs Exp $

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VERSION=${TCL_VERSION}

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi
TCL_SRC_DIR=`cd $srcdir/..; pwd`

#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------

# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:566: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi


    # Check whether --enable-gcc or --disable-gcc was given.
if test "${enable_gcc+set}" = set; then
  enableval="$enable_gcc"
  ok=$enableval
else
  ok=no
fi

    if test "$ok" = "yes"; then
	CC=gcc
	# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:607: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:637: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:688: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:720: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 731 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:736: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:762: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:767: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:776: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:795: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

    else
	CC=${CC-cc}
    fi

echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:831: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <<EOF
#line 846 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:852: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <<EOF
#line 863 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:869: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <<EOF
#line 880 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:886: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

for ac_hdr in unistd.h limits.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:914: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 919 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:924: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done


#------------------------------------------------------------------------
# Threads support
#------------------------------------------------------------------------


    echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:957: checking for building with threads" >&5
    # Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
  enableval="$enable_threads"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	echo "$ac_t""yes" 1>&6
	TCL_THREADS=1
	cat >> confdefs.h <<\EOF
#define TCL_THREADS 1
EOF

	cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

	cat >> confdefs.h <<\EOF
#define _THREAD_SAFE 1
EOF

	echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:983: checking for pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthread  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 991 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	if test "$tcl_ok" = "no"; then
	    # Check a little harder for __pthread_mutex_init in the same
	    # library, as some systems hide it there until pthread.h is
	    # defined.  We could alternatively do an AC_TRY_COMPILE with
	    # pthread.h, but that will work with libpthread really doesn't
	    # exist, like AIX 4.2.  [Bug: 4359]
	    echo $ac_n "checking for __pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:1030: checking for __pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'__pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthread  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1038 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char __pthread_mutex_init();

int main() {
__pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	fi

	if test "$tcl_ok" = "yes"; then
	    # The space is needed
	    THREADS_LIBS=" -lpthread"
	else
	    echo $ac_n "checking for pthread_mutex_init in -lpthreads""... $ac_c" 1>&6
echo "configure:1077: checking for pthread_mutex_init in -lpthreads" >&5
ac_lib_var=`echo pthreads'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthreads  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1085 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    if test "$tcl_ok" = "yes"; then
		# The space is needed
		THREADS_LIBS=" -lpthreads"
	    else
		echo $ac_n "checking for pthread_mutex_init in -lc""... $ac_c" 1>&6
echo "configure:1122: checking for pthread_mutex_init in -lc" >&5
ac_lib_var=`echo c'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lc  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1130 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_mutex_init();

int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    	if test "$tcl_ok" = "no"; then
	    	    TCL_THREADS=0
		    echo "configure: warning: "Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile..."" 1>&2
	    	fi
	    fi
	fi

	# Does the pthread-implementation provide
	# 'pthread_attr_setstacksize' ?

	for ac_func in pthread_attr_setstacksize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1175: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1180 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1203: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    else
	TCL_THREADS=0
	echo "$ac_t""no (default)" 1>&6
    fi


#------------------------------------------------------------------------
# If we're using GCC, see if the compiler understands -pipe.  If so, use it.
# It makes compiling go faster.  (This is only a performance feature.)
#------------------------------------------------------------------------

if test -z "$no_pipe"; then
if test -n "$GCC"; then
  echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6
echo "configure:1241: checking if the compiler understands -pipe" >&5
  OLDCC="$CC"  
  CC="$CC -pipe"
  cat > conftest.$ac_ext <<EOF
#line 1245 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:1252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CC="$OLDCC"
    echo "$ac_t""no" 1>&6
fi
rm -f conftest*
fi  
fi

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX library procedures, or
#	set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------

# Check if Posix compliant getcwd exists, if not we'll use getwd.
for ac_func in getcwd
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1275: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1280 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define USEGETWD 1
EOF

fi
done

# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?

for ac_func in opendir strstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1337: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1342 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done



for ac_func in strtol tmpnam waitpid
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1395: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1400 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:1423: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done


echo $ac_n "checking for strerror""... $ac_c" 1>&6
echo "configure:1450: checking for strerror" >&5
if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1455 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strerror(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strerror();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strerror) || defined (__stub___strerror)
choke me
#else
strerror();
#endif

; return 0; }
EOF
if { (eval echo configure:1478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strerror=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strerror=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strerror`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_STRERROR 1
EOF

fi

echo $ac_n "checking for getwd""... $ac_c" 1>&6
echo "configure:1502: checking for getwd" >&5
if eval "test \"`echo '$''{'ac_cv_func_getwd'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1507 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char getwd(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char getwd();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_getwd) || defined (__stub___getwd)
choke me
#else
getwd();
#endif

; return 0; }
EOF
if { (eval echo configure:1530: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_getwd=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_getwd=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'getwd`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_GETWD 1
EOF

fi

echo $ac_n "checking for wait3""... $ac_c" 1>&6
echo "configure:1554: checking for wait3" >&5
if eval "test \"`echo '$''{'ac_cv_func_wait3'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1559 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char wait3(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char wait3();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_wait3) || defined (__stub___wait3)
choke me
#else
wait3();
#endif

; return 0; }
EOF
if { (eval echo configure:1582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_wait3=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_wait3=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'wait3`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_WAIT3 1
EOF

fi

echo $ac_n "checking for uname""... $ac_c" 1>&6
echo "configure:1606: checking for uname" >&5
if eval "test \"`echo '$''{'ac_cv_func_uname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1611 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char uname(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char uname();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_uname) || defined (__stub___uname)
choke me
#else
uname();
#endif

; return 0; }
EOF
if { (eval echo configure:1634: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_uname=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_uname=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'uname`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_UNAME 1
EOF

fi

echo $ac_n "checking for realpath""... $ac_c" 1>&6
echo "configure:1658: checking for realpath" >&5
if eval "test \"`echo '$''{'ac_cv_func_realpath'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1663 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char realpath(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char realpath();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_realpath) || defined (__stub___realpath)
choke me
#else
realpath();
#endif

; return 0; }
EOF
if { (eval echo configure:1686: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_realpath=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_realpath=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'realpath`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_REALPATH 1
EOF

fi


#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX header files.  Special
#	notes:
#	    - stdlib.h doesn't define strtol, strtoul, or
#	      strtod insome versions of SunOS
#	    - some versions of string.h don't declare procedures such
#	      as strstr
#--------------------------------------------------------------------



    echo $ac_n "checking dirent.h""... $ac_c" 1>&6
echo "configure:1722: checking dirent.h" >&5
    cat > conftest.$ac_ext <<EOF
#line 1724 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <dirent.h>
int main() {

#ifndef _POSIX_SOURCE
#   ifdef __Lynx__
	/*
	 * Generate compilation error to make the test fail:  Lynx headers
	 * are only valid if really in the POSIX environment.
	 */

	missing_procedure();
#   endif
#endif
DIR *d;
struct dirent *entryPtr;
char *p;
d = opendir("foobar");
entryPtr = readdir(d);
p = entryPtr->d_name;
closedir(d);

; return 0; }
EOF
if { (eval echo configure:1750: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*

    if test $tcl_ok = no; then
	cat >> confdefs.h <<\EOF
#define NO_DIRENT_H 1
EOF

    fi

    echo "$ac_t""$tcl_ok" 1>&6
    ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1771: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1776 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_ERRNO_H 1
EOF

fi

    ac_safe=`echo "float.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for float.h""... $ac_c" 1>&6
echo "configure:1808: checking for float.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1813 "configure"
#include "confdefs.h"
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1818: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_FLOAT_H 1
EOF

fi

    ac_safe=`echo "values.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for values.h""... $ac_c" 1>&6
echo "configure:1845: checking for values.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1850 "configure"
#include "confdefs.h"
#include <values.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1855: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_VALUES_H 1
EOF

fi

    ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for limits.h""... $ac_c" 1>&6
echo "configure:1882: checking for limits.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1887 "configure"
#include "confdefs.h"
#include <limits.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1892: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_LIMITS_H 1
EOF

fi

    ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6
echo "configure:1919: checking for stdlib.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1924 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1929: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

    cat > conftest.$ac_ext <<EOF
#line 1952 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtol" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 1966 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtoul" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 1980 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strtod" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    if test $tcl_ok = 0; then
	cat >> confdefs.h <<\EOF
#define NO_STDLIB_H 1
EOF

    fi
    ac_safe=`echo "string.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for string.h""... $ac_c" 1>&6
echo "configure:2001: checking for string.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2006 "configure"
#include "confdefs.h"
#include <string.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2011: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

    cat > conftest.$ac_ext <<EOF
#line 2034 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strstr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*

    cat > conftest.$ac_ext <<EOF
#line 2048 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "strerror" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  tcl_ok=0
fi
rm -f conftest*


    # See also memmove check below for a place where NO_STRING_H can be
    # set and why.

    if test $tcl_ok = 0; then
	cat >> confdefs.h <<\EOF
#define NO_STRING_H 1
EOF

    fi

    ac_safe=`echo "sys/wait.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6
echo "configure:2074: checking for sys/wait.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2079 "configure"
#include "confdefs.h"
#include <sys/wait.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2084: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_SYS_WAIT_H 1
EOF

fi

    ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:2111: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2116 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2121: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_DLFCN_H 1
EOF

fi


    # OS/390 lacks sys/param.h (and doesn't need it, by chance).

    for ac_hdr in unistd.h sys/param.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2153: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2158 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done




#---------------------------------------------------------------------------
#	Determine which interface to use to talk to the serial port.
#	Note that #include lines must begin in leftmost column for
#	some compilers to recognize them as preprocessor directives.
#---------------------------------------------------------------------------


    echo $ac_n "checking termios vs. termio vs. sgtty""... $ac_c" 1>&6
echo "configure:2200: checking termios vs. termio vs. sgtty" >&5

    if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2206 "configure"
#include "confdefs.h"

#include <termios.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2222: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termios
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termios; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIOS 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2245 "configure"
#include "confdefs.h"

#include <termio.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }
EOF
if { (eval echo configure:2260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termio
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termio; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIO 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=none
else
  cat > conftest.$ac_ext <<EOF
#line 2283 "configure"
#include "confdefs.h"

#include <sgtty.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=sgtty
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=none
fi
rm -fr conftest*
fi


    if test $tk_ok = sgtty; then
	cat >> confdefs.h <<\EOF
#define USE_SGTTY 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2322 "configure"
#include "confdefs.h"

#include <termios.h>
#include <errno.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termios
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termios; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIOS 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 2363 "configure"
#include "confdefs.h"

#include <termio.h>
#include <errno.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }
EOF
if { (eval echo configure:2380: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=termio
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=no
fi
rm -fr conftest*
fi


    if test $tk_ok = termio; then
	cat >> confdefs.h <<\EOF
#define USE_TERMIO 1
EOF

    else
	if test "$cross_compiling" = yes; then
  tk_ok=none
else
  cat > conftest.$ac_ext <<EOF
#line 2403 "configure"
#include "confdefs.h"

#include <sgtty.h>
#include <errno.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}
EOF
if { (eval echo configure:2421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tk_ok=sgtty
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tk_ok=none
fi
rm -fr conftest*
fi


    if test $tk_ok = sgtty; then
	cat >> confdefs.h <<\EOF
#define USE_SGTTY 1
EOF

    fi
    fi
    fi
    fi
    fi
    fi
    echo "$ac_t""$tk_ok" 1>&6


#--------------------------------------------------------------------
#	Include sys/select.h if it exists and if it supplies things
#	that appear to be useful and aren't already in sys/types.h.
#	This appears to be true only on the RS/6000 under AIX.  Some
#	systems like OSF/1 have a sys/select.h that's of no use, and
#	other systems like SCO UNIX have a sys/select.h that's
#	pernicious.  If "fd_set" isn't defined anywhere then set a
#	special flag.
#--------------------------------------------------------------------

echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6
echo "configure:2459: checking fd_set and sys/select" >&5
cat > conftest.$ac_ext <<EOF
#line 2461 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
fd_set readMask, writeMask;
; return 0; }
EOF
if { (eval echo configure:2468: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tk_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tk_ok=no
fi
rm -f conftest*
if test $tk_ok = no; then
    cat > conftest.$ac_ext <<EOF
#line 2480 "configure"
#include "confdefs.h"
#include <sys/select.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "fd_mask" >/dev/null 2>&1; then
  rm -rf conftest*
  tk_ok=yes
fi
rm -f conftest*

    if test $tk_ok = yes; then
	cat >> confdefs.h <<\EOF
#define HAVE_SYS_SELECT_H 1
EOF

    fi
fi
echo "$ac_t""$tk_ok" 1>&6
if test $tk_ok = no; then
    cat >> confdefs.h <<\EOF
#define NO_FD_SET 1
EOF

fi

#------------------------------------------------------------------------------
#       Find out all about time handling differences.
#------------------------------------------------------------------------------

echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
echo "configure:2511: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2516 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
if { (eval echo configure:2524: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_tm=time.h
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_tm=sys/time.h
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_tm" 1>&6
if test $ac_cv_struct_tm = sys/time.h; then
  cat >> confdefs.h <<\EOF
#define TM_IN_SYS_TIME 1
EOF

fi


    for ac_hdr in sys/time.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2549: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2554 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2559: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
echo "configure:2586: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2591 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct tm *tp;
; return 0; }
EOF
if { (eval echo configure:2600: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_header_time=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_time=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_header_time" 1>&6
if test $ac_cv_header_time = yes; then
  cat >> confdefs.h <<\EOF
#define TIME_WITH_SYS_TIME 1
EOF

fi

    echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
echo "configure:2621: checking for tm_zone in struct tm" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2626 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_cv_struct_tm>
int main() {
struct tm tm; tm.tm_zone;
; return 0; }
EOF
if { (eval echo configure:2634: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_tm_zone=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_tm_zone=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6
if test "$ac_cv_struct_tm_zone" = yes; then
  cat >> confdefs.h <<\EOF
#define HAVE_TM_ZONE 1
EOF

else
  echo $ac_n "checking for tzname""... $ac_c" 1>&6
echo "configure:2654: checking for tzname" >&5
if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2659 "configure"
#include "confdefs.h"
#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif
int main() {
atoi(*tzname);
; return 0; }
EOF
if { (eval echo configure:2669: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_var_tzname=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_var_tzname=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_var_tzname" 1>&6
  if test $ac_cv_var_tzname = yes; then
    cat >> confdefs.h <<\EOF
#define HAVE_TZNAME 1
EOF

  fi
fi


    echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6
echo "configure:2692: checking tm_tzadj in struct tm" >&5
    cat > conftest.$ac_ext <<EOF
#line 2694 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_tzadj;
; return 0; }
EOF
if { (eval echo configure:2701: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TM_TZADJ 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    echo $ac_n "checking tm_gmtoff in struct tm""... $ac_c" 1>&6
echo "configure:2717: checking tm_gmtoff in struct tm" >&5
    cat > conftest.$ac_ext <<EOF
#line 2719 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_gmtoff;
; return 0; }
EOF
if { (eval echo configure:2726: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TM_GMTOFF 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    #
    # Its important to include time.h in this check, as some systems
    # (like convex) have timezone functions, etc.
    #
    have_timezone=no
    echo $ac_n "checking long timezone variable""... $ac_c" 1>&6
echo "configure:2747: checking long timezone variable" >&5
    cat > conftest.$ac_ext <<EOF
#line 2749 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern long timezone;
	    timezone += 1;
	    exit (0);
; return 0; }
EOF
if { (eval echo configure:2758: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  have_timezone=yes
	    cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*

    #
    # On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
    #
    if test "$have_timezone" = no; then
    echo $ac_n "checking time_t timezone variable""... $ac_c" 1>&6
echo "configure:2779: checking time_t timezone variable" >&5
    cat > conftest.$ac_ext <<EOF
#line 2781 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern time_t timezone;
	    timezone += 1;
	    exit (0);
; return 0; }
EOF
if { (eval echo configure:2790: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF

	    echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*
    fi



#--------------------------------------------------------------------
#	Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
#	in struct stat.  But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6
echo "configure:2813: checking for st_blksize in struct stat" >&5
if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2818 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/stat.h>
int main() {
struct stat s; s.st_blksize;
; return 0; }
EOF
if { (eval echo configure:2826: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_st_blksize=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_st_blksize=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6
if test $ac_cv_struct_st_blksize = yes; then
  cat >> confdefs.h <<\EOF
#define HAVE_ST_BLKSIZE 1
EOF

fi

echo $ac_n "checking for fstatfs""... $ac_c" 1>&6
echo "configure:2847: checking for fstatfs" >&5
if eval "test \"`echo '$''{'ac_cv_func_fstatfs'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2852 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char fstatfs(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char fstatfs();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_fstatfs) || defined (__stub___fstatfs)
choke me
#else
fstatfs();
#endif

; return 0; }
EOF
if { (eval echo configure:2875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_fstatfs=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_fstatfs=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'fstatfs`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_FSTATFS 1
EOF

fi


#--------------------------------------------------------------------
#       Some system have no memcmp or it does not work with 8 bit
#       data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
echo "configure:2904: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_func_memcmp_clean=no
else
  cat > conftest.$ac_ext <<EOF
#line 2912 "configure"
#include "confdefs.h"

main()
{
  char c0 = 0x40, c1 = 0x80, c2 = 0x81;
  exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1);
}

EOF
if { (eval echo configure:2922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_func_memcmp_clean=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_func_memcmp_clean=no
fi
rm -fr conftest*
fi

fi

echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"


#--------------------------------------------------------------------
#       Some system like SunOS 4 and other BSD like systems
#       have no memmove (we assume they have bcopy instead).
#       {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
echo $ac_n "checking for memmove""... $ac_c" 1>&6
echo "configure:2946: checking for memmove" >&5
if eval "test \"`echo '$''{'ac_cv_func_memmove'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 2951 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char memmove(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char memmove();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_memmove) || defined (__stub___memmove)
choke me
#else
memmove();
#endif

; return 0; }
EOF
if { (eval echo configure:2974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_memmove=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_memmove=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'memmove`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_MEMMOVE 1
EOF
 cat >> confdefs.h <<\EOF
#define NO_STRING_H 1
EOF

fi


#--------------------------------------------------------------------
#	On some systems strstr is broken: it returns a pointer even
#	even if the original string is empty.
#--------------------------------------------------------------------

echo $ac_n "checking proper strstr implementation""... $ac_c" 1>&6
echo "configure:3007: checking proper strstr implementation" >&5
if test "$cross_compiling" = yes; then
  tcl_ok=no
else
  cat > conftest.$ac_ext <<EOF
#line 3012 "configure"
#include "confdefs.h"

extern int strstr();
int main()
{
    exit(strstr("\0test", "test") ? 1 : 0);
}

EOF
if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=no
fi
rm -fr conftest*
fi

if test $tcl_ok = yes; then
    echo "$ac_t""yes" 1>&6
else
    echo "$ac_t""broken, using substitute" 1>&6
    LIBOBJS="$LIBOBJS strstr.o"
fi

#--------------------------------------------------------------------
#	Check for strtoul function.  This is tricky because under some
#	versions of AIX strtoul returns an incorrect terminator
#	pointer for the string "0".
#--------------------------------------------------------------------

echo $ac_n "checking for strtoul""... $ac_c" 1>&6
echo "configure:3048: checking for strtoul" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtoul'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3053 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtoul(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtoul();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtoul) || defined (__stub___strtoul)
choke me
#else
strtoul();
#endif

; return 0; }
EOF
if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtoul=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtoul=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtoul`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3100 "configure"
#include "confdefs.h"

extern int strtoul();
int main()
{
    char *string = "0";
    char *term;
    int value;
    value = strtoul(string, &term, 0);
    if ((value != 0) || (term != (string+1))) {
        exit(1);
    }
    exit(0);
}
EOF
if { (eval echo configure:3116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

if test "$tcl_ok" = 0; then
    test -n "$verbose" && echo "	Adding strtoul.o."
    LIBOBJS="$LIBOBJS strtoul.o"
fi

#--------------------------------------------------------------------
#	Check for the strtod function.  This is tricky because in some
#	versions of Linux strtod mis-parses strings starting with "+".
#--------------------------------------------------------------------

echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3139: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3144 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtod(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtod();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtod) || defined (__stub___strtod)
choke me
#else
strtod();
#endif

; return 0; }
EOF
if { (eval echo configure:3167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtod=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtod=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3191 "configure"
#include "confdefs.h"

extern double strtod();
int main()
{
    char *string = " +69";
    char *term;
    double value;
    value = strtod(string, &term);
    if ((value != 69) || (term != (string+4))) {
	exit(1);
    }
    exit(0);
}
EOF
if { (eval echo configure:3207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

if test "$tcl_ok" = 0; then
    test -n "$verbose" && echo "	Adding strtod.o."
    LIBOBJS="$LIBOBJS strtod.o"
fi

#--------------------------------------------------------------------
#	Under Solaris 2.4, strtod returns the wrong value for the
#	terminating character under some conditions.  Check for this
#	and if the problem exists use a substitute procedure
#	"fixstrtod" that corrects the error.
#--------------------------------------------------------------------


    echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3233: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3238 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strtod(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strtod();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strtod) || defined (__stub___strtod)
choke me
#else
strtod();
#endif

; return 0; }
EOF
if { (eval echo configure:3261: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strtod=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strtod=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strtod`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_strtod=1
else
  echo "$ac_t""no" 1>&6
tcl_strtod=0
fi

    if test "$tcl_strtod" = 1; then
	echo $ac_n "checking for Solaris2.4/Tru64 strtod bugs""... $ac_c" 1>&6
echo "configure:3283: checking for Solaris2.4/Tru64 strtod bugs" >&5
	if test "$cross_compiling" = yes; then
  tcl_ok=0
else
  cat > conftest.$ac_ext <<EOF
#line 3288 "configure"
#include "confdefs.h"

	    extern double strtod();
	    int main()
	    {
		char *string = "NaN", *spaceString = " ";
		char *term;
		double value;
		value = strtod(string, &term);
		if ((term != string) && (term[-1] == 0)) {
		    exit(1);
		}
		value = strtod(spaceString, &term);
		if (term == (spaceString+1)) {
		    exit(1);
		}
		exit(0);
	    }
EOF
if { (eval echo configure:3308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  tcl_ok=1
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  tcl_ok=0
fi
rm -fr conftest*
fi

	if test "$tcl_ok" = 1; then
	    echo "$ac_t""ok" 1>&6
	else
	    echo "$ac_t""buggy" 1>&6
	    LIBOBJS="$LIBOBJS fixstrtod.o"
	    cat >> confdefs.h <<\EOF
#define strtod fixstrtod
EOF

	fi
    fi


#--------------------------------------------------------------------
#	Check for various typedefs and provide substitutes if
#	they don't exist.
#--------------------------------------------------------------------

echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:3339: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3344 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3352: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  ac_cv_header_stdc=yes
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3369 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "memchr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3387 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "free" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then
  :
else
  cat > conftest.$ac_ext <<EOF
#line 3408 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int main () { int i; for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }

EOF
if { (eval echo configure:3419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_header_stdc=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_header_stdc" 1>&6
if test $ac_cv_header_stdc = yes; then
  cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

fi

echo $ac_n "checking for mode_t""... $ac_c" 1>&6
echo "configure:3443: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3448 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_mode_t=yes
else
  rm -rf conftest*
  ac_cv_type_mode_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_mode_t" 1>&6
if test $ac_cv_type_mode_t = no; then
  cat >> confdefs.h <<\EOF
#define mode_t int
EOF

fi

echo $ac_n "checking for pid_t""... $ac_c" 1>&6
echo "configure:3476: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3481 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_pid_t=yes
else
  rm -rf conftest*
  ac_cv_type_pid_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_pid_t" 1>&6
if test $ac_cv_type_pid_t = no; then
  cat >> confdefs.h <<\EOF
#define pid_t int
EOF

fi

echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:3509: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3514 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_size_t=yes
else
  rm -rf conftest*
  ac_cv_type_size_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_size_t" 1>&6
if test $ac_cv_type_size_t = no; then
  cat >> confdefs.h <<\EOF
#define size_t unsigned
EOF

fi

echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
echo "configure:3542: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3547 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "uid_t" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_uid_t=yes
else
  rm -rf conftest*
  ac_cv_type_uid_t=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_type_uid_t" 1>&6
if test $ac_cv_type_uid_t = no; then
  cat >> confdefs.h <<\EOF
#define uid_t int
EOF

  cat >> confdefs.h <<\EOF
#define gid_t int
EOF

fi


#--------------------------------------------------------------------
#	If a system doesn't have an opendir function (man, that's old!)
#	then we have to supply a different version of dirent.h which
#	is compatible with the substitute version of opendir that's
#	provided.  This version only works with V7-style directories.
#--------------------------------------------------------------------

echo $ac_n "checking for opendir""... $ac_c" 1>&6
echo "configure:3584: checking for opendir" >&5
if eval "test \"`echo '$''{'ac_cv_func_opendir'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3589 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char opendir(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char opendir();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_opendir) || defined (__stub___opendir)
choke me
#else
opendir();
#endif

; return 0; }
EOF
if { (eval echo configure:3612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_opendir=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_opendir=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'opendir`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define USE_DIRENT2_H 1
EOF

fi


#--------------------------------------------------------------------
#	The check below checks whether <sys/wait.h> defines the type
#	"union wait" correctly.  It's needed because of weirdness in
#	HP-UX where "union wait" is defined in both the BSD and SYS-V
#	environments.  Checking the usability of WIFEXITED seems to do
#	the trick.
#--------------------------------------------------------------------

echo $ac_n "checking union wait""... $ac_c" 1>&6
echo "configure:3645: checking union wait" >&5
cat > conftest.$ac_ext <<EOF
#line 3647 "configure"
#include "confdefs.h"
#include <sys/types.h> 
#include <sys/wait.h>
int main() {

union wait x;
WIFEXITED(x);		/* Generates compiler error if WIFEXITED
			 * uses an int. */

; return 0; }
EOF
if { (eval echo configure:3659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = no; then
    cat >> confdefs.h <<\EOF
#define NO_UNION_WAIT 1
EOF

fi

#--------------------------------------------------------------------
#	Check to see whether the system supports the matherr function
#	and its associated type "struct exception".
#--------------------------------------------------------------------

echo $ac_n "checking matherr support""... $ac_c" 1>&6
echo "configure:3683: checking matherr support" >&5
cat > conftest.$ac_ext <<EOF
#line 3685 "configure"
#include "confdefs.h"
#include <math.h>
int main() {

struct exception x;
x.type = DOMAIN;
x.type = SING;

; return 0; }
EOF
if { (eval echo configure:3696: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = yes; then
    cat >> confdefs.h <<\EOF
#define NEED_MATHERR 1
EOF

fi

#--------------------------------------------------------------------
#	Check whether there is an strncasecmp function on this system.
#	This is a bit tricky because under SCO it's in -lsocket and
#	under Sequent Dynix it's in -linet.
#--------------------------------------------------------------------

echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6
echo "configure:3721: checking for strncasecmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_strncasecmp'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3726 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char strncasecmp(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_strncasecmp) || defined (__stub___strncasecmp)
choke me
#else
strncasecmp();
#endif

; return 0; }
EOF
if { (eval echo configure:3749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_strncasecmp=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_strncasecmp=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'strncasecmp`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

if test "$tcl_ok" = 0; then
    echo $ac_n "checking for strncasecmp in -lsocket""... $ac_c" 1>&6
echo "configure:3771: checking for strncasecmp in -lsocket" >&5
ac_lib_var=`echo socket'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3779 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

fi
if test "$tcl_ok" = 0; then
    echo $ac_n "checking for strncasecmp in -linet""... $ac_c" 1>&6
echo "configure:3814: checking for strncasecmp in -linet" >&5
ac_lib_var=`echo inet'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-linet  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3822 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char strncasecmp();

int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=1
else
  echo "$ac_t""no" 1>&6
tcl_ok=0
fi

fi
if test "$tcl_ok" = 0; then
    LIBOBJS="$LIBOBJS strncasecmp.o"
fi

#--------------------------------------------------------------------
#	The code below deals with several issues related to gettimeofday:
#	1. Some systems don't provide a gettimeofday function at all
#	   (set NO_GETTOD if this is the case).
#	2. SGI systems don't use the BSD form of the gettimeofday function,
#	   but they have a BSDgettimeofday function that can be used instead.
#	3. See if gettimeofday is declared in the <sys/time.h> header file.
#	   if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
#	   declare it.
#--------------------------------------------------------------------

echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6
echo "configure:3871: checking for BSDgettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_BSDgettimeofday'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3876 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char BSDgettimeofday(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char BSDgettimeofday();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_BSDgettimeofday) || defined (__stub___BSDgettimeofday)
choke me
#else
BSDgettimeofday();
#endif

; return 0; }
EOF
if { (eval echo configure:3899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_BSDgettimeofday=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_BSDgettimeofday=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'BSDgettimeofday`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  cat >> confdefs.h <<\EOF
#define HAVE_BSDGETTIMEOFDAY 1
EOF

else
  echo "$ac_t""no" 1>&6

    echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6
echo "configure:3921: checking for gettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 3926 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char gettimeofday(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gettimeofday();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday)
choke me
#else
gettimeofday();
#endif

; return 0; }
EOF
if { (eval echo configure:3949: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_gettimeofday=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_gettimeofday=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
cat >> confdefs.h <<\EOF
#define NO_GETTOD 1
EOF

fi


fi

echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6
echo "configure:3976: checking for gettimeofday declaration" >&5
cat > conftest.$ac_ext <<EOF
#line 3978 "configure"
#include "confdefs.h"
#include <sys/time.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "gettimeofday" >/dev/null 2>&1; then
  rm -rf conftest*
  echo "$ac_t""present" 1>&6
else
  rm -rf conftest*
  
    echo "$ac_t""missing" 1>&6
    cat >> confdefs.h <<\EOF
#define GETTOD_NOT_DECLARED 1
EOF


fi
rm -f conftest*


#--------------------------------------------------------------------
#	The following code checks to see whether it is possible to get
#	signed chars on this platform.  This is needed in order to
#	properly generate sign-extended ints from character values.
#--------------------------------------------------------------------

echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6
echo "configure:4006: checking whether char is unsigned" >&5
if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$GCC" = yes; then
  # GCC predefines this symbol on systems where it applies.
cat > conftest.$ac_ext <<EOF
#line 4013 "configure"
#include "confdefs.h"
#ifdef __CHAR_UNSIGNED__
  yes
#endif

EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "yes" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_c_char_unsigned=yes
else
  rm -rf conftest*
  ac_cv_c_char_unsigned=no
fi
rm -f conftest*

else
if test "$cross_compiling" = yes; then
    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
  cat > conftest.$ac_ext <<EOF
#line 4035 "configure"
#include "confdefs.h"
/* volatile prevents gcc2 from optimizing the test away on sparcs.  */
#if !defined(__STDC__) || __STDC__ != 1
#define volatile
#endif
main() {
  volatile char c = 255; exit(c < 0);
}
EOF
if { (eval echo configure:4045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_c_char_unsigned=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_c_char_unsigned=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_c_char_unsigned" 1>&6
if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
  cat >> confdefs.h <<\EOF
#define __CHAR_UNSIGNED__ 1
EOF

fi

echo $ac_n "checking signed char declarations""... $ac_c" 1>&6
echo "configure:4069: checking signed char declarations" >&5
cat > conftest.$ac_ext <<EOF
#line 4071 "configure"
#include "confdefs.h"

int main() {

signed char *p;
p = 0;

; return 0; }
EOF
if { (eval echo configure:4081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = yes; then
    cat >> confdefs.h <<\EOF
#define HAVE_SIGNED_CHAR 1
EOF

fi

#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------


    #--------------------------------------------------------------------
    # On a few very rare systems, all of the libm.a stuff is
    # already in libc.a.  Set compiler flags accordingly.
    # Also, Linux requires the "ieee" library for math to work
    # right (and it must appear before "-lm").
    #--------------------------------------------------------------------

    echo $ac_n "checking for sin""... $ac_c" 1>&6
echo "configure:4112: checking for sin" >&5
if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4117 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char sin(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char sin();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_sin) || defined (__stub___sin)
choke me
#else
sin();
#endif

; return 0; }
EOF
if { (eval echo configure:4140: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_sin=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_sin=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  MATH_LIBS=""
else
  echo "$ac_t""no" 1>&6
MATH_LIBS="-lm"
fi

    echo $ac_n "checking for main in -lieee""... $ac_c" 1>&6
echo "configure:4161: checking for main in -lieee" >&5
ac_lib_var=`echo ieee'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lieee  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4169 "configure"
#include "confdefs.h"

int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  MATH_LIBS="-lieee $MATH_LIBS"
else
  echo "$ac_t""no" 1>&6
fi


    #--------------------------------------------------------------------
    # Interactive UNIX requires -linet instead of -lsocket, plus it
    # needs net/errno.h to define the socket-related error codes.
    #--------------------------------------------------------------------

    echo $ac_n "checking for main in -linet""... $ac_c" 1>&6
echo "configure:4203: checking for main in -linet" >&5
ac_lib_var=`echo inet'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-linet  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4211 "configure"
#include "confdefs.h"

int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -linet"
else
  echo "$ac_t""no" 1>&6
fi

    ac_safe=`echo "net/errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6
echo "configure:4240: checking for net/errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4245 "configure"
#include "confdefs.h"
#include <net/errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:4250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  cat >> confdefs.h <<\EOF
#define HAVE_NET_ERRNO_H 1
EOF

else
  echo "$ac_t""no" 1>&6
fi


    #--------------------------------------------------------------------
    #	Check for the existence of the -lsocket and -lnsl libraries.
    #	The order here is important, so that they end up in the right
    #	order in the command line generated by make.  Here are some
    #	special considerations:
    #	1. Use "connect" and "accept" to check for -lsocket, and
    #	   "gethostbyname" to check for -lnsl.
    #	2. Use each function name only once:  can't redo a check because
    #	   autoconf caches the results of the last check and won't redo it.
    #	3. Use -lnsl and -lsocket only if they supply procedures that
    #	   aren't already present in the normal libraries.  This is because
    #	   IRIX 5.2 has libraries, but they aren't needed and they're
    #	   bogus:  they goof up name resolution if used.
    #	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
    #	   To get around this problem, check for both libraries together
    #	   if -lsocket doesn't work by itself.
    #--------------------------------------------------------------------

    tcl_checkBoth=0
    echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:4295: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4300 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char connect(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char connect();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_connect) || defined (__stub___connect)
choke me
#else
connect();
#endif

; return 0; }
EOF
if { (eval echo configure:4323: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_connect=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_connect=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_checkSocket=0
else
  echo "$ac_t""no" 1>&6
tcl_checkSocket=1
fi

    if test "$tcl_checkSocket" = 1; then
	echo $ac_n "checking for setsockopt""... $ac_c" 1>&6
echo "configure:4345: checking for setsockopt" >&5
if eval "test \"`echo '$''{'ac_cv_func_setsockopt'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4350 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char setsockopt(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char setsockopt();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_setsockopt) || defined (__stub___setsockopt)
choke me
#else
setsockopt();
#endif

; return 0; }
EOF
if { (eval echo configure:4373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_setsockopt=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_setsockopt=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'setsockopt`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for setsockopt in -lsocket""... $ac_c" 1>&6
echo "configure:4391: checking for setsockopt in -lsocket" >&5
ac_lib_var=`echo socket'_'setsockopt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4399 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char setsockopt();

int main() {
setsockopt()
; return 0; }
EOF
if { (eval echo configure:4410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -lsocket"
else
  echo "$ac_t""no" 1>&6
tcl_checkBoth=1
fi

fi

    fi
    if test "$tcl_checkBoth" = 1; then
	tk_oldLibs=$LIBS
	LIBS="$LIBS -lsocket -lnsl"
	echo $ac_n "checking for accept""... $ac_c" 1>&6
echo "configure:4438: checking for accept" >&5
if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4443 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char accept(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char accept();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_accept) || defined (__stub___accept)
choke me
#else
accept();
#endif

; return 0; }
EOF
if { (eval echo configure:4466: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_accept=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_accept=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_checkNsl=0
else
  echo "$ac_t""no" 1>&6
LIBS=$tk_oldLibs
fi

    fi
    echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:4488: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4493 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char gethostbyname(); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {

/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
choke me
#else
gethostbyname();
#endif

; return 0; }
EOF
if { (eval echo configure:4516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:4534: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lnsl  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4542 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {
gethostbyname()
; return 0; }
EOF
if { (eval echo configure:4553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -lnsl"
else
  echo "$ac_t""no" 1>&6
fi

fi

    
    # Don't perform the eval of the libraries here because DL_LIBS
    # won't be set until we call SC_CONFIG_CFLAGS

    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
    
    


# Add the threads support libraries

LIBS="$LIBS$THREADS_LIBS"

#--------------------------------------------------------------------
# The statements below define a collection of compile flags.  This
# macro depends on the value of SHARED_BUILD, and should be called
# after SC_ENABLE_SHARED checks the configure switches.
#--------------------------------------------------------------------



    # Step 0.a: Enable 64 bit support?

    echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:4599: checking if 64bit support is requested" >&5
    # Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
  enableval="$enable_64bit"
  :
else
  enableval="no"
fi


    if test "$enableval" = "yes"; then
	do64bit=yes
    else
	do64bit=no
    fi
    echo "$ac_t""$do64bit" 1>&6

    # Step 0.b: Enable Solaris 64 bit VIS support?

    echo $ac_n "checking if 64bit Sparc VIS support is requested""... $ac_c" 1>&6
echo "configure:4619: checking if 64bit Sparc VIS support is requested" >&5
    # Check whether --enable-64bit-vis or --disable-64bit-vis was given.
if test "${enable_64bit_vis+set}" = set; then
  enableval="$enable_64bit_vis"
  :
else
  enableval="no"
fi


    if test "$enableval" = "yes"; then
	# Force 64bit on with VIS
	do64bit=yes
	do64bitVIS=yes
    else
	do64bitVIS=no
    fi
    echo "$ac_t""$do64bitVIS" 1>&6

    # Step 1: set the variable "system" to hold the name and version number
    # for the system.  This can usually be done via the "uname" command, but
    # there are a few systems, like Next, where this doesn't work.

    echo $ac_n "checking system version (for dynamic loading)""... $ac_c" 1>&6
echo "configure:4643: checking system version (for dynamic loading)" >&5
    if test -f /usr/lib/NextStep/software_version; then
	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
    else
	system=`uname -s`-`uname -r`
	if test "$?" -ne 0 ; then
	    echo "$ac_t""unknown (can't find uname command)" 1>&6
	    system=unknown
	else
	    # Special check for weird MP-RAS system (uname returns weird
	    # results, and the version is kept in special file).
	
	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
		system=MP-RAS-`awk '{print }' /etc/.relid'`
	    fi
	    if test "`uname -s`" = "AIX" ; then
		system=AIX-`uname -v`.`uname -r`
	    fi
	    echo "$ac_t""$system" 1>&6
	fi
    fi

    echo $ac_n "checking if gcc is being used""... $ac_c" 1>&6
echo "configure:4666: checking if gcc is being used" >&5
    if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
	using_gcc="yes"
    else
	using_gcc="no"
    fi

    echo "$ac_t""$using_gcc ($CC)" 1>&6

    # Step 2: check for existence of -ldl library.  This is needed because
    # Linux can use either -ldl or -ldld for dynamic loading.

    echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
echo "configure:4679: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldl  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4687 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dlopen();

int main() {
dlopen()
; return 0; }
EOF
if { (eval echo configure:4698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  have_dl=yes
else
  echo "$ac_t""no" 1>&6
have_dl=no
fi


    # Step 3: set configuration options based on system name and version.

    do64bit_ok=no
    fullSrcDir=`cd $srcdir; pwd`
    EXTRA_CFLAGS=""
    TCL_EXPORT_FILE_SUFFIX=""
    UNSHARED_LIB_SUFFIX=""
    TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
    ECHO_VERSION='`echo ${VERSION}`'
    TCL_LIB_VERSIONS_OK=ok
    CFLAGS_DEBUG=-g
    CFLAGS_OPTIMIZE=-O
    if test "$using_gcc" = "yes" ; then
	CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
    else
	CFLAGS_WARNING=""
    fi
    TCL_NEEDS_EXP_FILE=0
    TCL_BUILD_EXP_FILE=""
    TCL_EXP_FILE=""
    STLIB_LD="ar cr"
    case $system in
	AIX-5.*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		echo "$ac_t""Using $CC for compiling with threads" 1>&6
	    fi
	    # AIX-5 uses ELF style dynamic libraries
	    SHLIB_CFLAGS=""
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # AIX-5 has dl* in libc.so
	    DL_LIBS=""
	    LDFLAGS=""
	    if test "$using_gcc" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
	    fi

	    if test "$do64bit" = "yes" ; then
		if test "$using_gcc" = "no" ; then
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
		else 
		    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
		fi
	    fi
	    ;;
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		echo "$ac_t""Using $CC for compiling with threads" 1>&6
	    fi
	    SHLIB_CFLAGS=""
	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'

	    # AIX v<=4.1 has some different flags than 4.2+
	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then
		LIBOBJS="$LIBOBJS tclLoadAix.o"
		DL_LIBS="-lld"
	    fi

	    # On AIX <=v4 systems, libbsd.a has to be linked in to support
	    # non-blocking file IO.  This library has to be linked in after
	    # the MATH_LIBS or it breaks the pow() function.  The way to
	    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
	    # This library also supplies gettimeofday.
	    #
	    # AIX does not have a timezone field in struct tm. When the AIX
	    # bsd library is used, the timezone global and the gettimeofday
	    # methods are to be avoided for timezone deduction instead, we
	    # deduce the timezone by comparing the localtime result on a
	    # known GMT value.

	    echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6
echo "configure:4817: checking for gettimeofday in -lbsd" >&5
ac_lib_var=`echo bsd'_'gettimeofday | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lbsd  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4825 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gettimeofday();

int main() {
gettimeofday()
; return 0; }
EOF
if { (eval echo configure:4836: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  libbsd=yes
else
  echo "$ac_t""no" 1>&6
libbsd=no
fi

	    if test $libbsd = yes; then
	    	MATH_LIBS="$MATH_LIBS -lbsd"
	    	cat >> confdefs.h <<\EOF
#define USE_DELTA_FOR_TZ 1
EOF

	    fi
	    ;;
	BSD/OS-2.1*|BSD/OS-3*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="shlicc -r"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	BSD/OS-4.*)
	    SHLIB_CFLAGS="-export-dynamic -fPIC"
	    SHLIB_LD="cc -shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS=""
	    ;;
	dgux*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*|HP-UX-*.11.*)
	    SHLIB_SUFFIX=".sl"
	    echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:4898: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldld  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4906 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char shl_load();

int main() {
shl_load()
; return 0; }
EOF
if { (eval echo configure:4917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  tcl_ok=yes
else
  echo "$ac_t""no" 1>&6
tcl_ok=no
fi

	    if test "$tcl_ok" = yes; then
		SHLIB_CFLAGS="+z"
		SHLIB_LD="ld -b"
		SHLIB_LD_LIBS=""
		DL_OBJS="tclLoadShl.o"
		DL_LIBS="-ldld"
		LDFLAGS="-Wl,-E"
		LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
	    fi
	    ;;
	IRIX-4.*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_SUFFIX=".a"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
	    ;;
	IRIX-5.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    EXTRA_CFLAGS=""
	    LDFLAGS=""
	    ;;
	IRIX-6.*|IRIX64-6.5*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "yes" ; then
		EXTRA_CFLAGS="-mabi=n32"
		LDFLAGS="-mabi=n32"
	    else
		case $system in
		    IRIX-6.3)
			# Use to build 6.2 compatible binaries on 6.3.
			EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS"
			;;
		    *)
			EXTRA_CFLAGS="-n32"
			;;
		esac
		LDFLAGS="-n32"
	    fi
	    ;;
	IRIX64-6.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    ;;
	Linux*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings 
	    # when you inline the string and math operations.  Turn this off to
	    # get rid of the warnings.

	    CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS="tclLoadDl.o"
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    else
		ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5024: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5029 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5034: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		    SHLIB_LD="ld -shared"
		    DL_OBJS="tclLoadDld.o"
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""
else
  echo "$ac_t""no" 1>&6
fi

	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
	    ;;
	GNU*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS=""
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS=""
	    else
		ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5079: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5084 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		    SHLIB_LD="ld -shared"
		    DL_OBJS=""
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""
else
  echo "$ac_t""no" 1>&6
fi

	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
	    ;;
	MP-RAS-02*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	MP-RAS-*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS="-Wl,-Bexport"
	    LD_SEARCH_FLAGS=""
	    ;;
	NetBSD-*|FreeBSD-[1-2].*|OpenBSD-*)
	    # Not available on all versions:  check for include file.
	    ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:5144: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5149 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5154: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  
		# NetBSD/SPARC needs -fPIC, -fpic will not do.
		SHLIB_CFLAGS="-fPIC"
		SHLIB_LD="ld -Bshareable -x"
		SHLIB_LD_LIBS=""
		SHLIB_SUFFIX=".so"
		DL_OBJS="tclLoadDl.o"
		DL_LIBS=""
		LDFLAGS=""
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
		echo $ac_n "checking for ELF""... $ac_c" 1>&6
echo "configure:5181: checking for ELF" >&5
		cat > conftest.$ac_ext <<EOF
#line 5183 "configure"
#include "confdefs.h"

#ifdef __ELF__
	yes
#endif
		
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "yes" >/dev/null 2>&1; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so'
else
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
		
fi
rm -f conftest*

	    
else
  echo "$ac_t""no" 1>&6

		SHLIB_CFLAGS=""
		SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r"
		SHLIB_LD_LIBS='${LIBS}'
		SHLIB_SUFFIX=".a"
		DL_OBJS="tclLoadAout.o"
		DL_LIBS=""
		LDFLAGS=""
		LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
		SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    
fi


	    # FreeBSD doesn't handle version numbers with dots.

	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	FreeBSD-*)
	    # FreeBSD 3.* and greater have ELF.
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -Bshareable -x"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS=""
	    ;;
	Rhapsody-*|Darwin-*)
	    SHLIB_CFLAGS="-fno-common"
	    SHLIB_LD="cc -dynamiclib \${LDFLAGS} -compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE}"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".dylib"
	    DL_OBJS="tclLoadDyld.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    CFLAGS_OPTIMIZE="-O3"
	    ;;
	NEXTSTEP-*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="cc -nostdlib -r"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadNext.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OS/390-*)
	    CFLAGS_OPTIMIZE=""      # Optimizer is buggy
	    cat >> confdefs.h <<\EOF
#define _OE_SOCKETS 1
EOF
  # needed in sys/socket.h
	    ;;      
	OSF1-1.0|OSF1-1.1|OSF1-1.2)
	    # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1
	    SHLIB_CFLAGS=""
	    # Hack: make package name same as library name
	    SHLIB_LD='ld -R -export :'
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadOSF.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OSF1-1.*)
	    # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD="ld -shared"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	OSF1-V*)
	    # Digital OSF/1
	    SHLIB_CFLAGS=""
	    SHLIB_LD='ld -shared -expect_unresolved "*"'
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "no" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    # see pthread_intro(3) for pthread support on osf1, k.furukawa
	    if test "${TCL_THREADS}" = "1" ; then
		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
		if test "$using_gcc" = "no" ; then
		    EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
		    LDFLAGS="-pthread"
		else
		    LIBS=`echo $LIBS | sed s/-lpthreads//`
		    LIBS="$LIBS -lpthread -lmach -lexc"
		fi
	    fi

	    ;;
	RISCos-*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".a"
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    ;;
	SCO_SV-3.2*)
	    # Note, dlopen is available only on SCO 3.2.5 and greater. However,
	    # this test works, since "uname -s" was non-standard in 3.2.4 and
	    # below.
	    if test "$using_gcc" = "yes" ; then
	    	SHLIB_CFLAGS="-fPIC -melf"
	    	LDFLAGS="-melf -Wl,-Bexport"
	    else
	    	SHLIB_CFLAGS="-Kpic -belf"
	    	LDFLAGS="-belf -Wl,-Bexport"
	    fi
	    SHLIB_LD="ld -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	SINIX*5.4*)
	    SHLIB_CFLAGS="-K PIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    ;;
	SunOS-4*)
	    SHLIB_CFLAGS="-PIC"
	    SHLIB_LD="ld"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'

	    # SunOS can't handle version numbers with dots in them in library
	    # specs, like -ltcl7.5, so use -ltcl75 instead.  Also, it
	    # requires an extra version number at the end of .so file names.
	    # So, the library has to have a name like libtcl75.so.1.0

	    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
	    TCL_LIB_VERSIONS_OK=nodots
	    ;;
	SunOS-5.[0-6]*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    ;;
	SunOS-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"
	    LDFLAGS=""
    
	    if test "$do64bit" = "yes" ; then
		arch=`isainfo`
		if test "$arch" = "sparcv9 sparc" ; then
			if test "$using_gcc" = "no" ; then
			    do64bit_ok=yes
			    if test "$do64bitVIS" = "yes" ; then
				EXTRA_CFLAGS="-xarch=v9a"
			    	LDFLAGS="-xarch=v9a"
			    else
				EXTRA_CFLAGS="-xarch=v9"
			    	LDFLAGS="-xarch=v9"
			    fi
			else 
			    echo "configure: warning: "64bit mode not supported with GCC on $system"" 1>&2
			fi
		else
		    echo "configure: warning: "64bit mode only supported sparcv9 system"" 1>&2
		fi
	    fi
	    
	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    if test "$using_gcc" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
	    fi
	    ;;
	ULTRIX-4.*)
	    SHLIB_CFLAGS="-G 0"
	    SHLIB_SUFFIX=".a"
	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    if test "$using_gcc" = "no" ; then
		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
	    fi
	    ;;
	UNIX_SV* | UnixWare-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="cc -G"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
	    # that don't grok the -Bexport option.  Test that it does.
	    hold_ldflags=$LDFLAGS
	    echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6
echo "configure:5447: checking for ld accepts -Bexport flag" >&5
	    LDFLAGS="${LDFLAGS} -Wl,-Bexport"
	    cat > conftest.$ac_ext <<EOF
#line 5450 "configure"
#include "confdefs.h"

int main() {
int i;
; return 0; }
EOF
if { (eval echo configure:5457: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  found=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  found=no
fi
rm -f conftest*
	    LDFLAGS=$hold_ldflags
	    echo "$ac_t""$found" 1>&6
	    if test $found = yes; then
	    LDFLAGS="-Wl,-Bexport"
	    else
	    LDFLAGS=""
	    fi
	    LD_SEARCH_FLAGS=""
	    ;;
    esac

    if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then
    echo "configure: warning: "64bit support being disabled -- don\'t know magic for this platform"" 1>&2
    fi

    # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic
    # Loading for Tcl -- What Became of It?".  Proc. 2nd Tcl/Tk Workshop,
    # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need
    # to determine which of several header files defines the a.out file
    # format (a.out.h, sys/exec.h, or sys/exec_aout.h).  At present, we
    # support only a file format that is more or less version-7-compatible. 
    # In particular,
    #	- a.out files must begin with `struct exec'.
    #	- the N_TXTOFF on the `struct exec' must compute the seek address
    #	  of the text segment
    #	- The `struct exec' must contain a_magic, a_text, a_data, a_bss
    #	  and a_entry fields.
    # The following compilation should succeed if and only if either sys/exec.h
    # or a.out.h is usable for the purpose.
    #
    # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
    # `struct exec' includes a second header that contains information that
    # duplicates the v7 fields that are needed.

    if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
	echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6
echo "configure:5503: checking sys/exec.h" >&5
	cat > conftest.$ac_ext <<EOF
#line 5505 "configure"
#include "confdefs.h"
#include <sys/exec.h>
int main() {

	    struct exec foo;
	    unsigned long seek;
	    int flag;
#if defined(__mips) || defined(mips)
	    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
	    seek = N_TXTOFF (foo);
#endif
	    flag = (foo.a_magic == OMAGIC);
	    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
    
; return 0; }
EOF
if { (eval echo configure:5523: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
	echo "$ac_t""$tcl_ok" 1>&6
	if test $tcl_ok = usable; then
	    cat >> confdefs.h <<\EOF
#define USE_SYS_EXEC_H 1
EOF

	else
	    echo $ac_n "checking a.out.h""... $ac_c" 1>&6
echo "configure:5541: checking a.out.h" >&5
	    cat > conftest.$ac_ext <<EOF
#line 5543 "configure"
#include "confdefs.h"
#include <a.out.h>
int main() {

		struct exec foo;
		unsigned long seek;
		int flag;
#if defined(__mips) || defined(mips)
		seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
		seek = N_TXTOFF (foo);
#endif
		flag = (foo.a_magic == OMAGIC);
		return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
	    
; return 0; }
EOF
if { (eval echo configure:5561: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
	    echo "$ac_t""$tcl_ok" 1>&6
	    if test $tcl_ok = usable; then
		cat >> confdefs.h <<\EOF
#define USE_A_OUT_H 1
EOF

	    else
		echo $ac_n "checking sys/exec_aout.h""... $ac_c" 1>&6
echo "configure:5579: checking sys/exec_aout.h" >&5
		cat > conftest.$ac_ext <<EOF
#line 5581 "configure"
#include "confdefs.h"
#include <sys/exec_aout.h>
int main() {

		    struct exec foo;
		    unsigned long seek;
		    int flag;
#if defined(__mips) || defined(mips)
		    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
		    seek = N_TXTOFF (foo);
#endif
		    flag = (foo.a_midmag == OMAGIC);
		    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
		
; return 0; }
EOF
if { (eval echo configure:5599: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  tcl_ok=usable
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  tcl_ok=unusable
fi
rm -f conftest*
		echo "$ac_t""$tcl_ok" 1>&6
		if test $tcl_ok = usable; then
		    cat >> confdefs.h <<\EOF
#define USE_SYS_EXEC_AOUT_H 1
EOF

		else
		    DL_OBJS=""
		fi
	    fi
	fi
    fi

    # Step 5: disable dynamic loading if requested via a command-line switch.

    # Check whether --enable-load or --disable-load was given.
if test "${enable_load+set}" = set; then
  enableval="$enable_load"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi

    if test "$tcl_ok" = "no"; then
	DL_OBJS=""
    fi

    if test "x$DL_OBJS" != "x" ; then
	BUILD_DLTEST="\$(DLTEST_TARGETS)"
    else
	echo "Can't figure out how to do dynamic loading or shared libraries"
	echo "on this system."
	SHLIB_CFLAGS=""
	SHLIB_LD=""
	SHLIB_SUFFIX=""
	DL_OBJS="tclLoadNone.o"
	DL_LIBS=""
	LDFLAGS=""
	LD_SEARCH_FLAGS=""
	BUILD_DLTEST=""
    fi

    # If we're running gcc, then change the C flags for compiling shared
    # libraries to the right flags for gcc, instead of those for the
    # standard manufacturer compiler.

    if test "$DL_OBJS" != "tclLoadNone.o" ; then
	if test "$using_gcc" = "yes" ; then
	    case $system in
		AIX-*)
		    ;;
		BSD/OS*)
		    ;;
		IRIX*)
		    ;;
		NetBSD-*|FreeBSD-*|OpenBSD-*)
		    ;;
		Rhapsody-*|Darwin-*)
		    ;;
		RISCos-*)
		    ;;
		SCO_SV-3.2*)
		    ;;
		ULTRIX-4.*)
		    ;;
		*)
		    SHLIB_CFLAGS="-fPIC"
		    ;;
	    esac
	fi
    fi

    if test "$SHARED_LIB_SUFFIX" = "" ; then
	SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}'
    fi
    if test "$UNSHARED_LIB_SUFFIX" = "" ; then
	UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
    fi

    
    
    
    



    echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:5696: checking for build with symbols" >&5
    # Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
  enableval="$enable_symbols"
  tcl_ok=$enableval
else
  tcl_ok=no
fi

    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	DBGX=g
	echo "$ac_t""yes" 1>&6
    else
	CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}"
	LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
	DBGX=""
	echo "$ac_t""no" 1>&6
    fi


TCL_DBGX=${DBGX}
CFLAGS=${CFLAGS_DEFAULT}

#--------------------------------------------------------------------
#	The statements below check for systems where POSIX-style
#	non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. 
#	On these systems (mostly older ones), use the old BSD-style
#	FIONBIO approach instead.
#--------------------------------------------------------------------


    for ac_hdr in sys/ioctl.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:5733: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5738 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5743: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    for ac_hdr in sys/filio.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:5773: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5778 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

    echo $ac_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O""... $ac_c" 1>&6
echo "configure:5810: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5
    if test -f /usr/lib/NextStep/software_version; then
	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
    else
	system=`uname -s`-`uname -r`
	if test "$?" -ne 0 ; then
	    system=unknown
	else
	    # Special check for weird MP-RAS system (uname returns weird
	    # results, and the version is kept in special file).
	
	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
		system=MP-RAS-`awk '{print }' /etc/.relid'`
	    fi
	    if test "`uname -s`" = "AIX" ; then
		system=AIX-`uname -v`.`uname -r`
	    fi
	fi
    fi
    case $system in
	# There used to be code here to use FIONBIO under AIX.  However, it
	# was reported that FIONBIO doesn't work under AIX 3.2.5.  Since
	# using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO
	# code (JO, 5/31/97).

	OSF*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	SunOS-4*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	ULTRIX-4.*)
	    cat >> confdefs.h <<\EOF
#define USE_FIONBIO 1
EOF

	    echo "$ac_t""FIONBIO" 1>&6
	    ;;
	*)
	    echo "$ac_t""O_NONBLOCK" 1>&6
	    ;;
    esac


#--------------------------------------------------------------------
#	The statements below define a collection of symbols related to
#	building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------

TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}


    echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:5872: checking how to build libraries" >&5
    # Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
  enableval="$enable_shared"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi


    if test "${enable_shared+set}" = set; then
	enableval="$enable_shared"
	tcl_ok=$enableval
    else
	tcl_ok=yes
    fi

    if test "$tcl_ok" = "yes" ; then
	echo "$ac_t""shared" 1>&6
	SHARED_BUILD=1
    else
	echo "$ac_t""static" 1>&6
	SHARED_BUILD=0
	cat >> confdefs.h <<\EOF
#define STATIC_BUILD 1
EOF

    fi


if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
    TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
    TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
    eval "TCL_LIB_FILE=libtcl${TCL_SHARED_LIB_SUFFIX}"
    if test "x$DL_OBJS" = "xtclLoadAout.o"; then
	MAKE_LIB="ar cr \${TCL_LIB_FILE} \${OBJS}"
    else
	MAKE_LIB="\${SHLIB_LD} -o \${TCL_LIB_FILE} \${OBJS} ${SHLIB_LD_LIBS}"
	RANLIB=":"
    fi
else
    case $system in
        BSD/OS*)
	    ;;

	AIX-[1-4].*)
            ;;

        *)
	    SHLIB_LD_LIBS=""
	    ;;
    esac
    TCL_SHLIB_CFLAGS=""
    TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
    eval "TCL_LIB_FILE=libtcl${TCL_UNSHARED_LIB_SUFFIX}"
    MAKE_LIB="ar cr \${TCL_LIB_FILE} \${OBJS}"
fi

# tclConfig.sh needs a version of the _LIB_SUFFIX that has been eval'ed
# so that the backslashes quoting the DBX braces are dropped.

# Trick to replace DBGX with TCL_DBGX
DBGX='${TCL_DBGX}'
eval "TCL_LIB_FILE=${TCL_LIB_FILE}"

# Note:  in the following variable, it's important to use the absolute
# path name of the Tcl directory rather than "..":  this is because
# AIX remembers this path and will attempt to use it at run-time to look
# up the Tcl library.

if test "$SHARED_BUILD" = "0" -o $TCL_NEEDS_EXP_FILE = 0; then
    if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
        TCL_LIB_FLAG="-ltcl${TCL_VERSION}\${TCL_DBGX}"
    else
        TCL_LIB_FLAG="-ltcl`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
    fi
    TCL_BUILD_LIB_SPEC="-L`pwd` ${TCL_LIB_FLAG}"
    TCL_LIB_SPEC="-L${exec_prefix}/lib ${TCL_LIB_FLAG}"
else
    TCL_BUILD_EXP_FILE="lib.exp"
    eval "TCL_EXP_FILE=libtcl${TCL_EXPORT_FILE_SUFFIX}"

    # Replace DBGX with TCL_DBGX
    eval "TCL_EXP_FILE=\"${TCL_EXP_FILE}\""
    
    if test "$using_gcc" = "yes" ; then
	TCL_BUILD_LIB_SPEC="-Wl,-bI:`pwd`/${TCL_BUILD_EXP_FILE} -L`pwd`"
	TCL_LIB_SPEC="-Wl,-bI:${exec_prefix}/lib/${TCL_EXP_FILE} -L`pwd`"    
    else
	TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
	TCL_LIB_SPEC="-bI:${exec_prefix}/lib/${TCL_EXP_FILE}"    
    fi
fi
VERSION='${VERSION}'
eval "CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}"
eval "CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}"
eval "CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}"
VERSION=${TCL_VERSION}

#--------------------------------------------------------------------
#	The statements below define the symbol TCL_PACKAGE_PATH, which
#	gives a list of directories that may contain packages.  The list
#	consists of one directory for machine-dependent binaries and
#	another for platform-independent scripts.
#--------------------------------------------------------------------

if test "$prefix" != "$exec_prefix"; then
    TCL_PACKAGE_PATH="${exec_prefix}/lib ${prefix}/lib"
else
    TCL_PACKAGE_PATH="${prefix}/lib"
fi

#--------------------------------------------------------------------
#       The statements below define various symbols relating to Tcl
#       stub support.
#--------------------------------------------------------------------

# Replace ${VERSION} with contents of ${TCL_VERSION}
eval "STUB_LIB_FILE=libtclstub${TCL_UNSHARED_LIB_SUFFIX}"
# Replace DBGX with TCL_DBGX
eval "STUB_LIB_FILE=\"${STUB_LIB_FILE}\""

MAKE_STUB_LIB="ar cr \${STUB_LIB_FILE} \${STUB_LIB_OBJS}"

TCL_STUB_LIB_FILE=${STUB_LIB_FILE}

if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
    TCL_STUB_LIB_FLAG="-ltclstub${TCL_VERSION}\${TCL_DBGX}"
else
    TCL_STUB_LIB_FLAG="-ltclstub`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
fi

TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_SPEC="-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}"
TCL_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
TCL_STUB_LIB_PATH="${exec_prefix}/lib/${TCL_STUB_LIB_FILE}"

#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

















































trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tclConfig.sh" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@RANLIB@%$RANLIB%g
s%@CC@%$CC%g
s%@CPP@%$CPP%g
s%@LIBOBJS@%$LIBOBJS%g
s%@TCL_LIBS@%$TCL_LIBS%g
s%@MATH_LIBS@%$MATH_LIBS%g
s%@DL_LIBS@%$DL_LIBS%g
s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g
s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g
s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g
s%@STUB_LIB_FILE@%$STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g
s%@MAKE_STUB_LIB@%$MAKE_STUB_LIB%g
s%@BUILD_DLTEST@%$BUILD_DLTEST%g
s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g
s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g
s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g
s%@TCL_DBGX@%$TCL_DBGX%g
s%@DL_OBJS@%$DL_OBJS%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@MAKE_LIB@%$MAKE_LIB%g
s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@STLIB_LD@%$STLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g
s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g
s%@TCL_LDFLAGS_DEBUG@%$TCL_LDFLAGS_DEBUG%g
s%@TCL_LDFLAGS_OPTIMIZE@%$TCL_LDFLAGS_OPTIMIZE%g
s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g
s%@TCL_NEEDS_EXP_FILE@%$TCL_NEEDS_EXP_FILE%g
s%@TCL_BUILD_EXP_FILE@%$TCL_BUILD_EXP_FILE%g
s%@TCL_EXP_FILE@%$TCL_EXP_FILE%g
s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g
s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g
s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g
s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g
s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_SHARED_LIB_SUFFIX@%$TCL_SHARED_LIB_SUFFIX%g
s%@TCL_SHLIB_CFLAGS@%$TCL_SHLIB_CFLAGS%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
s%@TCL_UNSHARED_LIB_SUFFIX@%$TCL_UNSHARED_LIB_SUFFIX%g
s%@TCL_VERSION@%$TCL_VERSION%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tclConfig.sh"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to unix/configure.in.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash -norc
dnl	This file is an input file used by the GNU "autoconf" program to
dnl	generate the file "configure", which is run during Tcl installation
dnl	to configure the system for the local environment.
AC_INIT(../generic/tcl.h)
# RCS: @(#) $Id: configure.in,v 1.57 2000/04/19 08:32:45 hobbs Exp $

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".1"
VERSION=${TCL_VERSION}

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then





|




|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash -norc
dnl	This file is an input file used by the GNU "autoconf" program to
dnl	generate the file "configure", which is run during Tcl installation
dnl	to configure the system for the local environment.
AC_INIT(../generic/tcl.h)
# RCS: @(#) $Id: configure.in,v 1.57.2.2 2001/04/03 22:54:39 hobbs Exp $

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VERSION=${TCL_VERSION}

#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------

if test "${prefix}" = "NONE"; then
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX library procedures, or
#	set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------

# Check if Posix compliant getcwd exists, if not we'll use getwd.
AC_CHECK_FUNCS(getcwd, , AC_DEFINE(USEGETWD))
# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?

AC_REPLACE_FUNCS(opendir strstr)

AC_REPLACE_FUNCS(strtol tmpnam waitpid)
AC_CHECK_FUNC(strerror, , AC_DEFINE(NO_STRERROR))
AC_CHECK_FUNC(getwd, , AC_DEFINE(NO_GETWD))
AC_CHECK_FUNC(wait3, , AC_DEFINE(NO_WAIT3))
AC_CHECK_FUNC(uname, , AC_DEFINE(NO_UNAME))
AC_CHECK_FUNC(realpath, , AC_DEFINE(NO_REALPATH))

#--------------------------------------------------------------------
#	On a few very rare systems, all of the libm.a stuff is
#	already in libc.a.  Set compiler flags accordingly.
#	Also, Linux requires the "ieee" library for math to work
#	right (and it must appear before "-lm").
#--------------------------------------------------------------------

#AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
#AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])

#--------------------------------------------------------------------
#       On AIX systems, libbsd.a has to be linked in to support
#       non-blocking file IO.  This library has to be linked in after
#       the MATH_LIBS or it breaks the pow() function.  The way to
#       insure proper sequencing, is to add it to the tail of MATH_LIBS.
#        This library also supplies gettimeofday.
#--------------------------------------------------------------------
#libbsd=no
#if test "`uname -s`" = "AIX" ; then
#    AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
#    if test $libbsd = yes; then
#	MATH_LIBS="$MATH_LIBS -lbsd"
#    fi
#fi

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX header files.  Special
#	notes:
#	    - stdlib.h doesn't define strtol, strtoul, or
#	      strtod insome versions of SunOS
#	    - some versions of string.h don't declare procedures such







|






|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

























75
76
77
78
79
80
81

#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX library procedures, or
#	set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------

# Check if Posix compliant getcwd exists, if not we'll use getwd.
AC_CHECK_FUNCS(getcwd, , [AC_DEFINE(USEGETWD)])
# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?

AC_REPLACE_FUNCS(opendir strstr)

AC_REPLACE_FUNCS(strtol tmpnam waitpid)
AC_CHECK_FUNC(strerror, , [AC_DEFINE(NO_STRERROR)])
AC_CHECK_FUNC(getwd, , [AC_DEFINE(NO_GETWD)])
AC_CHECK_FUNC(wait3, , [AC_DEFINE(NO_WAIT3)])
AC_CHECK_FUNC(uname, , [AC_DEFINE(NO_UNAME)])
AC_CHECK_FUNC(realpath, , [AC_DEFINE(NO_REALPATH)])


























#--------------------------------------------------------------------
#	Supply substitutes for missing POSIX header files.  Special
#	notes:
#	    - stdlib.h doesn't define strtol, strtoul, or
#	      strtod insome versions of SunOS
#	    - some versions of string.h don't declare procedures such
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
SC_TIME_HANDLER

#--------------------------------------------------------------------
#	Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
#	in struct stat.  But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
AC_STRUCT_ST_BLKSIZE
AC_CHECK_FUNC(fstatfs, , AC_DEFINE(NO_FSTATFS))

#--------------------------------------------------------------------
#       Some system have no memcmp or it does not work with 8 bit
#       data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
AC_FUNC_MEMCMP

#--------------------------------------------------------------------
#       Some system like SunOS 4 and other BSD like systems
#       have no memmove (we assume they have bcopy instead).
#       {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
AC_CHECK_FUNC(memmove, , AC_DEFINE(NO_MEMMOVE) AC_DEFINE(NO_STRING_H))

#--------------------------------------------------------------------
#	On some systems strstr is broken: it returns a pointer even
#	even if the original string is empty.
#--------------------------------------------------------------------

AC_MSG_CHECKING([proper strstr implementation])







|












|







123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
SC_TIME_HANDLER

#--------------------------------------------------------------------
#	Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
#	in struct stat.  But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
AC_STRUCT_ST_BLKSIZE
AC_CHECK_FUNC(fstatfs, , [AC_DEFINE(NO_FSTATFS)])

#--------------------------------------------------------------------
#       Some system have no memcmp or it does not work with 8 bit
#       data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
AC_FUNC_MEMCMP

#--------------------------------------------------------------------
#       Some system like SunOS 4 and other BSD like systems
#       have no memmove (we assume they have bcopy instead).
#       {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
AC_CHECK_FUNC(memmove, , [AC_DEFINE(NO_MEMMOVE) AC_DEFINE(NO_STRING_H)])

#--------------------------------------------------------------------
#	On some systems strstr is broken: it returns a pointer even
#	even if the original string is empty.
#--------------------------------------------------------------------

AC_MSG_CHECKING([proper strstr implementation])
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#--------------------------------------------------------------------
#	If a system doesn't have an opendir function (man, that's old!)
#	then we have to supply a different version of dirent.h which
#	is compatible with the substitute version of opendir that's
#	provided.  This version only works with V7-style directories.
#--------------------------------------------------------------------

AC_CHECK_FUNC(opendir, , AC_DEFINE(USE_DIRENT2_H))

#--------------------------------------------------------------------
#	The check below checks whether <sys/wait.h> defines the type
#	"union wait" correctly.  It's needed because of weirdness in
#	HP-UX where "union wait" is defined in both the BSD and SYS-V
#	environments.  Checking the usability of WIFEXITED seems to do
#	the trick.







|







233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#--------------------------------------------------------------------
#	If a system doesn't have an opendir function (man, that's old!)
#	then we have to supply a different version of dirent.h which
#	is compatible with the substitute version of opendir that's
#	provided.  This version only works with V7-style directories.
#--------------------------------------------------------------------

AC_CHECK_FUNC(opendir, , [AC_DEFINE(USE_DIRENT2_H)])

#--------------------------------------------------------------------
#	The check below checks whether <sys/wait.h> defines the type
#	"union wait" correctly.  It's needed because of weirdness in
#	HP-UX where "union wait" is defined in both the BSD and SYS-V
#	environments.  Checking the usability of WIFEXITED seems to do
#	the trick.
324
325
326
327
328
329
330
331

332

333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
#	2. SGI systems don't use the BSD form of the gettimeofday function,
#	   but they have a BSDgettimeofday function that can be used instead.
#	3. See if gettimeofday is declared in the <sys/time.h> header file.
#	   if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
#	   declare it.
#--------------------------------------------------------------------

AC_CHECK_FUNC(BSDgettimeofday, AC_DEFINE(HAVE_BSDGETTIMEOFDAY),

	AC_CHECK_FUNC(gettimeofday, , AC_DEFINE(NO_GETTOD)))

AC_MSG_CHECKING([for gettimeofday declaration])
AC_EGREP_HEADER(gettimeofday, sys/time.h, AC_MSG_RESULT(present), [
    AC_MSG_RESULT(missing)
    AC_DEFINE(GETTOD_NOT_DECLARED)
])

#--------------------------------------------------------------------
#	Interactive UNIX requires -linet instead of -lsocket, plus it
#	needs net/errno.h to define the socket-related error codes.
#--------------------------------------------------------------------

#AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
#AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))

#--------------------------------------------------------------------
#	The following code checks to see whether it is possible to get
#	signed chars on this platform.  This is needed in order to
#	properly generate sign-extended ints from character values.
#--------------------------------------------------------------------

AC_C_CHAR_UNSIGNED
AC_MSG_CHECKING([signed char declarations])
AC_TRY_COMPILE(, [
signed char *p;
p = 0;
], tcl_ok=yes, tcl_ok=no)
AC_MSG_RESULT($tcl_ok)
if test $tcl_ok = yes; then
    AC_DEFINE(HAVE_SIGNED_CHAR)
fi

#--------------------------------------------------------------------
#	Check for the existence of the -lsocket and -lnsl libraries.
#	The order here is important, so that they end up in the right
#	order in the command line generated by make.  Here are some
#	special considerations:
#	1. Use "connect" and "accept" to check for -lsocket, and
#	   "gethostbyname" to check for -lnsl.
#	2. Use each function name only once:  can't redo a check because
#	   autoconf caches the results of the last check and won't redo it.
#	3. Use -lnsl and -lsocket only if they supply procedures that
#	   aren't already present in the normal libraries.  This is because
#	   IRIX 5.2 has libraries, but they aren't needed and they're
#	   bogus:  they goof up name resolution if used.
#	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
#	   To get around this problem, check for both libraries together
#	   if -lsocket doesn't work by itself.
#--------------------------------------------------------------------

#tcl_checkBoth=0
#AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
#if test "$tcl_checkSocket" = 1; then
#    AC_CHECK_LIB(socket, main, LIBS="$LIBS -lsocket", tcl_checkBoth=1)
#fi
#if test "$tcl_checkBoth" = 1; then
#    tk_oldLibs=$LIBS
#    LIBS="$LIBS -lsocket -lnsl"
#    AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
#fi
#AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))

#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------

SC_TCL_LINK_LIBS

# Add the threads support libraries







|
>
|
>






<
<
<
<
<
<
<
<

















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315








316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332






























333
334
335
336
337
338
339
#	2. SGI systems don't use the BSD form of the gettimeofday function,
#	   but they have a BSDgettimeofday function that can be used instead.
#	3. See if gettimeofday is declared in the <sys/time.h> header file.
#	   if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
#	   declare it.
#--------------------------------------------------------------------

AC_CHECK_FUNC(BSDgettimeofday,
    [AC_DEFINE(HAVE_BSDGETTIMEOFDAY)], [
    AC_CHECK_FUNC(gettimeofday, , [AC_DEFINE(NO_GETTOD)])
])
AC_MSG_CHECKING([for gettimeofday declaration])
AC_EGREP_HEADER(gettimeofday, sys/time.h, AC_MSG_RESULT(present), [
    AC_MSG_RESULT(missing)
    AC_DEFINE(GETTOD_NOT_DECLARED)
])









#--------------------------------------------------------------------
#	The following code checks to see whether it is possible to get
#	signed chars on this platform.  This is needed in order to
#	properly generate sign-extended ints from character values.
#--------------------------------------------------------------------

AC_C_CHAR_UNSIGNED
AC_MSG_CHECKING([signed char declarations])
AC_TRY_COMPILE(, [
signed char *p;
p = 0;
], tcl_ok=yes, tcl_ok=no)
AC_MSG_RESULT($tcl_ok)
if test $tcl_ok = yes; then
    AC_DEFINE(HAVE_SIGNED_CHAR)
fi































#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------

SC_TCL_LINK_LIBS

# Add the threads support libraries
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
	RANLIB=":"
    fi
else
    case $system in
        BSD/OS*)
	    ;;

	AIX-*)
            ;;

        *)
	    SHLIB_LD_LIBS=""
	    ;;
    esac
    TCL_SHLIB_CFLAGS=""







|







383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
	RANLIB=":"
    fi
else
    case $system in
        BSD/OS*)
	    ;;

	AIX-[[1-4]].*)
            ;;

        *)
	    SHLIB_LD_LIBS=""
	    ;;
    esac
    TCL_SHLIB_CFLAGS=""
Added unix/dltest/configure.


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=pkga.c

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


# RCS: @(#) $Id: configure,v 1.1.2.1 2001/04/03 22:10:14 hobbs Exp $

# Recover information that Tcl computed with its configure script.

. ../tclConfig.sh

CC=$TCL_CC

SHLIB_CFLAGS=$TCL_SHLIB_CFLAGS

EXTRA_CFLAGS=$TCL_EXTRA_CFLAGS

SHLIB_LD=$TCL_SHLIB_LD

SHLIB_LD_LIBS=$TCL_SHLIB_LD_LIBS

SHLIB_SUFFIX=$TCL_SHLIB_SUFFIX

SHLIB_VERSION=$TCL_SHLIB_VERSION


TCL_LIBS=$TCL_LIBS

TCL_VERSION=$TCL_VERSION

TCL_DBGX=$TCL_DBGX


trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@CC@%$CC%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@SHLIB_VERSION@%$SHLIB_VERSION%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_LIBS@%$TCL_LIBS%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_DBGX@%$TCL_DBGX%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to unix/install-sh.
55
56
57
58
59
60
61





62
63
64
65
66
67
68

	-g) chgrpcmd="$chgrpprog $2"
	    shift
	    shift
	    continue;;

	-s) stripcmd="$stripprog"





	    shift
	    continue;;

	*)  if [ x"$src" = x ]
	    then
		src=$1
	    else







>
>
>
>
>







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

	-g) chgrpcmd="$chgrpprog $2"
	    shift
	    shift
	    continue;;

	-s) stripcmd="$stripprog"
	    shift
	    continue;;

	-S) stripcmd="$stripprog $2"
	    shift
	    shift
	    continue;;

	*)  if [ x"$src" = x ]
	    then
		src=$1
	    else
Changes to unix/mkLinks.
33
34
35
36
37
38
39

40
41
42
43
44
45

46
47
48
49
50
51
52
    rm -f Tcl_Stat.3
    ln Access.3 Tcl_Access.3
    ln Access.3 Tcl_Stat.3
fi
if test -r AddErrInfo.3; then
    rm -f Tcl_AddObjErrorInfo.3
    rm -f Tcl_AddErrorInfo.3

    rm -f Tcl_SetErrorCode.3
    rm -f Tcl_SetErrorCodeVA.3
    rm -f Tcl_PosixError.3
    rm -f Tcl_LogCommandInfo.3
    ln AddErrInfo.3 Tcl_AddObjErrorInfo.3
    ln AddErrInfo.3 Tcl_AddErrorInfo.3

    ln AddErrInfo.3 Tcl_SetErrorCode.3
    ln AddErrInfo.3 Tcl_SetErrorCodeVA.3
    ln AddErrInfo.3 Tcl_PosixError.3
    ln AddErrInfo.3 Tcl_LogCommandInfo.3
fi
if test -r Alloc.3; then
    rm -f Tcl_Alloc.3







>






>







33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    rm -f Tcl_Stat.3
    ln Access.3 Tcl_Access.3
    ln Access.3 Tcl_Stat.3
fi
if test -r AddErrInfo.3; then
    rm -f Tcl_AddObjErrorInfo.3
    rm -f Tcl_AddErrorInfo.3
    rm -f Tcl_SetObjErrorCode.3
    rm -f Tcl_SetErrorCode.3
    rm -f Tcl_SetErrorCodeVA.3
    rm -f Tcl_PosixError.3
    rm -f Tcl_LogCommandInfo.3
    ln AddErrInfo.3 Tcl_AddObjErrorInfo.3
    ln AddErrInfo.3 Tcl_AddErrorInfo.3
    ln AddErrInfo.3 Tcl_SetObjErrorCode.3
    ln AddErrInfo.3 Tcl_SetErrorCode.3
    ln AddErrInfo.3 Tcl_SetErrorCodeVA.3
    ln AddErrInfo.3 Tcl_PosixError.3
    ln AddErrInfo.3 Tcl_LogCommandInfo.3
fi
if test -r Alloc.3; then
    rm -f Tcl_Alloc.3
115
116
117
118
119
120
121

122
123

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143














144
145
146
147
148
149
150
151
152
153














154
155
156
157
158
159
160
    rm -f Tcl_DontCallWhenDeleted.3
    ln CallDel.3 Tcl_CallWhenDeleted.3
    ln CallDel.3 Tcl_DontCallWhenDeleted.3
fi
if test -r ChnlStack.3; then
    rm -f Tcl_StackChannel.3
    rm -f Tcl_UnstackChannel.3

    ln ChnlStack.3 Tcl_StackChannel.3
    ln ChnlStack.3 Tcl_UnstackChannel.3

fi
if test -r CmdCmplt.3; then
    rm -f Tcl_CommandComplete.3
    ln CmdCmplt.3 Tcl_CommandComplete.3
fi
if test -r Concat.3; then
    rm -f Tcl_Concat.3
    ln Concat.3 Tcl_Concat.3
fi
if test -r CrtChannel.3; then
    rm -f Tcl_CreateChannel.3
    rm -f Tcl_GetChannelInstanceData.3
    rm -f Tcl_GetChannelType.3
    rm -f Tcl_GetChannelName.3
    rm -f Tcl_GetChannelHandle.3
    rm -f Tcl_GetChannelMode.3
    rm -f Tcl_GetChannelBufferSize.3
    rm -f Tcl_SetChannelBufferSize.3
    rm -f Tcl_NotifyChannel.3
    rm -f Tcl_BadChannelOption.3














    ln CrtChannel.3 Tcl_CreateChannel.3
    ln CrtChannel.3 Tcl_GetChannelInstanceData.3
    ln CrtChannel.3 Tcl_GetChannelType.3
    ln CrtChannel.3 Tcl_GetChannelName.3
    ln CrtChannel.3 Tcl_GetChannelHandle.3
    ln CrtChannel.3 Tcl_GetChannelMode.3
    ln CrtChannel.3 Tcl_GetChannelBufferSize.3
    ln CrtChannel.3 Tcl_SetChannelBufferSize.3
    ln CrtChannel.3 Tcl_NotifyChannel.3
    ln CrtChannel.3 Tcl_BadChannelOption.3














fi
if test -r CrtChnlHdlr.3; then
    rm -f Tcl_CreateChannelHandler.3
    rm -f Tcl_DeleteChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_CreateChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_DeleteChannelHandler.3
fi







>


>




















>
>
>
>
>
>
>
>
>
>
>
>
>
>










>
>
>
>
>
>
>
>
>
>
>
>
>
>







117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
    rm -f Tcl_DontCallWhenDeleted.3
    ln CallDel.3 Tcl_CallWhenDeleted.3
    ln CallDel.3 Tcl_DontCallWhenDeleted.3
fi
if test -r ChnlStack.3; then
    rm -f Tcl_StackChannel.3
    rm -f Tcl_UnstackChannel.3
    rm -f Tcl_GetStackedChannel.3
    ln ChnlStack.3 Tcl_StackChannel.3
    ln ChnlStack.3 Tcl_UnstackChannel.3
    ln ChnlStack.3 Tcl_GetStackedChannel.3
fi
if test -r CmdCmplt.3; then
    rm -f Tcl_CommandComplete.3
    ln CmdCmplt.3 Tcl_CommandComplete.3
fi
if test -r Concat.3; then
    rm -f Tcl_Concat.3
    ln Concat.3 Tcl_Concat.3
fi
if test -r CrtChannel.3; then
    rm -f Tcl_CreateChannel.3
    rm -f Tcl_GetChannelInstanceData.3
    rm -f Tcl_GetChannelType.3
    rm -f Tcl_GetChannelName.3
    rm -f Tcl_GetChannelHandle.3
    rm -f Tcl_GetChannelMode.3
    rm -f Tcl_GetChannelBufferSize.3
    rm -f Tcl_SetChannelBufferSize.3
    rm -f Tcl_NotifyChannel.3
    rm -f Tcl_BadChannelOption.3
    rm -f Tcl_ChannelName.3
    rm -f Tcl_ChannelVersion.3
    rm -f Tcl_ChannelBlockModeProc.3
    rm -f Tcl_ChannelCloseProc.3
    rm -f Tcl_ChannelClose2Proc.3
    rm -f Tcl_ChannelInputProc.3
    rm -f Tcl_ChannelOutputProc.3
    rm -f Tcl_ChannelSeekProc.3
    rm -f Tcl_ChannelSetOptionProc.3
    rm -f Tcl_ChannelGetOptionProc.3
    rm -f Tcl_ChannelWatchProc.3
    rm -f Tcl_ChannelGetHandleProc.3
    rm -f Tcl_ChannelFlushProc.3
    rm -f Tcl_ChannelHandlerProc.3
    ln CrtChannel.3 Tcl_CreateChannel.3
    ln CrtChannel.3 Tcl_GetChannelInstanceData.3
    ln CrtChannel.3 Tcl_GetChannelType.3
    ln CrtChannel.3 Tcl_GetChannelName.3
    ln CrtChannel.3 Tcl_GetChannelHandle.3
    ln CrtChannel.3 Tcl_GetChannelMode.3
    ln CrtChannel.3 Tcl_GetChannelBufferSize.3
    ln CrtChannel.3 Tcl_SetChannelBufferSize.3
    ln CrtChannel.3 Tcl_NotifyChannel.3
    ln CrtChannel.3 Tcl_BadChannelOption.3
    ln CrtChannel.3 Tcl_ChannelName.3
    ln CrtChannel.3 Tcl_ChannelVersion.3
    ln CrtChannel.3 Tcl_ChannelBlockModeProc.3
    ln CrtChannel.3 Tcl_ChannelCloseProc.3
    ln CrtChannel.3 Tcl_ChannelClose2Proc.3
    ln CrtChannel.3 Tcl_ChannelInputProc.3
    ln CrtChannel.3 Tcl_ChannelOutputProc.3
    ln CrtChannel.3 Tcl_ChannelSeekProc.3
    ln CrtChannel.3 Tcl_ChannelSetOptionProc.3
    ln CrtChannel.3 Tcl_ChannelGetOptionProc.3
    ln CrtChannel.3 Tcl_ChannelWatchProc.3
    ln CrtChannel.3 Tcl_ChannelGetHandleProc.3
    ln CrtChannel.3 Tcl_ChannelFlushProc.3
    ln CrtChannel.3 Tcl_ChannelHandlerProc.3
fi
if test -r CrtChnlHdlr.3; then
    rm -f Tcl_CreateChannelHandler.3
    rm -f Tcl_DeleteChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_CreateChannelHandler.3
    ln CrtChnlHdlr.3 Tcl_DeleteChannelHandler.3
fi
261
262
263
264
265
266
267

268
269

270
271
272
273
274
275
276
    ln DString.3 Tcl_DStringFree.3
    ln DString.3 Tcl_DStringResult.3
    ln DString.3 Tcl_DStringGetResult.3
fi
if test -r DetachPids.3; then
    rm -f Tcl_DetachPids.3
    rm -f Tcl_ReapDetachedProcs.3

    ln DetachPids.3 Tcl_DetachPids.3
    ln DetachPids.3 Tcl_ReapDetachedProcs.3

fi
if test -r DoOneEvent.3; then
    rm -f Tcl_DoOneEvent.3
    ln DoOneEvent.3 Tcl_DoOneEvent.3
fi
if test -r DoWhenIdle.3; then
    rm -f Tcl_DoWhenIdle.3







>


>







293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
    ln DString.3 Tcl_DStringFree.3
    ln DString.3 Tcl_DStringResult.3
    ln DString.3 Tcl_DStringGetResult.3
fi
if test -r DetachPids.3; then
    rm -f Tcl_DetachPids.3
    rm -f Tcl_ReapDetachedProcs.3
    rm -f Tcl_WaitPid.3
    ln DetachPids.3 Tcl_DetachPids.3
    ln DetachPids.3 Tcl_ReapDetachedProcs.3
    ln DetachPids.3 Tcl_WaitPid.3
fi
if test -r DoOneEvent.3; then
    rm -f Tcl_DoOneEvent.3
    ln DoOneEvent.3 Tcl_DoOneEvent.3
fi
if test -r DoWhenIdle.3; then
    rm -f Tcl_DoWhenIdle.3
343
344
345
346
347
348
349
350
351
352


353
354
355
356
357
358
359


360
361
362
363
364
365
366
    ln Eval.3 Tcl_GlobalEvalObj.3
    ln Eval.3 Tcl_VarEval.3
    ln Eval.3 Tcl_VarEvalVA.3
fi
if test -r Exit.3; then
    rm -f Tcl_Exit.3
    rm -f Tcl_Finalize.3
    rm -f Tcl_FinalizeThread.3
    rm -f Tcl_CreateExitHandler.3
    rm -f Tcl_DeleteExitHandler.3


    rm -f Tcl_CreateThreadExitHandler.3
    rm -f Tcl_DeleteThreadExitHandler.3
    ln Exit.3 Tcl_Exit.3
    ln Exit.3 Tcl_Finalize.3
    ln Exit.3 Tcl_FinalizeThread.3
    ln Exit.3 Tcl_CreateExitHandler.3
    ln Exit.3 Tcl_DeleteExitHandler.3


    ln Exit.3 Tcl_CreateThreadExitHandler.3
    ln Exit.3 Tcl_DeleteThreadExitHandler.3
fi
if test -r ExprLong.3; then
    rm -f Tcl_ExprLong.3
    rm -f Tcl_ExprDouble.3
    rm -f Tcl_ExprBoolean.3







<


>
>




<


>
>







377
378
379
380
381
382
383

384
385
386
387
388
389
390
391

392
393
394
395
396
397
398
399
400
401
402
    ln Eval.3 Tcl_GlobalEvalObj.3
    ln Eval.3 Tcl_VarEval.3
    ln Eval.3 Tcl_VarEvalVA.3
fi
if test -r Exit.3; then
    rm -f Tcl_Exit.3
    rm -f Tcl_Finalize.3

    rm -f Tcl_CreateExitHandler.3
    rm -f Tcl_DeleteExitHandler.3
    rm -f Tcl_ExitThread.3
    rm -f Tcl_FinalizeThread.3
    rm -f Tcl_CreateThreadExitHandler.3
    rm -f Tcl_DeleteThreadExitHandler.3
    ln Exit.3 Tcl_Exit.3
    ln Exit.3 Tcl_Finalize.3

    ln Exit.3 Tcl_CreateExitHandler.3
    ln Exit.3 Tcl_DeleteExitHandler.3
    ln Exit.3 Tcl_ExitThread.3
    ln Exit.3 Tcl_FinalizeThread.3
    ln Exit.3 Tcl_CreateThreadExitHandler.3
    ln Exit.3 Tcl_DeleteThreadExitHandler.3
fi
if test -r ExprLong.3; then
    rm -f Tcl_ExprLong.3
    rm -f Tcl_ExprDouble.3
    rm -f Tcl_ExprBoolean.3
394
395
396
397
398
399
400

401

402
403
404
405
406
407
408
fi
if test -r GetHostName.3; then
    rm -f Tcl_GetHostName.3
    ln GetHostName.3 Tcl_GetHostName.3
fi
if test -r GetIndex.3; then
    rm -f Tcl_GetIndexFromObj.3

    ln GetIndex.3 Tcl_GetIndexFromObj.3

fi
if test -r GetInt.3; then
    rm -f Tcl_GetInt.3
    rm -f Tcl_GetDouble.3
    rm -f Tcl_GetBoolean.3
    ln GetInt.3 Tcl_GetInt.3
    ln GetInt.3 Tcl_GetDouble.3







>

>







430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
fi
if test -r GetHostName.3; then
    rm -f Tcl_GetHostName.3
    ln GetHostName.3 Tcl_GetHostName.3
fi
if test -r GetIndex.3; then
    rm -f Tcl_GetIndexFromObj.3
    rm -f Tcl_GetIndexFromObjStruct.3
    ln GetIndex.3 Tcl_GetIndexFromObj.3
    ln GetIndex.3 Tcl_GetIndexFromObjStruct.3
fi
if test -r GetInt.3; then
    rm -f Tcl_GetInt.3
    rm -f Tcl_GetDouble.3
    rm -f Tcl_GetBoolean.3
    ln GetInt.3 Tcl_GetInt.3
    ln GetInt.3 Tcl_GetDouble.3
536
537
538
539
540
541
542

543
544
545
546
547

548
549
550
551
552
553
554
fi
if test -r Object.3; then
    rm -f Tcl_NewObj.3
    rm -f Tcl_DuplicateObj.3
    rm -f Tcl_IncrRefCount.3
    rm -f Tcl_DecrRefCount.3
    rm -f Tcl_IsShared.3

    ln Object.3 Tcl_NewObj.3
    ln Object.3 Tcl_DuplicateObj.3
    ln Object.3 Tcl_IncrRefCount.3
    ln Object.3 Tcl_DecrRefCount.3
    ln Object.3 Tcl_IsShared.3

fi
if test -r ObjectType.3; then
    rm -f Tcl_RegisterObjType.3
    rm -f Tcl_GetObjType.3
    rm -f Tcl_AppendAllObjTypes.3
    rm -f Tcl_ConvertToType.3
    ln ObjectType.3 Tcl_RegisterObjType.3







>





>







574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
fi
if test -r Object.3; then
    rm -f Tcl_NewObj.3
    rm -f Tcl_DuplicateObj.3
    rm -f Tcl_IncrRefCount.3
    rm -f Tcl_DecrRefCount.3
    rm -f Tcl_IsShared.3
    rm -f Tcl_InvalidateStringRep.3
    ln Object.3 Tcl_NewObj.3
    ln Object.3 Tcl_DuplicateObj.3
    ln Object.3 Tcl_IncrRefCount.3
    ln Object.3 Tcl_DecrRefCount.3
    ln Object.3 Tcl_IsShared.3
    ln Object.3 Tcl_InvalidateStringRep.3
fi
if test -r ObjectType.3; then
    rm -f Tcl_RegisterObjType.3
    rm -f Tcl_GetObjType.3
    rm -f Tcl_AppendAllObjTypes.3
    rm -f Tcl_ConvertToType.3
    ln ObjectType.3 Tcl_RegisterObjType.3
671
672
673
674
675
676
677
678

679
680
681
682
683
684
685

686
687
688
689
690
691
692
if test -r RegExp.3; then
    rm -f Tcl_RegExpMatch.3
    rm -f Tcl_RegExpCompile.3
    rm -f Tcl_RegExpExec.3
    rm -f Tcl_RegExpRange.3
    rm -f Tcl_GetRegExpFromObj.3
    rm -f Tcl_RegExpMatchObj.3
    rm -f Tcl_GetRegExpInfo.3

    ln RegExp.3 Tcl_RegExpMatch.3
    ln RegExp.3 Tcl_RegExpCompile.3
    ln RegExp.3 Tcl_RegExpExec.3
    ln RegExp.3 Tcl_RegExpRange.3
    ln RegExp.3 Tcl_GetRegExpFromObj.3
    ln RegExp.3 Tcl_RegExpMatchObj.3
    ln RegExp.3 Tcl_GetRegExpInfo.3

fi
if test -r SaveResult.3; then
    rm -f Tcl_SaveResult.3
    rm -f Tcl_RestoreResult.3
    rm -f Tcl_DiscardResult.3
    ln SaveResult.3 Tcl_SaveResult.3
    ln SaveResult.3 Tcl_RestoreResult.3







|
>






|
>







711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
if test -r RegExp.3; then
    rm -f Tcl_RegExpMatch.3
    rm -f Tcl_RegExpCompile.3
    rm -f Tcl_RegExpExec.3
    rm -f Tcl_RegExpRange.3
    rm -f Tcl_GetRegExpFromObj.3
    rm -f Tcl_RegExpMatchObj.3
    rm -f Tcl_RegExpExecObj.3
    rm -f Tcl_RegExpGetInfo.3
    ln RegExp.3 Tcl_RegExpMatch.3
    ln RegExp.3 Tcl_RegExpCompile.3
    ln RegExp.3 Tcl_RegExpExec.3
    ln RegExp.3 Tcl_RegExpRange.3
    ln RegExp.3 Tcl_GetRegExpFromObj.3
    ln RegExp.3 Tcl_RegExpMatchObj.3
    ln RegExp.3 Tcl_RegExpExecObj.3
    ln RegExp.3 Tcl_RegExpGetInfo.3
fi
if test -r SaveResult.3; then
    rm -f Tcl_SaveResult.3
    rm -f Tcl_RestoreResult.3
    rm -f Tcl_DiscardResult.3
    ln SaveResult.3 Tcl_SaveResult.3
    ln SaveResult.3 Tcl_RestoreResult.3
711
712
713
714
715
716
717

718
719
720
721
722
723
724
725

726
727
728
729
730
731
732
    rm -f Tcl_GetObjResult.3
    rm -f Tcl_SetResult.3
    rm -f Tcl_GetStringResult.3
    rm -f Tcl_AppendResult.3
    rm -f Tcl_AppendResultVA.3
    rm -f Tcl_AppendElement.3
    rm -f Tcl_ResetResult.3

    ln SetResult.3 Tcl_SetObjResult.3
    ln SetResult.3 Tcl_GetObjResult.3
    ln SetResult.3 Tcl_SetResult.3
    ln SetResult.3 Tcl_GetStringResult.3
    ln SetResult.3 Tcl_AppendResult.3
    ln SetResult.3 Tcl_AppendResultVA.3
    ln SetResult.3 Tcl_AppendElement.3
    ln SetResult.3 Tcl_ResetResult.3

fi
if test -r SetVar.3; then
    rm -f Tcl_SetVar2Ex.3
    rm -f Tcl_SetVar.3
    rm -f Tcl_SetVar2.3
    rm -f Tcl_ObjSetVar2.3
    rm -f Tcl_GetVar2Ex.3







>








>







753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
    rm -f Tcl_GetObjResult.3
    rm -f Tcl_SetResult.3
    rm -f Tcl_GetStringResult.3
    rm -f Tcl_AppendResult.3
    rm -f Tcl_AppendResultVA.3
    rm -f Tcl_AppendElement.3
    rm -f Tcl_ResetResult.3
    rm -f Tcl_FreeResult.3
    ln SetResult.3 Tcl_SetObjResult.3
    ln SetResult.3 Tcl_GetObjResult.3
    ln SetResult.3 Tcl_SetResult.3
    ln SetResult.3 Tcl_GetStringResult.3
    ln SetResult.3 Tcl_AppendResult.3
    ln SetResult.3 Tcl_AppendResultVA.3
    ln SetResult.3 Tcl_AppendElement.3
    ln SetResult.3 Tcl_ResetResult.3
    ln SetResult.3 Tcl_FreeResult.3
fi
if test -r SetVar.3; then
    rm -f Tcl_SetVar2Ex.3
    rm -f Tcl_SetVar.3
    rm -f Tcl_SetVar2.3
    rm -f Tcl_ObjSetVar2.3
    rm -f Tcl_GetVar2Ex.3
755
756
757
758
759
760
761


762
763
764
765


766
767
768
769
770
771
772
    ln SourceRCFile.3 Tcl_SourceRCFile.3
fi
if test -r SplitList.3; then
    rm -f Tcl_SplitList.3
    rm -f Tcl_Merge.3
    rm -f Tcl_ScanElement.3
    rm -f Tcl_ConvertElement.3


    ln SplitList.3 Tcl_SplitList.3
    ln SplitList.3 Tcl_Merge.3
    ln SplitList.3 Tcl_ScanElement.3
    ln SplitList.3 Tcl_ConvertElement.3


fi
if test -r SplitPath.3; then
    rm -f Tcl_SplitPath.3
    rm -f Tcl_JoinPath.3
    rm -f Tcl_GetPathType.3
    ln SplitPath.3 Tcl_SplitPath.3
    ln SplitPath.3 Tcl_JoinPath.3







>
>




>
>







799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
    ln SourceRCFile.3 Tcl_SourceRCFile.3
fi
if test -r SplitList.3; then
    rm -f Tcl_SplitList.3
    rm -f Tcl_Merge.3
    rm -f Tcl_ScanElement.3
    rm -f Tcl_ConvertElement.3
    rm -f Tcl_ScanCountedElement.3
    rm -f Tcl_ConvertCountedElement.3
    ln SplitList.3 Tcl_SplitList.3
    ln SplitList.3 Tcl_Merge.3
    ln SplitList.3 Tcl_ScanElement.3
    ln SplitList.3 Tcl_ConvertElement.3
    ln SplitList.3 Tcl_ScanCountedElement.3
    ln SplitList.3 Tcl_ConvertCountedElement.3
fi
if test -r SplitPath.3; then
    rm -f Tcl_SplitPath.3
    rm -f Tcl_JoinPath.3
    rm -f Tcl_GetPathType.3
    ln SplitPath.3 Tcl_SplitPath.3
    ln SplitPath.3 Tcl_JoinPath.3
822
823
824
825
826
827
828

829
830
831
832
833
834
835

836
837
838
839
840
841
842
    rm -f Tcl_ConditionNotify.3
    rm -f Tcl_ConditionWait.3
    rm -f Tcl_ConditionFinalize.3
    rm -f Tcl_GetThreadData.3
    rm -f Tcl_MutexLock.3
    rm -f Tcl_MutexUnlock.3
    rm -f Tcl_MutexFinalize.3

    ln Thread.3 Tcl_ConditionNotify.3
    ln Thread.3 Tcl_ConditionWait.3
    ln Thread.3 Tcl_ConditionFinalize.3
    ln Thread.3 Tcl_GetThreadData.3
    ln Thread.3 Tcl_MutexLock.3
    ln Thread.3 Tcl_MutexUnlock.3
    ln Thread.3 Tcl_MutexFinalize.3

fi
if test -r ToUpper.3; then
    rm -f Tcl_UniCharToUpper.3
    rm -f Tcl_UniCharToLower.3
    rm -f Tcl_UniCharToTitle.3
    rm -f Tcl_UtfToUpper.3
    rm -f Tcl_UtfToLower.3







>







>







870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
    rm -f Tcl_ConditionNotify.3
    rm -f Tcl_ConditionWait.3
    rm -f Tcl_ConditionFinalize.3
    rm -f Tcl_GetThreadData.3
    rm -f Tcl_MutexLock.3
    rm -f Tcl_MutexUnlock.3
    rm -f Tcl_MutexFinalize.3
    rm -f Tcl_CreateThread.3
    ln Thread.3 Tcl_ConditionNotify.3
    ln Thread.3 Tcl_ConditionWait.3
    ln Thread.3 Tcl_ConditionFinalize.3
    ln Thread.3 Tcl_GetThreadData.3
    ln Thread.3 Tcl_MutexLock.3
    ln Thread.3 Tcl_MutexUnlock.3
    ln Thread.3 Tcl_MutexFinalize.3
    ln Thread.3 Tcl_CreateThread.3
fi
if test -r ToUpper.3; then
    rm -f Tcl_UniCharToUpper.3
    rm -f Tcl_UniCharToLower.3
    rm -f Tcl_UniCharToTitle.3
    rm -f Tcl_UtfToUpper.3
    rm -f Tcl_UtfToLower.3
Changes to unix/tcl.m4.
343
344
345
346
347
348
349

350
351
352
353
354
355
356
#
#	Sets the following vars:
#		THREADS_LIBS	Thread library(s)
#
#	Defines the following vars:
#		TCL_THREADS
#		_REENTRANT

#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_THREADS, [
    AC_MSG_CHECKING(for building with threads)
    AC_ARG_ENABLE(threads, [  --enable-threads        build with threads],
	[tcl_ok=$enableval], [tcl_ok=no])







>







343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#
#	Sets the following vars:
#		THREADS_LIBS	Thread library(s)
#
#	Defines the following vars:
#		TCL_THREADS
#		_REENTRANT
#		_THREAD_SAFE
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_THREADS, [
    AC_MSG_CHECKING(for building with threads)
    AC_ARG_ENABLE(threads, [  --enable-threads        build with threads],
	[tcl_ok=$enableval], [tcl_ok=no])
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404

	# Does the pthread-implementation provide
	# 'pthread_attr_setstacksize' ?

	AC_CHECK_FUNCS(pthread_attr_setstacksize)
    else
	TCL_THREADS=0
	AC_MSG_RESULT(no (default))
    fi
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used







|







391
392
393
394
395
396
397
398
399
400
401
402
403
404
405

	# Does the pthread-implementation provide
	# 'pthread_attr_setstacksize' ?

	AC_CHECK_FUNCS(pthread_attr_setstacksize)
    else
	TCL_THREADS=0
	AC_MSG_RESULT([no (default)])
    fi
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used
609
610
611
612
613
614
615





































616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649

650










651
652
653




654
655
656
657
658
659
660
	CFLAGS_WARNING=""
    fi
    TCL_NEEDS_EXP_FILE=0
    TCL_BUILD_EXP_FILE=""
    TCL_EXP_FILE=""
    STLIB_LD="ar cr"
    case $system in





































	AIX-4.[[2-9]])
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    SHLIB_CFLAGS=""
	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
	    ;;
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    SHLIB_CFLAGS=""
	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    LIBOBJS="$LIBOBJS tclLoadAix.o"
	    DL_LIBS="-lld"

	    LDFLAGS=""










	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'




	    ;;
	BSD/OS-2.1*|BSD/OS-3*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="shlicc -r"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

















|
<
<
|
|
<
<
<
<
<
<
<
<
<
|
|
>
|
>
>
>
>
>
>
>
>
>
>
|
|
|
>
>
>
>







610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672


673
674









675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
	CFLAGS_WARNING=""
    fi
    TCL_NEEDS_EXP_FILE=0
    TCL_BUILD_EXP_FILE=""
    TCL_EXP_FILE=""
    STLIB_LD="ar cr"
    case $system in
	AIX-5.*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    # AIX-5 uses ELF style dynamic libraries
	    SHLIB_CFLAGS=""
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"

	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
	    # symbols when dynamically loaded into tclsh.

	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    # AIX-5 has dl* in libc.so
	    DL_LIBS=""
	    LDFLAGS=""
	    if test "$using_gcc" = "yes" ; then
		LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    else
		LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
	    fi

	    if test "$do64bit" = "yes" ; then
		if test "$using_gcc" = "no" ; then
		    do64bit_ok=yes
		    EXTRA_CFLAGS="-q64"
		    LDFLAGS="-q64"
		else 
		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
		fi
	    fi
	    ;;
	AIX-*)
	    if test "${TCL_THREADS}" = "1" -a "$using_gcc" = "no" ; then
		# AIX requires the _r compiler when gcc isn't being used
		if test "${CC}" != "cc_r" ; then
		    CC=${CC}_r
		fi
		AC_MSG_RESULT(Using $CC for compiling with threads)
	    fi
	    SHLIB_CFLAGS=""
	    SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS="-ldl"
	    LDFLAGS=""
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    TCL_NEEDS_EXP_FILE=1
	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'



	    # AIX v<=4.1 has some different flags than 4.2+
	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then









		LIBOBJS="$LIBOBJS tclLoadAix.o"
		DL_LIBS="-lld"
	    fi

	    # On AIX <=v4 systems, libbsd.a has to be linked in to support
	    # non-blocking file IO.  This library has to be linked in after
	    # the MATH_LIBS or it breaks the pow() function.  The way to
	    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
	    # This library also supplies gettimeofday.
	    #
	    # AIX does not have a timezone field in struct tm. When the AIX
	    # bsd library is used, the timezone global and the gettimeofday
	    # methods are to be avoided for timezone deduction instead, we
	    # deduce the timezone by comparing the localtime result on a
	    # known GMT value.

	    AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes, libbsd=no)
	    if test $libbsd = yes; then
	    	MATH_LIBS="$MATH_LIBS -lbsd"
	    	AC_DEFINE(USE_DELTA_FOR_TZ)
	    fi
	    ;;
	BSD/OS-2.1*|BSD/OS-3*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="shlicc -r"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
702
703
704
705
706
707
708











709
710
711
712
713
714
715
716
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
	    ;;











	IRIX-5.*|IRIX-6.*|IRIX64-6.5*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'







>
>
>
>
>
>
>
>
>
>
>
|







744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
	    SHLIB_LD_LIBS='${LIBS}'
	    DL_OBJS="tclLoadAout.o"
	    DL_LIBS=""
	    LDFLAGS="-Wl,-D,08000000"
	    LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
	    ;;
	IRIX-5.*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    EXTRA_CFLAGS=""
	    LDFLAGS=""
	    ;;
	IRIX-6.*|IRIX64-6.5*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="ld -n32 -shared -rdata_shared"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
757
758
759
760
761
762
763























764
765
766
767
768
769
770
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    else
		AC_CHECK_HEADER(dld.h, [
		    SHLIB_LD="ld -shared"
		    DL_OBJS="tclLoadDld.o"























		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""])
	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
	    else
		AC_CHECK_HEADER(dld.h, [
		    SHLIB_LD="ld -shared"
		    DL_OBJS="tclLoadDld.o"
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""])
	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
	    ;;
	GNU*)
	    SHLIB_CFLAGS="-fPIC"
	    SHLIB_LD_LIBS='${LIBS}'
	    SHLIB_SUFFIX=".so"

	    if test "$have_dl" = yes; then
		SHLIB_LD="${CC} -shared"
		DL_OBJS=""
		DL_LIBS="-ldl"
		LDFLAGS="-rdynamic"
		LD_SEARCH_FLAGS=""
	    else
		AC_CHECK_HEADER(dld.h, [
		    SHLIB_LD="ld -shared"
		    DL_OBJS=""
		    DL_LIBS="-ldld"
		    LDFLAGS=""
		    LD_SEARCH_FLAGS=""])
	    fi
	    if test "`uname -m`" = "alpha" ; then
		EXTRA_CFLAGS="-mieee"
	    fi
836
837
838
839
840
841
842











843
844
845
846
847
848
849
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS=""
	    ;;











	NEXTSTEP-*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="cc -nostdlib -r"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadNext.o"
	    DL_LIBS=""







>
>
>
>
>
>
>
>
>
>
>







912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadDl.o"
	    DL_LIBS=""
	    LDFLAGS="-export-dynamic"
	    LD_SEARCH_FLAGS=""
	    ;;
	Rhapsody-*|Darwin-*)
	    SHLIB_CFLAGS="-fno-common"
	    SHLIB_LD="cc -dynamiclib \${LDFLAGS} -compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE}"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".dylib"
	    DL_OBJS="tclLoadDyld.o"
	    DL_LIBS=""
	    LDFLAGS=""
	    LD_SEARCH_FLAGS=""
	    CFLAGS_OPTIMIZE="-O3"
	    ;;
	NEXTSTEP-*)
	    SHLIB_CFLAGS=""
	    SHLIB_LD="cc -nostdlib -r"
	    SHLIB_LD_LIBS=""
	    SHLIB_SUFFIX=".so"
	    DL_OBJS="tclLoadNext.o"
	    DL_LIBS=""
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
	    LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    ;;
	SunOS-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"
	    LDFLAGS=""
    
	    do64bit_ok=no
	    if test "$do64bit" = "yes" ; then
		arch=`isainfo`
		if test "$arch" = "sparcv9 sparc" ; then
			if test "$using_gcc" = "no" ; then
			    do64bit_ok=yes
			    if test "$do64bitVIS" = "yes" ; then
				EXTRA_CFLAGS="-xarch=v9a"







<







1062
1063
1064
1065
1066
1067
1068

1069
1070
1071
1072
1073
1074
1075
	    LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
	    ;;
	SunOS-5*)
	    SHLIB_CFLAGS="-KPIC"
	    SHLIB_LD="/usr/ccs/bin/ld -G -z text"
	    LDFLAGS=""
    

	    if test "$do64bit" = "yes" ; then
		arch=`isainfo`
		if test "$arch" = "sparcv9 sparc" ; then
			if test "$using_gcc" = "no" ; then
			    do64bit_ok=yes
			    if test "$do64bitVIS" = "yes" ; then
				EXTRA_CFLAGS="-xarch=v9a"
1165
1166
1167
1168
1169
1170
1171


1172
1173
1174
1175
1176
1177
1178
		    ;;
		BSD/OS*)
		    ;;
		IRIX*)
		    ;;
		NetBSD-*|FreeBSD-*|OpenBSD-*)
		    ;;


		RISCos-*)
		    ;;
		SCO_SV-3.2*)
		    ;;
		ULTRIX-4.*)
		    ;;
		*)







>
>







1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
		    ;;
		BSD/OS*)
		    ;;
		IRIX*)
		    ;;
		NetBSD-*|FreeBSD-*|OpenBSD-*)
		    ;;
		Rhapsody-*|Darwin-*)
		    ;;
		RISCos-*)
		    ;;
		SCO_SV-3.2*)
		    ;;
		ULTRIX-4.*)
		    ;;
		*)
1259
1260
1261
1262
1263
1264
1265

1266
1267



























































1268
1269
1270
1271
1272
1273
1274
    if (ioctl(0, TIOCGETP, &t) == 0) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}], tk_ok=sgtty, tk_ok=none, tk_ok=none)

    if test $tk_ok = sgtty; then
	AC_DEFINE(USE_SGTTY)



























































    fi
    fi
    fi
    AC_MSG_RESULT($tk_ok)
])

#--------------------------------------------------------------------







>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
    if (ioctl(0, TIOCGETP, &t) == 0) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}], tk_ok=sgtty, tk_ok=none, tk_ok=none)

    if test $tk_ok = sgtty; then
	AC_DEFINE(USE_SGTTY)
    else
	AC_TRY_RUN([
#include <termios.h>
#include <errno.h>

main()
{
    struct termios t;
    if (tcgetattr(0, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	cfsetospeed(&t, 0);
	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
}], tk_ok=termios, tk_ok=no, tk_ok=no)

    if test $tk_ok = termios; then
	AC_DEFINE(USE_TERMIOS)
    else
	AC_TRY_RUN([
#include <termio.h>
#include <errno.h>

main()
{
    struct termio t;
    if (ioctl(0, TCGETA, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
	return 0;
    }
    return 1;
    }], tk_ok=termio, tk_ok=no, tk_ok=no)

    if test $tk_ok = termio; then
	AC_DEFINE(USE_TERMIO)
    else
	AC_TRY_RUN([
#include <sgtty.h>
#include <errno.h>

main()
{
    struct sgttyb t;
    if (ioctl(0, TIOCGETP, &t) == 0
	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
	t.sg_ospeed = 0;
	t.sg_flags |= ODDP | EVENP | RAW;
	return 0;
    }
    return 1;
}], tk_ok=sgtty, tk_ok=none, tk_ok=none)

    if test $tk_ok = sgtty; then
	AC_DEFINE(USE_SGTTY)
    fi
    fi
    fi
    fi
    fi
    fi
    AC_MSG_RESULT($tk_ok)
])

#--------------------------------------------------------------------
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
], tcl_ok=yes, tcl_ok=no)

    if test $tcl_ok = no; then
	AC_DEFINE(NO_DIRENT_H)
    fi

    AC_MSG_RESULT($tcl_ok)
    AC_CHECK_HEADER(errno.h, , AC_DEFINE(NO_ERRNO_H))
    AC_CHECK_HEADER(float.h, , AC_DEFINE(NO_FLOAT_H))
    AC_CHECK_HEADER(values.h, , AC_DEFINE(NO_VALUES_H))
    AC_CHECK_HEADER(limits.h, , AC_DEFINE(NO_LIMITS_H))
    AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STDLIB_H)
    fi
    AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
    AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)

    # See also memmove check below for a place where NO_STRING_H can be
    # set and why.

    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STRING_H)
    fi

    AC_CHECK_HEADER(sys/wait.h, , AC_DEFINE(NO_SYS_WAIT_H))
    AC_CHECK_HEADER(dlfcn.h, , AC_DEFINE(NO_DLFCN_H))

    # OS/390 lacks sys/param.h (and doesn't need it, by chance).

    AC_HAVE_HEADERS(unistd.h sys/param.h)

])








|
|
|
|


















|
|







1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
], tcl_ok=yes, tcl_ok=no)

    if test $tcl_ok = no; then
	AC_DEFINE(NO_DIRENT_H)
    fi

    AC_MSG_RESULT($tcl_ok)
    AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H)])
    AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H)])
    AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H)])
    AC_CHECK_HEADER(limits.h, , [AC_DEFINE(NO_LIMITS_H)])
    AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
    AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STDLIB_H)
    fi
    AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
    AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
    AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)

    # See also memmove check below for a place where NO_STRING_H can be
    # set and why.

    if test $tcl_ok = 0; then
	AC_DEFINE(NO_STRING_H)
    fi

    AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H)])
    AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H)])

    # OS/390 lacks sys/param.h (and doesn't need it, by chance).

    AC_HAVE_HEADERS(unistd.h sys/param.h)

])

1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
	    timezone += 1;
	    exit (0);],
	    [AC_DEFINE(HAVE_TIMEZONE_VAR)
	    AC_MSG_RESULT(yes)],
	    AC_MSG_RESULT(no))
    fi

    #
    # AIX does not have a timezone field in struct tm. When the AIX bsd
    # library is used, the timezone global and the gettimeofday methods are
    # to be avoided for timezone deduction instead, we deduce the timezone
    # by comparing the localtime result on a known GMT value.
    #

    if test "`uname -s`" = "AIX" ; then
	AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
	if test $libbsd = yes; then
	    AC_DEFINE(USE_DELTA_FOR_TZ)
	fi
    fi
])

#--------------------------------------------------------------------
# SC_BUGGY_STRTOD
#
#	Under Solaris 2.4, strtod returns the wrong value for the
#	terminating character under some conditions.  Check for this







<
<
<
<
<
<
<
<
<
<
<
<
<







1724
1725
1726
1727
1728
1729
1730













1731
1732
1733
1734
1735
1736
1737
	    timezone += 1;
	    exit (0);],
	    [AC_DEFINE(HAVE_TIMEZONE_VAR)
	    AC_MSG_RESULT(yes)],
	    AC_MSG_RESULT(no))
    fi














])

#--------------------------------------------------------------------
# SC_BUGGY_STRTOD
#
#	Under Solaris 2.4, strtod returns the wrong value for the
#	terminating character under some conditions.  Check for this
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
    # already in libc.a.  Set compiler flags accordingly.
    # Also, Linux requires the "ieee" library for math to work
    # right (and it must appear before "-lm").
    #--------------------------------------------------------------------

    AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
    AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])

    #--------------------------------------------------------------------
    # On AIX systems, libbsd.a has to be linked in to support
    # non-blocking file IO.  This library has to be linked in after
    # the MATH_LIBS or it breaks the pow() function.  The way to
    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
    # This library also supplies gettimeofday.
    #--------------------------------------------------------------------

    libbsd=no
    if test "`uname -s`" = "AIX" ; then
	AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
	if test $libbsd = yes; then
	    MATH_LIBS="$MATH_LIBS -lbsd"
	fi
    fi


    #--------------------------------------------------------------------
    # Interactive UNIX requires -linet instead of -lsocket, plus it
    # needs net/errno.h to define the socket-related error codes.
    #--------------------------------------------------------------------

    AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
    AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))

    #--------------------------------------------------------------------
    #	Check for the existence of the -lsocket and -lnsl libraries.
    #	The order here is important, so that they end up in the right
    #	order in the command line generated by make.  Here are some
    #	special considerations:
    #	1. Use "connect" and "accept" to check for -lsocket, and







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







|







1814
1815
1816
1817
1818
1819
1820

















1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
    # already in libc.a.  Set compiler flags accordingly.
    # Also, Linux requires the "ieee" library for math to work
    # right (and it must appear before "-lm").
    #--------------------------------------------------------------------

    AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
    AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])


















    #--------------------------------------------------------------------
    # Interactive UNIX requires -linet instead of -lsocket, plus it
    # needs net/errno.h to define the socket-related error codes.
    #--------------------------------------------------------------------

    AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
    AC_CHECK_HEADER(net/errno.h, [AC_DEFINE(HAVE_NET_ERRNO_H)])

    #--------------------------------------------------------------------
    #	Check for the existence of the -lsocket and -lnsl libraries.
    #	The order here is important, so that they end up in the right
    #	order in the command line generated by make.  Here are some
    #	special considerations:
    #	1. Use "connect" and "accept" to check for -lsocket, and
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
    #	   To get around this problem, check for both libraries together
    #	   if -lsocket doesn't work by itself.
    #--------------------------------------------------------------------

    tcl_checkBoth=0
    AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
    if test "$tcl_checkSocket" = 1; then
	AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt,
	    LIBS="$LIBS -lsocket", tcl_checkBoth=1))
    fi
    if test "$tcl_checkBoth" = 1; then
	tk_oldLibs=$LIBS
	LIBS="$LIBS -lsocket -lnsl"
	AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
    fi
    AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname,
	    [LIBS="$LIBS -lnsl"]))
    
    # Don't perform the eval of the libraries here because DL_LIBS
    # won't be set until we call SC_CONFIG_CFLAGS

    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
    AC_SUBST(TCL_LIBS)
    AC_SUBST(MATH_LIBS)
])







|
|






|
|








1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
    #	   To get around this problem, check for both libraries together
    #	   if -lsocket doesn't work by itself.
    #--------------------------------------------------------------------

    tcl_checkBoth=0
    AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
    if test "$tcl_checkSocket" = 1; then
	AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt,
	    LIBS="$LIBS -lsocket", tcl_checkBoth=1)])
    fi
    if test "$tcl_checkBoth" = 1; then
	tk_oldLibs=$LIBS
	LIBS="$LIBS -lsocket -lnsl"
	AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
    fi
    AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname,
	    [LIBS="$LIBS -lnsl"])])
    
    # Don't perform the eval of the libraries here because DL_LIBS
    # won't be set until we call SC_CONFIG_CFLAGS

    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
    AC_SUBST(TCL_LIBS)
    AC_SUBST(MATH_LIBS)
])
Changes to unix/tcl.spec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# $Id: tcl.spec,v 1.4 2000/04/26 17:31:21 hobbs Exp $
# This file is the basis for a binary Tcl RPM for Linux.

%define version 8.3.1
%define directory /usr/local

Summary: Tcl scripting language development environment
Name: tcl
Version: %{version}
Release: 1
Copyright: BSD
Group: Development/Languages
Source: ftp://ftp.scriptics.com/pub/tcl/tcl8_3/tcl%{version}.tar.gz
URL: http://dev.scriptics.com/
Packager: Scriptics Corporation
Buildroot: /var/tmp/%{name}%{version}

%description
The Tcl (Tool Command Language) provides a powerful platform for
creating integration applications that tie together diverse
applications, protocols, devices, and frameworks.  When paired with
the Tk toolkit, Tcl provides the fastest and most powerful way to
|


|









|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# $Id: tcl.spec,v 1.4.2.3 2001/04/05 20:34:11 hobbs Exp $
# This file is the basis for a binary Tcl RPM for Linux.

%define version 8.3.3
%define directory /usr/local

Summary: Tcl scripting language development environment
Name: tcl
Version: %{version}
Release: 1
Copyright: BSD
Group: Development/Languages
Source: ftp://ftp.scriptics.com/pub/tcl/tcl8_3/tcl%{version}.tar.gz
URL: http://tcl.activestate.com/
Packager: ActiveState Tool Corporation
Buildroot: /var/tmp/%{name}%{version}

%description
The Tcl (Tool Command Language) provides a powerful platform for
creating integration applications that tie together diverse
applications, protocols, devices, and frameworks.  When paired with
the Tk toolkit, Tcl provides the fastest and most powerful way to
Changes to unix/tclConfig.sh.in.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.13 1999/07/29 19:21:32 wart Exp $

# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.13.10.1 2001/04/03 22:54:39 hobbs Exp $

# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a shared library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'








|







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a static library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'

Changes to unix/tclLoadDyld.c.
8
9
10
11
12
13
14
15
16
17
18
19





20
21
22
23
24
25
26
 *     It should work with OpenStep, but it's not been tried.
 *
 * Copyright (c) 1995 Apple Computer, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclLoadDyld.c,v 1.2 2000/04/25 17:55:45 hobbs Exp $
 */

#include "tclInt.h"
#include <mach-o/dyld.h>






/*
 *----------------------------------------------------------------------
 *
 * TclpLoadFile --
 *
 *     Dynamically loads a binary code file into memory and returns







|




>
>
>
>
>







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 *     It should work with OpenStep, but it's not been tried.
 *
 * Copyright (c) 1995 Apple Computer, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclLoadDyld.c,v 1.2.2.1 2001/04/06 18:42:39 hobbs Exp $
 */

#include "tclInt.h"
#include <mach-o/dyld.h>

/* For compatibility with older API. */
#ifndef NSLINKMODULE_OPTION_PRIVATE
#define NSLINKMODULE_OPTION_PRIVATE TRUE
#endif

/*
 *----------------------------------------------------------------------
 *
 * TclpLoadFile --
 *
 *     Dynamically loads a binary code file into memory and returns
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98



99

100
101
102
103
104



105

106
107
108
109
110
111
112
	    default:
		Tcl_SetResult(interp, "dyld: unknown failure", TCL_STATIC);
		break;
	}
	return TCL_ERROR;
    }

    module = NSLinkModule(image, fileName, TRUE);

    if (module == NULL) {
	Tcl_SetResult(interp, "dyld: falied to link module", TCL_STATIC);
	return TCL_ERROR;
    }

    name = (char*)malloc(sizeof(char)*(strlen(sym1)+2));
    sprintf(name, "_%s", sym1);



    symbol = NSLookupAndBindSymbol(name);

    free(name);
    *proc1Ptr = NSAddressOfSymbol(symbol);

    name = (char*)malloc(sizeof(char)*(strlen(sym2)+2));
    sprintf(name, "_%s", sym2);



    symbol = NSLookupAndBindSymbol(name);

    free(name);
    *proc2Ptr = NSAddressOfSymbol(symbol);

    *clientDataPtr = module;

    return TCL_OK;
}







|








>
>
>

>





>
>
>

>







88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
	    default:
		Tcl_SetResult(interp, "dyld: unknown failure", TCL_STATIC);
		break;
	}
	return TCL_ERROR;
    }

    module = NSLinkModule(image, fileName, NSLINKMODULE_OPTION_PRIVATE);

    if (module == NULL) {
	Tcl_SetResult(interp, "dyld: falied to link module", TCL_STATIC);
	return TCL_ERROR;
    }

    name = (char*)malloc(sizeof(char)*(strlen(sym1)+2));
    sprintf(name, "_%s", sym1);
#ifdef NSLINKMODULE_OPTION_PRIVATE
    symbol = NSLookupSymbolInModule(module, name);
#else
    symbol = NSLookupAndBindSymbol(name);
#endif
    free(name);
    *proc1Ptr = NSAddressOfSymbol(symbol);

    name = (char*)malloc(sizeof(char)*(strlen(sym2)+2));
    sprintf(name, "_%s", sym2);
#ifdef NSLINKMODULE_OPTION_PRIVATE
    symbol = NSLookupSymbolInModule(module, name);
#else
    symbol = NSLookupAndBindSymbol(name);
#endif
    free(name);
    *proc2Ptr = NSAddressOfSymbol(symbol);

    *clientDataPtr = module;

    return TCL_OK;
}
Changes to unix/tclMtherr.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMatherr.c --
 *
 *	This function provides a default implementation of the
 *	"matherr" function, for SYS-V systems where it's needed.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMtherr.c,v 1.3 1999/04/16 00:48:04 stanton Exp $
 */

#include "tclInt.h"
#include <math.h>

#ifndef TCL_GENERIC_ONLY
#include "tclPort.h"












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclMatherr.c --
 *
 *	This function provides a default implementation of the
 *	"matherr" function, for SYS-V systems where it's needed.
 *
 * Copyright (c) 1993-1994 The Regents of the University of California.
 * Copyright (c) 1994 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclMtherr.c,v 1.3.12.1 2001/04/06 18:42:39 hobbs Exp $
 */

#include "tclInt.h"
#include <math.h>

#ifndef TCL_GENERIC_ONLY
#include "tclPort.h"
57
58
59
60
61
62
63



64
65
66
67
68
69
70
 *
 * Side effects:
 *	Sets errno based on what's in xPtr.
 *
 *----------------------------------------------------------------------
 */




int
matherr(xPtr)
    struct exception *xPtr;	/* Describes error that occurred. */
{
    if (TclMathInProgress()) {
	return 0;
    }







>
>
>







57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 *
 * Side effects:
 *	Sets errno based on what's in xPtr.
 *
 *----------------------------------------------------------------------
 */

#ifdef __APPLE_CC__
__private_extern__
#endif
int
matherr(xPtr)
    struct exception *xPtr;	/* Describes error that occurred. */
{
    if (TclMathInProgress()) {
	return 0;
    }
Changes to unix/tclUnixChan.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUnixChan.c
 *
 *	Common channel driver for Unix channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixChan.c,v 1.17 2000/04/19 09:17:03 hobbs Exp $
 */

#include	"tclInt.h"	/* Internal definitions for Tcl. */
#include	"tclPort.h"	/* Portability features for Tcl. */

/*
 * sys/ioctl.h has already been included by tclPort.h.  Including termios.h












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUnixChan.c
 *
 *	Common channel driver for Unix channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixChan.c,v 1.17.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include	"tclInt.h"	/* Internal definitions for Tcl. */
#include	"tclPort.h"	/* Portability features for Tcl. */

/*
 * sys/ioctl.h has already been included by tclPort.h.  Including termios.h
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243




244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262




263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281




282
283
284
285
286
287
288
		            int *errorCodePtr));

/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType fileChannelType = {
    "file",				/* Type name. */
    FileBlockModeProc,			/* Set blocking/nonblocking mode.*/
    FileCloseProc,			/* Close proc. */
    FileInputProc,			/* Input proc. */
    FileOutputProc,			/* Output proc. */
    FileSeekProc,			/* Seek proc. */
    NULL,				/* Set option proc. */
    NULL,				/* Get option proc. */
    FileWatchProc,			/* Initialize notifier. */
    FileGetHandleProc,			/* Get OS handles out of channel. */




};

#ifdef SUPPORTS_TTY
/*
 * This structure describes the channel type structure for serial IO.
 * Note that this type is a subclass of the "file" type.
 */

static Tcl_ChannelType ttyChannelType = {
    "tty",				/* Type name. */
    FileBlockModeProc,			/* Set blocking/nonblocking mode.*/
    TtyCloseProc,			/* Close proc. */
    FileInputProc,			/* Input proc. */
    FileOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    TtySetOptionProc,			/* Set option proc. */
    TtyGetOptionProc,			/* Get option proc. */
    FileWatchProc,			/* Initialize notifier. */
    FileGetHandleProc,			/* Get OS handles out of channel. */




};
#endif	/* SUPPORTS_TTY */

/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",				/* Type name. */
    TcpBlockModeProc,			/* Set blocking/nonblocking mode.*/
    TcpCloseProc,			/* Close proc. */
    TcpInputProc,			/* Input proc. */
    TcpOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    NULL,				/* Set option proc. */
    TcpGetOptionProc,			/* Get option proc. */
    TcpWatchProc,			/* Initialize notifier. */
    TcpGetHandleProc,			/* Get OS handles out of channel. */




};


/*
 *----------------------------------------------------------------------
 *
 * FileBlockModeProc --







|
|
|
|
|
|
|
|
|
|
>
>
>
>









|
|
|
|
|
|
|
|
|
|
>
>
>
>









|
|
|
|
|
|
|
|
|
|
>
>
>
>







227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
		            int *errorCodePtr));

/*
 * This structure describes the channel type structure for file based IO:
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    FileCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    FileSeekProc,		/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    FileWatchProc,		/* Initialize notifier. */
    FileGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    FileBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

#ifdef SUPPORTS_TTY
/*
 * This structure describes the channel type structure for serial IO.
 * Note that this type is a subclass of the "file" type.
 */

static Tcl_ChannelType ttyChannelType = {
    "tty",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TtyCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    TtySetOptionProc,		/* Set option proc. */
    TtyGetOptionProc,		/* Get option proc. */
    FileWatchProc,		/* Initialize notifier. */
    FileGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    FileBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};
#endif	/* SUPPORTS_TTY */

/*
 * This structure describes the channel type structure for TCP socket
 * based IO:
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TcpCloseProc,		/* Close proc. */
    TcpInputProc,		/* Input proc. */
    TcpOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
    TcpWatchProc,		/* Initialize notifier. */
    TcpGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    TcpBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};


/*
 *----------------------------------------------------------------------
 *
 * FileBlockModeProc --
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426

1427
1428
1429
1430
1431
1432
1433
1434
1435
1436

    sprintf(channelName, "file%d", fd);

    /*
     * Look to see if a channel with this fd and the same mode already exists.
     * If the fd is used, but the mode doesn't match, return NULL.
     */
    
    for (fsPtr = tsdPtr->firstFilePtr; fsPtr != NULL; fsPtr = fsPtr->nextPtr) {
	if (fsPtr->fd == fd) {
	    return ((mode|TCL_EXCEPTION) == fsPtr->validMask) ?
		    fsPtr->channel : NULL;
	}
    }

    fsPtr = (FileState *) ckalloc((unsigned) sizeof(FileState));

    fsPtr->nextPtr = tsdPtr->firstFilePtr;
    tsdPtr->firstFilePtr = fsPtr;

    fsPtr->fd = fd;
    fsPtr->validMask = mode | TCL_EXCEPTION;
    fsPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName,
            (ClientData) fsPtr, mode);
    
    return fsPtr->channel;
}







|








>


<







1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441

1442
1443
1444
1445
1446
1447
1448

    sprintf(channelName, "file%d", fd);

    /*
     * Look to see if a channel with this fd and the same mode already exists.
     * If the fd is used, but the mode doesn't match, return NULL.
     */

    for (fsPtr = tsdPtr->firstFilePtr; fsPtr != NULL; fsPtr = fsPtr->nextPtr) {
	if (fsPtr->fd == fd) {
	    return ((mode|TCL_EXCEPTION) == fsPtr->validMask) ?
		    fsPtr->channel : NULL;
	}
    }

    fsPtr = (FileState *) ckalloc((unsigned) sizeof(FileState));

    fsPtr->nextPtr = tsdPtr->firstFilePtr;
    tsdPtr->firstFilePtr = fsPtr;

    fsPtr->fd = fd;
    fsPtr->validMask = mode | TCL_EXCEPTION;
    fsPtr->channel = Tcl_CreateChannel(&fileChannelType, channelName,
            (ClientData) fsPtr, mode);
    
    return fsPtr->channel;
}
Changes to unix/tclUnixInit.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
 * tclUnixInit.c --
 *
 *	Contains the Unix-specific interpreter initialization functions.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclUnixInit.c,v 1.18 1999/10/13 00:32:49 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include <locale.h>
#if defined(__FreeBSD__)
#   include <floatingpoint.h>









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
 * tclUnixInit.c --
 *
 *	Contains the Unix-specific interpreter initialization functions.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 * Copyright (c) 1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclUnixInit.c,v 1.18.2.2 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"
#include <locale.h>
#if defined(__FreeBSD__)
#   include <floatingpoint.h>
54
55
56
57
58
59
60

61
62
63
64
65
66
67
    CONST char *lang;
    CONST char *encoding;
} LocaleTable;

static CONST LocaleTable localeTable[] = {
    {"ja_JP.SJIS",	"shiftjis"},
    {"ja_JP.EUC",	"euc-jp"},

    {"ja_JP.JIS",	"iso2022-jp"},
    {"ja_JP.mscode",	"shiftjis"},
    {"ja_JP.ujis",	"euc-jp"},
    {"ja_JP",		"euc-jp"},
    {"Ja_JP",		"shiftjis"},
    {"Jp_JP",		"shiftjis"},
    {"japan",		"euc-jp"},







>







54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    CONST char *lang;
    CONST char *encoding;
} LocaleTable;

static CONST LocaleTable localeTable[] = {
    {"ja_JP.SJIS",	"shiftjis"},
    {"ja_JP.EUC",	"euc-jp"},
    {"ja_JP.eucJP",     "euc-jp"},
    {"ja_JP.JIS",	"iso2022-jp"},
    {"ja_JP.mscode",	"shiftjis"},
    {"ja_JP.ujis",	"euc-jp"},
    {"ja_JP",		"euc-jp"},
    {"Ja_JP",		"shiftjis"},
    {"Jp_JP",		"shiftjis"},
    {"japan",		"euc-jp"},
276
277
278
279
280
281
282






283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../library)
     *	<bindir>/../../<developLib>
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     






    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 1) {
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);







>
>
>
>
>
>


|






|






|






|






|






|







277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../library)
     *	<bindir>/../../<developLib>
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     

     /*
      * The variable path holds an absolute path.  Take care not to
      * overwrite pathv[0] since that might produce a relative path.
      */

    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 2) {
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 4) {
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
void
TclpSetInitialEncodings()
{
    CONST char *encoding;
    int i;
    Tcl_Obj *pathPtr;
    char *langEnv;
    Tcl_DString ds;

    /*
     * Determine the current encoding from the LC_* or LANG environment
     * variables.  We previously used setlocale() to determine the locale,
     * but this does not work on some systems (e.g. Linux/i386 RH 5.0).
     */








<







372
373
374
375
376
377
378

379
380
381
382
383
384
385
void
TclpSetInitialEncodings()
{
    CONST char *encoding;
    int i;
    Tcl_Obj *pathPtr;
    char *langEnv;


    /*
     * Determine the current encoding from the LC_* or LANG environment
     * variables.  We previously used setlocale() to determine the locale,
     * but this does not work on some systems (e.g. Linux/i386 RH 5.0).
     */

428
429
430
431
432
433
434

435
436
437
438

439
440

441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
    }
    if (encoding == NULL) {
	encoding = "iso8859-1";
    }

    Tcl_SetSystemEncoding(NULL, encoding);


    /*
     * Initialize the C library's locale subsystem.  This is required
     * for input methods to work properly on X11. Note that we need to
     * retore the initial "C" locale so that Tcl can parse numbers

     * properly.  The side effect of setting the default locale should be to
     * load any locale specific modules that are needed by X.

     */
 
    Tcl_DStringInit(&ds);
    Tcl_DStringAppend(&ds, setlocale(LC_ALL, NULL), -1);
    setlocale(LC_ALL, "");
    setlocale(LC_ALL, Tcl_DStringValue(&ds));
    Tcl_DStringFree(&ds);

    /*
     * In case the initial locale is not "C", ensure that the numeric
     * processing is done in "C" locale regardless.  This is needed because
     * Tcl relies on routines like strtod, but should not have locale
     * dependent behavior.
     */

    setlocale(LC_NUMERIC, "C");
 

    /*
     * Until the system encoding was actually set, the library path was
     * actually in the native multi-byte encoding, and not really UTF-8
     * as advertised.  We cheated as follows:
     *
     * 1. It was safe to allow the Tcl_SetSystemEncoding() call to 







>


|
<
>
|
|
>

|
<
<
|
<
<









<







434
435
436
437
438
439
440
441
442
443
444

445
446
447
448
449
450


451


452
453
454
455
456
457
458
459
460

461
462
463
464
465
466
467
    }
    if (encoding == NULL) {
	encoding = "iso8859-1";
    }

    Tcl_SetSystemEncoding(NULL, encoding);

    resetPath:
    /*
     * Initialize the C library's locale subsystem.  This is required
     * for input methods to work properly on X11.  We only do this for

     * LC_CTYPE because that's the necessary one, and we don't want to
     * affect LC_TIME here.  The side effect of setting the default locale
     * should be to load any locale specific modules that are needed by X.
     * [BUG: 5422 3345 4236 2522 2521].
     */



    setlocale(LC_CTYPE, "");



    /*
     * In case the initial locale is not "C", ensure that the numeric
     * processing is done in "C" locale regardless.  This is needed because
     * Tcl relies on routines like strtod, but should not have locale
     * dependent behavior.
     */

    setlocale(LC_NUMERIC, "C");


    /*
     * Until the system encoding was actually set, the library path was
     * actually in the native multi-byte encoding, and not really UTF-8
     * as advertised.  We cheated as follows:
     *
     * 1. It was safe to allow the Tcl_SetSystemEncoding() call to 
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
     * Now that the system encoding was actually successfully set,
     * translate all the names in the library path to UTF-8.  That way,
     * next time we search the library path, we'll translate the names 
     * from UTF-8 to the system encoding which will be the native 
     * encoding.
     */

    resetPath:
    pathPtr = TclGetLibraryPath();
    if (pathPtr != NULL) {
	int objc;
	Tcl_Obj **objv;
	
	objc = 0;
	Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);







<







477
478
479
480
481
482
483

484
485
486
487
488
489
490
     * Now that the system encoding was actually successfully set,
     * translate all the names in the library path to UTF-8.  That way,
     * next time we search the library path, we'll translate the names 
     * from UTF-8 to the system encoding which will be the native 
     * encoding.
     */


    pathPtr = TclGetLibraryPath();
    if (pathPtr != NULL) {
	int objc;
	Tcl_Obj **objv;
	
	objc = 0;
	Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);
Changes to unix/tclUnixPipe.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUnixPipe.c --
 *
 *	This file implements the UNIX-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixPipe.c,v 1.9 2000/03/31 19:39:42 ericm Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following macros convert between TclFile's and fd's.  The conversion












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclUnixPipe.c --
 *
 *	This file implements the UNIX-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1991-1994 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclUnixPipe.c,v 1.9.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclInt.h"
#include "tclPort.h"

/*
 * The following macros convert between TclFile's and fd's.  The conversion
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79




80
81
82
83
84
85
86

/*
 * This structure describes the channel type structure for command pipe
 * based IO:
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",				/* Type name. */
    PipeBlockModeProc,			/* Set blocking/nonblocking mode.*/
    PipeCloseProc,			/* Close proc. */
    PipeInputProc,			/* Input proc. */
    PipeOutputProc,			/* Output proc. */
    NULL,				/* Seek proc. */
    NULL,				/* Set option proc. */
    NULL,				/* Get option proc. */
    PipeWatchProc,			/* Initialize notifier. */
    PipeGetHandleProc,			/* Get OS handles out of channel. */




};

/*
 *----------------------------------------------------------------------
 *
 * TclpMakeFile --
 *







|
|
|
|
|
|
|
|
|
|
>
>
>
>







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

/*
 * This structure describes the channel type structure for command pipe
 * based IO:
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    PipeCloseProc,		/* Close proc. */
    PipeInputProc,		/* Input proc. */
    PipeOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    PipeWatchProc,		/* Initialize notifier. */
    PipeGetHandleProc,		/* Get OS handles out of channel. */
    NULL,			/* close2proc. */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * TclpMakeFile --
 *
182
183
184
185
186
187
188





189
190
191
192
193
194
195
196
197
198
199
TclpCreateTempFile(contents)
    CONST char *contents;	/* String to write into temp file, or NULL. */
{
    char fileName[L_tmpnam], *native;
    Tcl_DString dstring;
    int fd;






    if (tmpnam(fileName) == NULL) {			/* INTL: Native. */
	return NULL;
    }
    fd = open(fileName, O_RDWR|O_CREAT|O_TRUNC, 0666);	/* INTL: Native. */
    if (fd == -1) {
	return NULL;
    }
    fcntl(fd, F_SETFD, FD_CLOEXEC);
    unlink(fileName);					/* INTL: Native. */

    if (contents != NULL) {







>
>
>
>
>



|







186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
TclpCreateTempFile(contents)
    CONST char *contents;	/* String to write into temp file, or NULL. */
{
    char fileName[L_tmpnam], *native;
    Tcl_DString dstring;
    int fd;

    /*
     * Linux says we should use mkstemp, but Solaris prefers tmpnam.
     * We should also check against making more then TMP_MAX of these.
     */

    if (tmpnam(fileName) == NULL) {			/* INTL: Native. */
	return NULL;
    }
    fd = open(fileName, O_RDWR|O_CREAT|O_EXCL, 0666);	/* INTL: Native. */
    if (fd == -1) {
	return NULL;
    }
    fcntl(fd, F_SETFD, FD_CLOEXEC);
    unlink(fileName);					/* INTL: Native. */

    if (contents != NULL) {
440
441
442
443
444
445
446
447


448
449
450
451
452
453
454
455
456
457
    *pidPtr = (Tcl_Pid) pid;
    return TCL_OK;

    error:
    if (pid != -1) {
	/*
	 * Reap the child process now if an error occurred during its
	 * startup.


	 */

	Tcl_WaitPid((Tcl_Pid) pid, &status, WNOHANG);
    }
    
    if (errPipeIn) {
	TclpCloseFile(errPipeIn);
    }
    if (errPipeOut) {
	TclpCloseFile(errPipeOut);







|
>
>


|







449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
    *pidPtr = (Tcl_Pid) pid;
    return TCL_OK;

    error:
    if (pid != -1) {
	/*
	 * Reap the child process now if an error occurred during its
	 * startup.  We don't call this with WNOHANG because that can lead to
	 * defunct processes on an MP system.   We shouldn't have to worry
	 * about hanging here, since this is the error case.  [Bug: 6148]
	 */

	Tcl_WaitPid((Tcl_Pid) pid, &status, 0);
    }
    
    if (errPipeIn) {
	TclpCloseFile(errPipeIn);
    }
    if (errPipeOut) {
	TclpCloseFile(errPipeOut);
Changes to unix/tclUnixThrd.c.
645
646
647
648
649
650
651








652

653
654
655
656
657
658
659
660
	MASTER_UNLOCK;
    }
    pmutexPtr = *((pthread_mutex_t **)mutexPtr);
    pcondPtr = *((pthread_cond_t **)condPtr);
    if (timePtr == NULL) {
	pthread_cond_wait(pcondPtr, pmutexPtr);
    } else {








	ptime.tv_sec = timePtr->sec + TclpGetSeconds();

	ptime.tv_nsec = 1000 * timePtr->usec;
	pthread_cond_timedwait(pcondPtr, pmutexPtr, &ptime);
    }
}

/*
 *----------------------------------------------------------------------
 *







>
>
>
>
>
>
>
>
|
>
|







645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
	MASTER_UNLOCK;
    }
    pmutexPtr = *((pthread_mutex_t **)mutexPtr);
    pcondPtr = *((pthread_cond_t **)condPtr);
    if (timePtr == NULL) {
	pthread_cond_wait(pcondPtr, pmutexPtr);
    } else {
	Tcl_Time now;

	/*
	 * Make sure to take into account the microsecond component of the
	 * current time, including possible overflow situations. [Bug #411603]
	 */

	TclpGetTime(&now);
	ptime.tv_sec = timePtr->sec + now.sec +
	    (timePtr->usec + now.usec) / 1000000;
	ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000);
	pthread_cond_timedwait(pcondPtr, pmutexPtr, &ptime);
    }
}

/*
 *----------------------------------------------------------------------
 *
Changes to win/Makefile.in.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.33 2000/04/25 20:58:48 hobbs Exp $

VERSION = @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# This file is a Makefile for Tcl.  If it has the name "Makefile.in"
# then it is a template for a Makefile;  to generate the actual Makefile,
# run "./configure", which is a configuration script generated by the
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
# RCS: @(#) $Id: Makefile.in,v 1.33.2.5 2001/08/04 00:33:59 hobbs Exp $

VERSION = @TCL_VERSION@

#----------------------------------------------------------------
# Things you can change to personalize the Makefile for your own
# site (you can make these changes in either Makefile.in or
# Makefile, but changes to Makefile will get lost if you re-run
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# Path to use at runtime to refer to LIB_INSTALL_DIR:
LIB_RUNTIME_DIR		= $(libdir)

# Directory in which to install the program tclsh:
BIN_INSTALL_DIR		= $(INSTALL_ROOT)$(bindir)

# Directory in which to install libtcl.so or libtcl.a:
LIB_INSTALL_DIR		= $(INSTALL_ROOT)$(libdir)

# Path name to use when installing library scripts.
SCRIPT_INSTALL_DIR	= $(INSTALL_ROOT)$(TCL_LIBRARY)

# Directory in which to install the include file tcl.h:
INCLUDE_INSTALL_DIR	= $(INSTALL_ROOT)$(includedir)







|







43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

# Path to use at runtime to refer to LIB_INSTALL_DIR:
LIB_RUNTIME_DIR		= $(libdir)

# Directory in which to install the program tclsh:
BIN_INSTALL_DIR		= $(INSTALL_ROOT)$(bindir)

# Directory in which to install the .a or .so binary for the Tcl library:
LIB_INSTALL_DIR		= $(INSTALL_ROOT)$(libdir)

# Path name to use when installing library scripts.
SCRIPT_INSTALL_DIR	= $(INSTALL_ROOT)$(TCL_LIBRARY)

# Directory in which to install the include file tcl.h:
INCLUDE_INSTALL_DIR	= $(INSTALL_ROOT)$(includedir)
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
TCL_STUB_LIB_FILE	= @TCL_STUB_LIB_FILE@
TCL_DLL_FILE		= @TCL_DLL_FILE@
TCL_LIB_FILE		= @TCL_LIB_FILE@
DDE_DLL_FILE		= tcldde$(VER)${DLLSUFFIX}
DDE_LIB_FILE		= tcldde$(VER)${LIBSUFFIX}
REG_DLL_FILE		= tclreg$(VER)${DLLSUFFIX}
REG_LIB_FILE		= tclreg$(VER)${LIBSUFFIX}
PIPE_DLL_FILE		= tclpip$(VER).dll

SHARED_LIBRARIES 	= $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
			  $(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_FILE)
STATIC_LIBRARIES	= $(TCL_LIB_FILE)

TCLSH			= tclsh$(VER)${EXESUFFIX}
TCLTEST			= tcltest${EXEEXT}
CAT32			= cat32$(EXEEXT)
MAN2TCL			= man2tcl$(EXEEXT)

@SET_MAKE@







|



|







126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
TCL_STUB_LIB_FILE	= @TCL_STUB_LIB_FILE@
TCL_DLL_FILE		= @TCL_DLL_FILE@
TCL_LIB_FILE		= @TCL_LIB_FILE@
DDE_DLL_FILE		= tcldde$(VER)${DLLSUFFIX}
DDE_LIB_FILE		= tcldde$(VER)${LIBSUFFIX}
REG_DLL_FILE		= tclreg$(VER)${DLLSUFFIX}
REG_LIB_FILE		= tclreg$(VER)${LIBSUFFIX}
PIPE_DLL_FILE		= tclpip$(VER)${DLLSUFFIX}

SHARED_LIBRARIES 	= $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
			  $(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_FILE)
STATIC_LIBRARIES	= $(TCL_LIB_FILE) $(REG_LIB_FILE) $(DDE_LIB_FILE)

TCLSH			= tclsh$(VER)${EXESUFFIX}
TCLTEST			= tcltest${EXEEXT}
CAT32			= cat32$(EXEEXT)
MAN2TCL			= man2tcl$(EXEEXT)

@SET_MAKE@
152
153
154
155
156
157
158

159
160

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178

179
180
181
182
183
184
185
# makefile to look into these paths when resolving .c to .obj
# dependencies. Note the ':' to avoid autoconf's habit of deleting
# all VPATH lines without an explicit ':' in it. 

VPATH = $(GENERIC_DIR)@VPSEP@$(WIN_DIR)@VPSEP@$(COMPAT_DIR) # : 

AR		= @AR@

CC		= @CC@
RC		= @RC@

AC_FLAGS	= @EXTRA_CFLAGS@ @DEFS@
CPPFLAGS	= @CPPFLAGS@
LDFLAGS		= @LDFLAGS@
LDFLAGS_CONSOLE	= @LDFLAGS_CONSOLE@
LDFLAGS_WINDOW	= @LDFLAGS_WINDOW@
EXEEXT		= @EXEEXT@
OBJEXT		= @OBJEXT@
STLIB_LD	= @STLIB_LD@
SHLIB_LD	= @SHLIB_LD@
SHLIB_LD_LIBS	= @SHLIB_LD_LIBS@
SHLIB_CFLAGS	= @SHLIB_CFLAGS@
SHLIB_SUFFIX	= @SHLIB_SUFFIX@
VER		= @TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@
DOTVER		= @TCL_MAJOR_VERSION@.@TCL_MINOR_VERSION@
LIBS		= @LIBS@

RMDIR		= rm -rf
MKDIR		= mkdir -p

RM		= rm -f
COPY		= cp

CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \
-I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \
${COMPILE_DEBUG_FLAGS}








>


>









|








>







152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# makefile to look into these paths when resolving .c to .obj
# dependencies. Note the ':' to avoid autoconf's habit of deleting
# all VPATH lines without an explicit ':' in it. 

VPATH = $(GENERIC_DIR)@VPSEP@$(WIN_DIR)@VPSEP@$(COMPAT_DIR) # : 

AR		= @AR@
RANLIB		= @RANLIB@
CC		= @CC@
RC		= @RC@
RES		= @RES@
AC_FLAGS	= @EXTRA_CFLAGS@ @DEFS@
CPPFLAGS	= @CPPFLAGS@
LDFLAGS		= @LDFLAGS@
LDFLAGS_CONSOLE	= @LDFLAGS_CONSOLE@
LDFLAGS_WINDOW	= @LDFLAGS_WINDOW@
EXEEXT		= @EXEEXT@
OBJEXT		= @OBJEXT@
STLIB_LD	= @STLIB_LD@
SHLIB_LD	= @SHLIB_LD@
SHLIB_LD_LIBS	= @SHLIB_LD_LIBS@ $(LIBS)
SHLIB_CFLAGS	= @SHLIB_CFLAGS@
SHLIB_SUFFIX	= @SHLIB_SUFFIX@
VER		= @TCL_MAJOR_VERSION@@TCL_MINOR_VERSION@
DOTVER		= @TCL_MAJOR_VERSION@.@TCL_MINOR_VERSION@
LIBS		= @LIBS@

RMDIR		= rm -rf
MKDIR		= mkdir -p
SHELL		= @SHELL@
RM		= rm -f
COPY		= cp

CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \
-I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \
${COMPILE_DEBUG_FLAGS}

225
226
227
228
229
230
231

232
233
234
235
236
237
238
	tclGet.$(OBJEXT) \
	tclHash.$(OBJEXT) \
	tclHistory.$(OBJEXT) \
	tclIndexObj.$(OBJEXT) \
	tclInterp.$(OBJEXT) \
	tclIO.$(OBJEXT) \
	tclIOCmd.$(OBJEXT) \

	tclIOSock.$(OBJEXT) \
	tclIOUtil.$(OBJEXT) \
	tclLink.$(OBJEXT) \
	tclLiteral.$(OBJEXT) \
	tclListObj.$(OBJEXT) \
	tclLoad.$(OBJEXT) \
	tclMain.$(OBJEXT) \







>







228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
	tclGet.$(OBJEXT) \
	tclHash.$(OBJEXT) \
	tclHistory.$(OBJEXT) \
	tclIndexObj.$(OBJEXT) \
	tclInterp.$(OBJEXT) \
	tclIO.$(OBJEXT) \
	tclIOCmd.$(OBJEXT) \
	tclIOGT.$(OBJEXT) \
	tclIOSock.$(OBJEXT) \
	tclIOUtil.$(OBJEXT) \
	tclLink.$(OBJEXT) \
	tclLiteral.$(OBJEXT) \
	tclListObj.$(OBJEXT) \
	tclLoad.$(OBJEXT) \
	tclMain.$(OBJEXT) \
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334

335
336
337
338
339
340
341
342

343
344
345
346




347
348
349
350




351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370

TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]

all: binaries libraries doc

tcltest: $(TCLTEST)

binaries: @LIBRARIES@ $(STATIC_LIBRARIES) $(TCLSH)

libraries:

doc:

winhelp: $(ROOT_DIR)/tools/man2help.tcl $(MAN2TCL)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLSH) "$(ROOT_DIR_NATIVE)"/tools/man2help.tcl tcl "$(VER)" $(TCL_DOCS)
	hcw /c /e tcl.hpj

$(MAN2TCL): $(ROOT_DIR)/tools/man2tcl.c
	$(CC) $(CFLAGS_OPTIMIZE) $(MAN2TCLFLAGS) -o $(MAN2TCL) "$(ROOT_DIR_NATIVE)"/tools/man2tcl.c

$(TCLSH): $(TCL_LIB_FILE) $(TCLSH_OBJS) tclsh.res
	$(CC) $(CFLAGS) $(TCLSH_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.res $(CC_EXENAME) 

$(TCLTEST): $(TCL_LIB_FILE) $(TCLTEST_OBJS) $(CAT32) tclsh.res
	$(CC) $(CFLAGS) $(TCLTEST_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.res $(CC_EXENAME) 

cat32.${OBJEXT}: cat.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)

$(CAT32): cat32.${OBJEXT}
	$(CC) $(CFLAGS) cat32.obj $(CC_EXENAME) -link $(LDFLAGS_CONSOLE)

# The following targets are configured by autoconf to generate either
# a shared library or static library

${TCL_STUB_LIB_FILE}: ${STUB_OBJS}
	@$(RM) ${TCL_STUB_LIB_FILE}
	@MAKE_LIB@ ${STUB_OBJS}


${TCL_DLL_FILE}: ${TCL_OBJS} tcl.res
	@$(RM) ${TCL_DLL_FILE}
	@MAKE_DLL@ ${TCL_OBJS} tcl.res

${TCL_LIB_FILE}: ${TCL_OBJS}
	@$(RM) ${TCL_LIB_FILE}
	@MAKE_LIB@ ${TCL_OBJS}


${DDE_DLL_FILE}: ${DDE_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${DDE_DLL_FILE}
	@MAKE_DLL@ ${DDE_OBJS} ${TCL_STUB_LIB_FILE}





${REG_DLL_FILE}: ${REG_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${REG_DLL_FILE}
	@MAKE_DLL@ ${REG_OBJS} ${TCL_STUB_LIB_FILE}





# PIPE_DLL_FILE is actually an executable, don't build it
# like a DLL.

${PIPE_DLL_FILE}: ${PIPE_OBJS}
	@$(RM) ${PIPE_DLL_FILE}
	$(CC) $(CFLAGS) ${PIPE_OBJS} $(LIBS) -Fe$(PIPE_DLL_FILE) 

# Add the object extension to the implicit rules.  By default .obj is not
# automatically added.

.SUFFIXES: .${OBJEXT}
.SUFFIXES: .res
.SUFFIXES: .rc

# Special case object targets

tclWinInit.${OBJEXT}: tclWinInit.c
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl $(EXTFLAGS) $(DEPARG) $(CC_OBJNAME)








|













|

|

|

|

|


|
|







>

|

|




>



|
>
>
>
>



|
>
>
>
>






|





|







298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384

TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n]

all: binaries libraries doc

tcltest: $(TCLTEST)

binaries: @LIBRARIES@ $(TCLSH)

libraries:

doc:

winhelp: $(ROOT_DIR)/tools/man2help.tcl $(MAN2TCL)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLSH) "$(ROOT_DIR_NATIVE)"/tools/man2help.tcl tcl "$(VER)" $(TCL_DOCS)
	hcw /c /e tcl.hpj

$(MAN2TCL): $(ROOT_DIR)/tools/man2tcl.c
	$(CC) $(CFLAGS_OPTIMIZE) $(MAN2TCLFLAGS) -o $(MAN2TCL) "$(ROOT_DIR_NATIVE)"/tools/man2tcl.c

$(TCLSH): $(TCL_LIB_FILE) $(TCLSH_OBJS) tclsh.$(RES)
	$(CC) $(CFLAGS) $(TCLSH_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.$(RES) $(CC_EXENAME) 

$(TCLTEST): $(TCL_LIB_FILE) $(TCLTEST_OBJS) $(CAT32) tclsh.$(RES)
	$(CC) $(CFLAGS) $(TCLTEST_OBJS) $(TCL_LIB_FILE) $(LIBS) \
        tclsh.$(RES) $(CC_EXENAME) 

cat32.$(OBJEXT): cat.c
	$(CC) -c $(CC_SWITCHES) $(DEPARG) $(CC_OBJNAME)

$(CAT32): cat32.$(OBJEXT)
	$(CC) $(CFLAGS) cat32.$(OBJEXT) $(CC_EXENAME) $(LDFLAGS_CONSOLE)

# The following targets are configured by autoconf to generate either
# a shared library or static library

${TCL_STUB_LIB_FILE}: ${STUB_OBJS}
	@$(RM) ${TCL_STUB_LIB_FILE}
	@MAKE_LIB@ ${STUB_OBJS}
	@POST_MAKE_LIB@

${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES)
	@$(RM) ${TCL_DLL_FILE}
	@MAKE_DLL@ ${TCL_OBJS} tcl.$(RES) $(SHLIB_LD_LIBS)

${TCL_LIB_FILE}: ${TCL_OBJS}
	@$(RM) ${TCL_LIB_FILE}
	@MAKE_LIB@ ${TCL_OBJS}
	@POST_MAKE_LIB@

${DDE_DLL_FILE}: ${DDE_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${DDE_DLL_FILE}
	@MAKE_DLL@ ${DDE_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS)

${DDE_LIB_FILE}: ${DDE_OBJS} ${TCL_LIB_FILE}
	@$(RM) ${DDE_LIB_FILE}
	@MAKE_LIB@ ${DDE_OBJS} ${TCL_LIB_FILE}

${REG_DLL_FILE}: ${REG_OBJS} ${TCL_STUB_LIB_FILE}
	@$(RM) ${REG_DLL_FILE}
	@MAKE_DLL@ ${REG_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS)

${REG_LIB_FILE}: ${REG_OBJS} ${TCL_LIB_FILE}
	@$(RM) ${REG_LIB_FILE}
	@MAKE_LIB@ ${REG_OBJS} ${TCL_LIB_FILE}

# PIPE_DLL_FILE is actually an executable, don't build it
# like a DLL.

${PIPE_DLL_FILE}: ${PIPE_OBJS}
	@$(RM) ${PIPE_DLL_FILE}
	@MAKE_EXE@ $(CFLAGS) ${PIPE_OBJS} $(LIBS)

# Add the object extension to the implicit rules.  By default .obj is not
# automatically added.

.SUFFIXES: .${OBJEXT}
.SUFFIXES: .$(RES)
.SUFFIXES: .rc

# Special case object targets

tclWinInit.${OBJEXT}: tclWinInit.c
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl $(EXTFLAGS) $(DEPARG) $(CC_OBJNAME)

399
400
401
402
403
404
405
406
407
408
409
410
411
412
413



414
415




416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441


# Implicit rule for all object files that will end up in the Tcl library

.c.${OBJEXT}:
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl ${DEPARG} $(CC_OBJNAME)

.rc.res:
	$(RC) -fo $@ -r -i "$(GENERIC_DIR_NATIVE)" $(DEPARG)


install: all install-binaries install-libraries install-doc

install-binaries:
	@$(MKDIR) -p "$(BIN_INSTALL_DIR)"



	@$(MKDIR) -p "$(LIB_INSTALL_DIR)"
	$(COPY) tclConfig.sh $(LIB_INSTALL_DIR)/tclConfig.sh




	@for i in dde1.1 reg1.0; \
	    do \
	    if [ ! -d $(LIB_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(LIB_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(LIB_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@for i in $(TCL_DLL_FILE) $(TCLSH) $(PIPE_DLL_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i"; \
		$(COPY) $$i "$(BIN_INSTALL_DIR)"; \
	    fi; \
	    done
	@for i in $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i"; \
		$(COPY) $$i "$(LIB_INSTALL_DIR)"; \
	    fi; \
	    done
	@if [ -f $(DDE_DLL_FILE) ]; then \
	    echo installing $(DDE_DLL_FILE); \
	    $(COPY) $(DDE_DLL_FILE) $(LIB_INSTALL_DIR)/dde1.1; \
	    $(COPY) $(ROOT_DIR)/library/dde1.1/pkgIndex.tcl $(LIB_INSTALL_DIR)/dde1.1; \







|
<
|



|
|
>
>
>
|
<
>
>
>
>











|



|


|







413
414
415
416
417
418
419
420

421
422
423
424
425
426
427
428
429
430

431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460


# Implicit rule for all object files that will end up in the Tcl library

.c.${OBJEXT}:
	$(CC) -c $(CC_SWITCHES) -DBUILD_tcl ${DEPARG} $(CC_OBJNAME)

.rc.$(RES):

	$(RC) @RC_OUT@ $@ @RC_TYPE@ @RC_DEFINES@ @RC_INCLUDE@ "$(GENERIC_DIR_NATIVE)" @RC_INCLUDE@ "$(WIN_DIR_NATIVE)" $(DEPARG)

install: all install-binaries install-libraries install-doc

install-binaries: binaries
	@for i in "$(LIB_INSTALL_DIR)" "$(BIN_INSTALL_DIR)" ; \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		$(MKDIR) $$i; \

		chmod 755 $$i; \
		else true; \
		fi; \
	    done;
	@for i in dde1.1 reg1.0; \
	    do \
	    if [ ! -d $(LIB_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(LIB_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(LIB_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@for i in $(TCL_DLL_FILE) $(TCLSH) $(PIPE_DLL_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i to $(BIN_INSTALL_DIR)/"; \
		$(COPY) $$i "$(BIN_INSTALL_DIR)"; \
	    fi; \
	    done
	@for i in tclConfig.sh $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE); \
	    do \
	    if [ -f $$i ]; then \
		echo "Installing $$i to $(LIB_INSTALL_DIR)/"; \
		$(COPY) $$i "$(LIB_INSTALL_DIR)"; \
	    fi; \
	    done
	@if [ -f $(DDE_DLL_FILE) ]; then \
	    echo installing $(DDE_DLL_FILE); \
	    $(COPY) $(DDE_DLL_FILE) $(LIB_INSTALL_DIR)/dde1.1; \
	    $(COPY) $(ROOT_DIR)/library/dde1.1/pkgIndex.tcl $(LIB_INSTALL_DIR)/dde1.1; \
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476

477
478
479
480
481
482
483
484

485
486


487





488
489
490
491




492





493
494
495
496
497
498




499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
	    $(COPY) $(ROOT_DIR)/library/reg1.0/pkgIndex.tcl $(LIB_INSTALL_DIR)/reg1.0; \
	    fi
	@if [ -f $(REG_LIB_FILE) ]; then \
	    echo installing $(REG_LIB_FILE); \
	    $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg1.0; \
	    fi

install-libraries:
	@for i in $(prefix)/lib $(INCLUDE_INSTALL_DIR) \
		$(SCRIPT_INSTALL_DIR); \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		$(MKDIR) $$i; \
		else true; \
		fi; \
	    done;
	@for i in http1.0 http2.3 opt0.4 encoding msgcat1.0 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@echo "Installing header files";
	@for i in "$(GENERIC_DIR)/tcl.h" "$(GENERIC_DIR)/tclDecls.h" ; \

	    do \
	    $(COPY) "$$i" "$(INCLUDE_INSTALL_DIR)"; \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(ROOT_DIR)/library/*.tcl $(ROOT_DIR)/library/tclIndex; \
	    do \
	    $(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)"; \
	    done;

	@for i in http2.3 http1.0 opt0.4 msgcat1.0 tcltest1.0; \
	    do \


	    echo "Installing library $$i directory"; \





	    for j in $(ROOT_DIR)/library/$$i/*.tcl; \
		do \
		$(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/$$i"; \
		done; \




	    done;





	@echo "Installing encodings"
	@for i in $(ROOT_DIR)/library/encoding/*.enc ; do \
		$(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)/encoding"; \
	done;

install-doc:





test: binaries $(TCLTEST)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLTEST) "$(ROOT_DIR_NATIVE)/tests/all.tcl" $(TESTFLAGS) \
	| ./$(CAT32)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
	@TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	    ./tcltest

depend:

Makefile: Makefile.in
	./config.status

cleanhelp:
	$(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe

clean: cleanhelp
	$(RM) *.lib *.exp *.dll *.res *.${OBJEXT} *~ \#* TAGS a.out
	$(RM) $(TCLSH) $(TCLTEST) $(CAT32)
	$(RM) *.pch *.ilk *.pdb

distclean: clean
	$(RM) Makefile config.status config.cache config.log tclConfig.sh \
		tcl.hpj








|









|








|
>








>
|

>
>
|
>
>
>
>
>
|
|
|
|
>
>
>
>

>
>
>
>
>
|




|
>
>
>
>













|






|







469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
	    $(COPY) $(ROOT_DIR)/library/reg1.0/pkgIndex.tcl $(LIB_INSTALL_DIR)/reg1.0; \
	    fi
	@if [ -f $(REG_LIB_FILE) ]; then \
	    echo installing $(REG_LIB_FILE); \
	    $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg1.0; \
	    fi

install-libraries: libraries
	@for i in $(prefix)/lib $(INCLUDE_INSTALL_DIR) \
		$(SCRIPT_INSTALL_DIR); \
	    do \
	    if [ ! -d $$i ] ; then \
		echo "Making directory $$i"; \
		$(MKDIR) $$i; \
		else true; \
		fi; \
	    done;
	@for i in http1.0 http2.3 opt0.4 encoding msgcat1.1 tcltest1.0; \
	    do \
	    if [ ! -d $(SCRIPT_INSTALL_DIR)/$$i ] ; then \
		echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \
		$(MKDIR) $(SCRIPT_INSTALL_DIR)/$$i; \
		else true; \
		fi; \
	    done;
	@echo "Installing header files";
	@for i in "$(GENERIC_DIR)/tcl.h" "$(GENERIC_DIR)/tclDecls.h" \
		"$(GENERIC_DIR)/tclPlatDecls.h" ; \
	    do \
	    $(COPY) "$$i" "$(INCLUDE_INSTALL_DIR)"; \
	    done;
	@echo "Installing library files to $(SCRIPT_INSTALL_DIR)";
	@for i in $(ROOT_DIR)/library/*.tcl $(ROOT_DIR)/library/tclIndex; \
	    do \
	    $(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)"; \
	    done;
	@echo "Installing library http1.0 directory";
	@for j in $(ROOT_DIR)/library/http1.0/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http1.0"; \
	    done;
	@echo "Installing library http2.3 directory";
	@for j in $(ROOT_DIR)/library/http/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http2.3"; \
	    done;
	@echo "Installing library opt0.4 directory";
	@for j in $(ROOT_DIR)/library/opt/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/opt0.4"; \
	    done;
	@echo "Installing library msgcat1.1 directory";
	@for j in $(ROOT_DIR)/library/msgcat/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/msgcat1.1"; \
	    done;
	@echo "Installing library tcltest1.0 directory";
	@for j in $(ROOT_DIR)/library/tcltest1.0/*.tcl; \
	    do \
	    $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/tcltest1.0"; \
	    done;
	@echo "Installing encodings";
	@for i in $(ROOT_DIR)/library/encoding/*.enc ; do \
		$(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)/encoding"; \
	done;

install-doc: doc

# Specifying TESTFLAGS on the command line is the standard way to pass
# args to tcltest, ie:
#	% make test TESTFLAGS="-verbose bps -file fileName.test"

test: binaries $(TCLTEST)
	TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	./$(TCLTEST) "$(ROOT_DIR_NATIVE)/tests/all.tcl" $(TESTFLAGS) \
	| ./$(CAT32)

# Useful target to launch a built tcltest with the proper path,...
runtest: tcltest
	@TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \
	    ./tcltest

depend:

Makefile: $(SRC_DIR)/Makefile.in
	./config.status

cleanhelp:
	$(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe

clean: cleanhelp
	$(RM) *.lib *.a *.exp *.dll *.$(RES) *.${OBJEXT} *~ \#* TAGS a.out
	$(RM) $(TCLSH) $(TCLTEST) $(CAT32)
	$(RM) *.pch *.ilk *.pdb

distclean: clean
	$(RM) Makefile config.status config.cache config.log tclConfig.sh \
		tcl.hpj

Changes to win/README.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Tcl 8.3 for Windows

by Scott Stanton
Scriptics Corporation
scott.stanton@scriptics.com

RCS: @(#) $Id: README,v 1.16 2000/04/26 17:31:22 hobbs Exp $

1. Introduction
---------------

This is the directory where you configure and compile the Windows
version of Tcl.  This directory also contains source files for Tcl
that are specific to Microsoft Windows.

The information in this file is maintained on the web at:
	http://dev.scriptics.com/doc/howto/compile.html#win

2. Compiling Tcl
----------------

In order to compile Tcl for Windows, you need the following items:

	Tcl 8.3 Source Distribution (plus any patches)

	Visual C++ 2.x/4.x/5.x

In practice, this release is built with Visual C++ 5.0

In the "win" subdirectory of the source release, you will find
"makefile.vc".  This is the makefile Visual C++ compiler.  You should
update the paths at the top of the file to reflect your system
configuration.  Now you can use "make" (or "nmake" for VC++) to build
the tcl libraries and the tclsh executable.

In order to use the binaries generated by these makefiles, you will
need to place the Tcl script library files someplace where Tcl can
find them.  Tcl looks in one of following places for the library files:

	1) The path specified in the environment variable "TCL_LIBRARY".

	2) In the lib\tcl8.3 directory under the installation directory
	   as specified in the registry:

		HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.3

	3) Relative to the directory containing the current .exe.
	    Tcl will look for a directory "..\lib\tcl8.3" relative to the
	    directory containing the currently running .exe.

Note that in order to run tclsh83.exe, you must ensure that tcl83.dll
and tclpip83.dll are on your path, in the system directory, or in the 
directory containing tclsh83.exe.

Note: Tcl no longer provides support for Win32s.

This page includes a lengthy discussion of compiler macros necessary
when compiling Tcl extensions that will be dynamically loaded.

3. Test suite
-------------

This distribution contains an extensive test suite for Tcl.  Some of
the tests are timing dependent and will fail from time to time.  If a
test is failing consistently, please send us a bug report with as much
detail as you can manage.  Please use the online database at
	http://dev.scriptics.com/ticket/

In order to run the test suite, you build the "test" target using the
appropriate makefile for your compiler.



<
<
<
<
|


















|

|













<
<
<
<
<
|









<
<
<







|




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
26
27
28
29
30
31
32
33
34
35
36
37





38
39
40
41
42
43
44
45
46
47



48
49
50
51
52
53
54
55
56
57
58
59
Tcl 8.3 for Windows





RCS: @(#) $Id: README,v 1.16.2.2 2001/04/06 01:32:53 hobbs Exp $

1. Introduction
---------------

This is the directory where you configure and compile the Windows
version of Tcl.  This directory also contains source files for Tcl
that are specific to Microsoft Windows.

The information in this file is maintained on the web at:
	http://dev.scriptics.com/doc/howto/compile.html#win

2. Compiling Tcl
----------------

In order to compile Tcl for Windows, you need the following items:

	Tcl 8.3 Source Distribution (plus any patches)

	Visual C++ 5+

In practice, this release is built with Visual C++ 6.0

In the "win" subdirectory of the source release, you will find
"makefile.vc".  This is the makefile Visual C++ compiler.  You should
update the paths at the top of the file to reflect your system
configuration.  Now you can use "make" (or "nmake" for VC++) to build
the tcl libraries and the tclsh executable.

In order to use the binaries generated by these makefiles, you will
need to place the Tcl script library files someplace where Tcl can
find them.  Tcl looks in one of following places for the library files:

	1) The path specified in the environment variable "TCL_LIBRARY".






	2) Relative to the directory containing the current .exe.
	    Tcl will look for a directory "..\lib\tcl8.3" relative to the
	    directory containing the currently running .exe.

Note that in order to run tclsh83.exe, you must ensure that tcl83.dll
and tclpip83.dll are on your path, in the system directory, or in the 
directory containing tclsh83.exe.

Note: Tcl no longer provides support for Win32s.




3. Test suite
-------------

This distribution contains an extensive test suite for Tcl.  Some of
the tests are timing dependent and will fail from time to time.  If a
test is failing consistently, please send us a bug report with as much
detail as you can manage.  Please use the online database at
	http://tcl.sourceforge.net/

In order to run the test suite, you build the "test" target using the
appropriate makefile for your compiler.

Changes to win/README.binary.
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

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Tcl/Tk 8.3 for Windows, Binary Distribution

RCS: @(#) $Id: README.binary,v 1.19 2000/04/26 17:31:22 hobbs Exp $ 

1. Introduction
--------------- 

This directory contains the binary distribution of Tcl/Tk 8.3.1 for
Windows.  It was compiled with Microsoft Visual C++ 5.0 using Win32
API, so that it will run under Windows NT, 95, 98 and 2000.

Tcl provides a powerful platform for creating integration applications
that tie together diverse applications, protocols, devices, and
frameworks.  When paired with the Tk toolkit, Tcl provides the fastest
and most powerful way to create GUI applications that run on PCs, Unix,
and the Macintosh.  Tcl can also be used for a variety of web-related
tasks and for creating powerful command languages for applications.

Tcl is maintained, enhanced, and distributed freely as a service to the
Tcl community by Scriptics Corporation.

2. Documentation
----------------



The official home for Tcl and Tk on the Web is at:

	http://dev.scriptics.com

The home page for the Tcl/Tk 8.3 release is
	http://dev.scriptics.com/software/tcltk/8.3.html

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/tcl8.3.1.txt

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/

There are notes about compiling Tcl at
	http://dev.scriptics.com/doc/howto/compile.html

3. Installation
---------------

The binary release is distributed as a self-extracting archive called
tcl83.exe.  The setup program which will prompt you for an
installation directory.  It will create the installation heirarchy
under the specified directory, and install a wish application icon
under the program manager group of your choice.

We are no longer supporting use of Tcl with 16-bit versions of
Windows.  Microsoft has completely dropped support of the Win32s
subsystem.


|




|










|
<




>
>
|
>
|

|
|


|














|







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Tcl/Tk 8.3 for Windows, Binary Distribution

RCS: @(#) $Id: README.binary,v 1.19.2.3 2001/04/06 01:32:53 hobbs Exp $ 

1. Introduction
--------------- 

This directory contains the binary distribution of Tcl/Tk 8.3.3 for
Windows.  It was compiled with Microsoft Visual C++ 5.0 using Win32
API, so that it will run under Windows NT, 95, 98 and 2000.

Tcl provides a powerful platform for creating integration applications
that tie together diverse applications, protocols, devices, and
frameworks.  When paired with the Tk toolkit, Tcl provides the fastest
and most powerful way to create GUI applications that run on PCs, Unix,
and the Macintosh.  Tcl can also be used for a variety of web-related
tasks and for creating powerful command languages for applications.

Tcl is maintained, enhanced, and distributed freely by the Tcl community.


2. Documentation
----------------

The home of Tcl and Tk sources and bug database on the Web is at:
	http://tcl.sourceforge.net/

The home page for the Tcl Developer Xchange is at:
	http://dev.scriptics.com/

The home page for the Tcl/Tk release is
	http://dev.scriptics.com/software/tcltk/

Detailed release notes can be found at
	http://dev.scriptics.com/software/tcltk/relnotes/

Information about Tcl itself can be found at
	http://dev.scriptics.com/scripting/

There are many Tcl books on the market.  Most are listed at
	http://dev.scriptics.com/resource/doc/books/

There are notes about compiling Tcl at
	http://dev.scriptics.com/doc/howto/compile.html

3. Installation
---------------

The binary release is distributed as a self-extracting archive called
tcl<version>.exe.  The setup program which will prompt you for an
installation directory.  It will create the installation heirarchy
under the specified directory, and install a wish application icon
under the program manager group of your choice.

We are no longer supporting use of Tcl with 16-bit versions of
Windows.  Microsoft has completely dropped support of the Win32s
subsystem.
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
systems.

6. Reporting Bugs
-----------------
If you have comments or bug reports for the Windows version of Tcl,
please use our online database at:

	http://dev.scriptics.com/ticket/

or post them to the newsgroup comp.lang.tcl.

7. Tcl newsgroup
-----------------

There is a network news group "comp.lang.tcl" intended for the exchange







|







79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
systems.

6. Reporting Bugs
-----------------
If you have comments or bug reports for the Windows version of Tcl,
please use our online database at:

	http://tcl.sourceforge.net/

or post them to the newsgroup comp.lang.tcl.

7. Tcl newsgroup
-----------------

There is a network news group "comp.lang.tcl" intended for the exchange
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
releases, and patches.  You can contribute patches by sending them
to <patches@scriptics.com>.  You can also recommend more URLs for the
resource center using the forms labeled "Add a Resource".

10. Mailing lists
----------------

A couple of mailing lists have been set up to discuss Macintosh or
Windows related Tcl issues.  In order to use these Mailing Lists you
must have access to the internet.  To subscribe send a message to:
	
	wintcl-request@scriptics.com
	mactcl-request@scriptics.com

In the body of the message (the subject will be ignored) put:
	
	subscribe mactcl Joe Blow
	
Replacing Joe Blow with your real name, of course.  (Use wintcl
instead of mactcl if you're interested in the Windows list.)  If you
would just like to receive more information about the list without
subscribing put the line:

	information mactcl

in the body instead (or wintcl).  There are also Special Interest
Groups (SIGs) setup for these topics and more at:

       http://dev.scriptics.com/










<
<
<
|
<
<
|
<
<
|
|
<
<
<
<
|
<

|
|


<
<
<
122
123
124
125
126
127
128



129


130


131
132




133

134
135
136
137
138



releases, and patches.  You can contribute patches by sending them
to <patches@scriptics.com>.  You can also recommend more URLs for the
resource center using the forms labeled "Add a Resource".

10. Mailing lists
----------------




Several mailing lists are hosted at SourceForge to discuss development or


use issues (like Macintosh and Windows topics).  For more information and


to subscribe, visit:





	http://sourceforge.net/projects/tcl/


and go to the Mailing Lists page.  There are also Special Interest Groups
(SIGs) setup for these topics and more at:

       http://dev.scriptics.com/



Added win/configure.






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
#! /bin/sh

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --enable-gcc            allow use of gcc if available [--disable-gcc]"
ac_help="$ac_help
  --enable-threads        build with threads"
ac_help="$ac_help
  --enable-shared         build and link with shared libraries [--enable-shared]"
ac_help="$ac_help
  --enable-64bit          enable 64bit support (where applicable)"
ac_help="$ac_help
  --enable-symbols        build with debugging symbols [--disable-symbols]"

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
for ac_option
do

  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval "$ac_prev=\$ac_option"
    ac_prev=
    continue
  fi

  case "$ac_option" in
  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case "$ac_option" in

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir="$ac_optarg" ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$ac_optarg" ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file="$ac_optarg" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$ac_optarg'" ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix="$ac_optarg" ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he)
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$ac_optarg" ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir="$ac_optarg" ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir="$ac_optarg" ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir="$ac_optarg" ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir="$ac_optarg" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    localstatedir="$ac_optarg" ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir="$ac_optarg" ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir="$ac_optarg" ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix="$ac_optarg" ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix="$ac_optarg" ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix="$ac_optarg" ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name="$ac_optarg" ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir="$ac_optarg" ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir="$ac_optarg" ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site="$ac_optarg" ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir="$ac_optarg" ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir="$ac_optarg" ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=no" ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes="$ac_optarg" ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries="$ac_optarg" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=../generic/tcl.h

# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  srcdir=$ac_confdir
  if test ! -r $srcdir/$ac_unique_file; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi



TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi

#--------------------------------------------------------------------
# Check whether --enable-gcc or --disable-gcc was given.  Do this 
# before AC_PROG_CC and AC_CYGWIN are called so the compiler can 
# be fully tested by built-in autoconf tools.
#--------------------------------------------------------------------
 

    # Check whether --enable-gcc or --disable-gcc was given.
if test "${enable_gcc+set}" = set; then
  enableval="$enable_gcc"
  ok=$enableval
else
  ok=no
fi

    if test "$ok" = "yes"; then
	# Quick hack to simulate a real cross check
	# The right way to do this is to use AC_CHECK_TOOL
	# correctly, but this is the minimal change
	# we need until the real fix is ready.
	if test "$host" != "$build" ; then
	    if test -z "$CC"; then
		CC=${host}-gcc
	    fi
	    # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:576: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:606: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:657: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:689: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 700 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:731: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:736: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:745: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:764: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

	    # Extract the first word of "${host}-ar", so it can be a program name with args.
set dummy ${host}-ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:798: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="${host}-ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "${host}-ranlib", so it can be a program name with args.
set dummy ${host}-ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:827: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="${host}-ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "${host}-windres", so it can be a program name with args.
set dummy ${host}-windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:856: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="${host}-windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	else
	    if test -z "$CC"; then
		CC=gcc
	    fi
	    # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:889: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:919: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# -gt 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:970: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1002: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 1013 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:1018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1044: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1049: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1058: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:1077: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
if test "$ac_test_CFLAGS" = set; then
  CFLAGS="$ac_save_CFLAGS"
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

	    # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1111: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1140: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	    # Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1169: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    	fi
    else
	# Allow user to override
	if test -z "$CC"; then
	    CC=cl
	fi
    fi

#AC_PROG_CC

# To properly support cross-compilation, one would
# need to use these tool checks instead of
# the ones below and reconfigure with
# autoconf 2.50. You can also just set
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.
#AC_CHECK_TOOL(AR, ar, :)
#AC_CHECK_TOOL(RANLIB, ranlib, :)
#AC_CHECK_TOOL(RC, windres, :)

if test "${GCC}" = "yes" ; then
    # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1219: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="ar"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1248: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

    # Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1277: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RC"; then
  ac_cv_prog_RC="$RC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RC="windres"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RC="$ac_cv_prog_RC"
if test -n "$RC"; then
  echo "$ac_t""$RC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

fi

#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------

echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:1310: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftestmake <<\EOF
all:
	@echo 'ac_maketemp="${MAKE}"'
EOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
if test -n "$ac_maketemp"; then
  eval ac_cv_prog_make_${ac_make}_set=yes
else
  eval ac_cv_prog_make_${ac_make}_set=no
fi
rm -f conftestmake
fi
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  SET_MAKE=
else
  echo "$ac_t""no" 1>&6
  SET_MAKE="MAKE=${MAKE-make}"
fi


#--------------------------------------------------------------------
# These two macros perform additinal compiler test.
#--------------------------------------------------------------------

echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
echo "configure:1342: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1347 "configure"
#include "confdefs.h"

int main() {

#ifndef __CYGWIN__
#define __CYGWIN__ __CYGWIN32__
#endif
return __CYGWIN__;
; return 0; }
EOF
if { (eval echo configure:1358: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_cygwin=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_cygwin=no
fi
rm -f conftest*
rm -f conftest*
fi

echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes

#--------------------------------------------------------------------
# Determines the correct binary file extension (.o, .obj, .exe etc.)
#--------------------------------------------------------------------

echo $ac_n "checking for object suffix""... $ac_c" 1>&6
echo "configure:1380: checking for object suffix" >&5
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  rm -f conftest*
echo 'int i = 1;' > conftest.$ac_ext
if { (eval echo configure:1386: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  for ac_file in conftest.*; do
    case $ac_file in
    *.c) ;;
    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
    esac
  done
else
  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_objext" 1>&6
OBJEXT=$ac_cv_objext
ac_objext=$ac_cv_objext

echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
echo "configure:1404: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1409 "configure"
#include "confdefs.h"

int main() {
return __MINGW32__;
; return 0; }
EOF
if { (eval echo configure:1416: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_mingw32=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_mingw32=no
fi
rm -f conftest*
rm -f conftest*
fi

echo "$ac_t""$ac_cv_mingw32" 1>&6
MINGW32=
test "$ac_cv_mingw32" = yes && MINGW32=yes


echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
echo "configure:1435: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
  ac_cv_exeext=.exe
else
  rm -f conftest*
  echo 'int main () { return 0; }' > conftest.$ac_ext
  ac_cv_exeext=
  if { (eval echo configure:1445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    for file in conftest.*; do
      case $file in
      *.c | *.o | *.obj) ;;
      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
      esac
    done
  else
    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
  fi
  rm -f conftest*
  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
fi
fi

EXEEXT=""
test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
echo "$ac_t""${ac_cv_exeext}" 1>&6
ac_exeext=$EXEEXT


#--------------------------------------------------------------------
# Check whether --enable-threads or --disable-threads was given.
#--------------------------------------------------------------------


    echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:1472: checking for building with threads" >&5
    # Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
  enableval="$enable_threads"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	echo "$ac_t""yes" 1>&6
	TCL_THREADS=1
	cat >> confdefs.h <<\EOF
#define TCL_THREADS 1
EOF

    else
	TCL_THREADS=0
	echo "$ac_t""no (default)" 1>&6
    fi


#--------------------------------------------------------------------
# The statements below define a collection of symbols related to
# building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------


    echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:1502: checking how to build libraries" >&5
    # Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
  enableval="$enable_shared"
  tcl_ok=$enableval
else
  tcl_ok=yes
fi


    if test "${enable_shared+set}" = set; then
	enableval="$enable_shared"
	tcl_ok=$enableval
    else
	tcl_ok=yes
    fi

    if test "$tcl_ok" = "yes" ; then
	echo "$ac_t""shared" 1>&6
	SHARED_BUILD=1
    else
	echo "$ac_t""static" 1>&6
	SHARED_BUILD=0
	cat >> confdefs.h <<\EOF
#define STATIC_BUILD 1
EOF

    fi


#--------------------------------------------------------------------
# The statements below define a collection of compile flags.  This 
# macro depends on the value of SHARED_BUILD, and should be called
# after SC_ENABLE_SHARED checks the configure switches.
#--------------------------------------------------------------------


    echo $ac_n "checking compiler flags""... $ac_c" 1>&6
echo "configure:1540: checking compiler flags" >&5

    # Set some defaults (may get changed below)
    EXTRA_CFLAGS=""
    PATHTYPE='-w'
    CYGPATH='cygpath'
    VPSEP=';'

    # set various compiler flags depending on whether we are using gcc or cl
    
    if test "${GCC}" = "yes" ; then
	if test "$do64bit" = "yes" ; then
	    echo "configure: warning: "64bit mode not supported with GCC on Windows"" 1>&2
	fi
	SHLIB_LD=""
	SHLIB_LD_LIBS=""
	LIBS=""
	LIBS_GUI="-lgdi32 -lcomdlg32"
	STLIB_LD="${AR}"
	RC_OUT=-o
	RC_TYPE=
	RC_INCLUDE=--include
	RES=res.o
	MAKE_LIB="\${AR} crv \$@"
	POST_MAKE_LIB="\${RANLIB} \$@"
	MAKE_EXE="\${CC} -o \$@"
	LIBPREFIX="lib"

	if "$CC" -v 2>&1 | egrep '\/gcc-lib\/i[3-6]86[^\/]*-cygwin' >/dev/null; then
	    mno_cygwin="yes"
	    extra_cflags="-mno-cygwin"
	    extra_ldflags="-mno-cygwin"
	else
	    mno_cygwin="no"
	    extra_cflags=""
	    extra_ldflags=""
	fi

	if test "$cross_compiling" = "yes" -o "$mno_cygwin" = "yes"; then
	    PATHTYPE=''
	    CYGPATH='echo '
	    VPSEP=':'
	fi

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            echo "$ac_t""using static flags" 1>&6
	    runtime=
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.a"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	else
	    # dynamic
            echo "$ac_t""using shared flags" 1>&6

	    # check to see if ld supports --shared. Libtool does a much
	    # more extensive test, but not really needed in this case.
	    if test -z "$LD"; then
		ld_prog="`(${CC} -print-prog-name=ld) 2>/dev/null`"
		if test -z "$ld_prog"; then
		  ld_prog=ld
		else
		  # get rid of the potential '\r' from ld_prog.
		  ld_prog="`(echo $ld_prog | tr -d '\015' | sed 's,\\\\,\\/,g')`"
		fi
		LD="$ld_prog"
	    fi

	    echo $ac_n "checking whether $ld_prog supports -shared option""... $ac_c" 1>&6
echo "configure:1610: checking whether $ld_prog supports -shared option" >&5

	    # now the ad-hoc check to see if GNU ld supports --shared.
	    if "$LD" --shared 2>&1 | egrep ': -shared not supported' >/dev/null; then
		ld_supports_shared="no"
		SHLIB_LD="${DLLWRAP-dllwrap}"
	    else
		ld_supports_shared="yes"
		SHLIB_LD="${CC} -shared"
	    fi
	    echo "$ac_t""$ld_supports_shared" 1>&6

	    runtime=
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \$@ ${extra_ldflags}"
	    if test "${ld_supports_shared}" = "yes"; then
	        MAKE_DLL="${MAKE_DLL} -Wl,--out-implib,\$(patsubst %.dll,lib%.a,\$@)"
	    else
	        MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\$@)"
	    fi
	    LIBSUFFIX="\${DBGX}.a"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="${extra_cflags}"

	CFLAGS_DEBUG=-g
	CFLAGS_OPTIMIZE=-O
	CFLAGS_WARNING="-Wall -Wconversion"
	LDFLAGS_DEBUG=-g
	LDFLAGS_OPTIMIZE=-O

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-o \$@"
	CC_EXENAME="-o \$@"

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
    else
	SHLIB_LD="link -dll -nologo -incremental:no -link50compat"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib"
	AR="lib -nologo"
	STLIB_LD="lib -nologo"
	RC="rc"
	RC_OUT=-fo
	RC_TYPE=-r
	RC_INCLUDE=-i
	RES=res
	MAKE_LIB="\${AR} -out:\$@"
	POST_MAKE_LIB=
	MAKE_EXE="\${CC} -Fe\$@"
	LIBPREFIX=""

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            echo "$ac_t""using static flags" 1>&6
	    runtime=-MT
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.lib"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	else
	    # dynamic
            echo "$ac_t""using shared flags" 1>&6
	    runtime=-MD
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -out:\$@"
	    LIBSUFFIX="\${DBGX}.lib"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="-YX"
	CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
#	CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD ${runtime}"
	CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
	CFLAGS_WARNING="-W3"
	LDFLAGS_DEBUG="-debug:full -debugtype:cv"
	LDFLAGS_OPTIMIZE="-release"
	
	# Specify the CC output file names based on the target name
	CC_OBJNAME="-Fo\$@"
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\$@')\""

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-link -subsystem:console"
	LDFLAGS_WINDOW="-link -subsystem:windows"

	if test "$do64bit" = "yes" ; then
	    EXTRA_CFLAGS="$EXTRA_CFLAGS -DUSE_TCLALLOC=0"
	fi
    fi


#--------------------------------------------------------------------
# Set the default compiler switches based on the --enable-symbols 
# option.  This macro depends on C flags, and should be called
# after SC_CONFIG_CFLAGS macro is called.
#--------------------------------------------------------------------



    # Step 0: Enable 64 bit support?

    echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:1727: checking if 64bit support is requested" >&5
    # Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
  enableval="$enable_64bit"
  do64bit=$enableval
else
  do64bit=no
fi

    echo "$ac_t""$do64bit" 1>&6

    echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:1739: checking for build with symbols" >&5
    # Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
  enableval="$enable_symbols"
  tcl_ok=$enableval
else
  tcl_ok=no
fi


    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	DBGX=d
	echo "$ac_t""yes" 1>&6
    else
	CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}"
	LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
	DBGX=""
	echo "$ac_t""no" 1>&6
    fi


CFLAGS=${CFLAGS_DEFAULT}
LDFLAGS=${LDFLAGS_DEFAULT}
TCL_DBGX=${DBGX}

#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------

echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1771: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <<EOF
#line 1786 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1792: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <<EOF
#line 1803 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1809: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <<EOF
#line 1820 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1826: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1852: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 1857 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1862: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
MAN2TCLFLAGS="-DNO_ERRNO_H"
fi



#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

#--------------------------------------------------------------------
# Perform final evaluations of variables with possible substitutions.
#--------------------------------------------------------------------

TCL_SHARED_LIB_SUFFIX="\${NODOT_VERSION}${DLLSUFFIX}"
TCL_UNSHARED_LIB_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"
TCL_EXPORT_FILE_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"

eval "TCL_SRC_DIR=\"`cd $srcdir/..; pwd`\""

eval "TCL_DLL_FILE=tcl${VER}${DLLSUFFIX}"

eval "TCL_LIB_FILE=${LIBPREFIX}tcl$VER${LIBSUFFIX}"
# FIMXE: These variables decls are missing
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC

eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${exec_prefix}/lib/${TCL_STUB_LIB_FILE}\""

eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"

CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}
CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}

#--------------------------------------------------------------------
# Adjust the defines for how the resources are built depending
# on symbols and static vs. shared.
#--------------------------------------------------------------------

if test "${GCC}" = "yes" ; then
    RC_DEFINE_FLAG=--define
else
    RC_DEFINE_FLAG=-d
fi

if test ${SHARED_BUILD} = 0 ; then
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD ${RC_DEFINE_FLAG} DEBUG"
    else
        RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD"
    fi
else
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE_FLAG} DEBUG"
    else
        RC_DEFINES=""
    fi
fi






























































trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  fi
fi
rm -f confcache

trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
# If there is a colon in the path, we need to keep it.
if test "x$srcdir" = x.; then
  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
fi

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15

# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g
s%\]%\\&%g
s%\$%$$%g
EOF
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
rm -f conftest.defs


# Without the "./", some shells look in PATH for config.status.
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS
rm -f $CONFIG_STATUS
cat > $CONFIG_STATUS <<EOF
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
# $0 $ac_configure_args
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.

ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
  case "\$ac_option" in
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
    echo "$CONFIG_STATUS generated by autoconf version 2.13"
    exit 0 ;;
  -help | --help | --hel | --he | --h)
    echo "\$ac_cs_usage"; exit 0 ;;
  *) echo "\$ac_cs_usage"; exit 1 ;;
  esac
done

ac_given_srcdir=$srcdir

trap 'rm -fr `echo "Makefile tclConfig.sh tcl.hpj" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF

# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
 s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@exec_prefix@%$exec_prefix%g
s%@prefix@%$prefix%g
s%@program_transform_name@%$program_transform_name%g
s%@bindir@%$bindir%g
s%@sbindir@%$sbindir%g
s%@libexecdir@%$libexecdir%g
s%@datadir@%$datadir%g
s%@sysconfdir@%$sysconfdir%g
s%@sharedstatedir@%$sharedstatedir%g
s%@localstatedir@%$localstatedir%g
s%@libdir@%$libdir%g
s%@includedir@%$includedir%g
s%@oldincludedir@%$oldincludedir%g
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@CC@%$CC%g
s%@AR@%$AR%g
s%@RANLIB@%$RANLIB%g
s%@RC@%$RC%g
s%@SET_MAKE@%$SET_MAKE%g
s%@OBJEXT@%$OBJEXT%g
s%@EXEEXT@%$EXEEXT%g
s%@CPP@%$CPP%g
s%@MAN2TCLFLAGS@%$MAN2TCLFLAGS%g
s%@TCL_VERSION@%$TCL_VERSION%g
s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g
s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g
s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g
s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g
s%@TCL_DLL_FILE@%$TCL_DLL_FILE%g
s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g
s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g
s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g
s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
s%@TCL_DBGX@%$TCL_DBGX%g
s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g
s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g
s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g
s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g
s%@PATHTYPE@%$PATHTYPE%g
s%@CYGPATH@%$CYGPATH%g
s%@VPSEP@%$VPSEP%g
s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g
s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g
s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g
s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
s%@STLIB_LD@%$STLIB_LD%g
s%@SHLIB_LD@%$SHLIB_LD%g
s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g
s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g
s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g
s%@CC_OBJNAME@%$CC_OBJNAME%g
s%@CC_EXENAME@%$CC_EXENAME%g
s%@LDFLAGS_DEBUG@%$LDFLAGS_DEBUG%g
s%@LDFLAGS_OPTIMIZE@%$LDFLAGS_OPTIMIZE%g
s%@LDFLAGS_CONSOLE@%$LDFLAGS_CONSOLE%g
s%@LDFLAGS_WINDOW@%$LDFLAGS_WINDOW%g
s%@RC_OUT@%$RC_OUT%g
s%@RC_TYPE@%$RC_TYPE%g
s%@RC_INCLUDE@%$RC_INCLUDE%g
s%@RC_DEFINES@%$RC_DEFINES%g
s%@RES@%$RES%g
s%@LIBS_GUI@%$LIBS_GUI%g
s%@DLLSUFFIX@%$DLLSUFFIX%g
s%@LIBPREFIX@%$LIBPREFIX%g
s%@LIBSUFFIX@%$LIBSUFFIX%g
s%@EXESUFFIX@%$EXESUFFIX%g
s%@LIBRARIES@%$LIBRARIES%g
s%@MAKE_LIB@%$MAKE_LIB%g
s%@POST_MAKE_LIB@%$POST_MAKE_LIB%g
s%@MAKE_DLL@%$MAKE_DLL%g
s%@MAKE_EXE@%$MAKE_EXE%g

CEOF
EOF

cat >> $CONFIG_STATUS <<\EOF

# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
  if test $ac_beg -gt 1; then
    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
  else
    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
  fi
  if test ! -s conftest.s$ac_file; then
    ac_more_lines=false
    rm -f conftest.s$ac_file
  else
    if test -z "$ac_sed_cmds"; then
      ac_sed_cmds="sed -f conftest.s$ac_file"
    else
      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
    fi
    ac_file=`expr $ac_file + 1`
    ac_beg=$ac_end
    ac_end=`expr $ac_end + $ac_max_sed_cmds`
  fi
done
if test -z "$ac_sed_cmds"; then
  ac_sed_cmds=cat
fi
EOF

cat >> $CONFIG_STATUS <<EOF

CONFIG_FILES=\${CONFIG_FILES-"Makefile tclConfig.sh tcl.hpj"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
  *) ac_file_in="${ac_file}.in" ;;
  esac

  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.

  # Remove last slash and all that follows it.  Not all systems have dirname.
  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    # The file is in a subdirectory.
    test ! -d "$ac_dir" && mkdir "$ac_dir"
    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$ac_given_srcdir" in
  .)  srcdir=.
      if test -z "$ac_dots"; then top_srcdir=.
      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
  *) # Relative path.
    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
    top_srcdir="$ac_dots$ac_given_srcdir" ;;
  esac


  echo creating "$ac_file"
  rm -f "$ac_file"
  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
  case "$ac_file" in
  *Makefile*) ac_comsub="1i\\
# $configure_input" ;;
  *) ac_comsub= ;;
  esac

  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
  sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*

EOF
cat >> $CONFIG_STATUS <<EOF

EOF
cat >> $CONFIG_STATUS <<\EOF

exit 0
EOF
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1

Changes to win/configure.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
26
27
28
# This file is an input file used by the GNU "autoconf" program to
# generate the file "configure", which is run during Tcl installation
# to configure the system for the local environment.
#
# RCS: @(#) $Id: configure.in,v 1.20 2000/04/19 08:32:46 hobbs Exp $

AC_INIT(../generic/tcl.h)

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".1"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION








#--------------------------------------------------------------------
# Check whether --enable-gcc or --disable-gcc was given.  Do this 
# before AC_PROG_CC and AC_CYGWIN are called so the compiler can 
# be fully tested by built-in autoconf tools.
#--------------------------------------------------------------------
 
SC_ENABLE_GCC


















#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------

AC_PROG_MAKE_SET





|






|

>
>
>
>
>
>
>








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# This file is an input file used by the GNU "autoconf" program to
# generate the file "configure", which is run during Tcl installation
# to configure the system for the local environment.
#
# RCS: @(#) $Id: configure.in,v 1.20.2.4 2001/04/04 08:36:16 hobbs Exp $

AC_INIT(../generic/tcl.h)

TCL_VERSION=8.3
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=3
TCL_PATCH_LEVEL=".3"
VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION

if test "${prefix}" = "NONE"; then
    prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
    exec_prefix=$prefix
fi

#--------------------------------------------------------------------
# Check whether --enable-gcc or --disable-gcc was given.  Do this 
# before AC_PROG_CC and AC_CYGWIN are called so the compiler can 
# be fully tested by built-in autoconf tools.
#--------------------------------------------------------------------
 
SC_ENABLE_GCC
#AC_PROG_CC

# To properly support cross-compilation, one would
# need to use these tool checks instead of
# the ones below and reconfigure with
# autoconf 2.50. You can also just set
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.
#AC_CHECK_TOOL(AR, ar, :)
#AC_CHECK_TOOL(RANLIB, ranlib, :)
#AC_CHECK_TOOL(RC, windres, :)

if test "${GCC}" = "yes" ; then
    AC_CHECK_PROG(AR, ar, ar)
    AC_CHECK_PROG(RANLIB, ranlib, ranlib)
    AC_CHECK_PROG(RC, windres, windres)
fi

#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------

AC_PROG_MAKE_SET

74
75
76
77
78
79
80






81
82
83
84
85
86
87
88
89
90
91
92

93












94
95
96
97
98
99
100
101

























102
103
104
105
106
107

108
109






110
111
112
113
114
115

116
117
118
119
120
121
122

#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------

AC_CHECK_HEADER(errno.h, , MAN2TCLFLAGS="-DNO_ERRNO_H")
AC_SUBST(MAN2TCLFLAGS)







#--------------------------------------------------------------------
# Perform final evaluations of variables with possible substitutions.
#--------------------------------------------------------------------

TCL_SHARED_LIB_SUFFIX="\${NODOT_VERSION}${DLLSUFFIX}"
TCL_UNSHARED_LIB_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"
TCL_EXPORT_FILE_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"

eval "TCL_SRC_DIR=`cd $srcdir; pwd`"
eval "TCL_STUB_LIB_FILE=${LIBPREFIX}tclstub$VER${LIBSUFFIX}"
eval "TCL_DLL_FILE=tcl$VER${DLLSUFFIX}"

eval "TCL_LIB_FILE=${LIBPREFIX}tcl$VER${LIBSUFFIX}"












eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"

CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}
CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}


























AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PATCH_LEVEL)
AC_SUBST(TCL_LIB_FILE)

AC_SUBST(TCL_DLL_FILE)
AC_SUBST(TCL_STUB_LIB_FILE)






AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_DBGX)
AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX)


AC_SUBST(PATHTYPE)
AC_SUBST(CYGPATH)
AC_SUBST(VPSEP)
AC_SUBST(CFLAGS_DEBUG)
AC_SUBST(CFLAGS_OPTIMIZE)
AC_SUBST(CFLAGS_WARNING)







>
>
>
>
>
>









|
|
|
>

>
>
>
>
>
>
>
>
>
>
>
>








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






>


>
>
>
>
>
>






>







98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198

#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------

AC_CHECK_HEADER(errno.h, , MAN2TCLFLAGS="-DNO_ERRNO_H")
AC_SUBST(MAN2TCLFLAGS)

#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------

TCL_SHARED_BUILD=${SHARED_BUILD}

#--------------------------------------------------------------------
# Perform final evaluations of variables with possible substitutions.
#--------------------------------------------------------------------

TCL_SHARED_LIB_SUFFIX="\${NODOT_VERSION}${DLLSUFFIX}"
TCL_UNSHARED_LIB_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"
TCL_EXPORT_FILE_SUFFIX="\${NODOT_VERSION}${LIBSUFFIX}"

eval "TCL_SRC_DIR=\"`cd $srcdir/..; pwd`\""

eval "TCL_DLL_FILE=tcl${VER}${DLLSUFFIX}"

eval "TCL_LIB_FILE=${LIBPREFIX}tcl$VER${LIBSUFFIX}"
# FIMXE: These variables decls are missing
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC

eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${exec_prefix}/lib ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${exec_prefix}/lib/${TCL_STUB_LIB_FILE}\""

eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"

CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}
CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}

#--------------------------------------------------------------------
# Adjust the defines for how the resources are built depending
# on symbols and static vs. shared.
#--------------------------------------------------------------------

if test "${GCC}" = "yes" ; then
    RC_DEFINE_FLAG=--define
else
    RC_DEFINE_FLAG=-d
fi

if test ${SHARED_BUILD} = 0 ; then
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD ${RC_DEFINE_FLAG} DEBUG"
    else
        RC_DEFINES="${RC_DEFINE_FLAG} STATIC_BUILD"
    fi
else
    if test "${DBGX}" = "d"; then
        RC_DEFINES="${RC_DEFINE_FLAG} DEBUG"
    else
        RC_DEFINES=""
    fi
fi

AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PATCH_LEVEL)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_DLL_FILE)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_PATH)
AC_SUBST(TCL_STUB_LIB_PATH)

AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_DBGX)
AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX)
AC_SUBST(TCL_SHARED_BUILD)

AC_SUBST(PATHTYPE)
AC_SUBST(CYGPATH)
AC_SUBST(VPSEP)
AC_SUBST(CFLAGS_DEBUG)
AC_SUBST(CFLAGS_OPTIMIZE)
AC_SUBST(CFLAGS_WARNING)
130
131
132
133
134
135
136

137







138
139
140
141
142
143

144

145
146
AC_SUBST(CC_EXENAME)
AC_SUBST(LDFLAGS)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(LDFLAGS_CONSOLE)
AC_SUBST(LDFLAGS_WINDOW)
AC_SUBST(AR)

AC_SUBST(RC)







AC_SUBST(DLLSUFFIX)
AC_SUBST(LIBPREFIX)
AC_SUBST(LIBSUFFIX)
AC_SUBST(EXESUFFIX)
AC_SUBST(LIBRARIES)
AC_SUBST(MAKE_LIB)

AC_SUBST(MAKE_DLL)


AC_OUTPUT(Makefile tclConfig.sh tcl.hpj)







>

>
>
>
>
>
>
>






>

>


206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
AC_SUBST(CC_EXENAME)
AC_SUBST(LDFLAGS)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(LDFLAGS_CONSOLE)
AC_SUBST(LDFLAGS_WINDOW)
AC_SUBST(AR)
AC_SUBST(RANLIB)
AC_SUBST(RC)
AC_SUBST(RC_OUT)
AC_SUBST(RC_TYPE)
AC_SUBST(RC_INCLUDE)
AC_SUBST(RC_DEFINES)
AC_SUBST(RES)
AC_SUBST(LIBS)
AC_SUBST(LIBS_GUI)
AC_SUBST(DLLSUFFIX)
AC_SUBST(LIBPREFIX)
AC_SUBST(LIBSUFFIX)
AC_SUBST(EXESUFFIX)
AC_SUBST(LIBRARIES)
AC_SUBST(MAKE_LIB)
AC_SUBST(POST_MAKE_LIB)
AC_SUBST(MAKE_DLL)
AC_SUBST(MAKE_EXE)

AC_OUTPUT(Makefile tclConfig.sh tcl.hpj)
Changes to win/makefile.vc.
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
26
27
28
29

30
31
32
33
34
35
36




37






38


39
40










41



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

58
59



60

61
62
63
64
65
66
67
# Visual C++ 2.x and 4.0 makefile
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# RCS: @(#) $Id: makefile.vc,v 1.50 2000/04/25 20:58:48 hobbs Exp $

# Does not depend on the presence of any environment variables in
# order to compile tcl; all needed information is derived from 
# location of the compiler directories.

#
# Project directories
#
# ROOT	  = top of source tree
#
# TOOLS32 = location of VC++ 32-bit development tools. Note that the
#	    VC++ 2.0 header files are broken, so you need to use the
#	    ones that come with the developer network CD's, or later
#	    versions of VC++.
#
# INSTALLDIR = where the install- targets should copy the binaries and
#	    support files
#

# Set this to the appropriate value of /MACHINE: for your platform

MACHINE		= IX86

ROOT		= ..
INSTALLDIR	= c:\Progra~1\Tcl

!IF "$(MACHINE)" == "IA64"
TOOLS32		= c:\ia64sdk17




TOOLS32_rc	= c:\ia64sdk17






!ELSE


TOOLS32		= c:\Progra~1\devstudio\vc
TOOLS32_rc	= c:\Progra~1\devstudio\sharedide










!ENDIF




# Uncomment the following line to compile with thread support
#THREADDEFINES = -DTCL_THREADS=1

# Set NODEBUG to 0 to compile with symbols
NODEBUG = 1

# The following defines can be used to control the amount of debugging
# code that is added to the compilation.
#
#	-DTCL_MEM_DEBUG		Enables the debugging memory allocator.
#	-DTCL_COMPILE_DEBUG	Enables byte compilation logging.
#	-DTCL_COMPILE_STATS	Enables byte compilation statistics gathering.
#	-DUSE_TCLALLOC=0	Disables the Tcl memory allocator in favor
#				of the native malloc implementation.  This is
#				needed when using Purify.

#
#DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS



#DEBUGDEFINES = -DUSE_TCLALLOC=0


######################################################################
# Do not modify below this line
######################################################################

NAMEPREFIX = tcl
STUBPREFIX = $(NAMEPREFIX)stub
|





|

|




















>



|


|
>
>
>
>
|
>
>
>
>
>
>

>
>
|
|
>
>
>
>
>
>
>
>
>
>

>
>
>















|
>


>
>
>

>







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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# Visual C++ makefile
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# RCS: @(#) $Id: makefile.vc,v 1.50.2.2 2001/04/03 22:54:39 hobbs Exp $

# Does not depend on the presence of any environment variables in
# order to compile tcl; all needed information is derived from 
# location of the compiler directories.

#
# Project directories
#
# ROOT	  = top of source tree
#
# TOOLS32 = location of VC++ 32-bit development tools. Note that the
#	    VC++ 2.0 header files are broken, so you need to use the
#	    ones that come with the developer network CD's, or later
#	    versions of VC++.
#
# INSTALLDIR = where the install- targets should copy the binaries and
#	    support files
#

# Set this to the appropriate value of /MACHINE: for your platform
# Choices: IX86, IA64, ALPHA
MACHINE		= IX86

ROOT		= ..
INSTALLDIR	= C:\Progra~1\Tcl

!IF "$(MACHINE)" == "IA64"

# IA64 support is based on the standard setup with v2 of the
# Microsoft Platform SDK for Whistler, build 2267

TOOLS32		= C:\Progra~1\Microsoft Platform SDK
TOOLS32_rc	= C:\Progra~1\Microsoft Platform SDK

cc32		= "$(TOOLS32)\bin\Win64\cl.exe"
link32		= "$(TOOLS32)\bin\Win64\link.exe"
libpath32	= /LIBPATH:"$(TOOLS32)\lib\IA64"
lib32		= "$(TOOLS32)\bin\Win64\lib.exe"

!ELSE

# Visual Studio 5 default
#TOOLS32		= C:\Progra~1\devstudio\vc
#TOOLS32_rc	= C:\Progra~1\devstudio\sharedide

# Visual Studio 6 default
TOOLS32		= C:\Progra~1\Microsoft Visual Studio\VC98
TOOLS32_rc	= C:\Progra~1\Microsoft Visual Studio\common\MSDev98

cc32		= "$(TOOLS32)\bin\cl.exe"
link32		= "$(TOOLS32)\bin\link.exe"
libpath32	= /LIBPATH:"$(TOOLS32)\lib"
lib32		= "$(TOOLS32)\bin\lib.exe"

!ENDIF

rc32		= "$(TOOLS32_rc)\bin\rc.exe"
include32	= -I"$(TOOLS32)\include"

# Uncomment the following line to compile with thread support
#THREADDEFINES = -DTCL_THREADS=1

# Set NODEBUG to 0 to compile with symbols
NODEBUG = 1

# The following defines can be used to control the amount of debugging
# code that is added to the compilation.
#
#	-DTCL_MEM_DEBUG		Enables the debugging memory allocator.
#	-DTCL_COMPILE_DEBUG	Enables byte compilation logging.
#	-DTCL_COMPILE_STATS	Enables byte compilation statistics gathering.
#	-DUSE_TCLALLOC=0	Disables the Tcl memory allocator in favor
#				of the native malloc implementation.  This is
#				needed when using Purify.  For IA64, we do
#				want to use the native allocator.
#
#DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
!IF "$(MACHINE)" == "IA64"
DEBUGDEFINES = -DUSE_TCLALLOC=0
!ELSE
#DEBUGDEFINES = -DUSE_TCLALLOC=0
!ENDIF

######################################################################
# Do not modify below this line
######################################################################

NAMEPREFIX = tcl
STUBPREFIX = $(NAMEPREFIX)stub
148
149
150
151
152
153
154

155
156
157
158
159
160
161
	$(TMPDIR)\tclGet.obj \
	$(TMPDIR)\tclHash.obj \
	$(TMPDIR)\tclHistory.obj \
	$(TMPDIR)\tclIndexObj.obj \
	$(TMPDIR)\tclInterp.obj \
	$(TMPDIR)\tclIO.obj \
	$(TMPDIR)\tclIOCmd.obj \

	$(TMPDIR)\tclIOSock.obj \
	$(TMPDIR)\tclIOUtil.obj \
	$(TMPDIR)\tclLink.obj \
	$(TMPDIR)\tclLiteral.obj \
	$(TMPDIR)\tclListObj.obj \
	$(TMPDIR)\tclLoad.obj \
	$(TMPDIR)\tclMain.obj \







>







179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
	$(TMPDIR)\tclGet.obj \
	$(TMPDIR)\tclHash.obj \
	$(TMPDIR)\tclHistory.obj \
	$(TMPDIR)\tclIndexObj.obj \
	$(TMPDIR)\tclInterp.obj \
	$(TMPDIR)\tclIO.obj \
	$(TMPDIR)\tclIOCmd.obj \
	$(TMPDIR)\tclIOGT.obj \
	$(TMPDIR)\tclIOSock.obj \
	$(TMPDIR)\tclIOUtil.obj \
	$(TMPDIR)\tclLink.obj \
	$(TMPDIR)\tclLiteral.obj \
	$(TMPDIR)\tclListObj.obj \
	$(TMPDIR)\tclLoad.obj \
	$(TMPDIR)\tclMain.obj \
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
	$(TMPDIR)\tclWinPipe.obj \
	$(TMPDIR)\tclWinSock.obj \
	$(TMPDIR)\tclWinThrd.obj \
	$(TMPDIR)\tclWinTime.obj 

TCLSTUBOBJS = $(TMPDIR)\tclStubLib.obj \

cc32		= "$(TOOLS32)\bin\cl.exe"
link32		= "$(TOOLS32)\bin\link.exe"
rc32		= "$(TOOLS32_rc)\bin\rc.exe"
include32	= -I"$(TOOLS32)\include"
libpath32	= /LIBPATH:"$(TOOLS32)\lib"
lib32		= "$(TOOLS32)\bin\lib.exe"

WINDIR		= $(ROOT)\win
GENERICDIR	= $(ROOT)\generic

TCL_INCLUDES	= -I"$(WINDIR)" -I"$(GENERICDIR)"
TCL_DEFINES	= $(DEBUGDEFINES) $(THREADDEFINES)

######################################################################
# Compile flags
######################################################################

!IF "$(NODEBUG)" == "1"
# This cranks the optimization level to maximize speed
cdebug = -O2 -Gs -GD
!ELSE
!IF "$(MACHINE)" == "IA64"
cdebug = -Od -Zi
!ELSE
cdebug = -Z7 -Od -WX
!ENDIF
!ENDIF

# declarations common to all compiler options
cflags = -c -W3 -nologo -Fp$(TMPDIR)\ -YX
cvarsdll = -MD$(DBGX)

TCL_CFLAGS	= $(cdebug) $(cflags) $(cvarsdll) $(include32) \







<
<
<
<
<
<
<













<
|



<







228
229
230
231
232
233
234







235
236
237
238
239
240
241
242
243
244
245
246
247

248
249
250
251

252
253
254
255
256
257
258
	$(TMPDIR)\tclWinPipe.obj \
	$(TMPDIR)\tclWinSock.obj \
	$(TMPDIR)\tclWinThrd.obj \
	$(TMPDIR)\tclWinTime.obj 

TCLSTUBOBJS = $(TMPDIR)\tclStubLib.obj \








WINDIR		= $(ROOT)\win
GENERICDIR	= $(ROOT)\generic

TCL_INCLUDES	= -I"$(WINDIR)" -I"$(GENERICDIR)"
TCL_DEFINES	= $(DEBUGDEFINES) $(THREADDEFINES)

######################################################################
# Compile flags
######################################################################

!IF "$(NODEBUG)" == "1"
# This cranks the optimization level to maximize speed
cdebug = -O2 -Gs -GD

!ELSE IF "$(MACHINE)" == "IA64"
cdebug = -Od -Zi
!ELSE
cdebug = -Z7 -Od -WX

!ENDIF

# declarations common to all compiler options
cflags = -c -W3 -nologo -Fp$(TMPDIR)\ -YX
cvarsdll = -MD$(DBGX)

TCL_CFLAGS	= $(cdebug) $(cflags) $(cvarsdll) $(include32) \
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# declarations common to all linker options
lflags	= /NODEFAULTLIB /NOLOGO /MACHINE:$(MACHINE) $(libpath32)

# declarations for use on Intel i386, i486, and Pentium systems
!IF "$(MACHINE)" == "IX86"
DLLENTRY = @12
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll
!ELSE
!IF "$(MACHINE)" == "IA64"
DLLENTRY = @12
dlllflags = $(lflags) -dll
!ELSE
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll
!ENDIF
!ENDIF

conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup
guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup

!IF "$(MACHINE)" == "PPC"
libc = libc$(DBGX).lib







<
|




<







272
273
274
275
276
277
278

279
280
281
282
283

284
285
286
287
288
289
290
# declarations common to all linker options
lflags	= /NODEFAULTLIB /NOLOGO /MACHINE:$(MACHINE) $(libpath32)

# declarations for use on Intel i386, i486, and Pentium systems
!IF "$(MACHINE)" == "IX86"
DLLENTRY = @12
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll

!ELSE IF "$(MACHINE)" == "IA64"
DLLENTRY = @12
dlllflags = $(lflags) -dll
!ELSE
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll

!ENDIF

conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup
guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup

!IF "$(MACHINE)" == "PPC"
libc = libc$(DBGX).lib
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395

396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)"
	@echo installing http1.0
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http1.0"
	@echo installing http2.3
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http2.3\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http2.3\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.3"
	@echo installing opt0.4
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt0.4\optparse.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt0.4\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	@echo installing msgcat1.0
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	-@copy "$(ROOT)\library\msgcat1.0\msgcat.tcl"   "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	-@copy "$(ROOT)\library\msgcat1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.0"
	@echo installing $(TCLDDEDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(TCLDDEDLL)" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(ROOT)\library\dde1.1\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	@echo installing $(TCLREGDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(ROOT)\library\reg1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	@echo installing encoding files
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\encoding"
	-@copy "$(ROOT)\library\encoding\*.enc" "$(SCRIPT_INSTALL_DIR)\encoding"
	@echo installing library files
	-@copy "$(GENERICDIR)\tcl.h"         "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclDecls.h"    "$(INCLUDE_INSTALL_DIR)"

	-@copy "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\init.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\ldAout.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\parray.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\safe.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\tclIndex"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\word.tcl"    "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\auto.tcl"    "$(SCRIPT_INSTALL_DIR)"

#
# Regenerate the stubs files.
#

genstubs:
	tclsh$(VERSION) $(ROOT)\tools\genStubs.tcl $(GENERICDIR) \







|
|


|
|
|
|
|
|












|
|
>
|
|
|
|
|
|
|
|
|







386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)"
	@echo installing http1.0
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http1.0"
	-@copy "$(ROOT)\library\http1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http1.0"
	@echo installing http2.3
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http\http.tcl"     "$(SCRIPT_INSTALL_DIR)\http2.3"
	-@copy "$(ROOT)\library\http\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.3"
	@echo installing opt0.4
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt\optparse.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	-@copy "$(ROOT)\library\opt\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
	@echo installing msgcat1.1
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	-@copy "$(ROOT)\library\msgcat\msgcat.tcl"   "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	-@copy "$(ROOT)\library\msgcat\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.1"
	@echo installing $(TCLDDEDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(TCLDDEDLL)" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	-@copy "$(ROOT)\library\dde1.1\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\dde1.1"
	@echo installing $(TCLREGDLLNAME)
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	-@copy "$(ROOT)\library\reg1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.0"
	@echo installing encoding files
	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\encoding"
	-@copy "$(ROOT)\library\encoding\*.enc" "$(SCRIPT_INSTALL_DIR)\encoding"
	@echo installing library files
	-@copy "$(GENERICDIR)\tcl.h"          "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclDecls.h"     "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)"
	-@copy "$(ROOT)\library\history.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\init.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\ldAout.tcl"   "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\parray.tcl"   "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\safe.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\tclIndex"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\package.tcl"  "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\word.tcl"     "$(SCRIPT_INSTALL_DIR)"
	-@copy "$(ROOT)\library\auto.tcl"     "$(SCRIPT_INSTALL_DIR)"

#
# Regenerate the stubs files.
#

genstubs:
	tclsh$(VERSION) $(ROOT)\tools\genStubs.tcl $(GENERICDIR) \
503
504
505
506
507
508
509
510




511
512
513
514
515
516
517
518
519
520
521
522
523
    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(ROOT)\compat}.c{$(TMPDIR)}.obj:
    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(WINDIR)}.rc{$(TMPDIR)}.res:
	$(rc32) -fo $@ -r -i $(GENERICDIR) -i $(WINDIR) -D__WIN32__ \
		$(TCL_DEFINES) $<





clean:
	-@$(RM) $(OUTDIR)\*.exp 
	-@$(RM) $(OUTDIR)\*.lib 
	-@$(RM) $(OUTDIR)\*.dll 
	-@$(RM) $(OUTDIR)\*.exe
	-@$(RM) $(OUTDIR)\*.pdb
	-@$(RM) $(TMPDIR)\*.pch
	-@$(RM) $(TMPDIR)\*.obj
	-@$(RM) $(TMPDIR)\*.res
	-@$(RM) $(TMPDIR)\*.exe
	-@$(RMDIR) $(OUTDIR)
	-@$(RMDIR) $(TMPDIR)







|
>
>
>
>













525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(ROOT)\compat}.c{$(TMPDIR)}.obj:
    $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(WINDIR)}.rc{$(TMPDIR)}.res:
	$(rc32) -fo $@ -r -i $(GENERICDIR) -i $(WINDIR) -D__WIN32__ \
		$(TCL_DEFINES) \
!if "$(NODEBUG)" == "0"
		-d DEBUG \
!endif
		$<

clean:
	-@$(RM) $(OUTDIR)\*.exp 
	-@$(RM) $(OUTDIR)\*.lib 
	-@$(RM) $(OUTDIR)\*.dll 
	-@$(RM) $(OUTDIR)\*.exe
	-@$(RM) $(OUTDIR)\*.pdb
	-@$(RM) $(TMPDIR)\*.pch
	-@$(RM) $(TMPDIR)\*.obj
	-@$(RM) $(TMPDIR)\*.res
	-@$(RM) $(TMPDIR)\*.exe
	-@$(RMDIR) $(OUTDIR)
	-@$(RMDIR) $(TMPDIR)
Changes to win/tcl.m4.
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    if test ! -d $TK_BIN_DIR; then
	AC_MSG_ERROR(Tk directory $TK_BIN_DIR does not exist)
    fi
    if test ! -f $TK_BIN_DIR/tkConfig.sh; then
	AC_MSG_ERROR(There is no tkConfig.sh in $TK_BIN_DIR:  perhaps you did not specify the Tk *build* directory (not the toplevel Tk directory) or you forgot to configure Tk?)
    fi

    AC_MSG_RESULT($TK_BIN_DIR/tkConfig.sh)
])

#------------------------------------------------------------------------
# SC_LOAD_TCLCONFIG --
#
#	Load the tclConfig.sh file
#	Currently a no-op for Windows







|







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    if test ! -d $TK_BIN_DIR; then
	AC_MSG_ERROR(Tk directory $TK_BIN_DIR does not exist)
    fi
    if test ! -f $TK_BIN_DIR/tkConfig.sh; then
	AC_MSG_ERROR(There is no tkConfig.sh in $TK_BIN_DIR:  perhaps you did not specify the Tk *build* directory (not the toplevel Tk directory) or you forgot to configure Tk?)
    fi

    AC_MSG_RESULT([$TK_BIN_DIR/tkConfig.sh])
])

#------------------------------------------------------------------------
# SC_LOAD_TCLCONFIG --
#
#	Load the tclConfig.sh file
#	Currently a no-op for Windows
161
162
163
164
165
166
167




168
169
170
171
172
173














174

175




176
177
178
179
180
181
182
# Results:
#
#	Adds the following arguments to configure:
#		--enable-gcc
#
#	Sets the following vars:
#		CC	Command to use for the compiler




#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_GCC, [
    AC_ARG_ENABLE(gcc, [  --enable-gcc            allow use of gcc if available [--disable-gcc]],
	[ok=$enableval], [ok=no])
    if test "$ok" = "yes"; then














	CC=gcc

	AC_PROG_CC




    else
	# Allow user to override
	if test -z "$CC"; then
	    CC=cl
	fi
    fi
])







>
>
>
>






>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# Results:
#
#	Adds the following arguments to configure:
#		--enable-gcc
#
#	Sets the following vars:
#		CC	Command to use for the compiler
#		AR	Comman for the archive tool
#		RANLIB	Command for the archive indexing tool
#		RC	Command for the resource compiler
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_GCC, [
    AC_ARG_ENABLE(gcc, [  --enable-gcc            allow use of gcc if available [--disable-gcc]],
	[ok=$enableval], [ok=no])
    if test "$ok" = "yes"; then
	# Quick hack to simulate a real cross check
	# The right way to do this is to use AC_CHECK_TOOL
	# correctly, but this is the minimal change
	# we need until the real fix is ready.
	if test "$host" != "$build" ; then
	    if test -z "$CC"; then
		CC=${host}-gcc
	    fi
	    AC_PROG_CC
	    AC_CHECK_PROG(AR, ${host}-ar, ${host}-ar)
	    AC_CHECK_PROG(RANLIB, ${host}-ranlib, ${host}-ranlib)
	    AC_CHECK_PROG(RC, ${host}-windres, ${host}-windres)
	else
	    if test -z "$CC"; then
		CC=gcc
	    fi
	    AC_PROG_CC
	    AC_CHECK_PROG(AR, ar, ar)
	    AC_CHECK_PROG(RANLIB, ranlib, ranlib)
	    AC_CHECK_PROG(RC, windres, windres)
    	fi
    else
	# Allow user to override
	if test -z "$CC"; then
	    CC=cl
	fi
    fi
])
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263

    if test "$tcl_ok" = "yes"; then
	AC_MSG_RESULT(yes)
	TCL_THREADS=1
	AC_DEFINE(TCL_THREADS)
    else
	TCL_THREADS=0
	AC_MSG_RESULT(no (default))
    fi
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

    if test "$tcl_ok" = "yes"; then
	AC_MSG_RESULT(yes)
	TCL_THREADS=1
	AC_DEFINE(TCL_THREADS)
    else
	TCL_THREADS=0
	AC_MSG_RESULT([no (default)])
    fi
])

#------------------------------------------------------------------------
# SC_ENABLE_SYMBOLS --
#
#	Specify if debugging symbols should be used
280
281
282
283
284
285
286







287
288
289
290
291
292
293
#		LDFLAGS_DEFAULT	Sets to LDFLAGS_DEBUG if true
#				Sets to LDFLAGS_OPTIMIZE if false
#		DBGX		Debug library extension
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_SYMBOLS, [







    AC_MSG_CHECKING([for build with symbols])
    AC_ARG_ENABLE(symbols, [  --enable-symbols        build with debugging symbols [--disable-symbols]],    [tcl_ok=$enableval], [tcl_ok=no])

    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	DBGX=d







>
>
>
>
>
>
>







303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#		LDFLAGS_DEFAULT	Sets to LDFLAGS_DEBUG if true
#				Sets to LDFLAGS_OPTIMIZE if false
#		DBGX		Debug library extension
#
#------------------------------------------------------------------------

AC_DEFUN(SC_ENABLE_SYMBOLS, [

    # Step 0: Enable 64 bit support?

    AC_MSG_CHECKING([if 64bit support is requested])
    AC_ARG_ENABLE(64bit,[  --enable-64bit          enable 64bit support (where applicable)], [do64bit=$enableval], [do64bit=no])
    AC_MSG_RESULT($do64bit)

    AC_MSG_CHECKING([for build with symbols])
    AC_ARG_ENABLE(symbols, [  --enable-symbols        build with debugging symbols [--disable-symbols]],    [tcl_ok=$enableval], [tcl_ok=no])

    if test "$tcl_ok" = "yes"; then
	CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
	LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
	DBGX=d
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362



363
364
365
366
367
368



369
370

371
372
373
374
375
376
377
#	in the final configure script.
#
# Arguments:
#	none
#
# Results:
#
#	Defines the following vars for all compilers:
#    		EXTRA_CFLAGS
#    		CFLAGS_DEBUG
#    		CFLAGS_OPTIMIZE
#    		CFLAGS_WARNING
#    		LDFLAGS_DEBUG
#    		LDFLAGS_OPTIMIZE
#    		LDFLAGS_CONSOLE
#    		LDFLAGS_WINDOW
#    		CC_OBJNAME
#    		CC_EXENAME
#    		PATHTYPE
#    		VPSEP
#    		CYGPATH
#
#	Defines the following vars for non-gcc compilers
#    		SHLIB_LD
#    		SHLIB_LD_LIBS
#    		LIBS
#    		AR



#    		MAKE_LIB
#    		MAKE_EXE
#    		MAKE_DLL
#
#    		LIBSUFFIX
#    		LIBPREFIX
#    		LIBRARIES
#    		EXESUFFIX
#    		DLLSUFFIX
#
#--------------------------------------------------------------------

AC_DEFUN(SC_CONFIG_CFLAGS, [
    AC_MSG_CHECKING([compiler flags])

    # Set some defaults (may get changed below)
    EXTRA_CFLAGS=""
    PATHTYPE='-w'
    CYGPATH='cygpath'
    VPSEP=';'

    # set various compiler flags depending on whether we are using gcc or cl
    
    if test "${GCC}" = "yes" ; then



	SHLIB_LD=""
	SHLIB_LD_LIBS=""
	LIBS=""
	LIBS_GUI="-lgdi32 -lcomdlg32"
	AR="${AR-ar}"
	STLIB_LD="${AR-ar}"



	RC="${WINDRES-windres}"
	MAKE_LIB="\${AR} crv \[$]@"

	MAKE_EXE="\${CC} -o \[$]@"
	LIBPREFIX="lib"

	if "$CC" -v 2>&1 | egrep '\/gcc-lib\/i[[3-6]]86[[^\/]]*-cygwin' >/dev/null; then
	    mno_cygwin="yes"
	    extra_cflags="-mno-cygwin"
	    extra_ldflags="-mno-cygwin"







|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
|
>
>
>
|
|
|

|
|
|
|
|















>
>
>




<
|
>
>
>
|

>







342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362


363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400

401
402
403
404
405
406
407
408
409
410
411
412
413
414
#	in the final configure script.
#
# Arguments:
#	none
#
# Results:
#
#	Can the following vars:
#		EXTRA_CFLAGS
#		CFLAGS_DEBUG
#		CFLAGS_OPTIMIZE
#		CFLAGS_WARNING
#		LDFLAGS_DEBUG
#		LDFLAGS_OPTIMIZE
#		LDFLAGS_CONSOLE
#		LDFLAGS_WINDOW
#		CC_OBJNAME
#		CC_EXENAME
#		PATHTYPE
#		VPSEP
#		CYGPATH


#		SHLIB_LD
#		SHLIB_LD_LIBS
#		LIBS
#		AR
#		RC
#		RES
#
#		MAKE_LIB
#		MAKE_EXE
#		MAKE_DLL
#
#		LIBSUFFIX
#		LIBPREFIX
#		LIBRARIES
#		EXESUFFIX
#		DLLSUFFIX
#
#--------------------------------------------------------------------

AC_DEFUN(SC_CONFIG_CFLAGS, [
    AC_MSG_CHECKING([compiler flags])

    # Set some defaults (may get changed below)
    EXTRA_CFLAGS=""
    PATHTYPE='-w'
    CYGPATH='cygpath'
    VPSEP=';'

    # set various compiler flags depending on whether we are using gcc or cl
    
    if test "${GCC}" = "yes" ; then
	if test "$do64bit" = "yes" ; then
	    AC_MSG_WARN("64bit mode not supported with GCC on Windows")
	fi
	SHLIB_LD=""
	SHLIB_LD_LIBS=""
	LIBS=""
	LIBS_GUI="-lgdi32 -lcomdlg32"

	STLIB_LD="${AR}"
	RC_OUT=-o
	RC_TYPE=
	RC_INCLUDE=--include
	RES=res.o
	MAKE_LIB="\${AR} crv \[$]@"
	POST_MAKE_LIB="\${RANLIB} \[$]@"
	MAKE_EXE="\${CC} -o \[$]@"
	LIBPREFIX="lib"

	if "$CC" -v 2>&1 | egrep '\/gcc-lib\/i[[3-6]]86[[^\/]]*-cygwin' >/dev/null; then
	    mno_cygwin="yes"
	    extra_cflags="-mno-cygwin"
	    extra_ldflags="-mno-cygwin"
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.a"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	    DLLSUFFIX=""
	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])

	    # check to see if ld supports --shared. Libtool does a much
	    # more extensive test, but not really needed in this case.
	    if test -z "$LD"; then







<







428
429
430
431
432
433
434

435
436
437
438
439
440
441
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.a"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"

	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])

	    # check to see if ld supports --shared. Libtool does a much
	    # more extensive test, but not really needed in this case.
	    if test -z "$LD"; then
430
431
432
433
434
435
436
437
438
439
440



441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465




466

467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482

483
484
485
486
487
488



489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505




506
507
508
509
510
511
512
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \[$]@ ${extra_ldflags}"
	    if test "${ld_supports_shared}" = "yes"; then
	        MAKE_DLL="${MAKE_DLL} -Wl,--out-implib,\$(patsubst %.dll,lib%.a,\[$]@)"
	    else
	        MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\[$]@)"
	    fi
	    LIBSUFFIX="\${DBGX}.a"
	    DLLSUFFIX="\${DBGX}.dll"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi




	EXTRA_CFLAGS="${extra_cflags}"

	CFLAGS_DEBUG=-g
	CFLAGS_OPTIMIZE=-O
	CFLAGS_WARNING="-Wall -Wconversion"
	LDFLAGS_DEBUG=-g
	LDFLAGS_OPTIMIZE=-O

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-o \[$]@"
	CC_EXENAME="-o \[$]@"

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
    else
	SHLIB_LD="link -dll -nologo"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib"
	AR="lib -nologo"
	STLIB_LD="lib -nologo"
	RC="rc"




	MAKE_LIB="\${AR} -out:\[$]@"

	MAKE_EXE="\${CC} -Fe\[$]@"
	LIBPREFIX=""

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=-MT
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.lib"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"
	    DLLSUFFIX=""
	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])
	    runtime=-MD

	    MAKE_DLL="\${SHLIB_LD} \${SHLIB_LD_LIBS} \$(LDFLAGS) -out:\[$]@"
	    LIBSUFFIX="\${DBGX}.lib"
	    DLLSUFFIX="\${DBGX}.dll"
	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi




	EXTRA_CFLAGS="-YX"
	CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
#	CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD ${runtime}"
	CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
	CFLAGS_WARNING="-W3"
	LDFLAGS_DEBUG="-debug:full -debugtype:cv"
	LDFLAGS_OPTIMIZE="-release"
	
	# Specify the CC output file names based on the target name
	CC_OBJNAME="-Fo\[$]@"
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\[$]@')\""

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-subsystem:console"
	LDFLAGS_WINDOW="-subsystem:windows"




    fi
])

#------------------------------------------------------------------------
# SC_WITH_TCL --
#
#	Location of the Tcl build directory.







<



>
>
>


















|






>
>
>
>

>











<




>
|

<



>
>
>















|
|
>
>
>
>







466
467
468
469
470
471
472

473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

521
522
523
524
525
526
527

528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -o \[$]@ ${extra_ldflags}"
	    if test "${ld_supports_shared}" = "yes"; then
	        MAKE_DLL="${MAKE_DLL} -Wl,--out-implib,\$(patsubst %.dll,lib%.a,\[$]@)"
	    else
	        MAKE_DLL="${MAKE_DLL} --output-lib \$(patsubst %.dll,lib%.a,\[$]@)"
	    fi
	    LIBSUFFIX="\${DBGX}.a"

	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="${extra_cflags}"

	CFLAGS_DEBUG=-g
	CFLAGS_OPTIMIZE=-O
	CFLAGS_WARNING="-Wall -Wconversion"
	LDFLAGS_DEBUG=-g
	LDFLAGS_OPTIMIZE=-O

	# Specify the CC output file names based on the target name
	CC_OBJNAME="-o \[$]@"
	CC_EXENAME="-o \[$]@"

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-mconsole ${extra_ldflags}"
	LDFLAGS_WINDOW="-mwindows ${extra_ldflags}"
    else
	SHLIB_LD="link -dll -nologo -incremental:no -link50compat"
	SHLIB_LD_LIBS="user32.lib advapi32.lib"
	LIBS="user32.lib advapi32.lib"
	LIBS_GUI="gdi32.lib comdlg32.lib"
	AR="lib -nologo"
	STLIB_LD="lib -nologo"
	RC="rc"
	RC_OUT=-fo
	RC_TYPE=-r
	RC_INCLUDE=-i
	RES=res
	MAKE_LIB="\${AR} -out:\[$]@"
	POST_MAKE_LIB=
	MAKE_EXE="\${CC} -Fe\[$]@"
	LIBPREFIX=""

	if test "${SHARED_BUILD}" = "0" ; then
	    # static
            AC_MSG_RESULT([using static flags])
	    runtime=-MT
	    MAKE_DLL="echo "
	    LIBSUFFIX="s\${DBGX}.lib"
	    LIBRARIES="\${STATIC_LIBRARIES}"
	    EXESUFFIX="s\${DBGX}.exe"

	else
	    # dynamic
            AC_MSG_RESULT([using shared flags])
	    runtime=-MD
	    # Add SHLIB_LD_LIBS to the Make rule, not here.
	    MAKE_DLL="\${SHLIB_LD} \$(LDFLAGS) -out:\[$]@"
	    LIBSUFFIX="\${DBGX}.lib"

	    EXESUFFIX="\${DBGX}.exe"
	    LIBRARIES="\${SHARED_LIBRARIES}"
	fi
	# DLLSUFFIX is separate because it is the building block for
	# users of tclConfig.sh that may build shared or static.
	DLLSUFFIX="\${DBGX}.dll"

	EXTRA_CFLAGS="-YX"
	CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
#	CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD ${runtime}"
	CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
	CFLAGS_WARNING="-W3"
	LDFLAGS_DEBUG="-debug:full -debugtype:cv"
	LDFLAGS_OPTIMIZE="-release"
	
	# Specify the CC output file names based on the target name
	CC_OBJNAME="-Fo\[$]@"
	CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) \$(PATHTYPE) '\[$]@')\""

	# Specify linker flags depending on the type of app being 
	# built -- Console vs. Window.
	LDFLAGS_CONSOLE="-link -subsystem:console"
	LDFLAGS_WINDOW="-link -subsystem:windows"

	if test "$do64bit" = "yes" ; then
	    EXTRA_CFLAGS="$EXTRA_CFLAGS -DUSE_TCLALLOC=0"
	fi
    fi
])

#------------------------------------------------------------------------
# SC_WITH_TCL --
#
#	Location of the Tcl build directory.
539
540
541
542
543
544
545















































	AC_MSG_ERROR(There is no Makefile in $TCL_BIN_DIR:  perhaps you did not specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?)
    else
	echo "building against Tcl binaries in: $TCL_BIN_DIR"
    fi
    AC_SUBST(TCL_BIN_DIR)
])























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
	AC_MSG_ERROR(There is no Makefile in $TCL_BIN_DIR:  perhaps you did not specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?)
    else
	echo "building against Tcl binaries in: $TCL_BIN_DIR"
    fi
    AC_SUBST(TCL_BIN_DIR)
])

# FIXME : SC_PROG_TCLSH should really look for the installed tclsh and
# not the build version. If we want to use the build version in the
# tk script, it is better to hardcode that!

#------------------------------------------------------------------------
# SC_PROG_TCLSH
#	Locate a tclsh shell in the following directories:
#		${exec_prefix}/bin
#		${prefix}/bin
#		${TCL_BIN_DIR}
#		${TCL_BIN_DIR}/../bin
#		${PATH}
#
# Arguments
#	none
#
# Results
#	Subst's the following values:
#		TCLSH_PROG
#------------------------------------------------------------------------

AC_DEFUN(SC_PROG_TCLSH, [
    AC_MSG_CHECKING([for tclsh])

    AC_CACHE_VAL(ac_cv_path_tclsh, [
	search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'`
	for dir in $search_path ; do
	    for j in `ls -r $dir/tclsh[[8-9]]*.exe 2> /dev/null` \
		    `ls -r $dir/tclsh* 2> /dev/null` ; do
		if test x"$ac_cv_path_tclsh" = x ; then
		    if test -f "$j" ; then
			ac_cv_path_tclsh=$j
			break
		    fi
		fi
	    done
	done
    ])

    if test -f "$ac_cv_path_tclsh" ; then
	TCLSH_PROG=$ac_cv_path_tclsh
	AC_MSG_RESULT($TCLSH_PROG)
    else
	AC_MSG_ERROR(No tclsh found in PATH:  $search_path)
    fi
    AC_SUBST(TCLSH_PROG)
])
Changes to win/tcl.rc.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// RCS: @(#) $Id: tcl.rc,v 1.5 2000/04/18 23:26:45 redman Exp $
//
// Version
//

#define VS_VERSION_INFO 1

#define RESOURCE_INCLUDED
#include <tcl.h>



















LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL



 FILEFLAGS 	0x0L

 FILEOS 	0x4	/* VOS__WINDOWS32 */
 FILETYPE 	0x2	/* VFT_DLL */
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
        BEGIN
            VALUE "FileDescription", "Tcl DLL\0"
            VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".dll\0"
            VALUE "CompanyName", "Scriptics Corporation\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Scriptics Corporation\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END		    
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END







|

|


|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







>
>
>

>
|
|







|
|

|









<
<
<
<
<
<
<
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61







// RCS: @(#) $Id: tcl.rc,v 1.5.2.1 2001/04/03 22:54:39 hobbs Exp $
//
// Version Resource Script
//

#include <winver.h>

#define RESOURCE_INCLUDED
#include <tcl.h>

//
// build-up the name suffix that defines the type of build this is.
//
#ifdef TCL_THREADS
#define SUFFIX_THREADS	    "t"
#else
#define SUFFIX_THREADS	    ""
#endif

#ifdef DEBUG
#define SUFFIX_DEBUG	    "d"
#else
#define SUFFIX_DEBUG	    ""
#endif

#define SUFFIX		    SUFFIX_THREADS SUFFIX_DEBUG


LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL
#ifdef DEBUG
 FILEFLAGS 	VS_FF_DEBUG
#else
 FILEFLAGS 	0x0L
#endif
 FILEOS 	VOS__WINDOWS32
 FILETYPE 	VFT_DLL
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
        BEGIN
            VALUE "FileDescription", "Tcl DLL\0"
            VALUE "OriginalFilename", "tcl" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) SUFFIX ".dll\0"
            VALUE "CompanyName", "Ajuba Solutions\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Ajuba Solutions\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END		    
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END







Changes to win/tclConfig.sh.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
26
27
28
# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.3 1999/07/29 19:21:32 wart Exp $


TCL_SRC_DIR="@TCL_SRC_DIR@"
TCL_LIB_FILE="@TCL_LIB_FILE@"
TCL_DLL_FILE="@TCL_DLL_FILE@"
TCL_STUB_LIB_FILE="@TCL_STUB_LIB_FILE@"




# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'












|

<
<
<

<
<
<
<







1
2
3
4
5
6
7
8
9
10
11
12
13



14




15
16
17
18
19
20
21
# tclConfig.sh --
# 
# This shell script (for sh) is generated automatically by Tcl's
# configure script.  It will create shell variables for most of
# the configuration options discovered by the configure script.
# This script is intended to be included by the configure scripts
# for Tcl extensions so that they don't have to figure this all
# out for themselves.
#
# The information in this file is specific to a single platform.
#
# RCS: @(#) $Id: tclConfig.sh.in,v 1.3.10.2 2000/07/28 07:58:28 mo Exp $




TCL_DLL_FILE="@TCL_DLL_FILE@"





# Tcl's version number.
TCL_VERSION='@TCL_VERSION@'
TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@'
TCL_MINOR_VERSION='@TCL_MINOR_VERSION@'
TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@'

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# String that can be evaluated to generate the part of the export file
# name that comes after the "libxxx" (includes version number, if any,
# extension, and anything else needed).  May depend on the variables
# VERSION.  On most UNIX systems this is ${VERSION}.exp.
TCL_EXPORT_FILE_SUFFIX='@CFG_TCL_EXPORT_FILE_SUFFIX@'

# Additional libraries to use when linking Tcl.
TCL_LIBS='@DL_LIBS@ @LIBS@ @MATH_LIBS@'

# Top-level directory in which Tcl's platform-independent files are
# installed.
TCL_PREFIX='@prefix@'

# Top-level directory in which Tcl's platform-specific files (e.g.
# executables) are installed.







|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# String that can be evaluated to generate the part of the export file
# name that comes after the "libxxx" (includes version number, if any,
# extension, and anything else needed).  May depend on the variables
# VERSION.  On most UNIX systems this is ${VERSION}.exp.
TCL_EXPORT_FILE_SUFFIX='@CFG_TCL_EXPORT_FILE_SUFFIX@'

# Additional libraries to use when linking Tcl.
TCL_LIBS='@LIBS@'

# Top-level directory in which Tcl's platform-independent files are
# installed.
TCL_PREFIX='@prefix@'

# Top-level directory in which Tcl's platform-specific files (e.g.
# executables) are installed.
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a shared library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'








|







71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

# Extra flags to pass to cc:
TCL_EXTRA_CFLAGS='@EXTRA_CFLAGS@'

# Base command to use for combining object files into a shared library:
TCL_SHLIB_LD='@SHLIB_LD@'

# Base command to use for combining object files into a static library:
TCL_STLIB_LD='@STLIB_LD@'

# Either '$LIBS' (if dependent libraries should be included when linking
# shared libraries) or an empty string.  See Tcl's configure.in for more
# explanation.
TCL_SHLIB_LD_LIBS='@SHLIB_LD_LIBS@'

Changes to win/tclWinChan.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinChan.c
 *
 *	Channel drivers for Windows channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinChan.c,v 1.10 2000/04/20 01:30:20 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * State flags used in the info structures below.
 */











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinChan.c
 *
 *	Channel drivers for Windows channels based on files, command
 *	pipes and TCP sockets.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinChan.c,v 1.10.2.2 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * State flags used in the info structures below.
 */
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112




113
114
115
116
117
118
119
			    
/*
 * This structure describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    FileBlockProc,		/* Set blocking or non-blocking mode.*/
    FileCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    FileSeekProc,		/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    FileWatchProc,		/* Set up the notifier to watch the channel. */
    FileGetHandleProc,		/* Get an OS handle from channel. */




};


/*
 *----------------------------------------------------------------------
 *
 * FileInit --







|








>
>
>
>







97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
			    
/*
 * This structure describes the channel type structure for file based IO.
 */

static Tcl_ChannelType fileChannelType = {
    "file",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    FileCloseProc,		/* Close proc. */
    FileInputProc,		/* Input proc. */
    FileOutputProc,		/* Output proc. */
    FileSeekProc,		/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    FileWatchProc,		/* Set up the notifier to watch the channel. */
    FileGetHandleProc,		/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    FileBlockProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};


/*
 *----------------------------------------------------------------------
 *
 * FileInit --
871
872
873
874
875
876
877

878
879
880
881
882

883
884
885
886
887




888
889
890
891
892
893
894
    ClientData rawHandle;	/* OS level handle */
    int mode;			/* ORed combination of TCL_READABLE and
                                 * TCL_WRITABLE to indicate file mode. */
{
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_Channel channel = NULL;
    HANDLE handle = (HANDLE) rawHandle;

    DCB dcb;
    DWORD consoleParams;
    DWORD type;
    TclFile readFile = NULL;
    TclFile writeFile = NULL;


    if (mode == 0) {
	return NULL;
    }





    type = GetFileType(handle);

    /*
     * If the file is a character device, we need to try to figure out
     * whether it is a serial port, a console, or something else.  We
     * test for the console case first because this is more common.
     */







>

|
<


>





>
>
>
>







875
876
877
878
879
880
881
882
883
884

885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
    ClientData rawHandle;	/* OS level handle */
    int mode;			/* ORed combination of TCL_READABLE and
                                 * TCL_WRITABLE to indicate file mode. */
{
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_Channel channel = NULL;
    HANDLE handle = (HANDLE) rawHandle;
    HANDLE dupedHandle;
    DCB dcb;
    DWORD consoleParams, type;

    TclFile readFile = NULL;
    TclFile writeFile = NULL;
    BOOL result;

    if (mode == 0) {
	return NULL;
    }

    /*
     * GetFileType() returns FILE_TYPE_UNKNOWN for invalid handles.
     */

    type = GetFileType(handle);

    /*
     * If the file is a character device, we need to try to figure out
     * whether it is a serial port, a console, or something else.  We
     * test for the console case first because this is more common.
     */
922
923
924
925
926
927
928
929
930
931
932

933
934
935






936








937
938
939

940




941




















942
943
944
945
946
947
948
	    writeFile = TclWinMakeFile(handle);
	}
	channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL);
	break;

    case FILE_TYPE_DISK:
    case FILE_TYPE_CHAR:
    case FILE_TYPE_UNKNOWN:
	channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
	break;
	

    default:
	/*
	 * The handle is of an unknown type, probably /dev/nul equivalent






	 * or possibly a closed handle.








	 */
	
	channel = NULL;

	break;

























    }

    return channel;
}

/*
 *----------------------------------------------------------------------







<



>


|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
|
|
|
>
|
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







931
932
933
934
935
936
937

938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
	    writeFile = TclWinMakeFile(handle);
	}
	channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL);
	break;

    case FILE_TYPE_DISK:
    case FILE_TYPE_CHAR:

	channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
	break;
	
    case FILE_TYPE_UNKNOWN:
    default:
	/*
	 * The handle is of an unknown type.  Test the validity of this OS
	 * handle by duplicating it, then closing the dupe.  The Win32 API
	 * doesn't provide an IsValidHandle() function, so we have to emulate
	 * it here.  This test will not work on a console handle reliably,
	 * which is why we can't test every handle that comes into this
	 * function in this way.
	 */

	result = DuplicateHandle(GetCurrentProcess(), handle,
		GetCurrentProcess(), &dupedHandle, 0, FALSE,
		DUPLICATE_SAME_ACCESS);

	if (result != 0) {
	    /* 
	     * Unable to make a duplicate. It's definately invalid at this
	     * point.
	     */

	    return NULL;
	}

	/*
	 * Use structured exception handling (Win32 SEH) to protect the close
	 * of this duped handle which might throw EXCEPTION_INVALID_HANDLE.
	 */

	__try {
	    CloseHandle(dupedHandle);
	}
	__except (EXCEPTION_EXECUTE_HANDLER) {
	    /*
	     * Definately an invalid handle.  So, therefore, the original
	     * is invalid also.
	     */

	    return NULL;
	}

	/* Fall through, the handle is valid. */

	/*
	 * Create the undefined channel, anyways, because we know the handle
	 * is valid to something.
	 */

	channel = TclWinOpenFileChannel(handle, channelName, mode, 0);
    }

    return channel;
}

/*
 *----------------------------------------------------------------------
966
967
968
969
970
971
972

973
974
975
976
977
978
979
    int type;			/* One of TCL_STDIN, TCL_STDOUT, TCL_STDERR. */
{
    Tcl_Channel channel;
    HANDLE handle;
    int mode;
    char *bufMode;
    DWORD handleId;		/* Standard handle to retrieve. */


    switch (type) {
	case TCL_STDIN:
	    handleId = STD_INPUT_HANDLE;
	    mode = TCL_READABLE;
	    bufMode = "line";
	    break;







>







1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
    int type;			/* One of TCL_STDIN, TCL_STDOUT, TCL_STDERR. */
{
    Tcl_Channel channel;
    HANDLE handle;
    int mode;
    char *bufMode;
    DWORD handleId;		/* Standard handle to retrieve. */


    switch (type) {
	case TCL_STDIN:
	    handleId = STD_INPUT_HANDLE;
	    mode = TCL_READABLE;
	    bufMode = "line";
	    break;
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
    handle = GetStdHandle(handleId);

    /*
     * Note that we need to check for 0 because Windows may return 0 if this
     * is not a console mode application, even though this is not a valid
     * handle.
     */
    
    if ((handle == INVALID_HANDLE_VALUE) || (handle == 0)) {
	return NULL;
    }
    
    channel = Tcl_MakeFileChannel(handle, mode);

    if (channel == NULL) {
	return NULL;
    }

    /*
     * Set up the normal channel options for stdio handles.
     */

    if ((Tcl_SetChannelOption((Tcl_Interp *) NULL, channel, "-translation",







|

|

|



|







1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
    handle = GetStdHandle(handleId);

    /*
     * Note that we need to check for 0 because Windows may return 0 if this
     * is not a console mode application, even though this is not a valid
     * handle.
     */

    if ((handle == INVALID_HANDLE_VALUE) || (handle == 0)) {
	return (Tcl_Channel) NULL;
    }

    channel = Tcl_MakeFileChannel(handle, mode);

    if (channel == NULL) {
	return (Tcl_Channel) NULL;
    }

    /*
     * Set up the normal channel options for stdio handles.
     */

    if ((Tcl_SetChannelOption((Tcl_Interp *) NULL, channel, "-translation",
Changes to win/tclWinConsole.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinConsole.c --
 *
 *	This file implements the Windows-specific console functions,
 *	and the "console" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinConsole.c,v 1.3 1999/07/27 01:42:25 redman Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinConsole.c --
 *
 *	This file implements the Windows-specific console functions,
 *	and the "console" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinConsole.c,v 1.3.10.2 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182




183
184
185
186
187
188
189
				 * pointer. */
} ConsoleEvent;

/*
 * Declarations for functions used only in this file.
 */

static int		ApplicationType(Tcl_Interp *interp,
			    const char *fileName, char *fullName);
static void		BuildCommandLine(const char *executable, int argc, 
			    char **argv, Tcl_DString *linePtr);
static void		CopyChannel(HANDLE dst, HANDLE src);
static BOOL		HasConsole(void);
static TclFile		MakeFile(HANDLE handle);
static char *		MakeTempFile(Tcl_DString *namePtr);
static int		ConsoleBlockModeProc(ClientData instanceData, int mode);
static void		ConsoleCheckProc(ClientData clientData, int flags);
static int		ConsoleCloseProc(ClientData instanceData,
			    Tcl_Interp *interp);
static int		ConsoleEventProc(Tcl_Event *evPtr, int flags);
static void		ConsoleExitHandler(ClientData clientData);
static int		ConsoleGetHandleProc(ClientData instanceData,
			    int direction, ClientData *handlePtr);
static ThreadSpecificData *ConsoleInit(void);
static int		ConsoleInputProc(ClientData instanceData, char *buf,
			    int toRead, int *errorCode);
static int		ConsoleOutputProc(ClientData instanceData, char *buf,
			    int toWrite, int *errorCode);
static DWORD WINAPI	ConsoleReaderThread(LPVOID arg);
static void		ConsoleSetupProc(ClientData clientData, int flags);
static void		ConsoleWatchProc(ClientData instanceData, int mask);
static DWORD WINAPI	ConsoleWriterThread(LPVOID arg);
static void		ProcExitHandler(ClientData clientData);
static int		TempFileName(WCHAR name[MAX_PATH]);
static int		WaitForRead(ConsoleInfo *infoPtr, int blocking);

/*
 * This structure describes the channel type structure for command console
 * based IO.
 */

static Tcl_ChannelType consoleChannelType = {
    "console",			/* Type name. */
    ConsoleBlockModeProc,	/* Set blocking or non-blocking mode.*/
    ConsoleCloseProc,		/* Close proc. */
    ConsoleInputProc,		/* Input proc. */
    ConsoleOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    ConsoleWatchProc,		/* Set up notifier to watch the channel. */
    ConsoleGetHandleProc,	/* Get an OS handle from channel. */




};

/*
 *----------------------------------------------------------------------
 *
 * ConsoleInit --
 *







<
<
<
<
<
<
<
<


















<









|








>
>
>
>







131
132
133
134
135
136
137








138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
				 * pointer. */
} ConsoleEvent;

/*
 * Declarations for functions used only in this file.
 */









static int		ConsoleBlockModeProc(ClientData instanceData, int mode);
static void		ConsoleCheckProc(ClientData clientData, int flags);
static int		ConsoleCloseProc(ClientData instanceData,
			    Tcl_Interp *interp);
static int		ConsoleEventProc(Tcl_Event *evPtr, int flags);
static void		ConsoleExitHandler(ClientData clientData);
static int		ConsoleGetHandleProc(ClientData instanceData,
			    int direction, ClientData *handlePtr);
static ThreadSpecificData *ConsoleInit(void);
static int		ConsoleInputProc(ClientData instanceData, char *buf,
			    int toRead, int *errorCode);
static int		ConsoleOutputProc(ClientData instanceData, char *buf,
			    int toWrite, int *errorCode);
static DWORD WINAPI	ConsoleReaderThread(LPVOID arg);
static void		ConsoleSetupProc(ClientData clientData, int flags);
static void		ConsoleWatchProc(ClientData instanceData, int mask);
static DWORD WINAPI	ConsoleWriterThread(LPVOID arg);
static void		ProcExitHandler(ClientData clientData);

static int		WaitForRead(ConsoleInfo *infoPtr, int blocking);

/*
 * This structure describes the channel type structure for command console
 * based IO.
 */

static Tcl_ChannelType consoleChannelType = {
    "console",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    ConsoleCloseProc,		/* Close proc. */
    ConsoleInputProc,		/* Input proc. */
    ConsoleOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    ConsoleWatchProc,		/* Set up notifier to watch the channel. */
    ConsoleGetHandleProc,	/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    ConsoleBlockModeProc,	/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * ConsoleInit --
 *
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646

    if (infoPtr->readFlags & CONSOLE_BUFFERED) {
	/*
	 * Data is stored in the buffer.
	 */

	if (bufSize < (infoPtr->bytesRead - infoPtr->offset)) {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], bufSize);
	    bytesRead = bufSize;
	    infoPtr->offset += bufSize;
	} else {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], bufSize);
	    bytesRead = infoPtr->bytesRead - infoPtr->offset;

	    /*
	     * Reset the buffer
	     */
	    
	    infoPtr->readFlags &= ~CONSOLE_BUFFERED;







|



|







623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641

    if (infoPtr->readFlags & CONSOLE_BUFFERED) {
	/*
	 * Data is stored in the buffer.
	 */

	if (bufSize < (infoPtr->bytesRead - infoPtr->offset)) {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], (size_t) bufSize);
	    bytesRead = bufSize;
	    infoPtr->offset += bufSize;
	} else {
	    memcpy(buf, &infoPtr->buffer[infoPtr->offset], (size_t) bufSize);
	    bytesRead = infoPtr->bytesRead - infoPtr->offset;

	    /*
	     * Reset the buffer
	     */
	    
	    infoPtr->readFlags &= ~CONSOLE_BUFFERED;
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc(toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.







|

|







721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc((unsigned int) toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, (size_t) toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
	count = 0;

	/* 
	 * Look for data on the console, but first ignore any events
	 * that are not KEY_EVENTs 
	 */
	if (ReadConsole(handle, infoPtr->buffer, CONSOLE_BUFFER_SIZE,
		&infoPtr->bytesRead, NULL) != FALSE) {
	    /*
	     * Data was stored in the buffer.
	     */
	    
	    infoPtr->readFlags |= CONSOLE_BUFFERED;
	} else {
	    DWORD err;







|







1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
	count = 0;

	/* 
	 * Look for data on the console, but first ignore any events
	 * that are not KEY_EVENTs 
	 */
	if (ReadConsole(handle, infoPtr->buffer, CONSOLE_BUFFER_SIZE,
		(LPDWORD) &infoPtr->bytesRead, NULL) != FALSE) {
	    /*
	     * Data was stored in the buffer.
	     */
	    
	    infoPtr->readFlags |= CONSOLE_BUFFERED;
	} else {
	    DWORD err;
Changes to win/tclWinDde.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclWinDde.c --
 *
 *	This file provides procedures that implement the "send"
 *	command, allowing commands to be passed from interpreter
 *	to interpreter.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinDde.c,v 1.5 1999/06/26 22:41:53 redman Exp $
 */

#include "tclPort.h"
#include <ddeml.h>

/*
 * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclWinDde.c --
 *
 *	This file provides procedures that implement the "send"
 *	command, allowing commands to be passed from interpreter
 *	to interpreter.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinDde.c,v 1.5.10.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclPort.h"
#include <ddeml.h>

/*
 * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
MakeDdeConnection(
    Tcl_Interp *interp,		/* Used to report errors. */
    char *name,			/* The connection to use. */
    HCONV *ddeConvPtr)
{
    HSZ ddeTopic, ddeService;
    HCONV ddeConv;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    
    ddeService = DdeCreateStringHandle(ddeInstance, "TclEval", 0);
    ddeTopic = DdeCreateStringHandle(ddeInstance, name, 0);

    ddeConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);
    DdeFreeStringHandle(ddeInstance, ddeService);
    DdeFreeStringHandle(ddeInstance, ddeTopic);







<







729
730
731
732
733
734
735

736
737
738
739
740
741
742
MakeDdeConnection(
    Tcl_Interp *interp,		/* Used to report errors. */
    char *name,			/* The connection to use. */
    HCONV *ddeConvPtr)
{
    HSZ ddeTopic, ddeService;
    HCONV ddeConv;

    
    ddeService = DdeCreateStringHandle(ddeInstance, "TclEval", 0);
    ddeTopic = DdeCreateStringHandle(ddeInstance, name, 0);

    ddeConv = DdeConnect(ddeInstance, ddeService, ddeTopic, NULL);
    DdeFreeStringHandle(ddeInstance, ddeService);
    DdeFreeStringHandle(ddeInstance, ddeTopic);
Changes to win/tclWinError.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinError.c --
 *
 *	This file contains code for converting from Win32 errors to
 *	errno errors.
 *
 * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinError.c,v 1.3 1999/04/16 00:48:08 stanton Exp $
 */

#include "tclWinInt.h"

/*
 * The following table contains the mapping from Win32 errors to
 * errno errors.











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinError.c --
 *
 *	This file contains code for converting from Win32 errors to
 *	errno errors.
 *
 * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinError.c,v 1.3.12.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following table contains the mapping from Win32 errors to
 * errno errors.
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    EINVAL,	/* 120 */
    EINVAL,	/* 121 */
    EINVAL,	/* 122 */
    ENOENT,	/* ERROR_INVALID_NAME		123 */
    EINVAL,	/* 124 */
    EINVAL,	/* 125 */
    EINVAL,	/* 126 */
    ESRCH,	/* ERROR_PROC_NOT_FOUND		127 */
    ECHILD,	/* ERROR_WAIT_NO_CHILDREN	128 */
    ECHILD,	/* ERROR_CHILD_NOT_COMPLETE	129 */
    EBADF,	/* ERROR_DIRECT_ACCESS_HANDLE	130 */
    EINVAL,	/* 131 */
    ESPIPE,	/* ERROR_SEEK_ON_DEVICE		132 */
    EINVAL,	/* 133 */
    EINVAL,	/* 134 */







|







143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    EINVAL,	/* 120 */
    EINVAL,	/* 121 */
    EINVAL,	/* 122 */
    ENOENT,	/* ERROR_INVALID_NAME		123 */
    EINVAL,	/* 124 */
    EINVAL,	/* 125 */
    EINVAL,	/* 126 */
    EINVAL,	/* ERROR_PROC_NOT_FOUND		127 */
    ECHILD,	/* ERROR_WAIT_NO_CHILDREN	128 */
    ECHILD,	/* ERROR_CHILD_NOT_COMPLETE	129 */
    EBADF,	/* ERROR_DIRECT_ACCESS_HANDLE	130 */
    EINVAL,	/* 131 */
    ESPIPE,	/* ERROR_SEEK_ON_DEVICE		132 */
    EINVAL,	/* 133 */
    EINVAL,	/* 134 */
Changes to win/tclWinFCmd.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * tclWinFCmd.c
 *
 *      This file implements the Windows specific portion of file manipulation 
 *      subcommands of the "file" command. 
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFCmd.c,v 1.7 1999/12/09 14:44:11 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following constants specify the type of callback when
 * TraverseWinTree() calls the traverseProc()











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * tclWinFCmd.c
 *
 *      This file implements the Windows specific portion of file manipulation 
 *      subcommands of the "file" command. 
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFCmd.c,v 1.7.2.1 2000/08/07 21:33:02 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following constants specify the type of callback when
 * TraverseWinTree() calls the traverseProc()
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
		return TCL_ERROR;
	    }
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeSrcPath);
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeDstPath);

	    src = Tcl_WinTCharToUtf((TCHAR *) nativeSrcPath, -1, &srcString);
	    dst = Tcl_WinTCharToUtf((TCHAR *) nativeDstPath, -1, &dstString);
	    if (strncmp(src, dst, Tcl_DStringLength(&srcString)) == 0) {
		/*
		 * Trying to move a directory into itself.
		 */

		errno = EINVAL;
		Tcl_DStringFree(&srcString);
		Tcl_DStringFree(&dstString);







|







233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
		return TCL_ERROR;
	    }
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeSrcPath);
	    (*tclWinProcs->charLowerProc)((TCHAR *) nativeDstPath);

	    src = Tcl_WinTCharToUtf((TCHAR *) nativeSrcPath, -1, &srcString);
	    dst = Tcl_WinTCharToUtf((TCHAR *) nativeDstPath, -1, &dstString);
	    if (strncmp(src, dst, (size_t) Tcl_DStringLength(&srcString)) == 0) {
		/*
		 * Trying to move a directory into itself.
		 */

		errno = EINVAL;
		Tcl_DStringFree(&srcString);
		Tcl_DStringFree(&dstString);
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
    return result;
}

static int
DoCreateDirectory(
    Tcl_DString *pathPtr)	/* Pathname of directory to create (native). */
{
    int error;
    CONST TCHAR *nativePath;

    nativePath = (TCHAR *) Tcl_DStringValue(pathPtr);
    if ((*tclWinProcs->createDirectoryProc)(nativePath, NULL) == 0) {
	error = GetLastError();
	TclWinConvertError(error);
	return TCL_ERROR;







|







654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
    return result;
}

static int
DoCreateDirectory(
    Tcl_DString *pathPtr)	/* Pathname of directory to create (native). */
{
    DWORD error;
    CONST TCHAR *nativePath;

    nativePath = (TCHAR *) Tcl_DStringValue(pathPtr);
    if ((*tclWinProcs->createDirectoryProc)(nativePath, NULL) == 0) {
	error = GetLastError();
	TclWinConvertError(error);
	return TCL_ERROR;
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
    Tcl_DStringFree(&ds);

    if (result == 0xffffffff) {
	StatError(interp, fileName);
	return TCL_ERROR;
    }

    *attributePtrPtr = Tcl_NewBooleanObj(result & attributeArray[objIndex]);
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * ConvertFileNameFormat --







|







1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
    Tcl_DStringFree(&ds);

    if (result == 0xffffffff) {
	StatError(interp, fileName);
	return TCL_ERROR;
    }

    *attributePtrPtr = Tcl_NewBooleanObj((int) (result & attributeArray[objIndex]));
    return TCL_OK;
}

/*
 *----------------------------------------------------------------------
 *
 * ConvertFileNameFormat --
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
	     * but does complain about the second.
	     *
	     *	fprintf(stderr, "%d\n", data.w.cAlternateFileName[0]);
	     *	fprintf(stderr, "%d\n", ((WCHAR *) nativeName)[0]);
	     */

	    Tcl_WinTCharToUtf(nativeName, -1, &ds);
	    newv[i] = ckalloc(Tcl_DStringLength(&ds) + 1);
	    lstrcpyA(newv[i], Tcl_DStringValue(&ds));
	    Tcl_DStringFree(&ds);
	    FindClose(handle);
	}
    }

    Tcl_DStringInit(&resultDString);







|







1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
	     * but does complain about the second.
	     *
	     *	fprintf(stderr, "%d\n", data.w.cAlternateFileName[0]);
	     *	fprintf(stderr, "%d\n", ((WCHAR *) nativeName)[0]);
	     */

	    Tcl_WinTCharToUtf(nativeName, -1, &ds);
	    newv[i] = ckalloc((unsigned int) (Tcl_DStringLength(&ds) + 1));
	    lstrcpyA(newv[i], Tcl_DStringValue(&ds));
	    Tcl_DStringFree(&ds);
	    FindClose(handle);
	}
    }

    Tcl_DStringInit(&resultDString);
Changes to win/tclWinFile.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclWinFile.c --
 *
 *      This file contains temporary wrappers around UNIX file handling
 *      functions. These wrappers map the UNIX functions to Win32 HANDLE-style
 *      files, which can be manipulated through the Win32 console redirection
 *      interfaces.
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFile.c,v 1.7 1999/12/12 22:46:51 hobbs Exp $
 */

#include "tclWinInt.h"
#include <sys/stat.h>
#include <shlobj.h>
#include <lmaccess.h>		/* For TclpGetUserHome(). */














|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
 * tclWinFile.c --
 *
 *      This file contains temporary wrappers around UNIX file handling
 *      functions. These wrappers map the UNIX functions to Win32 HANDLE-style
 *      files, which can be manipulated through the Win32 console redirection
 *      interfaces.
 *
 * Copyright (c) 1995-1998 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinFile.c,v 1.7.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"
#include <sys/stat.h>
#include <shlobj.h>
#include <lmaccess.h>		/* For TclpGetUserHome(). */

322
323
324
325
326
327
328
329





330

331
332
333
334
335

336
337
338
339
340
341
342

	name = Tcl_WinTCharToUtf(nativeMatchResult, -1, &ds);
	Tcl_DStringAppend(dirPtr, name, -1);
	Tcl_DStringFree(&ds);

	fname = Tcl_DStringValue(dirPtr);
	nativeName = Tcl_WinUtfToTChar(fname, Tcl_DStringLength(dirPtr), &ds);
	attr = (*tclWinProcs->getFileAttributesProc)(nativeName);





	Tcl_DStringFree(&ds);


	if (tail == NULL) {
	    int typeOk = 1;
	    if (types != NULL) {
		if (types->perm != 0) {

		    if (
			((types->perm & TCL_GLOB_PERM_RONLY) &&
				!(attr & FILE_ATTRIBUTE_READONLY)) ||
			((types->perm & TCL_GLOB_PERM_HIDDEN) &&
				!(attr & FILE_ATTRIBUTE_HIDDEN)) ||
			((types->perm & TCL_GLOB_PERM_R) &&
				(TclpAccess(fname, R_OK) != 0)) ||







|
>
>
>
>
>
|
>





>







322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349

	name = Tcl_WinTCharToUtf(nativeMatchResult, -1, &ds);
	Tcl_DStringAppend(dirPtr, name, -1);
	Tcl_DStringFree(&ds);

	fname = Tcl_DStringValue(dirPtr);
	nativeName = Tcl_WinUtfToTChar(fname, Tcl_DStringLength(dirPtr), &ds);

	/*
	 * 'attr' represents the attributes of the file, but we only
	 * want to retrieve this info if it is absolutely necessary
	 * because it is an expensive call.
	 */

	attr = 0;

	if (tail == NULL) {
	    int typeOk = 1;
	    if (types != NULL) {
		if (types->perm != 0) {
		    attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
		    if (
			((types->perm & TCL_GLOB_PERM_RONLY) &&
				!(attr & FILE_ATTRIBUTE_READONLY)) ||
			((types->perm & TCL_GLOB_PERM_HIDDEN) &&
				!(attr & FILE_ATTRIBUTE_HIDDEN)) ||
			((types->perm & TCL_GLOB_PERM_R) &&
				(TclpAccess(fname, R_OK) != 0)) ||
385
386
387
388
389
390
391


392
393
394
395
396
397
398







399
400
401
402
403
404
405
		    }
		}		
	    } 
	    if (typeOk) {
		Tcl_ListObjAppendElement(interp, resultPtr, 
			Tcl_NewStringObj(fname, Tcl_DStringLength(dirPtr)));
	    }


	} else if (attr & FILE_ATTRIBUTE_DIRECTORY) {
	    Tcl_DStringAppend(dirPtr, "/", 1);
	    result = TclDoGlob(interp, separators, dirPtr, tail, types);
	    if (result != TCL_OK) {
		break;
	    }
	}







	Tcl_DStringSetLength(dirPtr, dirLength);
    }

    FindClose(handle);
    Tcl_DStringFree(&dirString);
    Tcl_DStringFree(&patternString);








>
>
|
|
|
|
|
|
|
>
>
>
>
>
>
>







392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
		    }
		}		
	    } 
	    if (typeOk) {
		Tcl_ListObjAppendElement(interp, resultPtr, 
			Tcl_NewStringObj(fname, Tcl_DStringLength(dirPtr)));
	    }
	} else {
	    attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
	    if (attr & FILE_ATTRIBUTE_DIRECTORY) {
		Tcl_DStringAppend(dirPtr, "/", 1);
		result = TclDoGlob(interp, separators, dirPtr, tail, types);
		if (result != TCL_OK) {
		    break;
		}
	    }
	}
	/*
	 * Free ds here to ensure that nativeName is valid above.
	 */

	Tcl_DStringFree(&ds);

	Tcl_DStringSetLength(dirPtr, dirLength);
    }

    FindClose(handle);
    Tcl_DStringFree(&dirString);
    Tcl_DStringFree(&patternString);

Changes to win/tclWinInit.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
 * tclWinInit.c --
 *
 *	Contains the Windows-specific interpreter initialization functions.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclWinInit.c,v 1.22 2000/03/31 08:52:31 hobbs Exp $
 */

#include "tclWinInt.h"
#include <winreg.h>
#include <winnt.h>
#include <winbase.h>










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
 * tclWinInit.c --
 *
 *	Contains the Windows-specific interpreter initialization functions.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 * All rights reserved.
 *
 * RCS: @(#) $Id: tclWinInit.c,v 1.22.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"
#include <winreg.h>
#include <winnt.h>
#include <winbase.h>

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     
    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 1) {
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 1) {
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);







|






|






|






|






|






|







244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
     *		(e.g. /usr/src/tcl8.2/unix/../../tcl8.2/library)
     *	<bindir>/../../../<devlopLib>
     *		(e.g. /usr/src/tcl8.2/unix/solaris-sparc/../../../tcl8.2/library)
     */
     
    if (path != NULL) {
	Tcl_SplitPath(path, &pathc, &pathv);
	if (pathc > 2) {
	    pathv[pathc - 2] = installLib;
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = installLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 2) {
	    pathv[pathc - 2] = "library";
	    path = Tcl_JoinPath(pathc - 1, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = "library";
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 3) {
	    pathv[pathc - 3] = developLib;
	    path = Tcl_JoinPath(pathc - 2, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	if (pathc > 4) {
	    pathv[pathc - 4] = developLib;
	    path = Tcl_JoinPath(pathc - 3, pathv, &ds);
	    objPtr = Tcl_NewStringObj(path, Tcl_DStringLength(&ds));
	    Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
	    Tcl_DStringFree(&ds);
	}
	ckfree((char *) pathv);
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
    /*
     * Initialize the user name from the environment first, since this is much
     * faster than asking the system.
     */

    Tcl_DStringSetLength(&ds, 100);
    if (TclGetEnv("USERNAME", &ds) == NULL) {
	if (GetUserName(Tcl_DStringValue(&ds), &Tcl_DStringLength(&ds)) == 0) {
	    Tcl_DStringSetLength(&ds, 0);
	}
    }
    Tcl_SetVar2(interp, "tcl_platform", "user", Tcl_DStringValue(&ds),
	    TCL_GLOBAL_ONLY);
    Tcl_DStringFree(&ds);
}







|







618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
    /*
     * Initialize the user name from the environment first, since this is much
     * faster than asking the system.
     */

    Tcl_DStringSetLength(&ds, 100);
    if (TclGetEnv("USERNAME", &ds) == NULL) {
	if (GetUserName(Tcl_DStringValue(&ds), (LPDWORD) &Tcl_DStringLength(&ds)) == 0) {
	    Tcl_DStringSetLength(&ds, 0);
	}
    }
    Tcl_SetVar2(interp, "tcl_platform", "user", Tcl_DStringValue(&ds),
	    TCL_GLOBAL_ONLY);
    Tcl_DStringFree(&ds);
}
Changes to win/tclWinInt.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclWinInt.h --
 *
 *	Declarations of Windows-specific shared variables and procedures.
 *
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinInt.h,v 1.8 1999/08/03 18:07:15 redman Exp $
 */

#ifndef _TCLWININT
#define _TCLWININT

#ifndef _TCLINT
#include "tclInt.h"










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * tclWinInt.h --
 *
 *	Declarations of Windows-specific shared variables and procedures.
 *
 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinInt.h,v 1.8.10.1 2001/04/03 22:54:39 hobbs Exp $
 */

#ifndef _TCLWININT
#define _TCLWININT

#ifndef _TCLINT
#include "tclInt.h"
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
    DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *, 
	    CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
    BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
    BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
} TclWinProcs;

EXTERN TclWinProcs *tclWinProcs;
EXTERN Tcl_Encoding tclWinTCharEncoding;

/*
 * Declarations of functions that are not accessible by way of the
 * stubs table.
 */

EXTERN void		TclWinInit(HINSTANCE hInst);







<







88
89
90
91
92
93
94

95
96
97
98
99
100
101
    DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *, 
	    CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
    BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
    BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
} TclWinProcs;

EXTERN TclWinProcs *tclWinProcs;


/*
 * Declarations of functions that are not accessible by way of the
 * stubs table.
 */

EXTERN void		TclWinInit(HINSTANCE hInst);
Changes to win/tclWinLoad.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclWinLoad.c --
 *
 *	This procedure provides a version of the TclLoadFile that
 *	works with the Windows "LoadLibrary" and "GetProcAddress"
 *	API for dynamic loading.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinLoad.c,v 1.5 2000/02/10 09:53:57 hobbs Exp $
 */

#include "tclWinInt.h"


/*
 *----------------------------------------------------------------------












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
 * tclWinLoad.c --
 *
 *	This procedure provides a version of the TclLoadFile that
 *	works with the Windows "LoadLibrary" and "GetProcAddress"
 *	API for dynamic loading.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinLoad.c,v 1.5.2.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"


/*
 *----------------------------------------------------------------------
83
84
85
86
87
88
89
90
91




92
93
94
95
96
97
98
	 * just about any problem, but it's better than nothing.  It'd be
	 * even better if there was a way to get what DLLs
	 */
	switch (lastError) {
	    case ERROR_MOD_NOT_FOUND:
	    case ERROR_DLL_NOT_FOUND:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" could not be found in library path", (char *)
			NULL);




		break;
	    case ERROR_INVALID_DLL:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" is damaged", (char *) NULL);
		break;
	    case ERROR_DLL_INIT_FAILED:
		Tcl_AppendResult(interp, "the library initialization",







|
|
>
>
>
>







83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
	 * just about any problem, but it's better than nothing.  It'd be
	 * even better if there was a way to get what DLLs
	 */
	switch (lastError) {
	    case ERROR_MOD_NOT_FOUND:
	    case ERROR_DLL_NOT_FOUND:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" could not be found in library path",
			(char *) NULL);
		break;
	    case ERROR_PROC_NOT_FOUND:
		Tcl_AppendResult(interp, "could not find specified procedure",
			(char *) NULL);
		break;
	    case ERROR_INVALID_DLL:
		Tcl_AppendResult(interp, "this library or a dependent library",
			" is damaged", (char *) NULL);
		break;
	    case ERROR_DLL_INIT_FAILED:
		Tcl_AppendResult(interp, "the library initialization",
Changes to win/tclWinNotify.c.
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
26
27
28
29
30
31
/* 
 * tclWinNotify.c --
 *
 *	This file contains Windows-specific procedures for the notifier,
 *	which is the lowest-level part of the Tcl event loop.  This file
 *	works together with ../generic/tclNotify.c.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinNotify.c,v 1.5 1999/07/02 22:08:28 redman Exp $
 */

#include "tclWinInt.h"
#include <winsock.h>

/*
 * The follwing static indicates whether this module has been initialized.
 */

static int initialized = 0;

#define INTERVAL_TIMER 1	/* Handle of interval timer. */

#define WM_WAKEUP WM_USER	/* Message that is send by
				 * Tcl_AlertNotifier. */
/*
 * The following static structure contains the state information for the
 * Windows implementation of the Tcl notifier.  One of these structures












|





<
<
<
<
<
<







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
/* 
 * tclWinNotify.c --
 *
 *	This file contains Windows-specific procedures for the notifier,
 *	which is the lowest-level part of the Tcl event loop.  This file
 *	works together with ../generic/tclNotify.c.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinNotify.c,v 1.5.10.1 2001/04/03 22:54:39 hobbs Exp $
 */

#include "tclWinInt.h"
#include <winsock.h>







#define INTERVAL_TIMER 1	/* Handle of interval timer. */

#define WM_WAKEUP WM_USER	/* Message that is send by
				 * Tcl_AlertNotifier. */
/*
 * The following static structure contains the state information for the
 * Windows implementation of the Tcl notifier.  One of these structures
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
	result = GetMessage(&msg, NULL, 0, 0);
	if (result == 0) {
	    /*
	     * We received a request to exit this thread (WM_QUIT), so
	     * propagate the quit message and start unwinding.
	     */

	    PostQuitMessage(msg.wParam);
	    status = -1;
	} else if (result == -1) {
	    /*
	     * We got an error from the system.  I have no idea why this would
	     * happen, so we'll just unwind.
	     */








|







458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
	result = GetMessage(&msg, NULL, 0, 0);
	if (result == 0) {
	    /*
	     * We received a request to exit this thread (WM_QUIT), so
	     * propagate the quit message and start unwinding.
	     */

	    PostQuitMessage((int) msg.wParam);
	    status = -1;
	} else if (result == -1) {
	    /*
	     * We got an error from the system.  I have no idea why this would
	     * happen, so we'll just unwind.
	     */

Changes to win/tclWinPipe.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinPipe.c --
 *
 *	This file implements the Windows-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1996-1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPipe.c,v 1.11 2000/04/11 21:42:12 ericm Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>











|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 
 * tclWinPipe.c --
 *
 *	This file implements the Windows-specific exec pipeline functions,
 *	the "pipe" channel driver, and the "pid" Tcl command.
 *
 * Copyright (c) 1996-1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPipe.c,v 1.11.2.3 2001/07/17 01:45:42 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
120
121
122
123
124
125
126


127
128
129
130
131
132
133
				 * input. */
    HANDLE startWriter;		/* Auto-reset event used by the main thread to
				 * signal when the writer thread should attempt
				 * to write to the pipe. */
    HANDLE startReader;		/* Auto-reset event used by the main thread to
				 * signal when the reader thread should attempt
				 * to read from the pipe. */


    DWORD writeError;		/* An error caused by the last background
				 * write.  Set to 0 if no error has been
				 * detected.  This word is shared with the
				 * writer thread so access must be
				 * synchronized with the writable object.
				 */
    char *writeBuf;		/* Current background output buffer.







>
>







120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
				 * input. */
    HANDLE startWriter;		/* Auto-reset event used by the main thread to
				 * signal when the writer thread should attempt
				 * to write to the pipe. */
    HANDLE startReader;		/* Auto-reset event used by the main thread to
				 * signal when the reader thread should attempt
				 * to read from the pipe. */
    HANDLE stopReader;		/* Manual-reset event used to alert the reader
				 * thread to fall-out and exit */
    DWORD writeError;		/* An error caused by the last background
				 * write.  Set to 0 if no error has been
				 * detected.  This word is shared with the
				 * writer thread so access must be
				 * synchronized with the writable object.
				 */
    char *writeBuf;		/* Current background output buffer.
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221



222
223
224
225
226
227
228
/*
 * This structure describes the channel type structure for command pipe
 * based IO.
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",			/* Type name. */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    TCL_CLOSE2PROC,		/* Close proc. */
    PipeInputProc,		/* Input proc. */
    PipeOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    PipeWatchProc,		/* Set up notifier to watch the channel. */
    PipeGetHandleProc,		/* Get an OS handle from channel. */
    PipeClose2Proc



};

/*
 *----------------------------------------------------------------------
 *
 * PipeInit --
 *







|








|
>
>
>







207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/*
 * This structure describes the channel type structure for command pipe
 * based IO.
 */

static Tcl_ChannelType pipeChannelType = {
    "pipe",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TCL_CLOSE2PROC,		/* Close proc. */
    PipeInputProc,		/* Input proc. */
    PipeOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    NULL,			/* Get option proc. */
    PipeWatchProc,		/* Set up notifier to watch the channel. */
    PipeGetHandleProc,		/* Get an OS handle from channel. */
    PipeClose2Proc,		/* close2proc */
    PipeBlockModeProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * PipeInit --
 *
826
827
828
829
830
831
832

833
834
835
836
837
838
839
840
	     * stdio of another.
	     */

	    if (!TclInExit() 
		    || ((GetStdHandle(STD_INPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_OUTPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_ERROR_HANDLE) != filePtr->handle))) {

		if (CloseHandle(filePtr->handle) == FALSE) {
		    TclWinConvertError(GetLastError());
		    ckfree((char *) filePtr);
		    return -1;
		}
	    }
	    break;








>
|







831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
	     * stdio of another.
	     */

	    if (!TclInExit() 
		    || ((GetStdHandle(STD_INPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_OUTPUT_HANDLE) != filePtr->handle)
			    && (GetStdHandle(STD_ERROR_HANDLE) != filePtr->handle))) {
		if (filePtr->handle != NULL &&
			CloseHandle(filePtr->handle) == FALSE) {
		    TclWinConvertError(GetLastError());
		    ckfree((char *) filePtr);
		    return -1;
		}
	    }
	    break;

1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
     * using ab~1.def instead of "a b.default").  
     */

    BuildCommandLine(execPath, argc, argv, &cmdLine);

    if ((*tclWinProcs->createProcessProc)(NULL, 
	    (TCHAR *) Tcl_DStringValue(&cmdLine), NULL, NULL, TRUE, 
	    createFlags, NULL, NULL, &startInfo, &procInfo) == 0) {
	TclWinConvertError(GetLastError());
	Tcl_AppendResult(interp, "couldn't execute \"", argv[0],
		"\": ", Tcl_PosixError(interp), (char *) NULL);
	goto end;
    }

    /*







|







1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
     * using ab~1.def instead of "a b.default").  
     */

    BuildCommandLine(execPath, argc, argv, &cmdLine);

    if ((*tclWinProcs->createProcessProc)(NULL, 
	    (TCHAR *) Tcl_DStringValue(&cmdLine), NULL, NULL, TRUE, 
	    (DWORD) createFlags, NULL, NULL, &startInfo, &procInfo) == 0) {
	TclWinConvertError(GetLastError());
	Tcl_AppendResult(interp, "couldn't execute \"", argv[0],
		"\": ", Tcl_PosixError(interp), (char *) NULL);
	goto end;
    }

    /*
1565
1566
1567
1568
1569
1570
1571

1572
1573
1574
1575
1576
1577
1578
	    special++;
	}
	Tcl_DStringAppend(&ds, start, special - start);
	if (quote) {
	    Tcl_DStringAppend(&ds, "\"", 1);
	}
    }

    Tcl_WinUtfToTChar(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds), linePtr);
    Tcl_DStringFree(&ds);
}

/*
 *----------------------------------------------------------------------
 *







>







1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
	    special++;
	}
	Tcl_DStringAppend(&ds, start, special - start);
	if (quote) {
	    Tcl_DStringAppend(&ds, "\"", 1);
	}
    }
    Tcl_DStringFree(linePtr);
    Tcl_WinUtfToTChar(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds), linePtr);
    Tcl_DStringFree(&ds);
}

/*
 *----------------------------------------------------------------------
 *
1641
1642
1643
1644
1645
1646
1647

1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
    if (readFile != NULL) {
	/*
	 * Start the background reader thread.
	 */

	infoPtr->readable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startReader = CreateEvent(NULL, FALSE, FALSE, NULL);

	infoPtr->readThread = CreateThread(NULL, 8000, PipeReaderThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_READABLE;
    } else {
	infoPtr->readThread = 0;
    }
    if (writeFile != NULL) {
	/*
	 * Start the background writeer thwrite.
	 */

	infoPtr->writable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startWriter = CreateEvent(NULL, FALSE, FALSE, NULL);
	infoPtr->writeThread = CreateThread(NULL, 8000, PipeWriterThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_WRITABLE;
    }

    /*
     * For backward compatibility with previous versions of Tcl, we







>
|








|




|







1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
    if (readFile != NULL) {
	/*
	 * Start the background reader thread.
	 */

	infoPtr->readable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startReader = CreateEvent(NULL, FALSE, FALSE, NULL);
	infoPtr->stopReader = CreateEvent(NULL, TRUE, FALSE, NULL);
	infoPtr->readThread = CreateThread(NULL, 512, PipeReaderThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_READABLE;
    } else {
	infoPtr->readThread = 0;
    }
    if (writeFile != NULL) {
	/*
	 * Start the background writer thread.
	 */

	infoPtr->writable = CreateEvent(NULL, TRUE, TRUE, NULL);
	infoPtr->startWriter = CreateEvent(NULL, FALSE, FALSE, NULL);
	infoPtr->writeThread = CreateThread(NULL, 512, PipeWriterThread,
		infoPtr, 0, &id);
	SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); 
        infoPtr->validMask |= TCL_WRITABLE;
    }

    /*
     * For backward compatibility with previous versions of Tcl, we
1800
1801
1802
1803
1804
1805
1806

1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820

1821

1822



1823


1824

1825


1826
1827
1828
1829
1830

1831




1832
1833






1834
1835






1836

1837
1838


1839
1840
1841

1842
1843
1844
1845
1846
1847
1848
    int flags)			/* Flags that indicate which side to close. */
{
    PipeInfo *pipePtr = (PipeInfo *) instanceData;
    Tcl_Channel errChan;
    int errorCode, result;
    PipeInfo *infoPtr, **nextPtrPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);


    errorCode = 0;
    if ((!flags || (flags == TCL_CLOSE_READ))
	    && (pipePtr->readFile != NULL)) {
	/*
	 * Clean up the background thread if necessary.  Note that this
	 * must be done before we can close the file, since the 
	 * thread may be blocking trying to read from the pipe.
	 */

	if (pipePtr->readThread) {
	    /*
	     * Forcibly terminate the background thread.  We cannot rely on the
	     * thread to cleanly terminate itself because we have no way of

	     * closing the pipe handle without blocking in the case where the

	     * thread is in the middle of an I/O operation.  Note that we need



	     * to guard against terminating the thread while it is in the


	     * middle of Tcl_ThreadAlert because it won't be able to release

	     * the notifier lock.


	     */

	    Tcl_MutexLock(&pipeMutex);
	    TerminateThread(pipePtr->readThread, 0);


	    /*




	     * Wait for the thread to terminate.  This ensures that we are
	     * completely cleaned up before we leave this function. 






	     */







	    WaitForSingleObject(pipePtr->readThread, INFINITE);

	    Tcl_MutexUnlock(&pipeMutex);



	    CloseHandle(pipePtr->readThread);
	    CloseHandle(pipePtr->readable);
	    CloseHandle(pipePtr->startReader);

	    pipePtr->readThread = NULL;
	}
	if (TclpCloseFile(pipePtr->readFile) != 0) {
	    errorCode = errno;
	}
	pipePtr->validMask &= ~TCL_READABLE;
	pipePtr->readFile = NULL;







>












|
|
>
|
>
|
>
>
>
|
>
>
|
>
|
>
>
|

|
|

>
|
>
>
>
>
|
<
>
>
>
>
>
>
|

>
>
>
>
>
>
|
>
|
|
>
>



>







1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856

1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
    int flags)			/* Flags that indicate which side to close. */
{
    PipeInfo *pipePtr = (PipeInfo *) instanceData;
    Tcl_Channel errChan;
    int errorCode, result;
    PipeInfo *infoPtr, **nextPtrPtr;
    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
    DWORD exitCode;

    errorCode = 0;
    if ((!flags || (flags == TCL_CLOSE_READ))
	    && (pipePtr->readFile != NULL)) {
	/*
	 * Clean up the background thread if necessary.  Note that this
	 * must be done before we can close the file, since the 
	 * thread may be blocking trying to read from the pipe.
	 */

	if (pipePtr->readThread) {
	    /*
	     * The thread may already have closed on it's own.  Check it's
	     * exit code.
	     */

	    GetExitCodeThread(pipePtr->readThread, &exitCode);

	    if (exitCode == STILL_ACTIVE) {
		/*
		 * Set the stop event so that if the reader thread is blocked
		 * in PipeReaderThread on WaitForMultipleEvents, it will exit
		 * cleanly.
		 */

		SetEvent(pipePtr->stopReader);

		/*
		 * Wait at most 10 milliseconds for the reader thread to close.
		 */

		WaitForSingleObject(pipePtr->readThread, 10);
		GetExitCodeThread(pipePtr->readThread, &exitCode);

		if (exitCode == STILL_ACTIVE) {
		    /*
		     * The thread must be blocked waiting for the pipe to
		     * become readable in ReadFile().  There isn't a clean way
		     * to exit the thread from this condition.  We should
		     * terminate the child process instead to get the reader
		     * thread to fall out of ReadFile with a FALSE.  (below) is

		     * not the correct way to do this, but will stay here until
		     * a better solution is found.
		     *
		     * Note that we need to guard against terminating the
		     * thread while it is in the middle of Tcl_ThreadAlert
		     * because it won't be able to release the notifier lock.
		     */

		    Tcl_MutexLock(&pipeMutex);

		    /* BUG: this leaks memory */
		    TerminateThread(pipePtr->readThread, 0);

		    /* Wait for the thread to terminate. */
		    WaitForSingleObject(pipePtr->readThread, INFINITE);

		    Tcl_MutexUnlock(&pipeMutex);
		}
	    }

	    CloseHandle(pipePtr->readThread);
	    CloseHandle(pipePtr->readable);
	    CloseHandle(pipePtr->startReader);
	    CloseHandle(pipePtr->stopReader);
	    pipePtr->readThread = NULL;
	}
	if (TclpCloseFile(pipePtr->readFile) != 0) {
	    errorCode = errno;
	}
	pipePtr->validMask &= ~TCL_READABLE;
	pipePtr->readFile = NULL;
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc(toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.







|

|







2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
	     * Reallocate the buffer to be large enough to hold the data.
	     */

	    if (infoPtr->writeBuf) {
		ckfree(infoPtr->writeBuf);
	    }
	    infoPtr->writeBufLen = toWrite;
	    infoPtr->writeBuf = ckalloc((unsigned int) toWrite);
	}
	memcpy(infoPtr->writeBuf, buf, (size_t) toWrite);
	infoPtr->toWrite = toWrite;
	ResetEvent(infoPtr->writable);
	SetEvent(infoPtr->startWriter);
	bytesWritten = toWrite;
    } else {
	/*
	 * In the blocking case, just try to write the buffer directly.
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
Tcl_Pid
Tcl_WaitPid(
    Tcl_Pid pid,
    int *statPtr,
    int options)
{
    ProcInfo *infoPtr, **prevPtrPtr;
    int flags;
    Tcl_Pid result;
    DWORD ret;

    PipeInit();

    /*
     * If no pid is specified, do nothing.







|







2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
Tcl_Pid
Tcl_WaitPid(
    Tcl_Pid pid,
    int *statPtr,
    int options)
{
    ProcInfo *infoPtr, **prevPtrPtr;
    DWORD flags;
    Tcl_Pid result;
    DWORD ret;

    PipeInit();

    /*
     * If no pid is specified, do nothing.
2655
2656
2657
2658
2659
2660
2661
2662


2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673


2674
2675
2676
2677

2678
2679

2680








2681
2682
2683
2684
2685
2686
2687
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Signals the main thread when input become available.  May
 *	cause the main thread to wake up by posting a message.  May
 *	consume one byte from the pipe for each wait operation.


 *
 *----------------------------------------------------------------------
 */

static DWORD WINAPI
PipeReaderThread(LPVOID arg)
{
    PipeInfo *infoPtr = (PipeInfo *)arg;
    HANDLE *handle = ((WinFile *) infoPtr->readFile)->handle;
    DWORD count, err;
    int done = 0;



    while (!done) {
	/*
	 * Wait for the main thread to signal before attempting to wait.

	 */


	WaitForSingleObject(infoPtr->startReader, INFINITE);









	/*
	 * Try waiting for 0 bytes.  This will block until some data is
	 * available on NT, but will return immediately on Win 95.  So,
	 * if no data is available after the first read, we block until
	 * we can read a single byte off of the pipe.
	 */







|
>
>











>
>



|
>


>
|
>
>
>
>
>
>
>
>







2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Signals the main thread when input become available.  May
 *	cause the main thread to wake up by posting a message.  May
 *	consume one byte from the pipe for each wait operation.  Will
 *	cause a memory leak of ~4k, if forcefully terminated with
 *	TerminateThread().
 *
 *----------------------------------------------------------------------
 */

static DWORD WINAPI
PipeReaderThread(LPVOID arg)
{
    PipeInfo *infoPtr = (PipeInfo *)arg;
    HANDLE *handle = ((WinFile *) infoPtr->readFile)->handle;
    DWORD count, err;
    int done = 0;
    HANDLE wEvents[2] = {infoPtr->stopReader, infoPtr->startReader};
    DWORD dwWait;

    while (!done) {
	/*
	 * Wait for the main thread to signal before attempting to wait
	 * on the pipe becoming readable.
	 */

	dwWait = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE);

	if (dwWait != (WAIT_OBJECT_0 + 1)) {
	    /*
	     * The start event was not signaled.  It might be the stop event
	     * or an error, so exit.
	     */

	    return 0;
	}

	/*
	 * Try waiting for 0 bytes.  This will block until some data is
	 * available on NT, but will return immediately on Win 95.  So,
	 * if no data is available after the first read, we block until
	 * we can read a single byte off of the pipe.
	 */
Changes to win/tclWinPort.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * tclWinPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between Windows and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPort.h,v 1.12 2000/03/31 08:52:31 hobbs Exp $
 */

#ifndef _TCLWINPORT
#define _TCLWINPORT

#ifndef _TCLINT
#   include "tclInt.h"












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * tclWinPort.h --
 *
 *	This header file handles porting issues that occur because of
 *	differences between Windows and Unix. It should be the only
 *	file that contains #ifdefs to handle different flavors of OS.
 *
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinPort.h,v 1.12.2.1 2001/04/03 22:54:40 hobbs Exp $
 */

#ifndef _TCLWINPORT
#define _TCLWINPORT

#ifndef _TCLINT
#   include "tclInt.h"
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <sys/stat.h>
#include <sys/timeb.h>
#include <sys/utime.h>
#endif

#include <tchar.h>
#include <time.h>
#include <winsock2.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS







|







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <sys/stat.h>
#include <sys/timeb.h>
#include <sys/utime.h>
#endif

#include <tchar.h>
#include <time.h>
#include <winsock.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN

#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
Changes to win/tclWinReg.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclWinReg.c --
 *
 *	This file contains the implementation of the "registry" Tcl
 *	built-in command.  This command is built as a dynamically
 *	loadable extension in a separate DLL.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinReg.c,v 1.11 2000/03/31 08:52:32 hobbs Exp $
 */

#include <tclPort.h>
#include <stdlib.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclWinReg.c --
 *
 *	This file contains the implementation of the "registry" Tcl
 *	built-in command.  This command is built as a dynamically
 *	loadable extension in a separate DLL.
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 * Copyright (c) 1998-1999 by Scriptics Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinReg.c,v 1.11.2.1 2001/04/03 22:54:40 hobbs Exp $
 */

#include <tclPort.h>
#include <stdlib.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
    Tcl_DString buf;

    /*
     * Find the parent of the key being deleted and open it.
     */

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc(length + 1);
    strcpy(buffer, keyName);

    if (ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName)
	    != TCL_OK) {
	ckfree(buffer);
	return TCL_ERROR;
    }







|







363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
    Tcl_DString buf;

    /*
     * Find the parent of the key being deleted and open it.
     */

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc((unsigned int) length + 1);
    strcpy(buffer, keyName);

    if (ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName)
	    != TCL_OK) {
	ckfree(buffer);
	return TCL_ERROR;
    }
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631

    /*
     * Set the type into the result.  Watch out for unknown types.
     * If we don't know about the type, just use the numeric value.
     */

    if (type > lastType || type < 0) {
	Tcl_SetIntObj(resultPtr, type);
    } else {
	Tcl_SetStringObj(resultPtr, typeNames[type], -1);
    }
    return TCL_OK;
}

/*







|







617
618
619
620
621
622
623
624
625
626
627
628
629
630
631

    /*
     * Set the type into the result.  Watch out for unknown types.
     * If we don't know about the type, just use the numeric value.
     */

    if (type > lastType || type < 0) {
	Tcl_SetIntObj(resultPtr, (int) type);
    } else {
	Tcl_SetStringObj(resultPtr, typeNames[type], -1);
    }
    return TCL_OK;
}

/*
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
     *
     * This allows short values to be read from the registy in one call.
     * Longer values need a second call with an expanded DString.
     */

    Tcl_DStringInit(&data);
    length = TCL_DSTRING_STATIC_SIZE - 1;
    Tcl_DStringSetLength(&data, length);

    resultPtr = Tcl_GetObjResult(interp);

    valueName = Tcl_GetStringFromObj(valueNameObj, &nameLen);
    valueName = Tcl_WinUtfToTChar(valueName, nameLen, &buf);

    result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL, &type,
	    (BYTE *) Tcl_DStringValue(&data), &length);
    while (result == ERROR_MORE_DATA) {
	/*
	 * The Windows docs say that in this error case, we just need
	 * to expand our buffer and request more data.
	 * Required for HKEY_PERFORMANCE_DATA
	 */
	length *= 2;
        Tcl_DStringSetLength(&data, length);
        result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL,
		&type, (BYTE *) Tcl_DStringValue(&data), &length);
    }
    Tcl_DStringFree(&buf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendStringsToObj(resultPtr, "unable to get value \"",







|















|







676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
     *
     * This allows short values to be read from the registy in one call.
     * Longer values need a second call with an expanded DString.
     */

    Tcl_DStringInit(&data);
    length = TCL_DSTRING_STATIC_SIZE - 1;
    Tcl_DStringSetLength(&data, (int) length);

    resultPtr = Tcl_GetObjResult(interp);

    valueName = Tcl_GetStringFromObj(valueNameObj, &nameLen);
    valueName = Tcl_WinUtfToTChar(valueName, nameLen, &buf);

    result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL, &type,
	    (BYTE *) Tcl_DStringValue(&data), &length);
    while (result == ERROR_MORE_DATA) {
	/*
	 * The Windows docs say that in this error case, we just need
	 * to expand our buffer and request more data.
	 * Required for HKEY_PERFORMANCE_DATA
	 */
	length *= 2;
        Tcl_DStringSetLength(&data, (int) length);
        result = (*regWinProcs->regQueryValueExProc)(key, valueName, NULL,
		&type, (BYTE *) Tcl_DStringValue(&data), &length);
    }
    Tcl_DStringFree(&buf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendStringsToObj(resultPtr, "unable to get value \"",
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
     * If the data is a 32-bit quantity, store it as an integer object.  If it
     * is a multi-string, store it as a list of strings.  For null-terminated
     * strings, append up the to first null.  Otherwise, store it as a binary
     * string.
     */

    if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {
	Tcl_SetIntObj(resultPtr, ConvertDWORD(type,
		*((DWORD*) Tcl_DStringValue(&data))));
    } else if (type == REG_MULTI_SZ) {
	char *p = Tcl_DStringValue(&data);
	char *end = Tcl_DStringValue(&data) + length;

	/*
	 * Multistrings are stored as an array of null-terminated strings,







|







715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
     * If the data is a 32-bit quantity, store it as an integer object.  If it
     * is a multi-string, store it as a list of strings.  For null-terminated
     * strings, append up the to first null.  Otherwise, store it as a binary
     * string.
     */

    if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {
	Tcl_SetIntObj(resultPtr, (int) ConvertDWORD(type,
		*((DWORD*) Tcl_DStringValue(&data))));
    } else if (type == REG_MULTI_SZ) {
	char *p = Tcl_DStringValue(&data);
	char *end = Tcl_DStringValue(&data) + length;

	/*
	 * Multistrings are stored as an array of null-terminated strings,
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
		Tcl_DStringLength(&buf));
	Tcl_DStringFree(&buf);
    } else {
	/*
	 * Save binary data as a byte array.
	 */

	Tcl_SetByteArrayObj(resultPtr, Tcl_DStringValue(&data), length);
    }
    Tcl_DStringFree(&data);
    return result;
}

/*
 *----------------------------------------------------------------------







|







750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
		Tcl_DStringLength(&buf));
	Tcl_DStringFree(&buf);
    } else {
	/*
	 * Save binary data as a byte array.
	 */

	Tcl_SetByteArrayObj(resultPtr, Tcl_DStringValue(&data), (int) length);
    }
    Tcl_DStringFree(&data);
    return result;
}

/*
 *----------------------------------------------------------------------
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
	goto done;
    }
    maxSize++;


    Tcl_DStringInit(&buffer);
    Tcl_DStringSetLength(&buffer,
	    (regWinProcs->useWide) ? maxSize*2 : maxSize);
    index = 0;
    result = TCL_OK;

    if (patternObj) {
	pattern = Tcl_GetString(patternObj);
    } else {
	pattern = NULL;







|







818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
	goto done;
    }
    maxSize++;


    Tcl_DStringInit(&buffer);
    Tcl_DStringSetLength(&buffer,
	    (int) ((regWinProcs->useWide) ? maxSize*2 : maxSize));
    index = 0;
    result = TCL_OK;

    if (patternObj) {
	pattern = Tcl_GetString(patternObj);
    } else {
	pattern = NULL;
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
	    Tcl_DStringValue(&buffer), &size, NULL, NULL, NULL, NULL)
	    == ERROR_SUCCESS) {

	if (regWinProcs->useWide) {
	    size *= 2;
	}

	Tcl_WinTCharToUtf((TCHAR *) Tcl_DStringValue(&buffer), size, &ds);
	name = Tcl_DStringValue(&ds);
	if (!pattern || Tcl_StringMatch(name, pattern)) {
	    result = Tcl_ListObjAppendElement(interp, resultPtr,
		    Tcl_NewStringObj(name, Tcl_DStringLength(&ds)));
	    if (result != TCL_OK) {
		Tcl_DStringFree(&ds);
		break;







|







843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
	    Tcl_DStringValue(&buffer), &size, NULL, NULL, NULL, NULL)
	    == ERROR_SUCCESS) {

	if (regWinProcs->useWide) {
	    size *= 2;
	}

	Tcl_WinTCharToUtf((TCHAR *) Tcl_DStringValue(&buffer), (int) size, &ds);
	name = Tcl_DStringValue(&ds);
	if (!pattern || Tcl_StringMatch(name, pattern)) {
	    result = Tcl_ListObjAppendElement(interp, resultPtr,
		    Tcl_NewStringObj(name, Tcl_DStringLength(&ds)));
	    if (result != TCL_OK) {
		Tcl_DStringFree(&ds);
		break;
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
{
    char *keyName, *buffer, *hostName;
    int length;
    HKEY rootKey;
    DWORD result;

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc(length + 1);
    strcpy(buffer, keyName);

    result = ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName);
    if (result == TCL_OK) {
	result = OpenSubKey(hostName, rootKey, keyName, mode, flags, keyPtr);
	if (result != ERROR_SUCCESS) {
	    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);







|







897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
{
    char *keyName, *buffer, *hostName;
    int length;
    HKEY rootKey;
    DWORD result;

    keyName = Tcl_GetStringFromObj(keyNameObj, &length);
    buffer = ckalloc((unsigned int) length + 1);
    strcpy(buffer, keyName);

    result = ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName);
    if (result == TCL_OK) {
	result = OpenSubKey(hostName, rootKey, keyName, mode, flags, keyPtr);
	if (result != ERROR_SUCCESS) {
	    Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
    maxSize++;
    if (result != ERROR_SUCCESS) {
	return result;
    }

    Tcl_DStringInit(&subkey);
    Tcl_DStringSetLength(&subkey,
	    (regWinProcs->useWide) ? maxSize * 2 : maxSize);

    while (result == ERROR_SUCCESS) {
	/*
	 * Always get index 0 because key deletion changes ordering.
	 */

	size = maxSize;







|







1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
    maxSize++;
    if (result != ERROR_SUCCESS) {
	return result;
    }

    Tcl_DStringInit(&subkey);
    Tcl_DStringSetLength(&subkey,
	    (int) ((regWinProcs->useWide) ? maxSize * 2 : maxSize));

    while (result == ERROR_SUCCESS) {
	/*
	 * Always get index 0 because key deletion changes ordering.
	 */

	size = maxSize;
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293

	if (regWinProcs->useWide) {
	    Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);
	}
	length = Tcl_DStringLength(&buf) + 1;

	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE*)data, length);
	Tcl_DStringFree(&buf);
    } else {
	char *data;

	/*
	 * Store binary data in the registry.
	 */

	data = Tcl_GetByteArrayFromObj(dataObj, &length);
	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE *)data, length);
    }
    Tcl_DStringFree(&nameBuf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendToObj(resultPtr, "unable to set value: ", -1);
	AppendSystemError(interp, result);
	return TCL_ERROR;







|










|







1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293

	if (regWinProcs->useWide) {
	    Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);
	}
	length = Tcl_DStringLength(&buf) + 1;

	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE*)data, (DWORD) length);
	Tcl_DStringFree(&buf);
    } else {
	char *data;

	/*
	 * Store binary data in the registry.
	 */

	data = Tcl_GetByteArrayFromObj(dataObj, &length);
	result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
		(BYTE *)data, (DWORD) length);
    }
    Tcl_DStringFree(&nameBuf);
    RegCloseKey(key);
    if (result != ERROR_SUCCESS) {
	Tcl_AppendToObj(resultPtr, "unable to set value: ", -1);
	AppendSystemError(interp, result);
	return TCL_ERROR;
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
	    LocalFree(msgPtr);
	}
    }
    if (length == 0) {
	if (error == ERROR_CALL_NOT_IMPLEMENTED) {
	    msg = "function not supported under Win32s";
	} else {
	    sprintf(msgBuf, "unknown error: %d", error);
	    msg = msgBuf;
	}
    } else {
	Tcl_Encoding encoding;

	encoding = Tcl_GetEncoding(NULL, "unicode");
	Tcl_ExternalToUtfDString(encoding, (char *) wMsgPtr, -1, &ds);







|







1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
	    LocalFree(msgPtr);
	}
    }
    if (length == 0) {
	if (error == ERROR_CALL_NOT_IMPLEMENTED) {
	    msg = "function not supported under Win32s";
	} else {
	    sprintf(msgBuf, "unknown error: %ld", error);
	    msg = msgBuf;
	}
    } else {
	Tcl_Encoding encoding;

	encoding = Tcl_GetEncoding(NULL, "unicode");
	Tcl_ExternalToUtfDString(encoding, (char *) wMsgPtr, -1, &ds);
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
	    msg[--length] = 0;
	}
	if (msg[length-1] == '\r') {
	    msg[--length] = 0;
	}
    }

    sprintf(id, "%d", error);
    Tcl_SetErrorCode(interp, "WINDOWS", id, msg, (char *) NULL);
    Tcl_AppendToObj(resultPtr, msg, length);

    if (length != 0) {
	Tcl_DStringFree(&ds);
    }
}







|







1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
	    msg[--length] = 0;
	}
	if (msg[length-1] == '\r') {
	    msg[--length] = 0;
	}
    }

    sprintf(id, "%ld", error);
    Tcl_SetErrorCode(interp, "WINDOWS", id, msg, (char *) NULL);
    Tcl_AppendToObj(resultPtr, msg, length);

    if (length != 0) {
	Tcl_DStringFree(&ds);
    }
}
Changes to win/tclWinSerial.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * Tclwinserial.c --
 *
 *  This file implements the Windows-specific serial port functions,
 *  and the "serial" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 * Changes by Rolf.Schroedter@dlr.de June 25-27, 1999
 *
 * RCS: @(#) $Id: tclWinSerial.c,v 1.9 1999/11/24 20:55:17 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * Tclwinserial.c --
 *
 *  This file implements the Windows-specific serial port functions,
 *  and the "serial" channel driver.
 *
 * Copyright (c) 1999 by Scriptics Corp.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 * Changes by Rolf.Schroedter@dlr.de June 25-27, 1999
 *
 * RCS: @(#) $Id: tclWinSerial.c,v 1.9.2.2 2001/04/03 22:54:40 hobbs Exp $
 */

#include "tclWinInt.h"

#include <dos.h>
#include <fcntl.h>
#include <io.h>
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166




167
168
169
170
171
172
173

/*
 * This structure describes the channel type structure for command serial
 * based IO.
 */

static Tcl_ChannelType serialChannelType = {
    "serial",               /* Type name. */
    SerialBlockProc,        /* Set blocking or non-blocking mode.*/
    SerialCloseProc,        /* Close proc. */
    SerialInputProc,        /* Input proc. */
    SerialOutputProc,       /* Output proc. */
    NULL,                   /* Seek proc. */
    SerialSetOptionProc,    /* Set option proc. */
    SerialGetOptionProc,    /* Get option proc. */
    SerialWatchProc,        /* Set up notifier to watch the channel. */
    SerialGetHandleProc,    /* Get an OS handle from channel. */




};

/*
 *----------------------------------------------------------------------
 *
 * SerialInit --
 *







|
|
|
|
|
|
|
|
|
|
>
>
>
>







150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

/*
 * This structure describes the channel type structure for command serial
 * based IO.
 */

static Tcl_ChannelType serialChannelType = {
    "serial",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    SerialCloseProc,		/* Close proc. */
    SerialInputProc,		/* Input proc. */
    SerialOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    SerialSetOptionProc,	/* Set option proc. */
    SerialGetOptionProc,	/* Get option proc. */
    SerialWatchProc,		/* Set up notifier to watch the channel. */
    SerialGetHandleProc,	/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    SerialBlockProc,		/* Set blocking or non-blocking mode.*/
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 *----------------------------------------------------------------------
 *
 * SerialInit --
 *
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Which option to set? */
    char *value;                /* New value for option. */
{
    SerialInfo *infoPtr;
    DCB dcb;
    int len;
    BOOL result;
    Tcl_DString ds;
    TCHAR *native;
    
    infoPtr = (SerialInfo *) instanceData;
    
    len = strlen(optionName);







|







1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Which option to set? */
    char *value;                /* New value for option. */
{
    SerialInfo *infoPtr;
    DCB dcb;
    size_t len;
    BOOL result;
    Tcl_DString ds;
    TCHAR *native;
    
    infoPtr = (SerialInfo *) instanceData;
    
    len = strlen(optionName);
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Option to get. */
    Tcl_DString *dsPtr;         /* Where to store value(s). */
{
    SerialInfo *infoPtr;
    DCB dcb;
    int len;
    int valid = 0;  /* flag if valid option parsed */

    infoPtr = (SerialInfo *) instanceData;

    if (optionName == NULL) {
        len = 0;
    } else {







|







1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
    ClientData instanceData;    /* File state. */
    Tcl_Interp *interp;         /* For error reporting - can be NULL. */
    char *optionName;           /* Option to get. */
    Tcl_DString *dsPtr;         /* Where to store value(s). */
{
    SerialInfo *infoPtr;
    DCB dcb;
    size_t len;
    int valid = 0;  /* flag if valid option parsed */

    infoPtr = (SerialInfo *) instanceData;

    if (optionName == NULL) {
        len = 0;
    } else {
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163

        } else {
            char parity;
            char *stop;
            char buf[2 * TCL_INTEGER_SPACE + 16];

            parity = 'n';
            if (dcb.Parity < 4) {
                parity = "noems"[dcb.Parity];
            }

            stop = (dcb.StopBits == ONESTOPBIT) ? "1" :
            (dcb.StopBits == ONE5STOPBITS) ? "1.5" : "2";

            wsprintfA(buf, "%d,%c,%d,%s", dcb.BaudRate, parity,







|







1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167

        } else {
            char parity;
            char *stop;
            char buf[2 * TCL_INTEGER_SPACE + 16];

            parity = 'n';
            if (dcb.Parity <= 4) {
                parity = "noems"[dcb.Parity];
            }

            stop = (dcb.StopBits == ONESTOPBIT) ? "1" :
            (dcb.StopBits == ONE5STOPBITS) ? "1.5" : "2";

            wsprintfA(buf, "%d,%c,%d,%s", dcb.BaudRate, parity,
Changes to win/tclWinSock.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclWinSock.c --
 *
 *	This file contains Windows-specific socket related code.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinSock.c,v 1.18 1999/12/09 14:44:11 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following variable is used to tell whether this module has been
 * initialized.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
 * tclWinSock.c --
 *
 *	This file contains Windows-specific socket related code.
 *
 * Copyright (c) 1995-1997 Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclWinSock.c,v 1.18.2.2 2001/04/03 22:54:40 hobbs Exp $
 */

#include "tclWinInt.h"

/*
 * The following variable is used to tell whether this module has been
 * initialized.
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227




228
229
230
231
232
233
234

/*
 * This structure describes the channel type structure for TCP socket
 * based IO.
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",		/* Type name. */
    TcpBlockProc,	/* Set socket into blocking/non-blocking mode. */
    TcpCloseProc,	/* Close proc. */
    TcpInputProc,	/* Input proc. */
    TcpOutputProc,	/* Output proc. */
    NULL,		/* Seek proc. */
    NULL,		/* Set option proc. */
    TcpGetOptionProc,	/* Get option proc. */
    TcpWatchProc,	/* Initialize notifier to watch this channel. */
    TcpGetHandleProc,	/* Get an OS handle from channel. */




};

/*
 * Define version of Winsock required by Tcl.
 */

#define WSA_VERSION_REQD MAKEWORD(1,1)







|
|
|
|
|
|
|
|
|
|
>
>
>
>







211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238

/*
 * This structure describes the channel type structure for TCP socket
 * based IO.
 */

static Tcl_ChannelType tcpChannelType = {
    "tcp",			/* Type name. */
    TCL_CHANNEL_VERSION_2,	/* v2 channel */
    TcpCloseProc,		/* Close proc. */
    TcpInputProc,		/* Input proc. */
    TcpOutputProc,		/* Output proc. */
    NULL,			/* Seek proc. */
    NULL,			/* Set option proc. */
    TcpGetOptionProc,		/* Get option proc. */
    TcpWatchProc,		/* Set up notifier to watch this channel. */
    TcpGetHandleProc,		/* Get an OS handle from channel. */
    NULL,			/* close2proc. */
    TcpBlockProc,		/* Set socket into (non-)blocking mode. */
    NULL,			/* flush proc. */
    NULL,			/* handler proc. */
};

/*
 * Define version of Winsock required by Tcl.
 */

#define WSA_VERSION_REQD MAKEWORD(1,1)
828
829
830
831
832
833
834

835
836
837
838
839
840
841
842
843
844
	FD_SET(infoPtr->socket, &readFds);
	timeout.tv_usec = 0;
	timeout.tv_sec = 0;
 
	if ((*winSock.select)(0, &readFds, NULL, NULL, &timeout) != 0) {
	    mask |= TCL_READABLE;
	} else {

	    SendMessage(tsdPtr->hwnd, SOCKET_SELECT,
		    (WPARAM) SELECT, (LPARAM) infoPtr);
	    infoPtr->readyEvents &= ~(FD_READ);
	}
    }
    if (events & (FD_WRITE | FD_CONNECT)) {
	mask |= TCL_WRITABLE;
    }

    if (mask) {







>


<







832
833
834
835
836
837
838
839
840
841

842
843
844
845
846
847
848
	FD_SET(infoPtr->socket, &readFds);
	timeout.tv_usec = 0;
	timeout.tv_sec = 0;
 
	if ((*winSock.select)(0, &readFds, NULL, NULL, &timeout) != 0) {
	    mask |= TCL_READABLE;
	} else {
	    infoPtr->readyEvents &= ~(FD_READ);
	    SendMessage(tsdPtr->hwnd, SOCKET_SELECT,
		    (WPARAM) SELECT, (LPARAM) infoPtr);

	}
    }
    if (events & (FD_WRITE | FD_CONNECT)) {
	mask |= TCL_WRITABLE;
    }

    if (mask) {
Changes to win/tclsh.rc.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// RCS: @(#) $Id: tclsh.rc,v 1.5 2000/04/18 23:26:45 redman Exp $
//
// Version
//

#define VS_VERSION_INFO 1

#define RESOURCE_INCLUDED
#include <tcl.h>

























LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL



 FILEFLAGS 	0x0L

 FILEOS 	0x4	/* VOS__WINDOWS32 */
 FILETYPE 	0x2	/* VFT_DLL */
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription", "Tclsh Application\0"
            VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) ".exe\0"
            VALUE "CompanyName", "Scriptics Corporation\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Scriptics Corporation\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

//
// Icon
//

tclsh                      ICON    DISCARDABLE     "tclsh.ico"

|

|


|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







>
>
>

>
|
|







|
|

|















<
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

// RCS: @(#) $Id: tclsh.rc,v 1.5.2.1 2001/04/03 22:54:40 hobbs Exp $
//
// Version Resource Script
//

#include <winver.h>

#define RESOURCE_INCLUDED
#include <tcl.h>

//
// build-up the name suffix that defines the type of build this is.
//
#ifdef TCL_THREADS
#define SUFFIX_THREADS	    "t"
#else
#define SUFFIX_THREADS	    ""
#endif

#ifdef STATIC_BUILD
#define SUFFIX_STATIC	    "s"
#else
#define SUFFIX_STATIC	    ""
#endif

#ifdef DEBUG
#define SUFFIX_DEBUG	    "d"
#else
#define SUFFIX_DEBUG	    ""
#endif

#define SUFFIX		    SUFFIX_THREADS SUFFIX_STATIC SUFFIX_DEBUG


LANGUAGE 0x9, 0x1	/* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 	TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE_SERIAL
 FILEFLAGSMASK 	0x3fL
#ifdef DEBUG
 FILEFLAGS 	VS_FF_DEBUG
#else
 FILEFLAGS 	0x0L
#endif
 FILEOS 	VOS__WINDOWS32
 FILETYPE 	VFT_APP
 FILESUBTYPE 	0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription", "Tclsh Application\0"
            VALUE "OriginalFilename", "tclsh" STRINGIFY(TCL_MAJOR_VERSION) STRINGIFY(TCL_MINOR_VERSION) SUFFIX ".exe\0"
            VALUE "CompanyName", "Ajuba Solutions\0"
            VALUE "FileVersion", TCL_PATCH_LEVEL
            VALUE "LegalCopyright", "Copyright (c) 2000 by Ajuba Solutions\0"
            VALUE "ProductName", "Tcl " TCL_VERSION " for Windows\0"
            VALUE "ProductVersion", TCL_PATCH_LEVEL
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

//
// Icon
//

tclsh                      ICON    DISCARDABLE     "tclsh.ico"