root/trunk/configs/xsb.config

Revision 4580, 14.9 KB (checked in by pmoura, 2 weeks ago)

Added a "prolog" read-only compiler flag whose value is the name of the back-end Prolog compiler (an atom). This flag can be used for conditional compilation of Prolog specific code.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2%
3%  Logtalk - Open source object-oriented logic programming language
4%  Release 2.33.3
5%
6%  Copyright (c) 1998-2008 Paulo Moura.        All Rights Reserved.
7%  Logtalk is free software.  You can redistribute it and/or modify
8%  it under the terms of the "Artistic License 2.0" as published by
9%  The Perl Foundation. Consult the "LICENSE.txt" file for details.
10%
11%
12%  configuration file for XSB 3.1 or later version
13%
14%  last updated: November 7, 2008
15%
16%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17
18
19:- import datime/1 from standard.
20:- import numbervars/3 from num_vars.
21:- import expand_atom/2 from standard.
22
23
24
25%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26%
27%  ISO Prolog Standard predicates that we must define because they are
28%  not built-in
29%
30%  add a clause for lgt_iso_predicate/1 declaring each ISO predicate that
31%  we must define; there must be at least one clause for this predicate
32%  whose call should fail if we don't define any ISO predicates
33%
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35
36
37% '$lgt_iso_predicate'(?callable).
38
39'$lgt_iso_predicate'(_) :-
40    fail.
41
42
43
44%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45%
46%  predicate properties
47%
48%  this predicate must return at least static, dynamic, and built_in
49%  properties for an existing predicate
50%
51%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52
53
54% '$lgt_predicate_property'(+callable, ?predicate_property)
55
56'$lgt_predicate_property'(Pred, Prop) :-
57    predicate_property(Pred, Prop).
58
59'$lgt_predicate_property'(Pred, built_in) :-
60    predicate_property(Pred, xsb_standard_predicate).
61
62
63
64%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65%
66%  Logtalk specific predicates
67%
68%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
69
70
71% call_cleanup(+callable, +callble) -- built-in
72
73
74% forall(+Generate, +Test)
75
76forall(Generate, Test) :-
77    \+ call((Generate, \+ call(Test))).
78
79
80% retractall(+callable) -- built-in
81
82
83% call_with_args/2-9
84%
85% use these definitions only if your compiler does
86% not provide call_with_args/2-9 as built-in predicates
87
88call_with_args(F, A) :-
89    call(F, A).
90
91call_with_args(F, A1, A2) :-
92    call(F, A1, A2).
93
94call_with_args(F, A1, A2, A3) :-
95    call(F, A1, A2, A3).
96
97call_with_args(F, A1, A2, A3, A4) :-
98    call(F, A1, A2, A3, A4).
99
100call_with_args(F, A1, A2, A3, A4, A5) :-
101    call(F, A1, A2, A3, A4, A5).
102
103call_with_args(F, A1, A2, A3, A4, A5, A6) :-
104    call(F, A1, A2, A3, A4, A5, A6).
105
106call_with_args(F, A1, A2, A3, A4, A5, A6, A7) :-
107    call(F, A1, A2, A3, A4, A5, A6, A7).
108
109call_with_args(F, A1, A2, A3, A4, A5, A6, A7, A8) :-
110    call(F, A1, A2, A3, A4, A5, A6, A7, A8).
111
112
113
114%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
115%
116%  Prolog built-in meta-predicates
117%
118%  (excluding ISO Prolog Standard meta-predicates)
119%
120%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
121
122
123% '$lgt_pl_meta_predicate'(?callable, ?atom).
124
125'$lgt_pl_meta_predicate'(fail_if(::), predicate).
126'$lgt_pl_meta_predicate'(not(::), predicate).
127'$lgt_pl_meta_predicate'(sk_not(::), predicate).
128'$lgt_pl_meta_predicate'(table_once(::), predicate).
129'$lgt_pl_meta_predicate'(tnot(::), predicate).
130
131'$lgt_pl_meta_predicate'(thread_create(::, *, *), predicate).
132'$lgt_pl_meta_predicate'(thread_create(::, *), predicate).
133'$lgt_pl_meta_predicate'(thread_create(::), predicate).
134'$lgt_pl_meta_predicate'(thread_signal(*, ::), predicate).
135'$lgt_pl_meta_predicate'(with_mutex(*, ::), predicate).
136
137
138
139%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
140%
141%  file extension predicates
142%
143%  these extensions are used by Logtalk load/compile predicates
144%
145%  you may want to change the extension for Prolog files to match
146%  the one expected by your Prolog compiler
147%
148%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
149
150
151% '$lgt_file_extension'(?atom, ?atom)
152
153'$lgt_file_extension'(logtalk, '.lgt').
154'$lgt_file_extension'(prolog, '.pl').
155'$lgt_file_extension'(xml, '.xml').
156
157
158
159%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160%
161%  default flag values
162%
163%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164
165
166% '$lgt_default_flag'(?atom, ?atom)
167%
168% default values for all flags
169
170'$lgt_default_flag'(prolog, xsb).
171
172'$lgt_default_flag'(xmldocs, on).
173'$lgt_default_flag'(xslfile, 'lgtxml.xsl').
174'$lgt_default_flag'(xmlspec, dtd).
175'$lgt_default_flag'(xmlsref, local).
176
177'$lgt_default_flag'(unknown, warning).
178'$lgt_default_flag'(misspelt, warning).
179'$lgt_default_flag'(singletons, warning).
180'$lgt_default_flag'(lgtredef, warning).
181'$lgt_default_flag'(plredef, silent).
182'$lgt_default_flag'(portability, silent).
183
184'$lgt_default_flag'(report, on).
185
186'$lgt_default_flag'(smart_compilation, off).
187'$lgt_default_flag'(reload, always).
188
189'$lgt_default_flag'(startup_message, flags(verbose)).
190
191'$lgt_default_flag'(underscore_variables, singletons).
192
193'$lgt_default_flag'(code_prefix, '').
194
195'$lgt_default_flag'(debug, off).
196'$lgt_default_flag'(break_predicate, supported).
197
198'$lgt_default_flag'(complements, off).
199'$lgt_default_flag'(dynamic_declarations, off).
200'$lgt_default_flag'(events, off).
201
202'$lgt_default_flag'(altdirs, off).
203'$lgt_default_flag'(tmpdir, 'lgt_tmp/').
204'$lgt_default_flag'(xmldir, 'xml_docs/').
205
206'$lgt_default_flag'(encoding_directive, unsupported).
207'$lgt_default_flag'(multifile_directive, unsupported).
208'$lgt_default_flag'(threads, Threads) :-
209    (   xsb_configuration(engine_mode, 'multi-threading') ->
210        Threads = on
211    ;   Threads = unsupported
212    ).
213
214'$lgt_default_flag'(context_switching_calls, allow).
215
216
217
218%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
219%
220%  list predicates
221%
222%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
223
224
225'$lgt_append'([], List, List).
226'$lgt_append'([Head| Tail], List, [Head| Tail2]) :-
227    '$lgt_append'(Tail, List, Tail2).
228
229
230'$lgt_member'(Head, [Head| _]).
231'$lgt_member'(Head, [_| Tail]) :-
232    '$lgt_member'(Head, Tail).
233
234
235'$lgt_member_var'(V, [H| _]) :-
236    V == H.
237'$lgt_member_var'(V, [_| T]) :-
238    '$lgt_member_var'(V, T).
239
240
241'$lgt_is_list'([]) :-
242    !.
243'$lgt_is_list'([_| Tail]) :-
244    '$lgt_is_list'(Tail).
245
246
247'$lgt_is_proper_list'(List) :-
248    List == [], !.
249'$lgt_is_proper_list'([_| Tail]) :-
250    nonvar(Tail),
251    '$lgt_is_proper_list'(Tail).
252
253
254
255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256%
257%  file predicates
258%
259%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
260
261
262% '$lgt_file_exists'(+atom)
263%
264% checks if a file exist in the current directory
265
266'$lgt_file_exists'(File) :-
267    expand_atom(File, Expanded),
268    path_sysop(exists, Expanded).
269
270
271% '$lgt_directory_exists'(+atom)
272%
273% checks if a directory exists
274
275'$lgt_directory_exists'(Directory) :-
276    expand_atom(Directory, Expanded),
277    path_sysop(exists, Expanded),
278    path_sysop(isdir, Expanded).
279
280
281% '$lgt_current_directory'(-atom)
282%
283% gets current working directory
284
285'$lgt_current_directory'(Directory) :-
286    path_sysop(cwd, Directory).
287
288
289% '$lgt_change_directory'(+atom)
290%
291% changes current working directory
292
293'$lgt_change_directory'(Directory) :-
294    expand_atom(Directory, Expanded),
295    path_sysop(chdir, Expanded).
296
297
298% '$lgt_make_directory'(+atom)
299%
300% makes a new directory; succeeds if the directory already exists
301
302'$lgt_make_directory'(Directory) :-
303    expand_atom(Directory, Expanded),
304    (   path_sysop(exists, Expanded) ->
305        true
306    ;   path_sysop(mkdir, Expanded)
307    ).
308
309
310% '$lgt_load_prolog_code'(+atom, +atom, +list)
311%
312% compile and load a Prolog file, resulting from a
313% Logtalk source file, given a list of options
314
315'$lgt_load_prolog_code'(File, _, _) :-
316    expand_atom(File, Expanded),
317    reconsult(Expanded, [optimize]).
318
319
320% '$lgt_compare_file_mtimes'(?atom, +atom, +atom)
321%
322% compare file modification times
323
324'$lgt_compare_file_mtimes'(Result, File1, File2) :-
325    path_sysop(modtime, File1, Time1),
326    path_sysop(modtime, File2, Time2),
327    compare(Result, Time1, Time2).
328
329
330
331%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
332%
333%  sorting predicates
334%
335%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
336
337
338% '$lgt_keysort'(+list, -list)
339
340'$lgt_keysort'(List, Sorted) :-
341    keysort(List, Sorted).
342
343
344% '$lgt_sort'(+list, -list)
345
346'$lgt_sort'(List, Sorted) :-
347    sort(List, Sorted).
348
349
350
351%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352%
353%  time and date predicates
354%
355%  if your Prolog compiler does not provide access to the operating system
356%  time and date just write dummy definitions
357%
358%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
359
360
361% '$lgt_current_date'(?Year, ?Month, ?Day)
362
363'$lgt_current_date'(Year, Month, Day) :-
364    datime(datime(Year, Month, Day, _, _, _)).
365
366
367% '$lgt_current_time'(?Hours, ?Mins, ?Secs)
368
369'$lgt_current_time'(Hours, Mins, Secs) :-
370    datime(datime(_, _, _, Hours, Mins, Secs)).
371
372
373
374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
375%
376%  timing predicate
377%
378%  if your Prolog compiler does not provide access to a timing predicate
379%  just write dummy definition
380%
381%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
382
383
384% '$lgt_cpu_time'(-Seconds)
385
386'$lgt_cpu_time'(Seconds) :-
387    cputime(Seconds).
388
389
390
391%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
392%
393%  comparison predicate
394%
395%  the usual compare/3 definition
396%
397%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
398
399
400% compare(?atom, @term, @term) -- built-in
401
402
403
404%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
405%
406%  callable predicate
407%
408%  the usual callable/1 definition
409%
410%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
411
412
413% callable(@term) -- built-in
414
415
416
417%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
418%
419%  read character predicate
420%
421%  read a single character echoing it and writing a newline after
422%
423%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
424
425
426'$lgt_read_single_char'(Char) :-
427    get_code(Code), char_code(Char, Code),
428    (   Code =:= 10 ->
429        true
430    ;   peek_code(10) ->    % hack to workaround the lack of built-in
431        get_code(_)         % support for unbuffered character input
432    ;   true
433    ).
434
435
436
437%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
438%
439%  pretty print a term by naming its free variables
440%  (avoid instantiating variables in term by using double negation if necessary)
441%
442%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
443
444
445'$lgt_pretty_print_vars'(Stream, Term) :-
446    \+ \+ (
447        numbervars(Term, 0, _),
448        write_term(Stream, Term, [numbervars(true)])).
449
450
451'$lgt_pretty_print_vars_quoted'(Stream, Term) :-
452    \+ \+ (
453        numbervars(Term, 0, _),
454        write_term(Stream, Term, [numbervars(true), quoted(true)])).
455
456
457
458%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
459%
460%  getting stream current line number
461%  (needed for improved compiler error messages)
462%
463%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
464
465
466% '$lgt_stream_current_line_number'(@stream, -integer)
467
468'$lgt_stream_current_line_number'(_, _) :-
469    fail.
470
471
472
473%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
474%
475%  customized version of the read_term/3 predicate for returning the line
476%  where the term starts (needed for improved compiler error messages)
477%
478%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
479
480
481% '$lgt_read_term'(@stream, -term, +list, -integer)
482
483'$lgt_read_term'(Stream, Term, Options, -1) :-
484    read_term(Stream, Term, Options).
485
486
487
488%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
489%
490%  handling of Prolog-proprietary directives on Logtalk source files
491%
492%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
493
494
495% '$lgt_ignore_pl_directive'(@callable)
496
497'$lgt_ignore_pl_directive'(_) :-
498    fail.
499
500
501% '$lgt_rewrite_and_copy_pl_directive'(@callable, -callable)
502
503'$lgt_rewrite_and_copy_pl_directive'(index(PI, IS), index(CPI, IS)) :-
504    '$lgt_rewrite_and_copy_pl_directive_pis'(PI, CPI).
505'$lgt_rewrite_and_copy_pl_directive'(table(PIs), table(CPIs)) :-
506    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
507'$lgt_rewrite_and_copy_pl_directive'(thread_private(PIs), thread_private(CPIs)) :-
508    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
509'$lgt_rewrite_and_copy_pl_directive'(thread_shared(PIs), thread_shared(CPIs)) :-
510    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
511'$lgt_rewrite_and_copy_pl_directive'(use_subsumptive_tabling(PIs), use_subsumptive_tabling(CPIs)) :-
512    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
513'$lgt_rewrite_and_copy_pl_directive'(use_variant_tabling(PIs), use_variant_tabling(CPIs)) :-
514    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
515
516
517'$lgt_rewrite_and_copy_pl_directive_pis'(PIs, _) :-
518    var(PIs),
519    throw(instantiation_error).
520'$lgt_rewrite_and_copy_pl_directive_pis'([], []) :-
521    !.
522'$lgt_rewrite_and_copy_pl_directive_pis'([PI| PIs], [CPI| CPIs]) :-
523    !,
524    '$lgt_rewrite_and_copy_pl_directive_pis'(PI, CPI),
525    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
526'$lgt_rewrite_and_copy_pl_directive_pis'((PI, PIs), (CPI, CPIs)) :-
527    !,
528    '$lgt_rewrite_and_copy_pl_directive_pis'(PI, CPI),
529    '$lgt_rewrite_and_copy_pl_directive_pis'(PIs, CPIs).
530'$lgt_rewrite_and_copy_pl_directive_pis'(Functor/Arity, TFunctor/TArity) :-
531    '$lgt_pp_entity'(_, _, Prefix, _, _),
532    '$lgt_construct_predicate_indicator'(Prefix, Functor/Arity, TFunctor/TArity).
533
534
535% '$lgt_rewrite_and_recompile_pl_directive'(@callable, -callable)
536
537'$lgt_rewrite_and_recompile_pl_directive'(_, _) :-
538    fail.
539
540
541
542%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
543%
544%  multi-threading predicates
545%
546%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
547
548
549% thread_property(+atom, ?nonvar) -- built-in
550
551
552% thread_self(?atom) -- built-in
553
554
555% thread_create(@callable, -thread_id, +list) -- built-in
556
557
558% thread_join(+atom, -nonvar) -- built-in
559
560
561% thread_detach(+atom) -- built-in
562
563
564% thread_exit(@term) -- built-in
565
566
567% thread_send_message(+atom, @callable) -- built-in
568
569
570% thread_peek_message(+atom, ?callable) -- built-in
571
572
573% thread_get_message(+atom, ?callable) -- built-in
574
575
576% thread_get_message(?callable) -- built-in
577
578
579% thread_signal(Thread, _Signal) -- built-in
580
581
582
583%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
584%
585%  Shortcut to the Logtalk built-in predicate logtalk_load/1
586%
587%  defined in the config files in order to be able to comment it out in case
588%  of conflict with some Prolog native feature; it implies conformance with
589%  the ISO Prolog standard regarding the definition of the {}/1 syntax
590%
591%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
592
593{File, Files} :-
594    !,
595    logtalk_load(File),
596    {Files}.
597{File} :-
598    logtalk_load(File).
599
600
601
602%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
603%
604%  end!
605%
606%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Note: See TracBrowser for help on using the browser.