aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/drawstuff
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ode-0.9/drawstuff')
-rw-r--r--libraries/ode-0.9/drawstuff/Makefile.am1
-rw-r--r--libraries/ode-0.9/drawstuff/Makefile.in488
-rw-r--r--libraries/ode-0.9/drawstuff/dstest/Makefile.am13
-rw-r--r--libraries/ode-0.9/drawstuff/dstest/Makefile.in446
-rw-r--r--libraries/ode-0.9/drawstuff/dstest/dstest.cpp125
-rw-r--r--libraries/ode-0.9/drawstuff/src/Makefile.am21
-rw-r--r--libraries/ode-0.9/drawstuff/src/Makefile.in507
-rw-r--r--libraries/ode-0.9/drawstuff/src/drawstuff.cpp1597
-rw-r--r--libraries/ode-0.9/drawstuff/src/internal.h50
-rw-r--r--libraries/ode-0.9/drawstuff/src/osx.cpp542
-rw-r--r--libraries/ode-0.9/drawstuff/src/resource.h28
-rw-r--r--libraries/ode-0.9/drawstuff/src/resources.rc153
-rw-r--r--libraries/ode-0.9/drawstuff/src/windows.cpp527
-rw-r--r--libraries/ode-0.9/drawstuff/src/x11.cpp418
-rw-r--r--libraries/ode-0.9/drawstuff/textures/ground.ppm6
-rw-r--r--libraries/ode-0.9/drawstuff/textures/sky.ppm5
-rw-r--r--libraries/ode-0.9/drawstuff/textures/wood.ppm5
17 files changed, 4932 insertions, 0 deletions
diff --git a/libraries/ode-0.9/drawstuff/Makefile.am b/libraries/ode-0.9/drawstuff/Makefile.am
new file mode 100644
index 0000000..2993d0b
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/Makefile.am
@@ -0,0 +1 @@
SUBDIRS = src dstest \ No newline at end of file
diff --git a/libraries/ode-0.9/drawstuff/Makefile.in b/libraries/ode-0.9/drawstuff/Makefile.in
new file mode 100644
index 0000000..974102b
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/Makefile.in
@@ -0,0 +1,488 @@
1# Makefile.in generated by automake 1.10 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6# This Makefile.in is free software; the Free Software Foundation
7# gives unlimited permission to copy and/or distribute it,
8# with or without modifications, as long as this notice is preserved.
9
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
12# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13# PARTICULAR PURPOSE.
14
15@SET_MAKE@
16VPATH = @srcdir@
17pkgdatadir = $(datadir)/@PACKAGE@
18pkglibdir = $(libdir)/@PACKAGE@
19pkgincludedir = $(includedir)/@PACKAGE@
20am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
21install_sh_DATA = $(install_sh) -c -m 644
22install_sh_PROGRAM = $(install_sh) -c
23install_sh_SCRIPT = $(install_sh) -c
24INSTALL_HEADER = $(INSTALL_DATA)
25transform = $(program_transform_name)
26NORMAL_INSTALL = :
27PRE_INSTALL = :
28POST_INSTALL = :
29NORMAL_UNINSTALL = :
30PRE_UNINSTALL = :
31POST_UNINSTALL = :
32build_triplet = @build@
33host_triplet = @host@
34target_triplet = @target@
35subdir = drawstuff
36DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
37ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
38am__aclocal_m4_deps = $(top_srcdir)/configure.in
39am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
40 $(ACLOCAL_M4)
41mkinstalldirs = $(install_sh) -d
42CONFIG_HEADER = $(top_builddir)/include/ode/config.h
43CONFIG_CLEAN_FILES =
44SOURCES =
45DIST_SOURCES =
46RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
47 html-recursive info-recursive install-data-recursive \
48 install-dvi-recursive install-exec-recursive \
49 install-html-recursive install-info-recursive \
50 install-pdf-recursive install-ps-recursive install-recursive \
51 installcheck-recursive installdirs-recursive pdf-recursive \
52 ps-recursive uninstall-recursive
53RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
54 distclean-recursive maintainer-clean-recursive
55ETAGS = etags
56CTAGS = ctags
57DIST_SUBDIRS = $(SUBDIRS)
58DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
59ACLOCAL = @ACLOCAL@
60ALLOCA = @ALLOCA@
61AMTAR = @AMTAR@
62ARCHFLAGS = @ARCHFLAGS@
63AUTOCONF = @AUTOCONF@
64AUTOHEADER = @AUTOHEADER@
65AUTOMAKE = @AUTOMAKE@
66AWK = @AWK@
67CC = @CC@
68CCDEPMODE = @CCDEPMODE@
69CFLAGS = @CFLAGS@
70CPP = @CPP@
71CPPFLAGS = @CPPFLAGS@
72CXX = @CXX@
73CXXDEPMODE = @CXXDEPMODE@
74CXXFLAGS = @CXXFLAGS@
75CYGPATH_W = @CYGPATH_W@
76DEFS = @DEFS@
77DEPDIR = @DEPDIR@
78DRAWSTUFF = @DRAWSTUFF@
79ECHO_C = @ECHO_C@
80ECHO_N = @ECHO_N@
81ECHO_T = @ECHO_T@
82EGREP = @EGREP@
83EXEEXT = @EXEEXT@
84GL_LIBS = @GL_LIBS@
85GREP = @GREP@
86INSTALL = @INSTALL@
87INSTALL_DATA = @INSTALL_DATA@
88INSTALL_PROGRAM = @INSTALL_PROGRAM@
89INSTALL_SCRIPT = @INSTALL_SCRIPT@
90INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
91LDFLAGS = @LDFLAGS@
92LIBOBJS = @LIBOBJS@
93LIBS = @LIBS@
94LTLIBOBJS = @LTLIBOBJS@
95MAKEINFO = @MAKEINFO@
96MKDIR_P = @MKDIR_P@
97OBJEXT = @OBJEXT@
98ODE_AGE = @ODE_AGE@
99ODE_CURRENT = @ODE_CURRENT@
100ODE_RELEASE = @ODE_RELEASE@
101ODE_REVISION = @ODE_REVISION@
102ODE_SONAME = @ODE_SONAME@
103PACKAGE = @PACKAGE@
104PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
105PACKAGE_NAME = @PACKAGE_NAME@
106PACKAGE_STRING = @PACKAGE_STRING@
107PACKAGE_TARNAME = @PACKAGE_TARNAME@
108PACKAGE_VERSION = @PACKAGE_VERSION@
109PATH_SEPARATOR = @PATH_SEPARATOR@
110RANLIB = @RANLIB@
111SET_MAKE = @SET_MAKE@
112SHARED_LDFLAGS = @SHARED_LDFLAGS@
113SHELL = @SHELL@
114STRIP = @STRIP@
115TOPDIR = @TOPDIR@
116VERSION = @VERSION@
117WINDRES = @WINDRES@
118XMKMF = @XMKMF@
119X_CFLAGS = @X_CFLAGS@
120X_EXTRA_LIBS = @X_EXTRA_LIBS@
121X_LIBS = @X_LIBS@
122X_PRE_LIBS = @X_PRE_LIBS@
123abs_builddir = @abs_builddir@
124abs_srcdir = @abs_srcdir@
125abs_top_builddir = @abs_top_builddir@
126abs_top_srcdir = @abs_top_srcdir@
127ac_ct_CC = @ac_ct_CC@
128ac_ct_CXX = @ac_ct_CXX@
129ac_ct_WINDRES = @ac_ct_WINDRES@
130am__include = @am__include@
131am__leading_dot = @am__leading_dot@
132am__quote = @am__quote@
133am__tar = @am__tar@
134am__untar = @am__untar@
135bindir = @bindir@
136build = @build@
137build_alias = @build_alias@
138build_cpu = @build_cpu@
139build_os = @build_os@
140build_vendor = @build_vendor@
141builddir = @builddir@
142datadir = @datadir@
143datarootdir = @datarootdir@
144docdir = @docdir@
145dvidir = @dvidir@
146exec_prefix = @exec_prefix@
147host = @host@
148host_alias = @host_alias@
149host_cpu = @host_cpu@
150host_os = @host_os@
151host_vendor = @host_vendor@
152htmldir = @htmldir@
153includedir = @includedir@
154infodir = @infodir@
155install_sh = @install_sh@
156libdir = @libdir@
157libexecdir = @libexecdir@
158localedir = @localedir@
159localstatedir = @localstatedir@
160mandir = @mandir@
161mkdir_p = @mkdir_p@
162oldincludedir = @oldincludedir@
163pdfdir = @pdfdir@
164prefix = @prefix@
165program_transform_name = @program_transform_name@
166psdir = @psdir@
167sbindir = @sbindir@
168sharedstatedir = @sharedstatedir@
169so_ext = @so_ext@
170srcdir = @srcdir@
171sysconfdir = @sysconfdir@
172target = @target@
173target_alias = @target_alias@
174target_cpu = @target_cpu@
175target_os = @target_os@
176target_vendor = @target_vendor@
177top_builddir = @top_builddir@
178top_srcdir = @top_srcdir@
179SUBDIRS = src dstest
180all: all-recursive
181
182.SUFFIXES:
183$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
184 @for dep in $?; do \
185 case '$(am__configure_deps)' in \
186 *$$dep*) \
187 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
188 && exit 0; \
189 exit 1;; \
190 esac; \
191 done; \
192 echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/Makefile'; \
193 cd $(top_srcdir) && \
194 $(AUTOMAKE) --foreign drawstuff/Makefile
195.PRECIOUS: Makefile
196Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
197 @case '$?' in \
198 *config.status*) \
199 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
200 *) \
201 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
202 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
203 esac;
204
205$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
206 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
207
208$(top_srcdir)/configure: $(am__configure_deps)
209 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
210$(ACLOCAL_M4): $(am__aclocal_m4_deps)
211 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
212
213# This directory's subdirectories are mostly independent; you can cd
214# into them and run `make' without going through this Makefile.
215# To change the values of `make' variables: instead of editing Makefiles,
216# (1) if the variable is set in `config.status', edit `config.status'
217# (which will cause the Makefiles to be regenerated when you run `make');
218# (2) otherwise, pass the desired values on the `make' command line.
219$(RECURSIVE_TARGETS):
220 @failcom='exit 1'; \
221 for f in x $$MAKEFLAGS; do \
222 case $$f in \
223 *=* | --[!k]*);; \
224 *k*) failcom='fail=yes';; \
225 esac; \
226 done; \
227 dot_seen=no; \
228 target=`echo $@ | sed s/-recursive//`; \
229 list='$(SUBDIRS)'; for subdir in $$list; do \
230 echo "Making $$target in $$subdir"; \
231 if test "$$subdir" = "."; then \
232 dot_seen=yes; \
233 local_target="$$target-am"; \
234 else \
235 local_target="$$target"; \
236 fi; \
237 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
238 || eval $$failcom; \
239 done; \
240 if test "$$dot_seen" = "no"; then \
241 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
242 fi; test -z "$$fail"
243
244$(RECURSIVE_CLEAN_TARGETS):
245 @failcom='exit 1'; \
246 for f in x $$MAKEFLAGS; do \
247 case $$f in \
248 *=* | --[!k]*);; \
249 *k*) failcom='fail=yes';; \
250 esac; \
251 done; \
252 dot_seen=no; \
253 case "$@" in \
254 distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
255 *) list='$(SUBDIRS)' ;; \
256 esac; \
257 rev=''; for subdir in $$list; do \
258 if test "$$subdir" = "."; then :; else \
259 rev="$$subdir $$rev"; \
260 fi; \
261 done; \
262 rev="$$rev ."; \
263 target=`echo $@ | sed s/-recursive//`; \
264 for subdir in $$rev; do \
265 echo "Making $$target in $$subdir"; \
266 if test "$$subdir" = "."; then \
267 local_target="$$target-am"; \
268 else \
269 local_target="$$target"; \
270 fi; \
271 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
272 || eval $$failcom; \
273 done && test -z "$$fail"
274tags-recursive:
275 list='$(SUBDIRS)'; for subdir in $$list; do \
276 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
277 done
278ctags-recursive:
279 list='$(SUBDIRS)'; for subdir in $$list; do \
280 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
281 done
282
283ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
284 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
285 unique=`for i in $$list; do \
286 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
287 done | \
288 $(AWK) ' { files[$$0] = 1; } \
289 END { for (i in files) print i; }'`; \
290 mkid -fID $$unique
291tags: TAGS
292
293TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
294 $(TAGS_FILES) $(LISP)
295 tags=; \
296 here=`pwd`; \
297 if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
298 include_option=--etags-include; \
299 empty_fix=.; \
300 else \
301 include_option=--include; \
302 empty_fix=; \
303 fi; \
304 list='$(SUBDIRS)'; for subdir in $$list; do \
305 if test "$$subdir" = .; then :; else \
306 test ! -f $$subdir/TAGS || \
307 tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
308 fi; \
309 done; \
310 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
311 unique=`for i in $$list; do \
312 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
313 done | \
314 $(AWK) ' { files[$$0] = 1; } \
315 END { for (i in files) print i; }'`; \
316 if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
317 test -n "$$unique" || unique=$$empty_fix; \
318 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
319 $$tags $$unique; \
320 fi
321ctags: CTAGS
322CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
323 $(TAGS_FILES) $(LISP)
324 tags=; \
325 here=`pwd`; \
326 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
327 unique=`for i in $$list; do \
328 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
329 done | \
330 $(AWK) ' { files[$$0] = 1; } \
331 END { for (i in files) print i; }'`; \
332 test -z "$(CTAGS_ARGS)$$tags$$unique" \
333 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
334 $$tags $$unique
335
336GTAGS:
337 here=`$(am__cd) $(top_builddir) && pwd` \
338 && cd $(top_srcdir) \
339 && gtags -i $(GTAGS_ARGS) $$here
340
341distclean-tags:
342 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
343
344distdir: $(DISTFILES)
345 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
346 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
347 list='$(DISTFILES)'; \
348 dist_files=`for file in $$list; do echo $$file; done | \
349 sed -e "s|^$$srcdirstrip/||;t" \
350 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
351 case $$dist_files in \
352 */*) $(MKDIR_P) `echo "$$dist_files" | \
353 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
354 sort -u` ;; \
355 esac; \
356 for file in $$dist_files; do \
357 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
358 if test -d $$d/$$file; then \
359 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
360 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
361 cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
362 fi; \
363 cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
364 else \
365 test -f $(distdir)/$$file \
366 || cp -p $$d/$$file $(distdir)/$$file \
367 || exit 1; \
368 fi; \
369 done
370 list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
371 if test "$$subdir" = .; then :; else \
372 test -d "$(distdir)/$$subdir" \
373 || $(MKDIR_P) "$(distdir)/$$subdir" \
374 || exit 1; \
375 distdir=`$(am__cd) $(distdir) && pwd`; \
376 top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
377 (cd $$subdir && \
378 $(MAKE) $(AM_MAKEFLAGS) \
379 top_distdir="$$top_distdir" \
380 distdir="$$distdir/$$subdir" \
381 am__remove_distdir=: \
382 am__skip_length_check=: \
383 distdir) \
384 || exit 1; \
385 fi; \
386 done
387check-am: all-am
388check: check-recursive
389all-am: Makefile
390installdirs: installdirs-recursive
391installdirs-am:
392install: install-recursive
393install-exec: install-exec-recursive
394install-data: install-data-recursive
395uninstall: uninstall-recursive
396
397install-am: all-am
398 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
399
400installcheck: installcheck-recursive
401install-strip:
402 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
403 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
404 `test -z '$(STRIP)' || \
405 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
406mostlyclean-generic:
407
408clean-generic:
409
410distclean-generic:
411 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
412
413maintainer-clean-generic:
414 @echo "This command is intended for maintainers to use"
415 @echo "it deletes files that may require special tools to rebuild."
416clean: clean-recursive
417
418clean-am: clean-generic mostlyclean-am
419
420distclean: distclean-recursive
421 -rm -f Makefile
422distclean-am: clean-am distclean-generic distclean-tags
423
424dvi: dvi-recursive
425
426dvi-am:
427
428html: html-recursive
429
430info: info-recursive
431
432info-am:
433
434install-data-am:
435
436install-dvi: install-dvi-recursive
437
438install-exec-am:
439
440install-html: install-html-recursive
441
442install-info: install-info-recursive
443
444install-man:
445
446install-pdf: install-pdf-recursive
447
448install-ps: install-ps-recursive
449
450installcheck-am:
451
452maintainer-clean: maintainer-clean-recursive
453 -rm -f Makefile
454maintainer-clean-am: distclean-am maintainer-clean-generic
455
456mostlyclean: mostlyclean-recursive
457
458mostlyclean-am: mostlyclean-generic
459
460pdf: pdf-recursive
461
462pdf-am:
463
464ps: ps-recursive
465
466ps-am:
467
468uninstall-am:
469
470.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
471 install-strip
472
473.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
474 all all-am check check-am clean clean-generic ctags \
475 ctags-recursive distclean distclean-generic distclean-tags \
476 distdir dvi dvi-am html html-am info info-am install \
477 install-am install-data install-data-am install-dvi \
478 install-dvi-am install-exec install-exec-am install-html \
479 install-html-am install-info install-info-am install-man \
480 install-pdf install-pdf-am install-ps install-ps-am \
481 install-strip installcheck installcheck-am installdirs \
482 installdirs-am maintainer-clean maintainer-clean-generic \
483 mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
484 tags-recursive uninstall uninstall-am
485
486# Tell versions [3.59,3.63) of GNU make to not export all variables.
487# Otherwise a system limit (for SysV at least) may be exceeded.
488.NOEXPORT:
diff --git a/libraries/ode-0.9/drawstuff/dstest/Makefile.am b/libraries/ode-0.9/drawstuff/dstest/Makefile.am
new file mode 100644
index 0000000..9d74664
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/dstest/Makefile.am
@@ -0,0 +1,13 @@
1noinst_PROGRAMS= dstest
2dstest_CXXFLAGS = -I$(top_srcdir)/include -I$(top_builddir)
3
4dstest_SOURCES= dstest.cpp
5dstest_DEPENDENCIES=$(top_builddir)/drawstuff/src/libdrawstuff.a
6dstest_LDFLAGS = -L$(top_builddir)/drawstuff/src
7dstest_LDADD=-ldrawstuff @LDFLAGS@ @GL_LIBS@ @LIBS@
8if WIN32
9dstest_DEPENDENCIES+=resources.o
10resources.o: ../src/resources.rc ../src/resource.h
11 @WINDRES@ ../src/resources.rc -o resources.o
12dstest_LDADD+= resources.o
13endif
diff --git a/libraries/ode-0.9/drawstuff/dstest/Makefile.in b/libraries/ode-0.9/drawstuff/dstest/Makefile.in
new file mode 100644
index 0000000..0b7aed3
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/dstest/Makefile.in
@@ -0,0 +1,446 @@
1# Makefile.in generated by automake 1.10 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6# This Makefile.in is free software; the Free Software Foundation
7# gives unlimited permission to copy and/or distribute it,
8# with or without modifications, as long as this notice is preserved.
9
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
12# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13# PARTICULAR PURPOSE.
14
15@SET_MAKE@
16
17VPATH = @srcdir@
18pkgdatadir = $(datadir)/@PACKAGE@
19pkglibdir = $(libdir)/@PACKAGE@
20pkgincludedir = $(includedir)/@PACKAGE@
21am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
22install_sh_DATA = $(install_sh) -c -m 644
23install_sh_PROGRAM = $(install_sh) -c
24install_sh_SCRIPT = $(install_sh) -c
25INSTALL_HEADER = $(INSTALL_DATA)
26transform = $(program_transform_name)
27NORMAL_INSTALL = :
28PRE_INSTALL = :
29POST_INSTALL = :
30NORMAL_UNINSTALL = :
31PRE_UNINSTALL = :
32POST_UNINSTALL = :
33build_triplet = @build@
34host_triplet = @host@
35target_triplet = @target@
36noinst_PROGRAMS = dstest$(EXEEXT)
37@WIN32_TRUE@am__append_1 = resources.o
38@WIN32_TRUE@am__append_2 = resources.o
39subdir = drawstuff/dstest
40DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/configure.in
43am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
44 $(ACLOCAL_M4)
45mkinstalldirs = $(install_sh) -d
46CONFIG_HEADER = $(top_builddir)/include/ode/config.h
47CONFIG_CLEAN_FILES =
48PROGRAMS = $(noinst_PROGRAMS)
49am_dstest_OBJECTS = dstest-dstest.$(OBJEXT)
50dstest_OBJECTS = $(am_dstest_OBJECTS)
51dstest_LINK = $(CXXLD) $(dstest_CXXFLAGS) $(CXXFLAGS) \
52 $(dstest_LDFLAGS) $(LDFLAGS) -o $@
53DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/ode@am__isrc@
54depcomp = $(SHELL) $(top_srcdir)/depcomp
55am__depfiles_maybe = depfiles
56CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
57 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
58CXXLD = $(CXX)
59CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
60 -o $@
61SOURCES = $(dstest_SOURCES)
62DIST_SOURCES = $(dstest_SOURCES)
63ETAGS = etags
64CTAGS = ctags
65DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
66ACLOCAL = @ACLOCAL@
67ALLOCA = @ALLOCA@
68AMTAR = @AMTAR@
69ARCHFLAGS = @ARCHFLAGS@
70AUTOCONF = @AUTOCONF@
71AUTOHEADER = @AUTOHEADER@
72AUTOMAKE = @AUTOMAKE@
73AWK = @AWK@
74CC = @CC@
75CCDEPMODE = @CCDEPMODE@
76CFLAGS = @CFLAGS@
77CPP = @CPP@
78CPPFLAGS = @CPPFLAGS@
79CXX = @CXX@
80CXXDEPMODE = @CXXDEPMODE@
81CXXFLAGS = @CXXFLAGS@
82CYGPATH_W = @CYGPATH_W@
83DEFS = @DEFS@
84DEPDIR = @DEPDIR@
85DRAWSTUFF = @DRAWSTUFF@
86ECHO_C = @ECHO_C@
87ECHO_N = @ECHO_N@
88ECHO_T = @ECHO_T@
89EGREP = @EGREP@
90EXEEXT = @EXEEXT@
91GL_LIBS = @GL_LIBS@
92GREP = @GREP@
93INSTALL = @INSTALL@
94INSTALL_DATA = @INSTALL_DATA@
95INSTALL_PROGRAM = @INSTALL_PROGRAM@
96INSTALL_SCRIPT = @INSTALL_SCRIPT@
97INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
98LDFLAGS = @LDFLAGS@
99LIBOBJS = @LIBOBJS@
100LIBS = @LIBS@
101LTLIBOBJS = @LTLIBOBJS@
102MAKEINFO = @MAKEINFO@
103MKDIR_P = @MKDIR_P@
104OBJEXT = @OBJEXT@
105ODE_AGE = @ODE_AGE@
106ODE_CURRENT = @ODE_CURRENT@
107ODE_RELEASE = @ODE_RELEASE@
108ODE_REVISION = @ODE_REVISION@
109ODE_SONAME = @ODE_SONAME@
110PACKAGE = @PACKAGE@
111PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
112PACKAGE_NAME = @PACKAGE_NAME@
113PACKAGE_STRING = @PACKAGE_STRING@
114PACKAGE_TARNAME = @PACKAGE_TARNAME@
115PACKAGE_VERSION = @PACKAGE_VERSION@
116PATH_SEPARATOR = @PATH_SEPARATOR@
117RANLIB = @RANLIB@
118SET_MAKE = @SET_MAKE@
119SHARED_LDFLAGS = @SHARED_LDFLAGS@
120SHELL = @SHELL@
121STRIP = @STRIP@
122TOPDIR = @TOPDIR@
123VERSION = @VERSION@
124WINDRES = @WINDRES@
125XMKMF = @XMKMF@
126X_CFLAGS = @X_CFLAGS@
127X_EXTRA_LIBS = @X_EXTRA_LIBS@
128X_LIBS = @X_LIBS@
129X_PRE_LIBS = @X_PRE_LIBS@
130abs_builddir = @abs_builddir@
131abs_srcdir = @abs_srcdir@
132abs_top_builddir = @abs_top_builddir@
133abs_top_srcdir = @abs_top_srcdir@
134ac_ct_CC = @ac_ct_CC@
135ac_ct_CXX = @ac_ct_CXX@
136ac_ct_WINDRES = @ac_ct_WINDRES@
137am__include = @am__include@
138am__leading_dot = @am__leading_dot@
139am__quote = @am__quote@
140am__tar = @am__tar@
141am__untar = @am__untar@
142bindir = @bindir@
143build = @build@
144build_alias = @build_alias@
145build_cpu = @build_cpu@
146build_os = @build_os@
147build_vendor = @build_vendor@
148builddir = @builddir@
149datadir = @datadir@
150datarootdir = @datarootdir@
151docdir = @docdir@
152dvidir = @dvidir@
153exec_prefix = @exec_prefix@
154host = @host@
155host_alias = @host_alias@
156host_cpu = @host_cpu@
157host_os = @host_os@
158host_vendor = @host_vendor@
159htmldir = @htmldir@
160includedir = @includedir@
161infodir = @infodir@
162install_sh = @install_sh@
163libdir = @libdir@
164libexecdir = @libexecdir@
165localedir = @localedir@
166localstatedir = @localstatedir@
167mandir = @mandir@
168mkdir_p = @mkdir_p@
169oldincludedir = @oldincludedir@
170pdfdir = @pdfdir@
171prefix = @prefix@
172program_transform_name = @program_transform_name@
173psdir = @psdir@
174sbindir = @sbindir@
175sharedstatedir = @sharedstatedir@
176so_ext = @so_ext@
177srcdir = @srcdir@
178sysconfdir = @sysconfdir@
179target = @target@
180target_alias = @target_alias@
181target_cpu = @target_cpu@
182target_os = @target_os@
183target_vendor = @target_vendor@
184top_builddir = @top_builddir@
185top_srcdir = @top_srcdir@
186dstest_CXXFLAGS = -I$(top_srcdir)/include -I$(top_builddir)
187dstest_SOURCES = dstest.cpp
188dstest_DEPENDENCIES = $(top_builddir)/drawstuff/src/libdrawstuff.a \
189 $(am__append_1)
190dstest_LDFLAGS = -L$(top_builddir)/drawstuff/src
191dstest_LDADD = -ldrawstuff @LDFLAGS@ @GL_LIBS@ @LIBS@ $(am__append_2)
192all: all-am
193
194.SUFFIXES:
195.SUFFIXES: .cpp .o .obj
196$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
197 @for dep in $?; do \
198 case '$(am__configure_deps)' in \
199 *$$dep*) \
200 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
201 && exit 0; \
202 exit 1;; \
203 esac; \
204 done; \
205 echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/dstest/Makefile'; \
206 cd $(top_srcdir) && \
207 $(AUTOMAKE) --foreign drawstuff/dstest/Makefile
208.PRECIOUS: Makefile
209Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
210 @case '$?' in \
211 *config.status*) \
212 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
213 *) \
214 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
215 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
216 esac;
217
218$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
219 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
220
221$(top_srcdir)/configure: $(am__configure_deps)
222 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
223$(ACLOCAL_M4): $(am__aclocal_m4_deps)
224 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
225
226clean-noinstPROGRAMS:
227 -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
228dstest$(EXEEXT): $(dstest_OBJECTS) $(dstest_DEPENDENCIES)
229 @rm -f dstest$(EXEEXT)
230 $(dstest_LINK) $(dstest_OBJECTS) $(dstest_LDADD) $(LIBS)
231
232mostlyclean-compile:
233 -rm -f *.$(OBJEXT)
234
235distclean-compile:
236 -rm -f *.tab.c
237
238@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dstest-dstest.Po@am__quote@
239
240.cpp.o:
241@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
242@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
243@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
244@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
245@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
246
247.cpp.obj:
248@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
249@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
250@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
251@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
252@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
253
254dstest-dstest.o: dstest.cpp
255@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -MT dstest-dstest.o -MD -MP -MF $(DEPDIR)/dstest-dstest.Tpo -c -o dstest-dstest.o `test -f 'dstest.cpp' || echo '$(srcdir)/'`dstest.cpp
256@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dstest-dstest.Tpo $(DEPDIR)/dstest-dstest.Po
257@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dstest.cpp' object='dstest-dstest.o' libtool=no @AMDEPBACKSLASH@
258@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
259@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -c -o dstest-dstest.o `test -f 'dstest.cpp' || echo '$(srcdir)/'`dstest.cpp
260
261dstest-dstest.obj: dstest.cpp
262@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -MT dstest-dstest.obj -MD -MP -MF $(DEPDIR)/dstest-dstest.Tpo -c -o dstest-dstest.obj `if test -f 'dstest.cpp'; then $(CYGPATH_W) 'dstest.cpp'; else $(CYGPATH_W) '$(srcdir)/dstest.cpp'; fi`
263@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dstest-dstest.Tpo $(DEPDIR)/dstest-dstest.Po
264@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dstest.cpp' object='dstest-dstest.obj' libtool=no @AMDEPBACKSLASH@
265@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
266@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -c -o dstest-dstest.obj `if test -f 'dstest.cpp'; then $(CYGPATH_W) 'dstest.cpp'; else $(CYGPATH_W) '$(srcdir)/dstest.cpp'; fi`
267
268ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
269 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
270 unique=`for i in $$list; do \
271 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
272 done | \
273 $(AWK) ' { files[$$0] = 1; } \
274 END { for (i in files) print i; }'`; \
275 mkid -fID $$unique
276tags: TAGS
277
278TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
279 $(TAGS_FILES) $(LISP)
280 tags=; \
281 here=`pwd`; \
282 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
283 unique=`for i in $$list; do \
284 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
285 done | \
286 $(AWK) ' { files[$$0] = 1; } \
287 END { for (i in files) print i; }'`; \
288 if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
289 test -n "$$unique" || unique=$$empty_fix; \
290 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
291 $$tags $$unique; \
292 fi
293ctags: CTAGS
294CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
295 $(TAGS_FILES) $(LISP)
296 tags=; \
297 here=`pwd`; \
298 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
299 unique=`for i in $$list; do \
300 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
301 done | \
302 $(AWK) ' { files[$$0] = 1; } \
303 END { for (i in files) print i; }'`; \
304 test -z "$(CTAGS_ARGS)$$tags$$unique" \
305 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
306 $$tags $$unique
307
308GTAGS:
309 here=`$(am__cd) $(top_builddir) && pwd` \
310 && cd $(top_srcdir) \
311 && gtags -i $(GTAGS_ARGS) $$here
312
313distclean-tags:
314 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
315
316distdir: $(DISTFILES)
317 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
318 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
319 list='$(DISTFILES)'; \
320 dist_files=`for file in $$list; do echo $$file; done | \
321 sed -e "s|^$$srcdirstrip/||;t" \
322 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
323 case $$dist_files in \
324 */*) $(MKDIR_P) `echo "$$dist_files" | \
325 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
326 sort -u` ;; \
327 esac; \
328 for file in $$dist_files; do \
329 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
330 if test -d $$d/$$file; then \
331 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
332 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
333 cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
334 fi; \
335 cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
336 else \
337 test -f $(distdir)/$$file \
338 || cp -p $$d/$$file $(distdir)/$$file \
339 || exit 1; \
340 fi; \
341 done
342check-am: all-am
343check: check-am
344all-am: Makefile $(PROGRAMS)
345installdirs:
346install: install-am
347install-exec: install-exec-am
348install-data: install-data-am
349uninstall: uninstall-am
350
351install-am: all-am
352 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
353
354installcheck: installcheck-am
355install-strip:
356 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
357 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
358 `test -z '$(STRIP)' || \
359 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
360mostlyclean-generic:
361
362clean-generic:
363
364distclean-generic:
365 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
366
367maintainer-clean-generic:
368 @echo "This command is intended for maintainers to use"
369 @echo "it deletes files that may require special tools to rebuild."
370clean: clean-am
371
372clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am
373
374distclean: distclean-am
375 -rm -rf ./$(DEPDIR)
376 -rm -f Makefile
377distclean-am: clean-am distclean-compile distclean-generic \
378 distclean-tags
379
380dvi: dvi-am
381
382dvi-am:
383
384html: html-am
385
386info: info-am
387
388info-am:
389
390install-data-am:
391
392install-dvi: install-dvi-am
393
394install-exec-am:
395
396install-html: install-html-am
397
398install-info: install-info-am
399
400install-man:
401
402install-pdf: install-pdf-am
403
404install-ps: install-ps-am
405
406installcheck-am:
407
408maintainer-clean: maintainer-clean-am
409 -rm -rf ./$(DEPDIR)
410 -rm -f Makefile
411maintainer-clean-am: distclean-am maintainer-clean-generic
412
413mostlyclean: mostlyclean-am
414
415mostlyclean-am: mostlyclean-compile mostlyclean-generic
416
417pdf: pdf-am
418
419pdf-am:
420
421ps: ps-am
422
423ps-am:
424
425uninstall-am:
426
427.MAKE: install-am install-strip
428
429.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
430 clean-noinstPROGRAMS ctags distclean distclean-compile \
431 distclean-generic distclean-tags distdir dvi dvi-am html \
432 html-am info info-am install install-am install-data \
433 install-data-am install-dvi install-dvi-am install-exec \
434 install-exec-am install-html install-html-am install-info \
435 install-info-am install-man install-pdf install-pdf-am \
436 install-ps install-ps-am install-strip installcheck \
437 installcheck-am installdirs maintainer-clean \
438 maintainer-clean-generic mostlyclean mostlyclean-compile \
439 mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
440 uninstall-am
441
442@WIN32_TRUE@resources.o: ../src/resources.rc ../src/resource.h
443@WIN32_TRUE@ @WINDRES@ ../src/resources.rc -o resources.o
444# Tell versions [3.59,3.63) of GNU make to not export all variables.
445# Otherwise a system limit (for SysV at least) may be exceeded.
446.NOEXPORT:
diff --git a/libraries/ode-0.9/drawstuff/dstest/dstest.cpp b/libraries/ode-0.9/drawstuff/dstest/dstest.cpp
new file mode 100644
index 0000000..27f042f
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/dstest/dstest.cpp
@@ -0,0 +1,125 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23#include <stdio.h>
24#include <math.h>
25#include <drawstuff/drawstuff.h>
26
27
28#ifndef M_PI
29#define M_PI (3.14159265358979323846)
30#endif
31
32
33void start()
34{
35 // adjust the starting viewpoint a bit
36 float xyz[3],hpr[3];
37 dsGetViewpoint (xyz,hpr);
38 hpr[0] += 7;
39 dsSetViewpoint (xyz,hpr);
40}
41
42
43void simLoop (int pause)
44{
45 float pos[3];
46 float R[12];
47 static float a = 0;
48
49 if (!pause) a += 0.02f;
50 if (a > (2*M_PI)) a -= (float) (2*M_PI);
51 float ca = (float) cos(a);
52 float sa = (float) sin(a);
53
54 dsSetTexture (DS_WOOD);
55
56 float b = (a > M_PI) ? (2*(a-(float)M_PI)) : a*2;
57 pos[0] = -0.3f;
58 pos[1] = 0;
59 pos[2] = (float) (0.1f*(2*M_PI*b - b*b) + 0.65f);
60 R[0] = ca; R[1] = 0; R[2] = -sa;
61 R[4] = 0; R[5] = 1; R[6] = 0;
62 R[8] = sa; R[9] = 0; R[10] = ca;
63 dsSetColor (1,0.8f,0.6f);
64 dsDrawSphere (pos,R,0.3f);
65
66 dsSetTexture (DS_NONE);
67
68 pos[0] = -0.2f;
69 pos[1] = 0.8f;
70 pos[2] = 0.4f;
71 R[0] = ca; R[1] = -sa; R[2] = 0;
72 R[4] = sa; R[5] = ca; R[6] = 0;
73 R[8] = 0; R[9] = 0; R[10] = 1;
74 float sides[3] = {0.1f,0.4f,0.8f};
75 dsSetColor (0.6f,0.6f,1);
76 dsDrawBox (pos,R,sides);
77
78 dsSetTexture (DS_WOOD);
79
80 float r = 0.3f; // cylinder radius
81 float d = (float)cos(a*2) * 0.4f;
82 float cd = (float)cos(-d/r);
83 float sd = (float)sin(-d/r);
84 pos[0] = -0.2f;
85 pos[1] = -1 + d;
86 pos[2] = 0.3f;
87 R[0] = 0; R[1] = 0; R[2] = -1;
88 R[4] = -sd; R[5] = cd; R[6] = 0;
89 R[8] = cd; R[9] = sd; R[10] = 0;
90 dsSetColor (0.4f,1,1);
91 dsDrawCylinder (pos,R,0.8f,r);
92
93 pos[0] = 0;
94 pos[1] = 0;
95 pos[2] = 0.2f;
96 R[0] = 0; R[1] = sa; R[2] = -ca;
97 R[4] = 0; R[5] = ca; R[6] = sa;
98 R[8] = 1; R[9] = 0; R[10] = 0;
99 dsSetColor (1,0.9f,0.2f);
100 dsDrawCappedCylinder (pos,R,0.8f,0.2f);
101}
102
103
104void command (int cmd)
105{
106 dsPrint ("received command %d (`%c')\n",cmd,cmd);
107}
108
109
110int main (int argc, char **argv)
111{
112 // setup pointers to callback functions
113 dsFunctions fn;
114 fn.version = DS_VERSION;
115 fn.start = &start;
116 fn.step = &simLoop;
117 fn.command = command;
118 fn.stop = 0;
119 fn.path_to_textures = 0; // uses default
120
121 // run simulation
122 dsSimulationLoop (argc,argv,400,400,&fn);
123
124 return 0;
125}
diff --git a/libraries/ode-0.9/drawstuff/src/Makefile.am b/libraries/ode-0.9/drawstuff/src/Makefile.am
new file mode 100644
index 0000000..ed9b2f5
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/Makefile.am
@@ -0,0 +1,21 @@
1# We build drawstuff as a non libtool static library manually
2# so it doesn't get installed when 'make install' is called,
3# drawstuff is meant as an aid for testing and not as a full
4# rendering library.
5
6noinst_LIBRARIES = libdrawstuff.a
7libdrawstuff_a_SOURCES = drawstuff.cpp internal.h
8libdrawstuff_a_CXXFLAGS = @ARCHFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include
9
10# libdrawstuff_a_LIBADD = @GL_LIBS@
11
12if WIN32
13libdrawstuff_a_SOURCES+= windows.cpp
14endif
15if X11
16libdrawstuff_a_SOURCES+= x11.cpp
17endif
18if OSX
19libdrawstuff_a_SOURCES+= osx.cpp
20endif
21
diff --git a/libraries/ode-0.9/drawstuff/src/Makefile.in b/libraries/ode-0.9/drawstuff/src/Makefile.in
new file mode 100644
index 0000000..0e0f633
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/Makefile.in
@@ -0,0 +1,507 @@
1# Makefile.in generated by automake 1.10 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6# This Makefile.in is free software; the Free Software Foundation
7# gives unlimited permission to copy and/or distribute it,
8# with or without modifications, as long as this notice is preserved.
9
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
12# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13# PARTICULAR PURPOSE.
14
15@SET_MAKE@
16
17# We build drawstuff as a non libtool static library manually
18# so it doesn't get installed when 'make install' is called,
19# drawstuff is meant as an aid for testing and not as a full
20# rendering library.
21
22VPATH = @srcdir@
23pkgdatadir = $(datadir)/@PACKAGE@
24pkglibdir = $(libdir)/@PACKAGE@
25pkgincludedir = $(includedir)/@PACKAGE@
26am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
27install_sh_DATA = $(install_sh) -c -m 644
28install_sh_PROGRAM = $(install_sh) -c
29install_sh_SCRIPT = $(install_sh) -c
30INSTALL_HEADER = $(INSTALL_DATA)
31transform = $(program_transform_name)
32NORMAL_INSTALL = :
33PRE_INSTALL = :
34POST_INSTALL = :
35NORMAL_UNINSTALL = :
36PRE_UNINSTALL = :
37POST_UNINSTALL = :
38build_triplet = @build@
39host_triplet = @host@
40target_triplet = @target@
41
42# libdrawstuff_a_LIBADD = @GL_LIBS@
43@WIN32_TRUE@am__append_1 = windows.cpp
44@X11_TRUE@am__append_2 = x11.cpp
45@OSX_TRUE@am__append_3 = osx.cpp
46subdir = drawstuff/src
47DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
48ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
49am__aclocal_m4_deps = $(top_srcdir)/configure.in
50am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
51 $(ACLOCAL_M4)
52mkinstalldirs = $(install_sh) -d
53CONFIG_HEADER = $(top_builddir)/include/ode/config.h
54CONFIG_CLEAN_FILES =
55LIBRARIES = $(noinst_LIBRARIES)
56AR = ar
57ARFLAGS = cru
58libdrawstuff_a_AR = $(AR) $(ARFLAGS)
59libdrawstuff_a_LIBADD =
60am__libdrawstuff_a_SOURCES_DIST = drawstuff.cpp internal.h windows.cpp \
61 x11.cpp osx.cpp
62@WIN32_TRUE@am__objects_1 = libdrawstuff_a-windows.$(OBJEXT)
63@X11_TRUE@am__objects_2 = libdrawstuff_a-x11.$(OBJEXT)
64@OSX_TRUE@am__objects_3 = libdrawstuff_a-osx.$(OBJEXT)
65am_libdrawstuff_a_OBJECTS = libdrawstuff_a-drawstuff.$(OBJEXT) \
66 $(am__objects_1) $(am__objects_2) $(am__objects_3)
67libdrawstuff_a_OBJECTS = $(am_libdrawstuff_a_OBJECTS)
68DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/ode@am__isrc@
69depcomp = $(SHELL) $(top_srcdir)/depcomp
70am__depfiles_maybe = depfiles
71CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
72 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
73CXXLD = $(CXX)
74CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
75 -o $@
76COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
77 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
78CCLD = $(CC)
79LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
80SOURCES = $(libdrawstuff_a_SOURCES)
81DIST_SOURCES = $(am__libdrawstuff_a_SOURCES_DIST)
82ETAGS = etags
83CTAGS = ctags
84DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
85ACLOCAL = @ACLOCAL@
86ALLOCA = @ALLOCA@
87AMTAR = @AMTAR@
88ARCHFLAGS = @ARCHFLAGS@
89AUTOCONF = @AUTOCONF@
90AUTOHEADER = @AUTOHEADER@
91AUTOMAKE = @AUTOMAKE@
92AWK = @AWK@
93CC = @CC@
94CCDEPMODE = @CCDEPMODE@
95CFLAGS = @CFLAGS@
96CPP = @CPP@
97CPPFLAGS = @CPPFLAGS@
98CXX = @CXX@
99CXXDEPMODE = @CXXDEPMODE@
100CXXFLAGS = @CXXFLAGS@
101CYGPATH_W = @CYGPATH_W@
102DEFS = @DEFS@
103DEPDIR = @DEPDIR@
104DRAWSTUFF = @DRAWSTUFF@
105ECHO_C = @ECHO_C@
106ECHO_N = @ECHO_N@
107ECHO_T = @ECHO_T@
108EGREP = @EGREP@
109EXEEXT = @EXEEXT@
110GL_LIBS = @GL_LIBS@
111GREP = @GREP@
112INSTALL = @INSTALL@
113INSTALL_DATA = @INSTALL_DATA@
114INSTALL_PROGRAM = @INSTALL_PROGRAM@
115INSTALL_SCRIPT = @INSTALL_SCRIPT@
116INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
117LDFLAGS = @LDFLAGS@
118LIBOBJS = @LIBOBJS@
119LIBS = @LIBS@
120LTLIBOBJS = @LTLIBOBJS@
121MAKEINFO = @MAKEINFO@
122MKDIR_P = @MKDIR_P@
123OBJEXT = @OBJEXT@
124ODE_AGE = @ODE_AGE@
125ODE_CURRENT = @ODE_CURRENT@
126ODE_RELEASE = @ODE_RELEASE@
127ODE_REVISION = @ODE_REVISION@
128ODE_SONAME = @ODE_SONAME@
129PACKAGE = @PACKAGE@
130PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
131PACKAGE_NAME = @PACKAGE_NAME@
132PACKAGE_STRING = @PACKAGE_STRING@
133PACKAGE_TARNAME = @PACKAGE_TARNAME@
134PACKAGE_VERSION = @PACKAGE_VERSION@
135PATH_SEPARATOR = @PATH_SEPARATOR@
136RANLIB = @RANLIB@
137SET_MAKE = @SET_MAKE@
138SHARED_LDFLAGS = @SHARED_LDFLAGS@
139SHELL = @SHELL@
140STRIP = @STRIP@
141TOPDIR = @TOPDIR@
142VERSION = @VERSION@
143WINDRES = @WINDRES@
144XMKMF = @XMKMF@
145X_CFLAGS = @X_CFLAGS@
146X_EXTRA_LIBS = @X_EXTRA_LIBS@
147X_LIBS = @X_LIBS@
148X_PRE_LIBS = @X_PRE_LIBS@
149abs_builddir = @abs_builddir@
150abs_srcdir = @abs_srcdir@
151abs_top_builddir = @abs_top_builddir@
152abs_top_srcdir = @abs_top_srcdir@
153ac_ct_CC = @ac_ct_CC@
154ac_ct_CXX = @ac_ct_CXX@
155ac_ct_WINDRES = @ac_ct_WINDRES@
156am__include = @am__include@
157am__leading_dot = @am__leading_dot@
158am__quote = @am__quote@
159am__tar = @am__tar@
160am__untar = @am__untar@
161bindir = @bindir@
162build = @build@
163build_alias = @build_alias@
164build_cpu = @build_cpu@
165build_os = @build_os@
166build_vendor = @build_vendor@
167builddir = @builddir@
168datadir = @datadir@
169datarootdir = @datarootdir@
170docdir = @docdir@
171dvidir = @dvidir@
172exec_prefix = @exec_prefix@
173host = @host@
174host_alias = @host_alias@
175host_cpu = @host_cpu@
176host_os = @host_os@
177host_vendor = @host_vendor@
178htmldir = @htmldir@
179includedir = @includedir@
180infodir = @infodir@
181install_sh = @install_sh@
182libdir = @libdir@
183libexecdir = @libexecdir@
184localedir = @localedir@
185localstatedir = @localstatedir@
186mandir = @mandir@
187mkdir_p = @mkdir_p@
188oldincludedir = @oldincludedir@
189pdfdir = @pdfdir@
190prefix = @prefix@
191program_transform_name = @program_transform_name@
192psdir = @psdir@
193sbindir = @sbindir@
194sharedstatedir = @sharedstatedir@
195so_ext = @so_ext@
196srcdir = @srcdir@
197sysconfdir = @sysconfdir@
198target = @target@
199target_alias = @target_alias@
200target_cpu = @target_cpu@
201target_os = @target_os@
202target_vendor = @target_vendor@
203top_builddir = @top_builddir@
204top_srcdir = @top_srcdir@
205noinst_LIBRARIES = libdrawstuff.a
206libdrawstuff_a_SOURCES = drawstuff.cpp internal.h $(am__append_1) \
207 $(am__append_2) $(am__append_3)
208libdrawstuff_a_CXXFLAGS = @ARCHFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include
209all: all-am
210
211.SUFFIXES:
212.SUFFIXES: .cpp .o .obj
213$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
214 @for dep in $?; do \
215 case '$(am__configure_deps)' in \
216 *$$dep*) \
217 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
218 && exit 0; \
219 exit 1;; \
220 esac; \
221 done; \
222 echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/src/Makefile'; \
223 cd $(top_srcdir) && \
224 $(AUTOMAKE) --foreign drawstuff/src/Makefile
225.PRECIOUS: Makefile
226Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
227 @case '$?' in \
228 *config.status*) \
229 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
230 *) \
231 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
232 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
233 esac;
234
235$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
236 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
237
238$(top_srcdir)/configure: $(am__configure_deps)
239 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
240$(ACLOCAL_M4): $(am__aclocal_m4_deps)
241 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
242
243clean-noinstLIBRARIES:
244 -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
245libdrawstuff.a: $(libdrawstuff_a_OBJECTS) $(libdrawstuff_a_DEPENDENCIES)
246 -rm -f libdrawstuff.a
247 $(libdrawstuff_a_AR) libdrawstuff.a $(libdrawstuff_a_OBJECTS) $(libdrawstuff_a_LIBADD)
248 $(RANLIB) libdrawstuff.a
249
250mostlyclean-compile:
251 -rm -f *.$(OBJEXT)
252
253distclean-compile:
254 -rm -f *.tab.c
255
256@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-drawstuff.Po@am__quote@
257@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-osx.Po@am__quote@
258@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-windows.Po@am__quote@
259@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-x11.Po@am__quote@
260
261.cpp.o:
262@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
263@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
264@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
265@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
266@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
267
268.cpp.obj:
269@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
270@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
271@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
272@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
273@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
274
275libdrawstuff_a-drawstuff.o: drawstuff.cpp
276@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-drawstuff.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo -c -o libdrawstuff_a-drawstuff.o `test -f 'drawstuff.cpp' || echo '$(srcdir)/'`drawstuff.cpp
277@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo $(DEPDIR)/libdrawstuff_a-drawstuff.Po
278@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drawstuff.cpp' object='libdrawstuff_a-drawstuff.o' libtool=no @AMDEPBACKSLASH@
279@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
280@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-drawstuff.o `test -f 'drawstuff.cpp' || echo '$(srcdir)/'`drawstuff.cpp
281
282libdrawstuff_a-drawstuff.obj: drawstuff.cpp
283@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-drawstuff.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo -c -o libdrawstuff_a-drawstuff.obj `if test -f 'drawstuff.cpp'; then $(CYGPATH_W) 'drawstuff.cpp'; else $(CYGPATH_W) '$(srcdir)/drawstuff.cpp'; fi`
284@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo $(DEPDIR)/libdrawstuff_a-drawstuff.Po
285@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drawstuff.cpp' object='libdrawstuff_a-drawstuff.obj' libtool=no @AMDEPBACKSLASH@
286@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
287@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-drawstuff.obj `if test -f 'drawstuff.cpp'; then $(CYGPATH_W) 'drawstuff.cpp'; else $(CYGPATH_W) '$(srcdir)/drawstuff.cpp'; fi`
288
289libdrawstuff_a-windows.o: windows.cpp
290@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-windows.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-windows.Tpo -c -o libdrawstuff_a-windows.o `test -f 'windows.cpp' || echo '$(srcdir)/'`windows.cpp
291@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-windows.Tpo $(DEPDIR)/libdrawstuff_a-windows.Po
292@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='windows.cpp' object='libdrawstuff_a-windows.o' libtool=no @AMDEPBACKSLASH@
293@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
294@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-windows.o `test -f 'windows.cpp' || echo '$(srcdir)/'`windows.cpp
295
296libdrawstuff_a-windows.obj: windows.cpp
297@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-windows.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-windows.Tpo -c -o libdrawstuff_a-windows.obj `if test -f 'windows.cpp'; then $(CYGPATH_W) 'windows.cpp'; else $(CYGPATH_W) '$(srcdir)/windows.cpp'; fi`
298@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-windows.Tpo $(DEPDIR)/libdrawstuff_a-windows.Po
299@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='windows.cpp' object='libdrawstuff_a-windows.obj' libtool=no @AMDEPBACKSLASH@
300@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
301@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-windows.obj `if test -f 'windows.cpp'; then $(CYGPATH_W) 'windows.cpp'; else $(CYGPATH_W) '$(srcdir)/windows.cpp'; fi`
302
303libdrawstuff_a-x11.o: x11.cpp
304@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-x11.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-x11.Tpo -c -o libdrawstuff_a-x11.o `test -f 'x11.cpp' || echo '$(srcdir)/'`x11.cpp
305@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-x11.Tpo $(DEPDIR)/libdrawstuff_a-x11.Po
306@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='x11.cpp' object='libdrawstuff_a-x11.o' libtool=no @AMDEPBACKSLASH@
307@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
308@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-x11.o `test -f 'x11.cpp' || echo '$(srcdir)/'`x11.cpp
309
310libdrawstuff_a-x11.obj: x11.cpp
311@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-x11.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-x11.Tpo -c -o libdrawstuff_a-x11.obj `if test -f 'x11.cpp'; then $(CYGPATH_W) 'x11.cpp'; else $(CYGPATH_W) '$(srcdir)/x11.cpp'; fi`
312@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-x11.Tpo $(DEPDIR)/libdrawstuff_a-x11.Po
313@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='x11.cpp' object='libdrawstuff_a-x11.obj' libtool=no @AMDEPBACKSLASH@
314@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
315@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-x11.obj `if test -f 'x11.cpp'; then $(CYGPATH_W) 'x11.cpp'; else $(CYGPATH_W) '$(srcdir)/x11.cpp'; fi`
316
317libdrawstuff_a-osx.o: osx.cpp
318@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-osx.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-osx.Tpo -c -o libdrawstuff_a-osx.o `test -f 'osx.cpp' || echo '$(srcdir)/'`osx.cpp
319@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-osx.Tpo $(DEPDIR)/libdrawstuff_a-osx.Po
320@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='osx.cpp' object='libdrawstuff_a-osx.o' libtool=no @AMDEPBACKSLASH@
321@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
322@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-osx.o `test -f 'osx.cpp' || echo '$(srcdir)/'`osx.cpp
323
324libdrawstuff_a-osx.obj: osx.cpp
325@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-osx.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-osx.Tpo -c -o libdrawstuff_a-osx.obj `if test -f 'osx.cpp'; then $(CYGPATH_W) 'osx.cpp'; else $(CYGPATH_W) '$(srcdir)/osx.cpp'; fi`
326@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-osx.Tpo $(DEPDIR)/libdrawstuff_a-osx.Po
327@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='osx.cpp' object='libdrawstuff_a-osx.obj' libtool=no @AMDEPBACKSLASH@
328@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
329@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-osx.obj `if test -f 'osx.cpp'; then $(CYGPATH_W) 'osx.cpp'; else $(CYGPATH_W) '$(srcdir)/osx.cpp'; fi`
330
331ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
332 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
333 unique=`for i in $$list; do \
334 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
335 done | \
336 $(AWK) ' { files[$$0] = 1; } \
337 END { for (i in files) print i; }'`; \
338 mkid -fID $$unique
339tags: TAGS
340
341TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
342 $(TAGS_FILES) $(LISP)
343 tags=; \
344 here=`pwd`; \
345 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
346 unique=`for i in $$list; do \
347 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
348 done | \
349 $(AWK) ' { files[$$0] = 1; } \
350 END { for (i in files) print i; }'`; \
351 if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
352 test -n "$$unique" || unique=$$empty_fix; \
353 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
354 $$tags $$unique; \
355 fi
356ctags: CTAGS
357CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
358 $(TAGS_FILES) $(LISP)
359 tags=; \
360 here=`pwd`; \
361 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
362 unique=`for i in $$list; do \
363 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
364 done | \
365 $(AWK) ' { files[$$0] = 1; } \
366 END { for (i in files) print i; }'`; \
367 test -z "$(CTAGS_ARGS)$$tags$$unique" \
368 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
369 $$tags $$unique
370
371GTAGS:
372 here=`$(am__cd) $(top_builddir) && pwd` \
373 && cd $(top_srcdir) \
374 && gtags -i $(GTAGS_ARGS) $$here
375
376distclean-tags:
377 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
378
379distdir: $(DISTFILES)
380 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
381 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
382 list='$(DISTFILES)'; \
383 dist_files=`for file in $$list; do echo $$file; done | \
384 sed -e "s|^$$srcdirstrip/||;t" \
385 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
386 case $$dist_files in \
387 */*) $(MKDIR_P) `echo "$$dist_files" | \
388 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
389 sort -u` ;; \
390 esac; \
391 for file in $$dist_files; do \
392 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
393 if test -d $$d/$$file; then \
394 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
395 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
396 cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
397 fi; \
398 cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
399 else \
400 test -f $(distdir)/$$file \
401 || cp -p $$d/$$file $(distdir)/$$file \
402 || exit 1; \
403 fi; \
404 done
405check-am: all-am
406check: check-am
407all-am: Makefile $(LIBRARIES)
408installdirs:
409install: install-am
410install-exec: install-exec-am
411install-data: install-data-am
412uninstall: uninstall-am
413
414install-am: all-am
415 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
416
417installcheck: installcheck-am
418install-strip:
419 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
420 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
421 `test -z '$(STRIP)' || \
422 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
423mostlyclean-generic:
424
425clean-generic:
426
427distclean-generic:
428 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
429
430maintainer-clean-generic:
431 @echo "This command is intended for maintainers to use"
432 @echo "it deletes files that may require special tools to rebuild."
433clean: clean-am
434
435clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
436
437distclean: distclean-am
438 -rm -rf ./$(DEPDIR)
439 -rm -f Makefile
440distclean-am: clean-am distclean-compile distclean-generic \
441 distclean-tags
442
443dvi: dvi-am
444
445dvi-am:
446
447html: html-am
448
449info: info-am
450
451info-am:
452
453install-data-am:
454
455install-dvi: install-dvi-am
456
457install-exec-am:
458
459install-html: install-html-am
460
461install-info: install-info-am
462
463install-man:
464
465install-pdf: install-pdf-am
466
467install-ps: install-ps-am
468
469installcheck-am:
470
471maintainer-clean: maintainer-clean-am
472 -rm -rf ./$(DEPDIR)
473 -rm -f Makefile
474maintainer-clean-am: distclean-am maintainer-clean-generic
475
476mostlyclean: mostlyclean-am
477
478mostlyclean-am: mostlyclean-compile mostlyclean-generic
479
480pdf: pdf-am
481
482pdf-am:
483
484ps: ps-am
485
486ps-am:
487
488uninstall-am:
489
490.MAKE: install-am install-strip
491
492.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
493 clean-noinstLIBRARIES ctags distclean distclean-compile \
494 distclean-generic distclean-tags distdir dvi dvi-am html \
495 html-am info info-am install install-am install-data \
496 install-data-am install-dvi install-dvi-am install-exec \
497 install-exec-am install-html install-html-am install-info \
498 install-info-am install-man install-pdf install-pdf-am \
499 install-ps install-ps-am install-strip installcheck \
500 installcheck-am installdirs maintainer-clean \
501 maintainer-clean-generic mostlyclean mostlyclean-compile \
502 mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
503 uninstall-am
504
505# Tell versions [3.59,3.63) of GNU make to not export all variables.
506# Otherwise a system limit (for SysV at least) may be exceeded.
507.NOEXPORT:
diff --git a/libraries/ode-0.9/drawstuff/src/drawstuff.cpp b/libraries/ode-0.9/drawstuff/src/drawstuff.cpp
new file mode 100644
index 0000000..f588266
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/drawstuff.cpp
@@ -0,0 +1,1597 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23/*
24
25simple graphics.
26
27the following command line flags can be used (typically under unix)
28 -notex Do not use any textures
29 -noshadow[s] Do not draw any shadows
30 -pause Start the simulation paused
31
32TODO
33----
34
35manage openGL state changes better
36
37*/
38
39#ifdef WIN32
40#include <windows.h>
41#endif
42
43#include <ode/config.h>
44#ifdef HAVE_APPLE_OPENGL_FRAMEWORK
45#include <OpenGL/gl.h>
46#include <OpenGL/glu.h>
47#else
48#include <GL/gl.h>
49#include <GL/glu.h>
50#endif
51
52#include "drawstuff/drawstuff.h"
53#include "internal.h"
54
55//***************************************************************************
56// misc
57
58#ifdef WIN32
59#define DEFAULT_PATH_TO_TEXTURES "..\\textures\\"
60#else
61#define DEFAULT_PATH_TO_TEXTURES "../textures/"
62#endif
63
64#ifndef M_PI
65#define M_PI (3.14159265358979323846)
66#endif
67
68// constants to convert degrees to radians and the reverse
69#define RAD_TO_DEG (180.0/M_PI)
70#define DEG_TO_RAD (M_PI/180.0)
71
72// light vector. LIGHTZ is implicitly 1
73#define LIGHTX (1.0f)
74#define LIGHTY (0.4f)
75
76// ground and sky
77#define SHADOW_INTENSITY (0.65f)
78#define GROUND_R (0.5f) // ground color for when there's no texture
79#define GROUND_G (0.5f)
80#define GROUND_B (0.3f)
81
82const float ground_scale = 1.0f/1.0f; // ground texture scale (1/size)
83const float ground_ofsx = 0.5; // offset of ground texture
84const float ground_ofsy = 0.5;
85const float sky_scale = 1.0f/4.0f; // sky texture scale (1/size)
86const float sky_height = 1.0f; // sky height above viewpoint
87
88//***************************************************************************
89// misc mathematics stuff
90
91#define dCROSS(a,op,b,c) \
92 (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \
93 (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \
94 (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]);
95
96
97inline float dDOT (const float *a, const float *b)
98 { return ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2]); }
99
100
101static void normalizeVector3 (float v[3])
102{
103 float len = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
104 if (len <= 0.0f) {
105 v[0] = 1;
106 v[1] = 0;
107 v[2] = 0;
108 }
109 else {
110 len = 1.0f / (float)sqrt(len);
111 v[0] *= len;
112 v[1] *= len;
113 v[2] *= len;
114 }
115}
116
117//***************************************************************************
118// PPM image object
119
120typedef unsigned char byte;
121
122class Image {
123 int image_width,image_height;
124 byte *image_data;
125public:
126 Image (char *filename);
127 // load from PPM file
128 ~Image();
129 int width() { return image_width; }
130 int height() { return image_height; }
131 byte *data() { return image_data; }
132};
133
134
135// skip over whitespace and comments in a stream.
136
137static void skipWhiteSpace (char *filename, FILE *f)
138{
139 int c,d;
140 for(;;) {
141 c = fgetc(f);
142 if (c==EOF) dsError ("unexpected end of file in \"%s\"",filename);
143
144 // skip comments
145 if (c == '#') {
146 do {
147 d = fgetc(f);
148 if (d==EOF) dsError ("unexpected end of file in \"%s\"",filename);
149 } while (d != '\n');
150 continue;
151 }
152
153 if (c > ' ') {
154 ungetc (c,f);
155 return;
156 }
157 }
158}
159
160
161// read a number from a stream, this return 0 if there is none (that's okay
162// because 0 is a bad value for all PPM numbers anyway).
163
164static int readNumber (char *filename, FILE *f)
165{
166 int c,n=0;
167 for(;;) {
168 c = fgetc(f);
169 if (c==EOF) dsError ("unexpected end of file in \"%s\"",filename);
170 if (c >= '0' && c <= '9') n = n*10 + (c - '0');
171 else {
172 ungetc (c,f);
173 return n;
174 }
175 }
176}
177
178
179Image::Image (char *filename)
180{
181 FILE *f = fopen (filename,"rb");
182 if (!f) dsError ("Can't open image file `%s'",filename);
183
184 // read in header
185 if (fgetc(f) != 'P' || fgetc(f) != '6')
186 dsError ("image file \"%s\" is not a binary PPM (no P6 header)",filename);
187 skipWhiteSpace (filename,f);
188
189 // read in image parameters
190 image_width = readNumber (filename,f);
191 skipWhiteSpace (filename,f);
192 image_height = readNumber (filename,f);
193 skipWhiteSpace (filename,f);
194 int max_value = readNumber (filename,f);
195
196 // check values
197 if (image_width < 1 || image_height < 1)
198 dsError ("bad image file \"%s\"",filename);
199 if (max_value != 255)
200 dsError ("image file \"%s\" must have color range of 255",filename);
201
202 // read either nothing, LF (10), or CR,LF (13,10)
203 int c = fgetc(f);
204 if (c == 10) {
205 // LF
206 }
207 else if (c == 13) {
208 // CR
209 c = fgetc(f);
210 if (c != 10) ungetc (c,f);
211 }
212 else ungetc (c,f);
213
214 // read in rest of data
215 image_data = new byte [image_width*image_height*3];
216 if (fread (image_data,image_width*image_height*3,1,f) != 1)
217 dsError ("Can not read data from image file `%s'",filename);
218 fclose (f);
219}
220
221
222Image::~Image()
223{
224 delete[] image_data;
225}
226
227//***************************************************************************
228// Texture object.
229
230class Texture {
231 Image *image;
232 GLuint name;
233public:
234 Texture (char *filename);
235 ~Texture();
236 void bind (int modulate);
237};
238
239
240Texture::Texture (char *filename)
241{
242 image = new Image (filename);
243 glGenTextures (1,&name);
244 glBindTexture (GL_TEXTURE_2D,name);
245
246 // set pixel unpacking mode
247 glPixelStorei (GL_UNPACK_SWAP_BYTES, 0);
248 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
249 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
250 glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
251 glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
252
253 // glTexImage2D (GL_TEXTURE_2D, 0, 3, image->width(), image->height(), 0,
254 // GL_RGB, GL_UNSIGNED_BYTE, image->data());
255 gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image->width(), image->height(),
256 GL_RGB, GL_UNSIGNED_BYTE, image->data());
257
258 // set texture parameters - will these also be bound to the texture???
259 glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
260 glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
261
262 glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
263 glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
264 GL_LINEAR_MIPMAP_LINEAR);
265
266 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
267}
268
269
270Texture::~Texture()
271{
272 delete image;
273 glDeleteTextures (1,&name);
274}
275
276
277void Texture::bind (int modulate)
278{
279 glBindTexture (GL_TEXTURE_2D,name);
280 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
281 modulate ? GL_MODULATE : GL_DECAL);
282}
283
284//***************************************************************************
285// the current drawing state (for when the user's step function is drawing)
286
287static float color[4] = {0,0,0,0}; // current r,g,b,alpha color
288static int tnum = 0; // current texture number
289
290//***************************************************************************
291// OpenGL utility stuff
292
293static void setCamera (float x, float y, float z, float h, float p, float r)
294{
295 glMatrixMode (GL_MODELVIEW);
296 glLoadIdentity();
297 glRotatef (90, 0,0,1);
298 glRotatef (90, 0,1,0);
299 glRotatef (r, 1,0,0);
300 glRotatef (p, 0,1,0);
301 glRotatef (-h, 0,0,1);
302 glTranslatef (-x,-y,-z);
303}
304
305
306// sets the material color, not the light color
307
308static void setColor (float r, float g, float b, float alpha)
309{
310 GLfloat light_ambient[4],light_diffuse[4],light_specular[4];
311 light_ambient[0] = r*0.3f;
312 light_ambient[1] = g*0.3f;
313 light_ambient[2] = b*0.3f;
314 light_ambient[3] = alpha;
315 light_diffuse[0] = r*0.7f;
316 light_diffuse[1] = g*0.7f;
317 light_diffuse[2] = b*0.7f;
318 light_diffuse[3] = alpha;
319 light_specular[0] = r*0.2f;
320 light_specular[1] = g*0.2f;
321 light_specular[2] = b*0.2f;
322 light_specular[3] = alpha;
323 glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, light_ambient);
324 glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, light_diffuse);
325 glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, light_specular);
326 glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 5.0f);
327}
328
329
330static void setTransform (const float pos[3], const float R[12])
331{
332 GLfloat matrix[16];
333 matrix[0]=R[0];
334 matrix[1]=R[4];
335 matrix[2]=R[8];
336 matrix[3]=0;
337 matrix[4]=R[1];
338 matrix[5]=R[5];
339 matrix[6]=R[9];
340 matrix[7]=0;
341 matrix[8]=R[2];
342 matrix[9]=R[6];
343 matrix[10]=R[10];
344 matrix[11]=0;
345 matrix[12]=pos[0];
346 matrix[13]=pos[1];
347 matrix[14]=pos[2];
348 matrix[15]=1;
349 glPushMatrix();
350 glMultMatrixf (matrix);
351}
352static void setTransformD (const double pos[3], const double R[12])
353{
354 GLdouble matrix[16];
355 matrix[0]=R[0];
356 matrix[1]=R[4];
357 matrix[2]=R[8];
358 matrix[3]=0;
359 matrix[4]=R[1];
360 matrix[5]=R[5];
361 matrix[6]=R[9];
362 matrix[7]=0;
363 matrix[8]=R[2];
364 matrix[9]=R[6];
365 matrix[10]=R[10];
366 matrix[11]=0;
367 matrix[12]=pos[0];
368 matrix[13]=pos[1];
369 matrix[14]=pos[2];
370 matrix[15]=1;
371 glPushMatrix();
372 glMultMatrixd (matrix);
373}
374
375
376// set shadow projection transform
377
378static void setShadowTransform()
379{
380 GLfloat matrix[16];
381 for (int i=0; i<16; i++) matrix[i] = 0;
382 matrix[0]=1;
383 matrix[5]=1;
384 matrix[8]=-LIGHTX;
385 matrix[9]=-LIGHTY;
386 matrix[15]=1;
387 glPushMatrix();
388 glMultMatrixf (matrix);
389}
390
391static void drawConvex (float *_planes,unsigned int _planecount,
392 float *_points,
393 unsigned int _pointcount,
394 unsigned int *_polygons)
395{
396 unsigned int polyindex=0;
397 for(unsigned int i=0;i<_planecount;++i)
398 {
399 unsigned int pointcount=_polygons[polyindex];
400 polyindex++;
401 glBegin (GL_POLYGON);
402 glNormal3f(_planes[(i*4)+0],
403 _planes[(i*4)+1],
404 _planes[(i*4)+2]);
405 for(unsigned int j=0;j<pointcount;++j)
406 {
407 glVertex3f(_points[_polygons[polyindex]*3],
408 _points[(_polygons[polyindex]*3)+1],
409 _points[(_polygons[polyindex]*3)+2]);
410 polyindex++;
411 }
412 glEnd();
413 }
414}
415
416static void drawConvexD (double *_planes,unsigned int _planecount,
417 double *_points,
418 unsigned int _pointcount,
419 unsigned int *_polygons)
420{
421 unsigned int polyindex=0;
422 for(unsigned int i=0;i<_planecount;++i)
423 {
424 unsigned int pointcount=_polygons[polyindex];
425 polyindex++;
426 glBegin (GL_POLYGON);
427 glNormal3d(_planes[(i*4)+0],
428 _planes[(i*4)+1],
429 _planes[(i*4)+2]);
430 for(unsigned int j=0;j<pointcount;++j)
431 {
432 glVertex3d(_points[_polygons[polyindex]*3],
433 _points[(_polygons[polyindex]*3)+1],
434 _points[(_polygons[polyindex]*3)+2]);
435 polyindex++;
436 }
437 glEnd();
438 }
439}
440
441static void drawBox (const float sides[3])
442{
443 float lx = sides[0]*0.5f;
444 float ly = sides[1]*0.5f;
445 float lz = sides[2]*0.5f;
446
447 // sides
448 glBegin (GL_TRIANGLE_STRIP);
449 glNormal3f (-1,0,0);
450 glVertex3f (-lx,-ly,-lz);
451 glVertex3f (-lx,-ly,lz);
452 glVertex3f (-lx,ly,-lz);
453 glVertex3f (-lx,ly,lz);
454 glNormal3f (0,1,0);
455 glVertex3f (lx,ly,-lz);
456 glVertex3f (lx,ly,lz);
457 glNormal3f (1,0,0);
458 glVertex3f (lx,-ly,-lz);
459 glVertex3f (lx,-ly,lz);
460 glNormal3f (0,-1,0);
461 glVertex3f (-lx,-ly,-lz);
462 glVertex3f (-lx,-ly,lz);
463 glEnd();
464
465 // top face
466 glBegin (GL_TRIANGLE_FAN);
467 glNormal3f (0,0,1);
468 glVertex3f (-lx,-ly,lz);
469 glVertex3f (lx,-ly,lz);
470 glVertex3f (lx,ly,lz);
471 glVertex3f (-lx,ly,lz);
472 glEnd();
473
474 // bottom face
475 glBegin (GL_TRIANGLE_FAN);
476 glNormal3f (0,0,-1);
477 glVertex3f (-lx,-ly,-lz);
478 glVertex3f (-lx,ly,-lz);
479 glVertex3f (lx,ly,-lz);
480 glVertex3f (lx,-ly,-lz);
481 glEnd();
482}
483
484
485// This is recursively subdivides a triangular area (vertices p1,p2,p3) into
486// smaller triangles, and then draws the triangles. All triangle vertices are
487// normalized to a distance of 1.0 from the origin (p1,p2,p3 are assumed
488// to be already normalized). Note this is not super-fast because it draws
489// triangles rather than triangle strips.
490
491static void drawPatch (float p1[3], float p2[3], float p3[3], int level)
492{
493 int i;
494 if (level > 0) {
495 float q1[3],q2[3],q3[3]; // sub-vertices
496 for (i=0; i<3; i++) {
497 q1[i] = 0.5f*(p1[i]+p2[i]);
498 q2[i] = 0.5f*(p2[i]+p3[i]);
499 q3[i] = 0.5f*(p3[i]+p1[i]);
500 }
501 float length1 = (float)(1.0/sqrt(q1[0]*q1[0]+q1[1]*q1[1]+q1[2]*q1[2]));
502 float length2 = (float)(1.0/sqrt(q2[0]*q2[0]+q2[1]*q2[1]+q2[2]*q2[2]));
503 float length3 = (float)(1.0/sqrt(q3[0]*q3[0]+q3[1]*q3[1]+q3[2]*q3[2]));
504 for (i=0; i<3; i++) {
505 q1[i] *= length1;
506 q2[i] *= length2;
507 q3[i] *= length3;
508 }
509 drawPatch (p1,q1,q3,level-1);
510 drawPatch (q1,p2,q2,level-1);
511 drawPatch (q1,q2,q3,level-1);
512 drawPatch (q3,q2,p3,level-1);
513 }
514 else {
515 glNormal3f (p1[0],p1[1],p1[2]);
516 glVertex3f (p1[0],p1[1],p1[2]);
517 glNormal3f (p2[0],p2[1],p2[2]);
518 glVertex3f (p2[0],p2[1],p2[2]);
519 glNormal3f (p3[0],p3[1],p3[2]);
520 glVertex3f (p3[0],p3[1],p3[2]);
521 }
522}
523
524
525// draw a sphere of radius 1
526
527static int sphere_quality = 1;
528
529static void drawSphere()
530{
531 // icosahedron data for an icosahedron of radius 1.0
532# define ICX 0.525731112119133606f
533# define ICZ 0.850650808352039932f
534 static GLfloat idata[12][3] = {
535 {-ICX, 0, ICZ},
536 {ICX, 0, ICZ},
537 {-ICX, 0, -ICZ},
538 {ICX, 0, -ICZ},
539 {0, ICZ, ICX},
540 {0, ICZ, -ICX},
541 {0, -ICZ, ICX},
542 {0, -ICZ, -ICX},
543 {ICZ, ICX, 0},
544 {-ICZ, ICX, 0},
545 {ICZ, -ICX, 0},
546 {-ICZ, -ICX, 0}
547 };
548
549 static int index[20][3] = {
550 {0, 4, 1}, {0, 9, 4},
551 {9, 5, 4}, {4, 5, 8},
552 {4, 8, 1}, {8, 10, 1},
553 {8, 3, 10}, {5, 3, 8},
554 {5, 2, 3}, {2, 7, 3},
555 {7, 10, 3}, {7, 6, 10},
556 {7, 11, 6}, {11, 0, 6},
557 {0, 1, 6}, {6, 1, 10},
558 {9, 0, 11}, {9, 11, 2},
559 {9, 2, 5}, {7, 2, 11},
560 };
561
562 static GLuint listnum = 0;
563 if (listnum==0) {
564 listnum = glGenLists (1);
565 glNewList (listnum,GL_COMPILE);
566 glBegin (GL_TRIANGLES);
567 for (int i=0; i<20; i++) {
568 drawPatch (&idata[index[i][2]][0],&idata[index[i][1]][0],
569 &idata[index[i][0]][0],sphere_quality);
570 }
571 glEnd();
572 glEndList();
573 }
574 glCallList (listnum);
575}
576
577
578static void drawSphereShadow (float px, float py, float pz, float radius)
579{
580 // calculate shadow constants based on light vector
581 static int init=0;
582 static float len2,len1,scale;
583 if (!init) {
584 len2 = LIGHTX*LIGHTX + LIGHTY*LIGHTY;
585 len1 = 1.0f/(float)sqrt(len2);
586 scale = (float) sqrt(len2 + 1);
587 init = 1;
588 }
589
590 // map sphere center to ground plane based on light vector
591 px -= LIGHTX*pz;
592 py -= LIGHTY*pz;
593
594 const float kx = 0.96592582628907f;
595 const float ky = 0.25881904510252f;
596 float x=radius, y=0;
597
598 glBegin (GL_TRIANGLE_FAN);
599 for (int i=0; i<24; i++) {
600 // for all points on circle, scale to elongated rotated shadow and draw
601 float x2 = (LIGHTX*x*scale - LIGHTY*y)*len1 + px;
602 float y2 = (LIGHTY*x*scale + LIGHTX*y)*len1 + py;
603 glTexCoord2f (x2*ground_scale+ground_ofsx,y2*ground_scale+ground_ofsy);
604 glVertex3f (x2,y2,0);
605
606 // rotate [x,y] vector
607 float xtmp = kx*x - ky*y;
608 y = ky*x + kx*y;
609 x = xtmp;
610 }
611 glEnd();
612}
613
614
615static void drawTriangle (const float *v0, const float *v1, const float *v2, int solid)
616{
617 float u[3],v[3],normal[3];
618 u[0] = v1[0] - v0[0];
619 u[1] = v1[1] - v0[1];
620 u[2] = v1[2] - v0[2];
621 v[0] = v2[0] - v0[0];
622 v[1] = v2[1] - v0[1];
623 v[2] = v2[2] - v0[2];
624 dCROSS (normal,=,u,v);
625 normalizeVector3 (normal);
626
627 glBegin(solid ? GL_TRIANGLES : GL_LINE_STRIP);
628 glNormal3fv (normal);
629 glVertex3fv (v0);
630 glVertex3fv (v1);
631 glVertex3fv (v2);
632 glEnd();
633}
634
635static void drawTriangleD (const double *v0, const double *v1, const double *v2, int solid)
636{
637 float u[3],v[3],normal[3];
638 u[0] = float( v1[0] - v0[0] );
639 u[1] = float( v1[1] - v0[1] );
640 u[2] = float( v1[2] - v0[2] );
641 v[0] = float( v2[0] - v0[0] );
642 v[1] = float( v2[1] - v0[1] );
643 v[2] = float( v2[2] - v0[2] );
644 dCROSS (normal,=,u,v);
645 normalizeVector3 (normal);
646
647 glBegin(solid ? GL_TRIANGLES : GL_LINE_STRIP);
648 glNormal3fv (normal);
649 glVertex3dv (v0);
650 glVertex3dv (v1);
651 glVertex3dv (v2);
652 glEnd();
653}
654
655
656// draw a capped cylinder of length l and radius r, aligned along the x axis
657
658static int capped_cylinder_quality = 3;
659
660static void drawCapsule (float l, float r)
661{
662 int i,j;
663 float tmp,nx,ny,nz,start_nx,start_ny,a,ca,sa;
664 // number of sides to the cylinder (divisible by 4):
665 const int n = capped_cylinder_quality*4;
666
667 l *= 0.5;
668 a = float(M_PI*2.0)/float(n);
669 sa = (float) sin(a);
670 ca = (float) cos(a);
671
672 // draw cylinder body
673 ny=1; nz=0; // normal vector = (0,ny,nz)
674 glBegin (GL_TRIANGLE_STRIP);
675 for (i=0; i<=n; i++) {
676 glNormal3d (ny,nz,0);
677 glVertex3d (ny*r,nz*r,l);
678 glNormal3d (ny,nz,0);
679 glVertex3d (ny*r,nz*r,-l);
680 // rotate ny,nz
681 tmp = ca*ny - sa*nz;
682 nz = sa*ny + ca*nz;
683 ny = tmp;
684 }
685 glEnd();
686
687 // draw first cylinder cap
688 start_nx = 0;
689 start_ny = 1;
690 for (j=0; j<(n/4); j++) {
691 // get start_n2 = rotated start_n
692 float start_nx2 = ca*start_nx + sa*start_ny;
693 float start_ny2 = -sa*start_nx + ca*start_ny;
694 // get n=start_n and n2=start_n2
695 nx = start_nx; ny = start_ny; nz = 0;
696 float nx2 = start_nx2, ny2 = start_ny2, nz2 = 0;
697 glBegin (GL_TRIANGLE_STRIP);
698 for (i=0; i<=n; i++) {
699 glNormal3d (ny2,nz2,nx2);
700 glVertex3d (ny2*r,nz2*r,l+nx2*r);
701 glNormal3d (ny,nz,nx);
702 glVertex3d (ny*r,nz*r,l+nx*r);
703 // rotate n,n2
704 tmp = ca*ny - sa*nz;
705 nz = sa*ny + ca*nz;
706 ny = tmp;
707 tmp = ca*ny2- sa*nz2;
708 nz2 = sa*ny2 + ca*nz2;
709 ny2 = tmp;
710 }
711 glEnd();
712 start_nx = start_nx2;
713 start_ny = start_ny2;
714 }
715
716 // draw second cylinder cap
717 start_nx = 0;
718 start_ny = 1;
719 for (j=0; j<(n/4); j++) {
720 // get start_n2 = rotated start_n
721 float start_nx2 = ca*start_nx - sa*start_ny;
722 float start_ny2 = sa*start_nx + ca*start_ny;
723 // get n=start_n and n2=start_n2
724 nx = start_nx; ny = start_ny; nz = 0;
725 float nx2 = start_nx2, ny2 = start_ny2, nz2 = 0;
726 glBegin (GL_TRIANGLE_STRIP);
727 for (i=0; i<=n; i++) {
728 glNormal3d (ny,nz,nx);
729 glVertex3d (ny*r,nz*r,-l+nx*r);
730 glNormal3d (ny2,nz2,nx2);
731 glVertex3d (ny2*r,nz2*r,-l+nx2*r);
732 // rotate n,n2
733 tmp = ca*ny - sa*nz;
734 nz = sa*ny + ca*nz;
735 ny = tmp;
736 tmp = ca*ny2- sa*nz2;
737 nz2 = sa*ny2 + ca*nz2;
738 ny2 = tmp;
739 }
740 glEnd();
741 start_nx = start_nx2;
742 start_ny = start_ny2;
743 }
744
745 glPopMatrix();
746}
747
748
749// draw a cylinder of length l and radius r, aligned along the z axis
750
751static void drawCylinder (float l, float r, float zoffset)
752{
753 int i;
754 float tmp,ny,nz,a,ca,sa;
755 const int n = 24; // number of sides to the cylinder (divisible by 4)
756
757 l *= 0.5;
758 a = float(M_PI*2.0)/float(n);
759 sa = (float) sin(a);
760 ca = (float) cos(a);
761
762 // draw cylinder body
763 ny=1; nz=0; // normal vector = (0,ny,nz)
764 glBegin (GL_TRIANGLE_STRIP);
765 for (i=0; i<=n; i++) {
766 glNormal3d (ny,nz,0);
767 glVertex3d (ny*r,nz*r,l+zoffset);
768 glNormal3d (ny,nz,0);
769 glVertex3d (ny*r,nz*r,-l+zoffset);
770 // rotate ny,nz
771 tmp = ca*ny - sa*nz;
772 nz = sa*ny + ca*nz;
773 ny = tmp;
774 }
775 glEnd();
776
777 // draw top cap
778 glShadeModel (GL_FLAT);
779 ny=1; nz=0; // normal vector = (0,ny,nz)
780 glBegin (GL_TRIANGLE_FAN);
781 glNormal3d (0,0,1);
782 glVertex3d (0,0,l+zoffset);
783 for (i=0; i<=n; i++) {
784 if (i==1 || i==n/2+1)
785 setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]);
786 glNormal3d (0,0,1);
787 glVertex3d (ny*r,nz*r,l+zoffset);
788 if (i==1 || i==n/2+1)
789 setColor (color[0],color[1],color[2],color[3]);
790
791 // rotate ny,nz
792 tmp = ca*ny - sa*nz;
793 nz = sa*ny + ca*nz;
794 ny = tmp;
795 }
796 glEnd();
797
798 // draw bottom cap
799 ny=1; nz=0; // normal vector = (0,ny,nz)
800 glBegin (GL_TRIANGLE_FAN);
801 glNormal3d (0,0,-1);
802 glVertex3d (0,0,-l+zoffset);
803 for (i=0; i<=n; i++) {
804 if (i==1 || i==n/2+1)
805 setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]);
806 glNormal3d (0,0,-1);
807 glVertex3d (ny*r,nz*r,-l+zoffset);
808 if (i==1 || i==n/2+1)
809 setColor (color[0],color[1],color[2],color[3]);
810
811 // rotate ny,nz
812 tmp = ca*ny + sa*nz;
813 nz = -sa*ny + ca*nz;
814 ny = tmp;
815 }
816 glEnd();
817}
818
819//***************************************************************************
820// motion model
821
822// current camera position and orientation
823static float view_xyz[3]; // position x,y,z
824static float view_hpr[3]; // heading, pitch, roll (degrees)
825
826
827// initialize the above variables
828
829static void initMotionModel()
830{
831 view_xyz[0] = 2;
832 view_xyz[1] = 0;
833 view_xyz[2] = 1;
834 view_hpr[0] = 180;
835 view_hpr[1] = 0;
836 view_hpr[2] = 0;
837}
838
839
840static void wrapCameraAngles()
841{
842 for (int i=0; i<3; i++) {
843 while (view_hpr[i] > 180) view_hpr[i] -= 360;
844 while (view_hpr[i] < -180) view_hpr[i] += 360;
845 }
846}
847
848
849// call this to update the current camera position. the bits in `mode' say
850// if the left (1), middle (2) or right (4) mouse button is pressed, and
851// (deltax,deltay) is the amount by which the mouse pointer has moved.
852
853void dsMotion (int mode, int deltax, int deltay)
854{
855 float side = 0.01f * float(deltax);
856 float fwd = (mode==4) ? (0.01f * float(deltay)) : 0.0f;
857 float s = (float) sin (view_hpr[0]*DEG_TO_RAD);
858 float c = (float) cos (view_hpr[0]*DEG_TO_RAD);
859
860 if (mode==1) {
861 view_hpr[0] += float (deltax) * 0.5f;
862 view_hpr[1] += float (deltay) * 0.5f;
863 }
864 else {
865 view_xyz[0] += -s*side + c*fwd;
866 view_xyz[1] += c*side + s*fwd;
867 if (mode==2 || mode==5) view_xyz[2] += 0.01f * float(deltay);
868 }
869 wrapCameraAngles();
870}
871
872//***************************************************************************
873// drawing loop stuff
874
875// the current state:
876// 0 = uninitialized
877// 1 = dsSimulationLoop() called
878// 2 = dsDrawFrame() called
879static int current_state = 0;
880
881// textures and shadows
882static int use_textures=1; // 1 if textures to be drawn
883static int use_shadows=1; // 1 if shadows to be drawn
884static Texture *sky_texture = 0;
885static Texture *ground_texture = 0;
886static Texture *wood_texture = 0;
887
888
889#ifndef macintosh
890
891void dsStartGraphics (int width, int height, dsFunctions *fn)
892{
893 char *prefix = DEFAULT_PATH_TO_TEXTURES;
894 if (fn->version >= 2 && fn->path_to_textures) prefix = fn->path_to_textures;
895 char *s = (char*) alloca (strlen(prefix) + 20);
896
897 strcpy (s,prefix);
898 strcat (s,"/sky.ppm");
899 sky_texture = new Texture (s);
900
901 strcpy (s,prefix);
902 strcat (s,"/ground.ppm");
903 ground_texture = new Texture (s);
904
905 strcpy (s,prefix);
906 strcat (s,"/wood.ppm");
907 wood_texture = new Texture (s);
908}
909
910#else // macintosh
911
912void dsStartGraphics (int width, int height, dsFunctions *fn)
913{
914 // All examples build into the same dir
915 char *prefix = "::::drawstuff:textures";
916 char *s = (char*) alloca (strlen(prefix) + 20);
917
918 strcpy (s,prefix);
919 strcat (s,":sky.ppm");
920 sky_texture = new Texture (s);
921
922 strcpy (s,prefix);
923 strcat (s,":ground.ppm");
924 ground_texture = new Texture (s);
925
926 strcpy (s,prefix);
927 strcat (s,":wood.ppm");
928 wood_texture = new Texture (s);
929}
930
931#endif
932
933
934void dsStopGraphics()
935{
936 delete sky_texture;
937 delete ground_texture;
938 delete wood_texture;
939 sky_texture = 0;
940 ground_texture = 0;
941 wood_texture = 0;
942}
943
944
945static void drawSky (float view_xyz[3])
946{
947 glDisable (GL_LIGHTING);
948 if (use_textures) {
949 glEnable (GL_TEXTURE_2D);
950 sky_texture->bind (0);
951 }
952 else {
953 glDisable (GL_TEXTURE_2D);
954 glColor3f (0,0.5,1.0);
955 }
956
957 // make sure sky depth is as far back as possible
958 glShadeModel (GL_FLAT);
959 glEnable (GL_DEPTH_TEST);
960 glDepthFunc (GL_LEQUAL);
961 glDepthRange (1,1);
962
963 const float ssize = 1000.0f;
964 static float offset = 0.0f;
965
966 float x = ssize*sky_scale;
967 float z = view_xyz[2] + sky_height;
968
969 glBegin (GL_QUADS);
970 glNormal3f (0,0,-1);
971 glTexCoord2f (-x+offset,-x+offset);
972 glVertex3f (-ssize+view_xyz[0],-ssize+view_xyz[1],z);
973 glTexCoord2f (-x+offset,x+offset);
974 glVertex3f (-ssize+view_xyz[0],ssize+view_xyz[1],z);
975 glTexCoord2f (x+offset,x+offset);
976 glVertex3f (ssize+view_xyz[0],ssize+view_xyz[1],z);
977 glTexCoord2f (x+offset,-x+offset);
978 glVertex3f (ssize+view_xyz[0],-ssize+view_xyz[1],z);
979 glEnd();
980
981 offset = offset + 0.002f;
982 if (offset > 1) offset -= 1;
983
984 glDepthFunc (GL_LESS);
985 glDepthRange (0,1);
986}
987
988
989static void drawGround()
990{
991 glDisable (GL_LIGHTING);
992 glShadeModel (GL_FLAT);
993 glEnable (GL_DEPTH_TEST);
994 glDepthFunc (GL_LESS);
995 // glDepthRange (1,1);
996
997 if (use_textures) {
998 glEnable (GL_TEXTURE_2D);
999 ground_texture->bind (0);
1000 }
1001 else {
1002 glDisable (GL_TEXTURE_2D);
1003 glColor3f (GROUND_R,GROUND_G,GROUND_B);
1004 }
1005
1006 // ground fog seems to cause problems with TNT2 under windows
1007 /*
1008 GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1};
1009 glEnable (GL_FOG);
1010 glFogi (GL_FOG_MODE, GL_EXP2);
1011 glFogfv (GL_FOG_COLOR, fogColor);
1012 glFogf (GL_FOG_DENSITY, 0.05f);
1013 glHint (GL_FOG_HINT, GL_NICEST); // GL_DONT_CARE);
1014 glFogf (GL_FOG_START, 1.0);
1015 glFogf (GL_FOG_END, 5.0);
1016 */
1017
1018 const float gsize = 100.0f;
1019 const float offset = 0; // -0.001f; ... polygon offsetting doesn't work well
1020
1021 glBegin (GL_QUADS);
1022 glNormal3f (0,0,1);
1023 glTexCoord2f (-gsize*ground_scale + ground_ofsx,
1024 -gsize*ground_scale + ground_ofsy);
1025 glVertex3f (-gsize,-gsize,offset);
1026 glTexCoord2f (gsize*ground_scale + ground_ofsx,
1027 -gsize*ground_scale + ground_ofsy);
1028 glVertex3f (gsize,-gsize,offset);
1029 glTexCoord2f (gsize*ground_scale + ground_ofsx,
1030 gsize*ground_scale + ground_ofsy);
1031 glVertex3f (gsize,gsize,offset);
1032 glTexCoord2f (-gsize*ground_scale + ground_ofsx,
1033 gsize*ground_scale + ground_ofsy);
1034 glVertex3f (-gsize,gsize,offset);
1035 glEnd();
1036
1037 glDisable (GL_FOG);
1038}
1039
1040
1041static void drawPyramidGrid()
1042{
1043 // setup stuff
1044 glEnable (GL_LIGHTING);
1045 glDisable (GL_TEXTURE_2D);
1046 glShadeModel (GL_FLAT);
1047 glEnable (GL_DEPTH_TEST);
1048 glDepthFunc (GL_LESS);
1049
1050 // draw the pyramid grid
1051 for (int i=-1; i<=1; i++) {
1052 for (int j=-1; j<=1; j++) {
1053 glPushMatrix();
1054 glTranslatef ((float)i,(float)j,(float)0);
1055 if (i==1 && j==0) setColor (1,0,0,1);
1056 else if (i==0 && j==1) setColor (0,0,1,1);
1057 else setColor (1,1,0,1);
1058 const float k = 0.03f;
1059 glBegin (GL_TRIANGLE_FAN);
1060 glNormal3f (0,-1,1);
1061 glVertex3f (0,0,k);
1062 glVertex3f (-k,-k,0);
1063 glVertex3f ( k,-k,0);
1064 glNormal3f (1,0,1);
1065 glVertex3f ( k, k,0);
1066 glNormal3f (0,1,1);
1067 glVertex3f (-k, k,0);
1068 glNormal3f (-1,0,1);
1069 glVertex3f (-k,-k,0);
1070 glEnd();
1071 glPopMatrix();
1072 }
1073 }
1074}
1075
1076
1077void dsDrawFrame (int width, int height, dsFunctions *fn, int pause)
1078{
1079 if (current_state < 1) dsDebug ("internal error");
1080 current_state = 2;
1081
1082 // setup stuff
1083 glEnable (GL_LIGHTING);
1084 glEnable (GL_LIGHT0);
1085 glDisable (GL_TEXTURE_2D);
1086 glDisable (GL_TEXTURE_GEN_S);
1087 glDisable (GL_TEXTURE_GEN_T);
1088 glShadeModel (GL_FLAT);
1089 glEnable (GL_DEPTH_TEST);
1090 glDepthFunc (GL_LESS);
1091 glEnable (GL_CULL_FACE);
1092 glCullFace (GL_BACK);
1093 glFrontFace (GL_CCW);
1094
1095 // setup viewport
1096 glViewport (0,0,width,height);
1097 glMatrixMode (GL_PROJECTION);
1098 glLoadIdentity();
1099 const float vnear = 0.1f;
1100 const float vfar = 100.0f;
1101 const float k = 0.8f; // view scale, 1 = +/- 45 degrees
1102 if (width >= height) {
1103 float k2 = float(height)/float(width);
1104 glFrustum (-vnear*k,vnear*k,-vnear*k*k2,vnear*k*k2,vnear,vfar);
1105 }
1106 else {
1107 float k2 = float(width)/float(height);
1108 glFrustum (-vnear*k*k2,vnear*k*k2,-vnear*k,vnear*k,vnear,vfar);
1109 }
1110
1111 // setup lights. it makes a difference whether this is done in the
1112 // GL_PROJECTION matrix mode (lights are scene relative) or the
1113 // GL_MODELVIEW matrix mode (lights are camera relative, bad!).
1114 static GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
1115 static GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
1116 static GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
1117 glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
1118 glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
1119 glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
1120 glColor3f (1.0, 1.0, 1.0);
1121
1122 // clear the window
1123 glClearColor (0.5,0.5,0.5,0);
1124 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1125
1126 // snapshot camera position (in MS Windows it is changed by the GUI thread)
1127 float view2_xyz[3];
1128 float view2_hpr[3];
1129 memcpy (view2_xyz,view_xyz,sizeof(float)*3);
1130 memcpy (view2_hpr,view_hpr,sizeof(float)*3);
1131
1132 // go to GL_MODELVIEW matrix mode and set the camera
1133 glMatrixMode (GL_MODELVIEW);
1134 glLoadIdentity();
1135 setCamera (view2_xyz[0],view2_xyz[1],view2_xyz[2],
1136 view2_hpr[0],view2_hpr[1],view2_hpr[2]);
1137
1138 // set the light position (for some reason we have to do this in model view.
1139 static GLfloat light_position[] = { LIGHTX, LIGHTY, 1.0, 0.0 };
1140 glLightfv (GL_LIGHT0, GL_POSITION, light_position);
1141
1142 // draw the background (ground, sky etc)
1143 drawSky (view2_xyz);
1144 drawGround();
1145
1146 // draw the little markers on the ground
1147 drawPyramidGrid();
1148
1149 // leave openGL in a known state - flat shaded white, no textures
1150 glEnable (GL_LIGHTING);
1151 glDisable (GL_TEXTURE_2D);
1152 glShadeModel (GL_FLAT);
1153 glEnable (GL_DEPTH_TEST);
1154 glDepthFunc (GL_LESS);
1155 glColor3f (1,1,1);
1156 setColor (1,1,1,1);
1157
1158 // draw the rest of the objects. set drawing state first.
1159 color[0] = 1;
1160 color[1] = 1;
1161 color[2] = 1;
1162 color[3] = 1;
1163 tnum = 0;
1164 if (fn->step) fn->step (pause);
1165}
1166
1167
1168int dsGetShadows()
1169{
1170 return use_shadows;
1171}
1172
1173
1174void dsSetShadows (int a)
1175{
1176 use_shadows = (a != 0);
1177}
1178
1179
1180int dsGetTextures()
1181{
1182 return use_textures;
1183}
1184
1185
1186void dsSetTextures (int a)
1187{
1188 use_textures = (a != 0);
1189}
1190
1191//***************************************************************************
1192// C interface
1193
1194// sets lighting and texture modes, sets current color
1195static void setupDrawingMode()
1196{
1197 glEnable (GL_LIGHTING);
1198 if (tnum) {
1199 if (use_textures) {
1200 glEnable (GL_TEXTURE_2D);
1201 wood_texture->bind (1);
1202 glEnable (GL_TEXTURE_GEN_S);
1203 glEnable (GL_TEXTURE_GEN_T);
1204 glTexGeni (GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
1205 glTexGeni (GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
1206 static GLfloat s_params[4] = {1.0f,1.0f,0.0f,1};
1207 static GLfloat t_params[4] = {0.817f,-0.817f,0.817f,1};
1208 glTexGenfv (GL_S,GL_OBJECT_PLANE,s_params);
1209 glTexGenfv (GL_T,GL_OBJECT_PLANE,t_params);
1210 }
1211 else {
1212 glDisable (GL_TEXTURE_2D);
1213 }
1214 }
1215 else {
1216 glDisable (GL_TEXTURE_2D);
1217 }
1218 setColor (color[0],color[1],color[2],color[3]);
1219
1220 if (color[3] < 1) {
1221 glEnable (GL_BLEND);
1222 glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
1223 }
1224 else {
1225 glDisable (GL_BLEND);
1226 }
1227}
1228
1229
1230static void setShadowDrawingMode()
1231{
1232 glDisable (GL_LIGHTING);
1233 if (use_textures) {
1234 glEnable (GL_TEXTURE_2D);
1235 ground_texture->bind (1);
1236 glColor3f (SHADOW_INTENSITY,SHADOW_INTENSITY,SHADOW_INTENSITY);
1237 glEnable (GL_TEXTURE_2D);
1238 glEnable (GL_TEXTURE_GEN_S);
1239 glEnable (GL_TEXTURE_GEN_T);
1240 glTexGeni (GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
1241 glTexGeni (GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
1242 static GLfloat s_params[4] = {ground_scale,0,0,ground_ofsx};
1243 static GLfloat t_params[4] = {0,ground_scale,0,ground_ofsy};
1244 glTexGenfv (GL_S,GL_EYE_PLANE,s_params);
1245 glTexGenfv (GL_T,GL_EYE_PLANE,t_params);
1246 }
1247 else {
1248 glDisable (GL_TEXTURE_2D);
1249 glColor3f (GROUND_R*SHADOW_INTENSITY,GROUND_G*SHADOW_INTENSITY,
1250 GROUND_B*SHADOW_INTENSITY);
1251 }
1252 glDepthRange (0,0.9999);
1253}
1254
1255
1256extern "C" void dsSimulationLoop (int argc, char **argv,
1257 int window_width, int window_height,
1258 dsFunctions *fn)
1259{
1260 if (current_state != 0) dsError ("dsSimulationLoop() called more than once");
1261 current_state = 1;
1262
1263 // look for flags that apply to us
1264 int initial_pause = 0;
1265 for (int i=1; i<argc; i++) {
1266 if (strcmp(argv[i],"-notex")==0) use_textures = 0;
1267 if (strcmp(argv[i],"-noshadow")==0) use_shadows = 0;
1268 if (strcmp(argv[i],"-noshadows")==0) use_shadows = 0;
1269 if (strcmp(argv[i],"-pause")==0) initial_pause = 1;
1270 }
1271
1272 if (fn->version > DS_VERSION)
1273 dsDebug ("bad version number in dsFunctions structure");
1274
1275 initMotionModel();
1276 dsPlatformSimLoop (window_width,window_height,fn,initial_pause);
1277
1278 current_state = 0;
1279}
1280
1281
1282extern "C" void dsSetViewpoint (float xyz[3], float hpr[3])
1283{
1284 if (current_state < 1) dsError ("dsSetViewpoint() called before simulation started");
1285 if (xyz) {
1286 view_xyz[0] = xyz[0];
1287 view_xyz[1] = xyz[1];
1288 view_xyz[2] = xyz[2];
1289 }
1290 if (hpr) {
1291 view_hpr[0] = hpr[0];
1292 view_hpr[1] = hpr[1];
1293 view_hpr[2] = hpr[2];
1294 wrapCameraAngles();
1295 }
1296}
1297
1298
1299extern "C" void dsGetViewpoint (float xyz[3], float hpr[3])
1300{
1301 if (current_state < 1) dsError ("dsGetViewpoint() called before simulation started");
1302 if (xyz) {
1303 xyz[0] = view_xyz[0];
1304 xyz[1] = view_xyz[1];
1305 xyz[2] = view_xyz[2];
1306 }
1307 if (hpr) {
1308 hpr[0] = view_hpr[0];
1309 hpr[1] = view_hpr[1];
1310 hpr[2] = view_hpr[2];
1311 }
1312}
1313
1314
1315extern "C" void dsSetTexture (int texture_number)
1316{
1317 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1318 tnum = texture_number;
1319}
1320
1321
1322extern "C" void dsSetColor (float red, float green, float blue)
1323{
1324 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1325 color[0] = red;
1326 color[1] = green;
1327 color[2] = blue;
1328 color[3] = 1;
1329}
1330
1331
1332extern "C" void dsSetColorAlpha (float red, float green, float blue,
1333 float alpha)
1334{
1335 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1336 color[0] = red;
1337 color[1] = green;
1338 color[2] = blue;
1339 color[3] = alpha;
1340}
1341
1342
1343extern "C" void dsDrawBox (const float pos[3], const float R[12],
1344 const float sides[3])
1345{
1346 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1347 setupDrawingMode();
1348 glShadeModel (GL_FLAT);
1349 setTransform (pos,R);
1350 drawBox (sides);
1351 glPopMatrix();
1352
1353 if (use_shadows) {
1354 setShadowDrawingMode();
1355 setShadowTransform();
1356 setTransform (pos,R);
1357 drawBox (sides);
1358 glPopMatrix();
1359 glPopMatrix();
1360 glDepthRange (0,1);
1361 }
1362}
1363
1364extern "C" void dsDrawConvex (const float pos[3], const float R[12],
1365 float *_planes,unsigned int _planecount,
1366 float *_points,
1367 unsigned int _pointcount,
1368 unsigned int *_polygons)
1369{
1370 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1371 setupDrawingMode();
1372 glShadeModel (GL_FLAT);
1373 setTransform (pos,R);
1374 drawConvex(_planes,_planecount,_points,_pointcount,_polygons);
1375 glPopMatrix();
1376 if (use_shadows) {
1377 setShadowDrawingMode();
1378 setShadowTransform();
1379 setTransform (pos,R);
1380 drawConvex(_planes,_planecount,_points,_pointcount,_polygons);
1381 glPopMatrix();
1382 glPopMatrix();
1383 glDepthRange (0,1);
1384 }
1385}
1386
1387
1388extern "C" void dsDrawSphere (const float pos[3], const float R[12],
1389 float radius)
1390{
1391 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1392 setupDrawingMode();
1393 glEnable (GL_NORMALIZE);
1394 glShadeModel (GL_SMOOTH);
1395 setTransform (pos,R);
1396 glScaled (radius,radius,radius);
1397 drawSphere();
1398 glPopMatrix();
1399 glDisable (GL_NORMALIZE);
1400
1401 // draw shadows
1402 if (use_shadows) {
1403 glDisable (GL_LIGHTING);
1404 if (use_textures) {
1405 ground_texture->bind (1);
1406 glEnable (GL_TEXTURE_2D);
1407 glDisable (GL_TEXTURE_GEN_S);
1408 glDisable (GL_TEXTURE_GEN_T);
1409 glColor3f (SHADOW_INTENSITY,SHADOW_INTENSITY,SHADOW_INTENSITY);
1410 }
1411 else {
1412 glDisable (GL_TEXTURE_2D);
1413 glColor3f (GROUND_R*SHADOW_INTENSITY,GROUND_G*SHADOW_INTENSITY,
1414 GROUND_B*SHADOW_INTENSITY);
1415 }
1416 glShadeModel (GL_FLAT);
1417 glDepthRange (0,0.9999);
1418 drawSphereShadow (pos[0],pos[1],pos[2],radius);
1419 glDepthRange (0,1);
1420 }
1421}
1422
1423
1424extern "C" void dsDrawTriangle (const float pos[3], const float R[12],
1425 const float *v0, const float *v1,
1426 const float *v2, int solid)
1427{
1428 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1429 setupDrawingMode();
1430 glShadeModel (GL_FLAT);
1431 setTransform (pos,R);
1432 drawTriangle (v0, v1, v2, solid);
1433 glPopMatrix();
1434}
1435
1436
1437extern "C" void dsDrawCylinder (const float pos[3], const float R[12],
1438 float length, float radius)
1439{
1440 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1441 setupDrawingMode();
1442 glShadeModel (GL_SMOOTH);
1443 setTransform (pos,R);
1444 drawCylinder (length,radius,0);
1445 glPopMatrix();
1446
1447 if (use_shadows) {
1448 setShadowDrawingMode();
1449 setShadowTransform();
1450 setTransform (pos,R);
1451 drawCylinder (length,radius,0);
1452 glPopMatrix();
1453 glPopMatrix();
1454 glDepthRange (0,1);
1455 }
1456}
1457
1458
1459extern "C" void dsDrawCapsule (const float pos[3], const float R[12],
1460 float length, float radius)
1461{
1462 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1463 setupDrawingMode();
1464 glShadeModel (GL_SMOOTH);
1465 setTransform (pos,R);
1466 drawCapsule (length,radius);
1467 glPopMatrix();
1468
1469 if (use_shadows) {
1470 setShadowDrawingMode();
1471 setShadowTransform();
1472 setTransform (pos,R);
1473 drawCapsule (length,radius);
1474 glPopMatrix();
1475 glPopMatrix();
1476 glDepthRange (0,1);
1477 }
1478}
1479
1480
1481void dsDrawLine (const float pos1[3], const float pos2[3])
1482{
1483 setupDrawingMode();
1484 glColor3f (color[0],color[1],color[2]);
1485 glDisable (GL_LIGHTING);
1486 glLineWidth (2);
1487 glShadeModel (GL_FLAT);
1488 glBegin (GL_LINES);
1489 glVertex3f (pos1[0],pos1[1],pos1[2]);
1490 glVertex3f (pos2[0],pos2[1],pos2[2]);
1491 glEnd();
1492}
1493
1494
1495void dsDrawBoxD (const double pos[3], const double R[12],
1496 const double sides[3])
1497{
1498 int i;
1499 float pos2[3],R2[12],fsides[3];
1500 for (i=0; i<3; i++) pos2[i]=(float)pos[i];
1501 for (i=0; i<12; i++) R2[i]=(float)R[i];
1502 for (i=0; i<3; i++) fsides[i]=(float)sides[i];
1503 dsDrawBox (pos2,R2,fsides);
1504}
1505
1506extern "C" void dsDrawConvexD (const double pos[3], const double R[12],
1507 double *_planes,unsigned int _planecount,
1508 double *_points,
1509 unsigned int _pointcount,
1510 unsigned int *_polygons)
1511{
1512 if (current_state != 2) dsError ("drawing function called outside simulation loop");
1513 setupDrawingMode();
1514 glShadeModel (GL_FLAT);
1515 setTransformD (pos,R);
1516 drawConvexD(_planes,_planecount,_points,_pointcount,_polygons);
1517 glPopMatrix();
1518 if (use_shadows) {
1519 setShadowDrawingMode();
1520 setShadowTransform();
1521 setTransformD (pos,R);
1522 drawConvexD(_planes,_planecount,_points,_pointcount,_polygons);
1523 glPopMatrix();
1524 glPopMatrix();
1525 glDepthRange (0,1);
1526 }
1527}
1528
1529void dsDrawSphereD (const double pos[3], const double R[12], float radius)
1530{
1531 int i;
1532 float pos2[3],R2[12];
1533 for (i=0; i<3; i++) pos2[i]=(float)pos[i];
1534 for (i=0; i<12; i++) R2[i]=(float)R[i];
1535 dsDrawSphere (pos2,R2,radius);
1536}
1537
1538
1539void dsDrawTriangleD (const double pos[3], const double R[12],
1540 const double *v0, const double *v1,
1541 const double *v2, int solid)
1542{
1543 int i;
1544 float pos2[3],R2[12];
1545 for (i=0; i<3; i++) pos2[i]=(float)pos[i];
1546 for (i=0; i<12; i++) R2[i]=(float)R[i];
1547
1548 setupDrawingMode();
1549 glShadeModel (GL_FLAT);
1550 setTransform (pos2,R2);
1551 drawTriangleD (v0, v1, v2, solid);
1552 glPopMatrix();
1553}
1554
1555
1556void dsDrawCylinderD (const double pos[3], const double R[12],
1557 float length, float radius)
1558{
1559 int i;
1560 float pos2[3],R2[12];
1561 for (i=0; i<3; i++) pos2[i]=(float)pos[i];
1562 for (i=0; i<12; i++) R2[i]=(float)R[i];
1563 dsDrawCylinder (pos2,R2,length,radius);
1564}
1565
1566
1567void dsDrawCapsuleD (const double pos[3], const double R[12],
1568 float length, float radius)
1569{
1570 int i;
1571 float pos2[3],R2[12];
1572 for (i=0; i<3; i++) pos2[i]=(float)pos[i];
1573 for (i=0; i<12; i++) R2[i]=(float)R[i];
1574 dsDrawCapsule (pos2,R2,length,radius);
1575}
1576
1577
1578void dsDrawLineD (const double _pos1[3], const double _pos2[3])
1579{
1580 int i;
1581 float pos1[3],pos2[3];
1582 for (i=0; i<3; i++) pos1[i]=(float)_pos1[i];
1583 for (i=0; i<3; i++) pos2[i]=(float)_pos2[i];
1584 dsDrawLine (pos1,pos2);
1585}
1586
1587
1588void dsSetSphereQuality (int n)
1589{
1590 sphere_quality = n;
1591}
1592
1593
1594void dsSetCapsuleQuality (int n)
1595{
1596 capped_cylinder_quality = n;
1597}
diff --git a/libraries/ode-0.9/drawstuff/src/internal.h b/libraries/ode-0.9/drawstuff/src/internal.h
new file mode 100644
index 0000000..de1aa11
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/internal.h
@@ -0,0 +1,50 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23/* functions supplied and used by the platform specific code */
24
25#ifndef __DS_INTERNAL_H
26#define __DS_INTERNAL_H
27
28#include "drawstuff/drawstuff.h"
29
30
31// supplied by platform specific code
32
33void dsPlatformSimLoop (int window_width, int window_height,
34 dsFunctions *fn, int initial_pause);
35
36
37// used by platform specific code
38
39void dsStartGraphics (int width, int height, dsFunctions *fn);
40void dsDrawFrame (int width, int height, dsFunctions *fn, int pause);
41void dsStopGraphics();
42void dsMotion (int mode, int deltax, int deltay);
43
44int dsGetShadows();
45void dsSetShadows (int a);
46
47int dsGetTextures();
48void dsSetTextures (int a);
49
50#endif
diff --git a/libraries/ode-0.9/drawstuff/src/osx.cpp b/libraries/ode-0.9/drawstuff/src/osx.cpp
new file mode 100644
index 0000000..fcecba9
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/osx.cpp
@@ -0,0 +1,542 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23// Platform-specific code for Mac OS X using Carbon+AGL
24//
25// Created using x11.cpp and the window-initialization -routines from GLFW
26// as reference.
27// Not thoroughly tested and is certain to contain deficiencies and bugs
28
29#include <ode/config.h>
30#include <stdlib.h>
31#include <string.h>
32#include <stdarg.h>
33
34#ifdef HAVE_SYS_TIME_H
35#include <sys/time.h>
36#endif
37
38#include <drawstuff/drawstuff.h>
39#include <drawstuff/version.h>
40#include "internal.h"
41
42#include <Carbon/Carbon.h>
43#include <AGL/agl.h>
44
45// Global variables
46
47static bool running = true; // 1 if simulation running
48static bool paused = false; // 1 if in `pause' mode
49static bool singlestep = false; // 1 if single step key pressed
50static bool writeframes = false; // 1 if frame files to be written
51
52static int windowWidth = -1;
53static int windowHeight = -1;
54static UInt32 modifierMask = 0;
55static int mouseButtonMode = 0;
56static bool mouseWithOption = false; // Set if dragging the mouse with alt pressed
57static bool mouseWithControl = false; // Set if dragging the mouse with ctrl pressed
58
59static dsFunctions* functions = NULL;
60static WindowRef windowReference;
61static AGLContext aglContext;
62
63static EventHandlerUPP mouseUPP = NULL;
64static EventHandlerUPP keyboardUPP = NULL;
65static EventHandlerUPP windowUPP = NULL;
66
67// Describes the window-events we are interested in
68EventTypeSpec OSX_WINDOW_EVENT_TYPES[] = {
69 { kEventClassWindow, kEventWindowBoundsChanged },
70 { kEventClassWindow, kEventWindowClose },
71 { kEventClassWindow, kEventWindowDrawContent }
72};
73
74// Describes the mouse-events we are interested in
75EventTypeSpec OSX_MOUSE_EVENT_TYPES[] = {
76 { kEventClassMouse, kEventMouseDown },
77 { kEventClassMouse, kEventMouseUp },
78 { kEventClassMouse, kEventMouseMoved },
79 { kEventClassMouse, kEventMouseDragged }
80};
81
82// Describes the key-events we are interested in
83EventTypeSpec OSX_KEY_EVENT_TYPES[] = {
84 { kEventClassKeyboard, kEventRawKeyDown },
85// { kEventClassKeyboard, kEventRawKeyUp },
86 { kEventClassKeyboard, kEventRawKeyModifiersChanged }
87};
88
89//***************************************************************************
90// error handling for unix
91
92static void printMessage (char *msg1, char *msg2, va_list ap)
93{
94 fflush (stderr);
95 fflush (stdout);
96 fprintf (stderr,"\n%s: ",msg1);
97 vfprintf (stderr,msg2,ap);
98 fprintf (stderr,"\n");
99 fflush (stderr);
100}
101
102extern "C" void dsError (char *msg, ...)
103{
104 va_list ap;
105 va_start (ap,msg);
106 printMessage ("Error",msg,ap);
107 exit (1);
108}
109
110
111extern "C" void dsDebug (char *msg, ...)
112{
113 va_list ap;
114 va_start (ap,msg);
115 printMessage ("INTERNAL ERROR",msg,ap);
116 // *((char *)0) = 0; ... commit SEGVicide ?
117 abort();
118}
119
120extern "C" void dsPrint (char *msg, ...)
121{
122 va_list ap;
123 va_start (ap,msg);
124 vprintf (msg,ap);
125}
126
127static void captureFrame( int num ){
128
129 fprintf( stderr,"\rcapturing frame %04d", num );
130 unsigned char buffer[windowWidth*windowHeight][3];
131 glReadPixels( 0, 0, windowWidth, windowHeight, GL_RGB, GL_UNSIGNED_BYTE, &buffer );
132 char s[100];
133 sprintf (s,"frame%04d.ppm",num);
134 FILE *f = fopen (s,"wb");
135 if( !f ){
136 dsError( "can't open \"%s\" for writing", s );
137 }
138 fprintf( f,"P6\n%d %d\n255\n", windowWidth, windowHeight );
139 for( int y=windowHeight-1; y>-1; y-- ){
140 fwrite( buffer[y*windowWidth], 3*windowWidth, 1, f );
141 }
142 fclose (f);
143}
144
145extern "C" void dsStop(){
146
147 running = false;
148}
149
150extern "C" double dsElapsedTime()
151{
152#if HAVE_GETTIMEOFDAY
153 static double prev=0.0;
154 timeval tv ;
155
156 gettimeofday(&tv, 0);
157 double curr = tv.tv_sec + (double) tv.tv_usec / 1000000.0 ;
158 if (!prev)
159 prev=curr;
160 double retval = curr-prev;
161 prev=curr;
162 if (retval>1.0) retval=1.0;
163 if (retval<dEpsilon) retval=dEpsilon;
164 return retval;
165#else
166 return 0.01666; // Assume 60 fps
167#endif
168}
169
170OSStatus osxKeyEventHandler( EventHandlerCallRef handlerCallRef, EventRef event, void *userData ){
171
172 UInt32 keyCode;
173 UInt32 state = 0;
174 void* KCHR = NULL;
175 char charCode = 0;
176 char uppercase = 0;
177
178 switch( GetEventKind( event ) ){
179 case kEventRawKeyDown:
180 if( GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof( UInt32 ), NULL, &keyCode ) != noErr ){
181 break;
182 }
183 KCHR = (void *)GetScriptVariable( smCurrentScript, smKCHRCache );
184 charCode = (char)KeyTranslate( KCHR, keyCode, &state );
185 uppercase = charCode;
186 UppercaseText( &uppercase, 1, smSystemScript );
187 //printf( "Character %d [%c] [%c] modifiers [%d]\n", charCode, charCode, uppercase, modifierMask );
188
189 if( modifierMask == 0 ){
190 if( charCode >= ' ' && charCode <= 126 && functions -> command ){
191 functions -> command( charCode );
192 }
193 }
194 else if( ( modifierMask & controlKey ) ){
195 // ctrl+key was pressed
196 switch(uppercase ){
197 case 'T':
198 dsSetTextures( !dsGetTextures() );
199 break;
200 case 'S':
201 dsSetShadows( !dsGetShadows() );
202 break;
203 case 'X':
204 running = false;
205 break;
206 case 'P':
207 paused = !paused;
208 singlestep = false;
209 break;
210 case 'O':
211 if( paused ){
212 singlestep = true;
213 }
214 break;
215 case 'V': {
216 float xyz[3],hpr[3];
217 dsGetViewpoint( xyz,hpr );
218 printf( "Viewpoint = (%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)\n", xyz[0], xyz[1], xyz[2], hpr[0], hpr[1], hpr[2] );
219 break;
220 }
221 case 'W':
222 writeframes = !writeframes;
223 if( writeframes ){
224 printf( "Now writing frames to PPM files\n" );
225 }
226 break;
227 }
228
229 }
230 return noErr;
231 case kEventRawKeyModifiersChanged:
232 if( GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof( UInt32 ), NULL, &modifierMask ) == noErr ){
233 if( ( mouseWithOption && !( modifierMask & optionKey ) ) || ( mouseWithControl && !( modifierMask & controlKey ) ) ){
234 // The mouse was being dragged using either the command-key or the option-key modifier to emulate
235 // the right button or both left + right.
236 // Now the modifier-key has been released so the mouseButtonMode must be changed accordingly
237 // The following releases the right-button.
238 mouseButtonMode &= (~4);
239 mouseWithOption = false;
240 mouseWithControl = false;
241 }
242 return noErr;
243 }
244 break;
245 }
246 return eventNotHandledErr;
247}
248
249OSStatus osxMouseEventHandler( EventHandlerCallRef handlerCallRef, EventRef event, void *userData ){
250
251 bool buttonDown = false;
252 HIPoint mouseLocation;
253
254 switch( GetEventKind( event ) ){
255
256 case kEventMouseDown:
257 buttonDown = true;
258 case kEventMouseUp:
259 if( GetEventParameter( event, kEventParamWindowMouseLocation, typeHIPoint, NULL, sizeof( HIPoint ), NULL, &mouseLocation ) != noErr ){
260 break;
261 }
262 EventMouseButton button;
263 if( GetEventParameter( event, kEventParamMouseButton, typeMouseButton, NULL, sizeof( EventMouseButton ), NULL, &button ) == noErr ){
264
265 if( button == kEventMouseButtonPrimary ){
266 if( modifierMask & controlKey ){
267 // Ctrl+button == right
268 button = kEventMouseButtonSecondary;
269 mouseWithControl = true;
270 }
271 else if( modifierMask & optionKey ){
272 // Alt+button == left+right
273 mouseButtonMode = 5;
274 mouseWithOption = true;
275 return noErr;
276 }
277 }
278 if( buttonDown ){
279 if( button == kEventMouseButtonPrimary ) mouseButtonMode |= 1; // Left
280 if( button == kEventMouseButtonTertiary ) mouseButtonMode |= 2; // Middle
281 if( button == kEventMouseButtonSecondary ) mouseButtonMode |= 4; // Right
282 }
283 else{
284 if( button == kEventMouseButtonPrimary ) mouseButtonMode &= (~1); // Left
285 if( button == kEventMouseButtonTertiary ) mouseButtonMode &= (~2); // Middle
286 if( button == kEventMouseButtonSecondary ) mouseButtonMode &= (~4);// Right
287 }
288 return noErr;
289 }
290 break;
291 case kEventMouseMoved:
292 // NO-OP
293 return noErr;
294 case kEventMouseDragged:
295 // Carbon provides mouse-position deltas, so we don't have to store the old state ourselves
296 if( GetEventParameter( event, kEventParamMouseDelta, typeHIPoint, NULL, sizeof( HIPoint ), NULL, &mouseLocation ) == noErr ){
297 //printf( "Mode %d\n", mouseButtonMode );
298 dsMotion( mouseButtonMode, (int)mouseLocation.x, (int)mouseLocation.y );
299 return noErr;
300 }
301 break;
302 case kEventMouseWheelMoved:
303 // NO-OP
304 break;
305 }
306 return eventNotHandledErr;
307}
308
309static void osxCloseMainWindow(){
310
311 if( windowUPP != NULL ){
312 DisposeEventHandlerUPP( windowUPP );
313 windowUPP = NULL;
314 }
315
316 if( aglContext != NULL ){
317 aglSetCurrentContext( NULL );
318 aglSetDrawable( aglContext, NULL );
319 aglDestroyContext( aglContext );
320 aglContext = NULL;
321 }
322
323 if( windowReference != NULL ){
324 ReleaseWindow( windowReference );
325 windowReference = NULL;
326 }
327}
328
329OSStatus osxWindowEventHandler( EventHandlerCallRef handlerCallRef, EventRef event, void *userData ){
330
331 //printf( "WindowEvent\n" );
332 switch( GetEventKind(event) ){
333 case kEventWindowBoundsChanged:
334 WindowRef window;
335 GetEventParameter( event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window );
336 Rect rect;
337 GetWindowPortBounds( window, &rect );
338 windowWidth = rect.right;
339 windowHeight = rect.bottom;
340 aglUpdateContext( aglContext );
341 break;
342 case kEventWindowClose:
343 osxCloseMainWindow();
344 exit( 0 );
345 return noErr;
346 case kEventWindowDrawContent:
347 // NO-OP
348 break;
349 }
350
351 return eventNotHandledErr;
352}
353
354static void osxCreateMainWindow( int width, int height ){
355
356 int redbits = 4;
357 int greenbits = 4;
358 int bluebits = 4;
359 int alphabits = 4;
360 int depthbits = 16;
361
362 OSStatus error;
363
364 // create pixel format attribute list
365
366 GLint pixelFormatAttributes[256];
367 int numAttrs = 0;
368
369 pixelFormatAttributes[numAttrs++] = AGL_RGBA;
370 pixelFormatAttributes[numAttrs++] = AGL_DOUBLEBUFFER;
371
372 pixelFormatAttributes[numAttrs++] = AGL_RED_SIZE;
373 pixelFormatAttributes[numAttrs++] = redbits;
374 pixelFormatAttributes[numAttrs++] = AGL_GREEN_SIZE;
375 pixelFormatAttributes[numAttrs++] = greenbits;
376 pixelFormatAttributes[numAttrs++] = AGL_BLUE_SIZE;
377 pixelFormatAttributes[numAttrs++] = bluebits;
378 pixelFormatAttributes[numAttrs++] = AGL_ALPHA_SIZE;
379 pixelFormatAttributes[numAttrs++] = alphabits;
380 pixelFormatAttributes[numAttrs++] = AGL_DEPTH_SIZE;
381 pixelFormatAttributes[numAttrs++] = depthbits;
382
383 pixelFormatAttributes[numAttrs++] = AGL_NONE;
384
385 // create pixel format.
386
387 AGLDevice mainMonitor = GetMainDevice();
388 AGLPixelFormat pixelFormat = aglChoosePixelFormat( &mainMonitor, 1, pixelFormatAttributes );
389 if( pixelFormat == NULL ){
390 return;
391 }
392
393 aglContext = aglCreateContext( pixelFormat, NULL );
394
395 aglDestroyPixelFormat( pixelFormat );
396
397 if( aglContext == NULL ){
398 osxCloseMainWindow();
399 return;
400 }
401
402 Rect windowContentBounds;
403 windowContentBounds.left = 0;
404 windowContentBounds.top = 0;
405 windowContentBounds.right = width;
406 windowContentBounds.bottom = height;
407
408 int windowAttributes = kWindowCloseBoxAttribute
409 | kWindowFullZoomAttribute
410 | kWindowCollapseBoxAttribute
411 | kWindowResizableAttribute
412 | kWindowStandardHandlerAttribute
413 | kWindowLiveResizeAttribute;
414
415 error = CreateNewWindow( kDocumentWindowClass, windowAttributes, &windowContentBounds, &windowReference );
416 if( ( error != noErr ) || ( windowReference == NULL ) ){
417 osxCloseMainWindow();
418 return;
419 }
420
421 windowUPP = NewEventHandlerUPP( osxWindowEventHandler );
422
423 error = InstallWindowEventHandler( windowReference, windowUPP,GetEventTypeCount( OSX_WINDOW_EVENT_TYPES ), OSX_WINDOW_EVENT_TYPES, NULL, NULL );
424 if( error != noErr ){
425 osxCloseMainWindow();
426 return;
427 }
428
429 // The process-type must be changed for a ForegroundApplication
430 // Unless it is a foreground-process, the application will not show in the dock or expose and the window
431 // will not behave properly.
432 ProcessSerialNumber currentProcess;
433 GetCurrentProcess( &currentProcess );
434 TransformProcessType( &currentProcess, kProcessTransformToForegroundApplication );
435 SetFrontProcess( &currentProcess );
436
437 SetWindowTitleWithCFString( windowReference, CFSTR( "ODE - Drawstuff" ) );
438 RepositionWindow( windowReference, NULL, kWindowCenterOnMainScreen );
439
440 ShowWindow( windowReference );
441
442 if( !aglSetDrawable( aglContext, GetWindowPort( windowReference ) ) ){
443 osxCloseMainWindow();
444 return;
445 }
446
447 if( !aglSetCurrentContext( aglContext ) ){
448 osxCloseMainWindow();
449 }
450
451 windowWidth = width;
452 windowHeight = height;
453}
454
455int osxInstallEventHandlers(){
456
457 OSStatus error;
458
459 mouseUPP = NewEventHandlerUPP( osxMouseEventHandler );
460
461 error = InstallEventHandler( GetApplicationEventTarget(), mouseUPP, GetEventTypeCount( OSX_MOUSE_EVENT_TYPES ), OSX_MOUSE_EVENT_TYPES, NULL, NULL );
462 if( error != noErr ){
463 return GL_FALSE;
464 }
465
466 keyboardUPP = NewEventHandlerUPP( osxKeyEventHandler );
467
468 error = InstallEventHandler( GetApplicationEventTarget(), keyboardUPP, GetEventTypeCount( OSX_KEY_EVENT_TYPES ), OSX_KEY_EVENT_TYPES, NULL, NULL );
469 if( error != noErr ){
470 return GL_FALSE;
471 }
472
473 return GL_TRUE;
474}
475
476extern void dsPlatformSimLoop( int givenWindowWidth, int givenWindowHeight, dsFunctions *fn, int givenPause ){
477
478 functions = fn;
479
480 paused = givenPause;
481
482 osxCreateMainWindow( givenWindowWidth, givenWindowHeight );
483 osxInstallEventHandlers();
484
485 dsStartGraphics( windowWidth, windowHeight, fn );
486
487 static bool firsttime=true;
488 if( firsttime )
489 {
490 fprintf
491 (
492 stderr,
493 "\n"
494 "Simulation test environment v%d.%02d\n"
495 " Ctrl-P : pause / unpause (or say `-pause' on command line).\n"
496 " Ctrl-O : single step when paused.\n"
497 " Ctrl-T : toggle textures (or say `-notex' on command line).\n"
498 " Ctrl-S : toggle shadows (or say `-noshadow' on command line).\n"
499 " Ctrl-V : print current viewpoint coordinates (x,y,z,h,p,r).\n"
500 " Ctrl-W : write frames to ppm files: frame/frameNNN.ppm\n"
501 " Ctrl-X : exit.\n"
502 "\n"
503 "Change the camera position by clicking + dragging in the window.\n"
504 " Left button - pan and tilt.\n"
505 " Right button (or Ctrl + button) - forward and sideways.\n"
506 " Left + Right button (or middle button, or Alt + button) - sideways and up.\n"
507 "\n",DS_VERSION >> 8,DS_VERSION & 0xff
508 );
509 firsttime = false;
510 }
511
512 if( fn -> start ) fn->start();
513
514 int frame = 1;
515 running = true;
516 while( running ){
517 // read in and process all pending events for the main window
518 EventRef event;
519 EventTargetRef eventDispatcher = GetEventDispatcherTarget();
520 while( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr ){
521 SendEventToEventTarget( event, eventDispatcher );
522 ReleaseEvent( event );
523 }
524
525 dsDrawFrame( windowWidth, windowHeight, fn, paused && !singlestep );
526 singlestep = false;
527
528 glFlush();
529 aglSwapBuffers( aglContext );
530
531 // capture frames if necessary
532 if( !paused && writeframes ){
533 captureFrame( frame );
534 frame++;
535 }
536 }
537
538 if( fn->stop ) fn->stop();
539 dsStopGraphics();
540
541 osxCloseMainWindow();
542}
diff --git a/libraries/ode-0.9/drawstuff/src/resource.h b/libraries/ode-0.9/drawstuff/src/resource.h
new file mode 100644
index 0000000..15802b6
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/resource.h
@@ -0,0 +1,28 @@
1//{{NO_DEPENDENCIES}}
2// Microsoft Developer Studio generated include file.
3// Used by resources.rc
4//
5#define IDD_MSGDLG 101
6#define IDR_MENU1 102
7#define IDD_ABOUT 103
8#define IDR_ACCELERATOR1 104
9#define IDC_LIST1 1000
10#define IDM_EXIT 40001
11#define IDM_ABOUT 40002
12#define IDM_PAUSE 40003
13#define IDM_PERF_MONITOR 40004
14#define IDM_SHADOWS 40005
15#define IDM_TEXTURES 40006
16#define IDM_SAVE_SETTINGS 40007
17#define IDM_SINGLE_STEP 40008
18
19// Next default values for new objects
20//
21#ifdef APSTUDIO_INVOKED
22#ifndef APSTUDIO_READONLY_SYMBOLS
23#define _APS_NEXT_RESOURCE_VALUE 108
24#define _APS_NEXT_COMMAND_VALUE 40009
25#define _APS_NEXT_CONTROL_VALUE 1001
26#define _APS_NEXT_SYMED_VALUE 101
27#endif
28#endif
diff --git a/libraries/ode-0.9/drawstuff/src/resources.rc b/libraries/ode-0.9/drawstuff/src/resources.rc
new file mode 100644
index 0000000..61611f7
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/resources.rc
@@ -0,0 +1,153 @@
1//Microsoft Developer Studio generated resource script.
2//
3#include "resource.h"
4
5#define APSTUDIO_READONLY_SYMBOLS
6/////////////////////////////////////////////////////////////////////////////
7//
8// Generated from the TEXTINCLUDE 2 resource.
9//
10//#include "afxres.h"
11
12// added by RLS to make this work with windres
13#include "winresrc.h"
14#define IDC_STATIC (-1)
15
16/////////////////////////////////////////////////////////////////////////////
17#undef APSTUDIO_READONLY_SYMBOLS
18
19/////////////////////////////////////////////////////////////////////////////
20// English (U.S.) resources
21
22#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
23#ifdef _WIN32
24LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
25#pragma code_page(1252)
26#endif //_WIN32
27
28/////////////////////////////////////////////////////////////////////////////
29//
30// Dialog
31//
32
33IDD_ABOUT DIALOG DISCARDABLE 0, 0, 257, 105
34STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
35CAPTION "About"
36FONT 8, "MS Sans Serif"
37BEGIN
38 DEFPUSHBUTTON "OK",IDOK,200,84,50,14
39 LTEXT "Simulation test environment",IDC_STATIC,7,7,243,8
40 LTEXT "Change the camera position by clicking + dragging in the main window.",
41 IDC_STATIC,7,24,243,8
42 LTEXT "Left button - pan and tilt.",IDC_STATIC,25,37,225,8
43 LTEXT "Right button - forward and sideways.",IDC_STATIC,25,48,
44 225,8
45 LTEXT "Left + Right button (or middle button) - sideways and up.",
46 IDC_STATIC,25,59,225,8
47END
48
49
50#ifdef APSTUDIO_INVOKED
51/////////////////////////////////////////////////////////////////////////////
52//
53// TEXTINCLUDE
54//
55
561 TEXTINCLUDE DISCARDABLE
57BEGIN
58 "resource.h\0"
59END
60
612 TEXTINCLUDE DISCARDABLE
62BEGIN
63 //"#include ""afxres.h""\r\n"
64 "\0"
65END
66
673 TEXTINCLUDE DISCARDABLE
68BEGIN
69 "\r\n"
70 "\0"
71END
72
73#endif // APSTUDIO_INVOKED
74
75
76/////////////////////////////////////////////////////////////////////////////
77//
78// Menu
79//
80
81IDR_MENU1 MENU DISCARDABLE
82BEGIN
83 POPUP "&File"
84 BEGIN
85 MENUITEM "&Exit\tCtrl+X", IDM_EXIT
86 END
87 POPUP "&Simulation"
88 BEGIN
89 MENUITEM "&Pause\tCtrl+P", IDM_PAUSE
90 MENUITEM "Single Step\tCtrl+O", IDM_SINGLE_STEP
91 MENUITEM "Performance &Monitor", IDM_PERF_MONITOR, GRAYED
92 MENUITEM SEPARATOR
93 MENUITEM "&Shadows\tCtrl+S", IDM_SHADOWS, CHECKED
94 MENUITEM "&Textures\tCtrl+T", IDM_TEXTURES, CHECKED
95 MENUITEM SEPARATOR
96 MENUITEM "S&ave Settings", IDM_SAVE_SETTINGS, GRAYED
97 END
98 POPUP "&Help"
99 BEGIN
100 MENUITEM "&About", IDM_ABOUT
101 END
102END
103
104
105/////////////////////////////////////////////////////////////////////////////
106//
107// DESIGNINFO
108//
109
110#ifdef APSTUDIO_INVOKED
111GUIDELINES DESIGNINFO DISCARDABLE
112BEGIN
113 IDD_ABOUT, DIALOG
114 BEGIN
115 LEFTMARGIN, 7
116 RIGHTMARGIN, 250
117 VERTGUIDE, 25
118 TOPMARGIN, 7
119 BOTTOMMARGIN, 98
120 END
121END
122#endif // APSTUDIO_INVOKED
123
124
125/////////////////////////////////////////////////////////////////////////////
126//
127// Accelerator
128//
129
130IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE
131BEGIN
132 "O", IDM_SINGLE_STEP, VIRTKEY, CONTROL, NOINVERT
133 "P", IDM_PAUSE, VIRTKEY, CONTROL, NOINVERT
134 "S", IDM_SHADOWS, VIRTKEY, CONTROL, NOINVERT
135 "T", IDM_TEXTURES, VIRTKEY, CONTROL, NOINVERT
136 "X", IDM_EXIT, VIRTKEY, CONTROL, NOINVERT
137END
138
139#endif // English (U.S.) resources
140/////////////////////////////////////////////////////////////////////////////
141
142
143
144#ifndef APSTUDIO_INVOKED
145/////////////////////////////////////////////////////////////////////////////
146//
147// Generated from the TEXTINCLUDE 3 resource.
148//
149
150
151/////////////////////////////////////////////////////////////////////////////
152#endif // not APSTUDIO_INVOKED
153
diff --git a/libraries/ode-0.9/drawstuff/src/windows.cpp b/libraries/ode-0.9/drawstuff/src/windows.cpp
new file mode 100644
index 0000000..e2b442a
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/windows.cpp
@@ -0,0 +1,527 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23#if defined(WIN32) || defined(__CYGWIN__)// this prevents warnings when dependencies built
24#include <windows.h>
25#endif
26#include <ode/config.h>
27#include <GL/gl.h>
28
29#include "resource.h"
30#include "internal.h"
31
32//***************************************************************************
33// application globals
34
35static HINSTANCE ghInstance = 0;
36static int gnCmdShow = 0;
37static HACCEL accelerators = 0;
38static HWND main_window = 0;
39
40//***************************************************************************
41// error and message handling
42
43static void errorBox (char *title, char *msg, va_list ap)
44{
45 char s[1000];
46 vsprintf (s,msg,ap);
47 MessageBox (0,s,title,MB_OK | MB_APPLMODAL | MB_ICONEXCLAMATION);
48}
49
50
51static void dsWarning (char *msg, ...)
52{
53 va_list ap;
54 va_start (ap,msg);
55 errorBox ("Warning",msg,ap);
56}
57
58
59extern "C" void dsError (char *msg, ...)
60{
61 va_list ap;
62 va_start (ap,msg);
63 errorBox ("Error",msg,ap);
64 exit (1);
65}
66
67
68extern "C" void dsDebug (char *msg, ...)
69{
70 va_list ap;
71 va_start (ap,msg);
72 errorBox ("INTERNAL ERROR",msg,ap);
73 // *((char *)0) = 0; ... commit SEGVicide ?
74 abort();
75 exit (1); // should never get here, but just in case...
76}
77
78
79extern "C" void dsPrint (char *msg, ...)
80{
81 va_list ap;
82 va_start (ap,msg);
83 vprintf (msg,ap);
84}
85
86//***************************************************************************
87// rendering thread
88
89// globals used to communicate with rendering thread
90
91static volatile int renderer_run = 1;
92static volatile int renderer_pause = 0; // 0=run, 1=pause
93static volatile int renderer_ss = 0; // single step command
94static volatile int renderer_width = 1;
95static volatile int renderer_height = 1;
96static dsFunctions *renderer_fn = 0;
97static volatile HDC renderer_dc = 0;
98static volatile int keybuffer[16]; // fifo ring buffer for keypresses
99static volatile int keybuffer_head = 0; // index of next key to put in (modified by GUI)
100static volatile int keybuffer_tail = 0; // index of next key to take out (modified by renderer)
101
102
103static void setupRendererGlobals()
104{
105 renderer_run = 1;
106 renderer_pause = 0;
107 renderer_ss = 0;
108 renderer_width = 1;
109 renderer_height = 1;
110 renderer_fn = 0;
111 renderer_dc = 0;
112 keybuffer[16];
113 keybuffer_head = 0;
114 keybuffer_tail = 0;
115}
116
117
118static DWORD WINAPI renderingThread (LPVOID lpParam)
119{
120 // create openGL context and make it current
121 HGLRC glc = wglCreateContext (renderer_dc);
122 if (glc==NULL) dsError ("could not create OpenGL context");
123 if (wglMakeCurrent (renderer_dc,glc) != TRUE)
124 dsError ("could not make OpenGL context current");
125
126 // test openGL capabilities
127 int maxtsize=0;
128 glGetIntegerv (GL_MAX_TEXTURE_SIZE,&maxtsize);
129 if (maxtsize < 128) dsWarning ("max texture size too small (%dx%d)",
130 maxtsize,maxtsize);
131
132 dsStartGraphics (renderer_width,renderer_height,renderer_fn);
133 if (renderer_fn->start) renderer_fn->start();
134
135 while (renderer_run) {
136 // need to make local copy of renderer_ss to help prevent races
137 int ss = renderer_ss;
138 dsDrawFrame (renderer_width,renderer_height,renderer_fn,
139 renderer_pause && !ss);
140 if (ss) renderer_ss = 0;
141
142 // read keys out of ring buffer and feed them to the command function
143 while (keybuffer_head != keybuffer_tail) {
144 if (renderer_fn->command) renderer_fn->command (keybuffer[keybuffer_tail]);
145 keybuffer_tail = (keybuffer_tail+1) & 15;
146 }
147
148 // swap buffers
149 SwapBuffers (renderer_dc);
150 }
151
152 if (renderer_fn->stop) renderer_fn->stop();
153 dsStopGraphics();
154
155 // delete openGL context
156 wglMakeCurrent (NULL,NULL);
157 wglDeleteContext (glc);
158
159 return 123; // magic value used to test for thread termination
160}
161
162//***************************************************************************
163// window handling
164
165// callback function for "about" dialog box
166
167static LRESULT CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam,
168 LPARAM lParam)
169{
170 switch (uMsg) {
171 case WM_INITDIALOG:
172 return TRUE;
173 case WM_COMMAND:
174 switch (wParam) {
175 case IDOK:
176 EndDialog (hDlg, TRUE);
177 return TRUE;
178 }
179 break;
180 }
181 return FALSE;
182}
183
184
185// callback function for the main window
186
187static LRESULT CALLBACK mainWndProc (HWND hWnd, UINT msg, WPARAM wParam,
188 LPARAM lParam)
189{
190 static int button=0,lastx=0,lasty=0;
191 int ctrl = int(wParam & MK_CONTROL);
192
193 switch (msg) {
194 case WM_LBUTTONDOWN:
195 case WM_MBUTTONDOWN:
196 case WM_RBUTTONDOWN:
197 if (msg==WM_LBUTTONDOWN) button |= 1;
198 else if (msg==WM_MBUTTONDOWN) button |= 2;
199 else button |= 4;
200 lastx = SHORT(LOWORD(lParam));
201 lasty = SHORT(HIWORD(lParam));
202 SetCapture (hWnd);
203 break;
204
205 case WM_LBUTTONUP:
206 case WM_MBUTTONUP:
207 case WM_RBUTTONUP:
208 if (msg==WM_LBUTTONUP) button &= ~1;
209 else if (msg==WM_MBUTTONUP) button &= ~2;
210 else button &= ~4;
211 if (button==0) ReleaseCapture();
212 break;
213
214 case WM_MOUSEMOVE: {
215 int x = SHORT(LOWORD(lParam));
216 int y = SHORT(HIWORD(lParam));
217 if (button) dsMotion (button,x-lastx,y-lasty);
218 lastx = x;
219 lasty = y;
220 break;
221 }
222
223 case WM_CHAR: {
224 if (wParam >= ' ' && wParam <= 126) {
225 int nexth = (keybuffer_head+1) & 15;
226 if (nexth != keybuffer_tail) {
227 keybuffer[keybuffer_head] = int(wParam);
228 keybuffer_head = nexth;
229 }
230 }
231 break;
232 }
233
234 case WM_SIZE:
235 // lParam will contain the size of the *client* area!
236 renderer_width = LOWORD(lParam);
237 renderer_height = HIWORD(lParam);
238 break;
239
240 case WM_COMMAND:
241 switch (wParam & 0xffff) {
242 case IDM_ABOUT:
243 DialogBox (ghInstance,MAKEINTRESOURCE(IDD_ABOUT),hWnd,
244 (DLGPROC) AboutDlgProc);
245 break;
246 case IDM_PAUSE: {
247 renderer_pause ^= 1;
248 CheckMenuItem (GetMenu(hWnd),IDM_PAUSE,
249 renderer_pause ? MF_CHECKED : MF_UNCHECKED);
250 if (renderer_pause) renderer_ss = 0;
251 break;
252 }
253 case IDM_SINGLE_STEP: {
254 if (renderer_pause)
255 renderer_ss = 1;
256 else
257 SendMessage( hWnd, WM_COMMAND, IDM_PAUSE, 0 );
258 break;
259 }
260 case IDM_PERF_MONITOR: {
261 dsWarning ("Performance monitor not yet implemented.");
262 break;
263 }
264 case IDM_TEXTURES: {
265 static int tex = 1;
266 tex ^= 1;
267 CheckMenuItem (GetMenu(hWnd),IDM_TEXTURES,
268 tex ? MF_CHECKED : MF_UNCHECKED);
269 dsSetTextures (tex);
270 break;
271 }
272 case IDM_SHADOWS: {
273 static int shadows = 1;
274 shadows ^= 1;
275 CheckMenuItem (GetMenu(hWnd),IDM_SHADOWS,
276 shadows ? MF_CHECKED : MF_UNCHECKED);
277 dsSetShadows (shadows);
278 break;
279 }
280 case IDM_SAVE_SETTINGS: {
281 dsWarning ("\"Save Settings\" not yet implemented.");
282 break;
283 }
284 case IDM_EXIT:
285 PostQuitMessage (0);
286 break;
287 }
288 break;
289
290 case WM_CLOSE:
291 PostQuitMessage (0);
292 break;
293
294 default:
295 return (DefWindowProc (hWnd, msg, wParam, lParam));
296 }
297
298 return 0;
299}
300
301
302// this comes from an MSDN example. believe it or not, this is the recommended
303// way to get the console window handle.
304
305static HWND GetConsoleHwnd()
306{
307 // the console window title to a "unique" value, then find the window
308 // that has this title.
309 char title[1024];
310 wsprintf (title,"DrawStuff:%d/%d",GetTickCount(),GetCurrentProcessId());
311 SetConsoleTitle (title);
312 Sleep(40); // ensure window title has been updated
313 return FindWindow (NULL,title);
314}
315
316
317static void drawStuffStartup()
318{
319 static int startup_called = 0;
320 if (startup_called) return;
321 startup_called = 1;
322 if (!ghInstance)
323 ghInstance = GetModuleHandleA (NULL);
324 gnCmdShow = SW_SHOWNORMAL; // @@@ fix this later
325
326 // redirect standard I/O to a new console (except on cygwin)
327#ifndef __CYGWIN__
328 FreeConsole();
329 if (AllocConsole()==0) dsError ("AllocConsole() failed");
330 if (freopen ("CONIN$","rt",stdin)==0) dsError ("could not open stdin");
331 if (freopen ("CONOUT$","wt",stdout)==0) dsError ("could not open stdout");
332 if (freopen ("CONOUT$","wt",stderr)==0) dsError ("could not open stderr");
333 BringWindowToTop (GetConsoleHwnd());
334 SetConsoleTitle ("DrawStuff Messages");
335#endif
336
337 // register the window class
338 WNDCLASS wc;
339 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
340 wc.lpfnWndProc = mainWndProc;
341 wc.cbClsExtra = 0;
342 wc.cbWndExtra = 0;
343 wc.hInstance = ghInstance;
344 wc.hIcon = LoadIcon (NULL,IDI_APPLICATION);
345 wc.hCursor = LoadCursor (NULL,IDC_ARROW);
346 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
347 wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
348 wc.lpszClassName = "SimAppClass";
349 if (RegisterClass (&wc)==0) dsError ("could not register window class");
350
351 // load accelerators
352 accelerators = LoadAccelerators (ghInstance,
353 MAKEINTRESOURCE(IDR_ACCELERATOR1));
354 if (accelerators==NULL) dsError ("could not load accelerators");
355}
356
357
358void dsPlatformSimLoop (int window_width, int window_height,
359 dsFunctions *fn, int initial_pause)
360{
361 drawStuffStartup();
362 setupRendererGlobals();
363 renderer_pause = initial_pause;
364
365 // create window - but first get window size for desired size of client area.
366 // if this adjustment isn't made then the openGL area will be shifted into
367 // the nonclient area and determining the frame buffer coordinate from the
368 // client area coordinate will be hard.
369 RECT winrect;
370 winrect.left = 50;
371 winrect.top = 80;
372 winrect.right = winrect.left + window_width;
373 winrect.bottom = winrect.top + window_height;
374 DWORD style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
375 AdjustWindowRect (&winrect,style,1);
376 char title[100];
377 sprintf (title,"Simulation test environment v%d.%02d",
378 DS_VERSION >> 8,DS_VERSION & 0xff);
379 main_window = CreateWindow ("SimAppClass",title,style,
380 winrect.left,winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,
381 NULL,NULL,ghInstance,NULL);
382 if (main_window==NULL) dsError ("could not create main window");
383 ShowWindow (main_window, gnCmdShow);
384
385 HDC dc = GetDC (main_window); // get DC for this window
386 if (dc==NULL) dsError ("could not get window DC");
387
388 // set pixel format for DC
389
390 PIXELFORMATDESCRIPTOR pfd = {
391 sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
392 1, // version number
393 PFD_DRAW_TO_WINDOW | // support window
394 PFD_SUPPORT_OPENGL | // support OpenGL
395 PFD_DOUBLEBUFFER, // double buffered
396 PFD_TYPE_RGBA, // RGBA type
397 24, // 24-bit color depth
398 0, 0, 0, 0, 0, 0, // color bits ignored
399 0, // no alpha buffer
400 0, // shift bit ignored
401 0, // no accumulation buffer
402 0, 0, 0, 0, // accum bits ignored
403 32, // 32-bit z-buffer
404 0, // no stencil buffer
405 0, // no auxiliary buffer
406 PFD_MAIN_PLANE, // main layer
407 0, // reserved
408 0, 0, 0 // layer masks ignored
409 };
410 // get the best available match of pixel format for the device context
411 int iPixelFormat = ChoosePixelFormat (dc,&pfd);
412 if (iPixelFormat==0)
413 dsError ("could not find a good OpenGL pixel format");
414 // set the pixel format of the device context
415 if (SetPixelFormat (dc,iPixelFormat,&pfd)==FALSE)
416 dsError ("could not set DC pixel format for OpenGL");
417
418 // **********
419 // start the rendering thread
420
421 // set renderer globals
422 renderer_dc = dc;
423 renderer_width = window_width;
424 renderer_height = window_height;
425 renderer_fn = fn;
426
427 DWORD threadId, thirdParam = 0;
428 HANDLE hThread;
429
430 hThread = CreateThread(
431 NULL, // no security attributes
432 0, // use default stack size
433 renderingThread, // thread function
434 &thirdParam, // argument to thread function
435 0, // use default creation flags
436 &threadId); // returns the thread identifier
437
438 if (hThread==NULL) dsError ("Could not create rendering thread");
439
440 // **********
441 // start GUI message processing
442
443 MSG msg;
444 while (GetMessage (&msg,main_window,0,0)) {
445 if (!TranslateAccelerator (main_window,accelerators,&msg)) {
446 TranslateMessage (&msg);
447 DispatchMessage (&msg);
448 }
449 }
450
451 // terminate rendering thread
452 renderer_run = 0;
453 DWORD ret = WaitForSingleObject (hThread,2000);
454 if (ret==WAIT_TIMEOUT) dsWarning ("Could not kill rendering thread (1)");
455 DWORD exitcode=0;
456 if (!(GetExitCodeThread (hThread,&exitcode) && exitcode == 123))
457 dsWarning ("Could not kill rendering thread (2)");
458 CloseHandle (hThread); // dont need thread handle anymore
459
460 // destroy window
461 DestroyWindow (main_window);
462}
463
464
465extern "C" void dsStop()
466{
467 // just calling PostQuitMessage() here wont work, as this function is
468 // typically called from the rendering thread, not the GUI thread.
469 // instead we must post the message to the GUI window explicitly.
470
471 if (main_window) PostMessage (main_window,WM_QUIT,0,0);
472}
473
474
475extern "C" double dsElapsedTime()
476{
477 static double prev=0.0;
478 double curr = timeGetTime()/1000.0;
479 if (!prev)
480 prev=curr;
481 double retval = curr-prev;
482 prev=curr;
483 if (retval>1.0) retval=1.0;
484 if (retval<dEpsilon) retval=dEpsilon;
485 return retval;
486}
487
488
489// JPerkins: if running as a DLL, grab my module handle at load time so
490// I can find the accelerators table later
491
492BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
493{
494 switch (fdwReason)
495 {
496 case DLL_PROCESS_ATTACH:
497 ghInstance = hinstDLL;
498 break;
499 }
500 return TRUE;
501}
502
503
504// JPerkins: the new build system can set the entry point of the tests to
505// main(); this code is no longer necessary
506/*
507
508//***************************************************************************
509// windows entry point
510//
511// NOTE: WinMain is not guaranteed to be called with MinGW, because MinGW
512// always calls main if it is defined and most users of this library will
513// define their own main. So the startup functionality is kept in
514// zDriverStartup(), which is also called when dsSimulationLoop() is called.
515
516extern "C" int main (int argc, char **argv);
517
518
519int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
520 LPSTR lpCmdLine, int nCmdShow)
521{
522 drawStuffStartup();
523 return main (0,0); // @@@ should really pass cmd line arguments
524}
525
526*/
527
diff --git a/libraries/ode-0.9/drawstuff/src/x11.cpp b/libraries/ode-0.9/drawstuff/src/x11.cpp
new file mode 100644
index 0000000..639ce7b
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/src/x11.cpp
@@ -0,0 +1,418 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23// main window and event handling for X11
24
25#include <ode/config.h>
26#include <stdlib.h>
27#include <string.h>
28#include <stdarg.h>
29#include <X11/Xlib.h>
30#include <X11/Xatom.h>
31#include <X11/keysym.h>
32#include <GL/glx.h>
33
34#ifdef HAVE_SYS_TIME_H
35#include <sys/time.h>
36#endif
37
38#include <drawstuff/drawstuff.h>
39#include <drawstuff/version.h>
40#include "internal.h"
41
42//***************************************************************************
43// error handling for unix
44
45static void printMessage (char *msg1, char *msg2, va_list ap)
46{
47 fflush (stderr);
48 fflush (stdout);
49 fprintf (stderr,"\n%s: ",msg1);
50 vfprintf (stderr,msg2,ap);
51 fprintf (stderr,"\n");
52 fflush (stderr);
53}
54
55
56extern "C" void dsError (char *msg, ...)
57{
58 va_list ap;
59 va_start (ap,msg);
60 printMessage ("Error",msg,ap);
61 exit (1);
62}
63
64
65extern "C" void dsDebug (char *msg, ...)
66{
67 va_list ap;
68 va_start (ap,msg);
69 printMessage ("INTERNAL ERROR",msg,ap);
70 // *((char *)0) = 0; ... commit SEGVicide ?
71 abort();
72}
73
74
75extern "C" void dsPrint (char *msg, ...)
76{
77 va_list ap;
78 va_start (ap,msg);
79 vprintf (msg,ap);
80}
81
82//***************************************************************************
83// openGL window
84
85// X11 display info
86static Display *display=0;
87static int screen=0;
88static XVisualInfo *visual=0; // best visual for openGL
89static Colormap colormap=0; // window's colormap
90static Atom wm_protocols_atom = 0;
91static Atom wm_delete_window_atom = 0;
92
93// window and openGL
94static Window win=0; // X11 window, 0 if not initialized
95static int width=0,height=0; // window size
96static GLXContext glx_context=0; // openGL rendering context
97static int last_key_pressed=0; // last key pressed in the window
98static int run=1; // 1 if simulation running
99static int pause=0; // 1 if in `pause' mode
100static int singlestep=0; // 1 if single step key pressed
101static int writeframes=0; // 1 if frame files to be written
102
103
104static void createMainWindow (int _width, int _height)
105{
106 // create X11 display connection
107 display = XOpenDisplay (NULL);
108 if (!display) dsError ("can not open X11 display");
109 screen = DefaultScreen(display);
110
111 // get GL visual
112 static int attribList[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE,16,
113 GLX_RED_SIZE,4, GLX_GREEN_SIZE,4,
114 GLX_BLUE_SIZE,4, None};
115 visual = glXChooseVisual (display,screen,attribList);
116 if (!visual) dsError ("no good X11 visual found for OpenGL");
117
118 // create colormap
119 colormap = XCreateColormap (display,RootWindow(display,screen),
120 visual->visual,AllocNone);
121
122 // initialize variables
123 win = 0;
124 width = _width;
125 height = _height;
126 glx_context = 0;
127 last_key_pressed = 0;
128
129 if (width < 1 || height < 1) dsDebug (0,"bad window width or height");
130
131 // create the window
132 XSetWindowAttributes attributes;
133 attributes.background_pixel = BlackPixel(display,screen);
134 attributes.colormap = colormap;
135 attributes.event_mask = ButtonPressMask | ButtonReleaseMask |
136 KeyPressMask | KeyReleaseMask | ButtonMotionMask | PointerMotionHintMask |
137 StructureNotifyMask;
138 win = XCreateWindow (display,RootWindow(display,screen),50,50,width,height,
139 0,visual->depth, InputOutput,visual->visual,
140 CWBackPixel | CWColormap | CWEventMask,&attributes);
141
142 // associate a GLX context with the window
143 glx_context = glXCreateContext (display,visual,0,GL_TRUE);
144 if (!glx_context) dsError ("can't make an OpenGL context");
145
146 // set the window title
147 XTextProperty window_name;
148 window_name.value = (unsigned char *) "Simulation";
149 window_name.encoding = XA_STRING;
150 window_name.format = 8;
151 window_name.nitems = strlen((char *) window_name.value);
152 XSetWMName (display,win,&window_name);
153
154 // participate in the window manager 'delete yourself' protocol
155 wm_protocols_atom = XInternAtom (display,"WM_PROTOCOLS",False);
156 wm_delete_window_atom = XInternAtom (display,"WM_DELETE_WINDOW",False);
157 if (XSetWMProtocols (display,win,&wm_delete_window_atom,1)==0)
158 dsError ("XSetWMProtocols() call failed");
159
160 // pop up the window
161 XMapWindow (display,win);
162 XSync (display,win);
163}
164
165
166static void destroyMainWindow()
167{
168 glXDestroyContext (display,glx_context);
169 XDestroyWindow (display,win);
170 XSync (display,0);
171 XCloseDisplay(display);
172 display = 0;
173 win = 0;
174 glx_context = 0;
175}
176
177
178static void handleEvent (XEvent &event, dsFunctions *fn)
179{
180 static int mx=0,my=0; // mouse position
181 static int mode = 0; // mouse button bits
182
183 switch (event.type) {
184
185 case ButtonPress: {
186 if (event.xbutton.button == Button1) mode |= 1;
187 if (event.xbutton.button == Button2) mode |= 2;
188 if (event.xbutton.button == Button3) mode |= 4;
189 mx = event.xbutton.x;
190 my = event.xbutton.y;
191 }
192 return;
193
194 case ButtonRelease: {
195 if (event.xbutton.button == Button1) mode &= (~1);
196 if (event.xbutton.button == Button2) mode &= (~2);
197 if (event.xbutton.button == Button3) mode &= (~4);
198 mx = event.xbutton.x;
199 my = event.xbutton.x;
200 }
201 return;
202
203 case MotionNotify: {
204 if (event.xmotion.is_hint) {
205 Window root,child;
206 unsigned int mask;
207 XQueryPointer (display,win,&root,&child,&event.xbutton.x_root,
208 &event.xbutton.y_root,&event.xbutton.x,&event.xbutton.y,
209 &mask);
210 }
211 dsMotion (mode, event.xmotion.x - mx, event.xmotion.y - my);
212 mx = event.xmotion.x;
213 my = event.xmotion.y;
214 }
215 return;
216
217 case KeyPress: {
218 KeySym key;
219 XLookupString (&event.xkey,NULL,0,&key,0);
220 if ((event.xkey.state & ControlMask) == 0) {
221 if (key >= ' ' && key <= 126 && fn->command) fn->command (key);
222 }
223 else if (event.xkey.state & ControlMask) {
224 switch (key) {
225 case 't': case 'T':
226 dsSetTextures (dsGetTextures() ^ 1);
227 break;
228 case 's': case 'S':
229 dsSetShadows (dsGetShadows() ^ 1);
230 break;
231 case 'x': case 'X':
232 run = 0;
233 break;
234 case 'p': case 'P':
235 pause ^= 1;
236 singlestep = 0;
237 break;
238 case 'o': case 'O':
239 if (pause) singlestep = 1;
240 break;
241 case 'v': case 'V': {
242 float xyz[3],hpr[3];
243 dsGetViewpoint (xyz,hpr);
244 printf ("Viewpoint = (%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)\n",
245 xyz[0],xyz[1],xyz[2],hpr[0],hpr[1],hpr[2]);
246 break;
247 }
248 case 'w': case 'W':
249 writeframes ^= 1;
250 if (writeframes) printf ("Now writing frames to PPM files\n");
251 break;
252 }
253 }
254 last_key_pressed = key; // a kludgy place to put this...
255 }
256 return;
257
258 case KeyRelease: {
259 // hmmmm...
260 }
261 return;
262
263 case ClientMessage:
264 if (event.xclient.message_type == wm_protocols_atom &&
265 event.xclient.format == 32 &&
266 Atom(event.xclient.data.l[0]) == wm_delete_window_atom) {
267 run = 0;
268 return;
269 }
270 return;
271
272 case ConfigureNotify:
273 width = event.xconfigure.width;
274 height = event.xconfigure.height;
275 return;
276 }
277}
278
279
280// return the index of the highest bit
281static int getHighBitIndex (unsigned int x)
282{
283 int i = 0;
284 while (x) {
285 i++;
286 x >>= 1;
287 }
288 return i-1;
289}
290
291
292// shift x left by i, where i can be positive or negative
293#define SHIFTL(x,i) (((i) >= 0) ? ((x) << (i)) : ((x) >> (-i)))
294
295
296static void captureFrame (int num)
297{
298 fprintf (stderr,"capturing frame %04d\n",num);
299
300 char s[100];
301 sprintf (s,"frame/frame%04d.ppm",num);
302 FILE *f = fopen (s,"wb");
303 if (!f) dsError ("can't open \"%s\" for writing",s);
304 fprintf (f,"P6\n%d %d\n255\n",width,height);
305 XImage *image = XGetImage (display,win,0,0,width,height,~0,ZPixmap);
306
307 int rshift = 7 - getHighBitIndex (image->red_mask);
308 int gshift = 7 - getHighBitIndex (image->green_mask);
309 int bshift = 7 - getHighBitIndex (image->blue_mask);
310
311 for (int y=0; y<height; y++) {
312 for (int x=0; x<width; x++) {
313 unsigned long pixel = XGetPixel (image,x,y);
314 unsigned char b[3];
315 b[0] = SHIFTL(pixel & image->red_mask,rshift);
316 b[1] = SHIFTL(pixel & image->green_mask,gshift);
317 b[2] = SHIFTL(pixel & image->blue_mask,bshift);
318 fwrite (b,3,1,f);
319 }
320 }
321 fclose (f);
322 XDestroyImage (image);
323}
324
325
326void dsPlatformSimLoop (int window_width, int window_height, dsFunctions *fn,
327 int initial_pause)
328{
329 pause = initial_pause;
330 createMainWindow (window_width, window_height);
331 glXMakeCurrent (display,win,glx_context);
332
333 dsStartGraphics (window_width,window_height,fn);
334
335 static bool firsttime=true;
336 if (firsttime)
337 {
338 fprintf
339 (
340 stderr,
341 "\n"
342 "Simulation test environment v%d.%02d\n"
343 " Ctrl-P : pause / unpause (or say `-pause' on command line).\n"
344 " Ctrl-O : single step when paused.\n"
345 " Ctrl-T : toggle textures (or say `-notex' on command line).\n"
346 " Ctrl-S : toggle shadows (or say `-noshadow' on command line).\n"
347 " Ctrl-V : print current viewpoint coordinates (x,y,z,h,p,r).\n"
348 " Ctrl-W : write frames to ppm files: frame/frameNNN.ppm\n"
349 " Ctrl-X : exit.\n"
350 "\n"
351 "Change the camera position by clicking + dragging in the window.\n"
352 " Left button - pan and tilt.\n"
353 " Right button - forward and sideways.\n"
354 " Left + Right button (or middle button) - sideways and up.\n"
355 "\n",DS_VERSION >> 8,DS_VERSION & 0xff
356 );
357 firsttime = false;
358 }
359
360 if (fn->start) fn->start();
361
362 int frame = 1;
363 run = 1;
364 while (run) {
365 // read in and process all pending events for the main window
366 XEvent event;
367 while (run && XPending (display)) {
368 XNextEvent (display,&event);
369 handleEvent (event,fn);
370 }
371
372 dsDrawFrame (width,height,fn,pause && !singlestep);
373 singlestep = 0;
374
375 glFlush();
376 glXSwapBuffers (display,win);
377 XSync (display,0);
378
379 // capture frames if necessary
380 if (pause==0 && writeframes) {
381 captureFrame (frame);
382 frame++;
383 }
384 };
385
386 if (fn->stop) fn->stop();
387 dsStopGraphics();
388
389 destroyMainWindow();
390}
391
392
393extern "C" void dsStop()
394{
395 run = 0;
396}
397
398
399extern "C" double dsElapsedTime()
400{
401#if HAVE_GETTIMEOFDAY
402 static double prev=0.0;
403 timeval tv ;
404
405 gettimeofday(&tv, 0);
406 double curr = tv.tv_sec + (double) tv.tv_usec / 1000000.0 ;
407 if (!prev)
408 prev=curr;
409 double retval = curr-prev;
410 prev=curr;
411 if (retval>1.0) retval=1.0;
412 if (retval<dEpsilon) retval=dEpsilon;
413 return retval;
414#else
415 return 0.01666; // Assume 60 fps
416#endif
417}
418
diff --git a/libraries/ode-0.9/drawstuff/textures/ground.ppm b/libraries/ode-0.9/drawstuff/textures/ground.ppm
new file mode 100644
index 0000000..5154c31
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/textures/ground.ppm
@@ -0,0 +1,6 @@
1P6
2# Created by Paint Shop Pro
3256 256
4255
5mttv{}{{tdc\}dc\}||UTSu{{bVU{{t|lritt{zllf]cSKJ|{ttlekzll|z[[Ttsl|uztlri||u||}}mttttslks}|leklld|z|zSKJ]bZ}ttsddc{tt[TTult{tttllv{tll}cbVdc\lrijcVsre[TTsleSKJj]\\[[:97*)(ztlJHFlddJHFVTLbVUVTLddcb[Ulrib[Uultmttlldllklld|dc\|zmtttsl||uttsddc{{tmtt\UZlj||}ttslldkd\lddult|z|zu{{ek]|lri|zztltsltslztl[[T{u{]bZldd]cddc\mttUMRldd}VZTSKJD;9mttlld\[[JHFUTSJHF[TT||tzlmtt|lksddc|{{}|}||}||{{{{{{}ÙÜttsllk{{t{||||{||}mttd\\tllultVTL|cbV{tt}{ttultr]gultf]cbVU}}tlltlllekztl{{t{ttmttult{u{tllult}{||{{ldd{{]cd}{{|u{{{{lksUUYldddc\}{{tult}sre{zmttsj]\VTLSKJrg]iWUv{ekd:97$kd\uztultultlddbVUVTLSKJkk]}}ztlVTLtzl{||lld|uttstsltsldc\tzlsle|u{{ekdtyglri{||]cd{u{tzlv{ztl{{t|zv{|u||VTLddcb[UbVZ|z[TT[[Tlri{tt{u{rfklldttsd\\ult{tti\Vredtzlllk{{iq]{ttdc\ekddc\ztltzl]cdJHFjcVLKR}uzt{{mttd\\\[[||zuztnvmttlks{{}^^qmttddc{{nv}||lks}ylnvnv}{{edk{{f]c|z|u|{{t||}{||JHF|{{ultred}|z{||}zll|z}jcVtll}w{||}ttsmttu{{tt{ttsu{{VTLlrimtt\[[|zlrilldmtttt{lks|tsl|\[bf]clkslri|||lks}dc\ult}{u{ttsu{{ddc|UUY}]bZtslddcslesrev{lddslecbVSKJ{{tdc\kd\tzltsl||v|j]\[[T:97:97cbVlrid\\tlltllldd[[T|zcbV}}{||lkscbV}tzl{u{{tt}ekd{{tek]f]c{u{ddctll{u{lek}tlldc\{tt{||{||ultv|ultult]bZ{||tzledk]cdfkktllsle[[T\[[ttslriekdmtt|tsllri\[[b[U{{tuzt[[Tddc[[T|z{{d\\UTSult{tt{{tyllkstt{ult||{{{{{{|{{t{{lks{{|nv{{|fkk{{}|^fslkslksnv}|nv}ǻǪekduztutlld}{{ddcedkddclritsl{{lek|ulddztlred|u]bZtslSKJf]c}[[Tv|||{{}}ultf]c[TTlddd\\||\[b[TTUMRult|||lld|lksd\\{tttt{{||||{u{rfktt{||uztf]clddrfk{{tsletll|urfkzllb[Ukk]ztlztldc\cbV|z{{tbVZ[TTSKJutllkLKR*)(rg]llklekult{u{VTLVTLllk|uztVTLVTLedk|z{{ttsl|z|zddcddcekdVTLlrif]culttsl}{{ztl{{ttsl||sle]cdtll{{t{{tult}|z{{tult{||mttVZ[JHF]bZ|lksv{f]cekdtt{tll[[T}||{{{u{{{t]bZ{tt|uttslld]bZ\[bSKJlksd\\tll{{ttsu{{tslu{{{{mttek]}|{{u{{mtt|ttsmttylnv^^q\[b\[bnvtt{~u{{}\[bnvnn{{t{||}utultlekddc{{tsl{{tleklks{tt|}|}bVZultlksedktsl{{tlks|llkdc\ttsfkk|z|zuztuztztllld{ttu{{|z|tt{uzt{u{dc\{u{|lldtt{v{||j]\ut{{trg]PF=]bZ[TTlri{{t{{tddcSKJbVUlldUTSJHF*)(d\\}{ttlddlldsref]cf]clritslslellku{{ekdlrilrimttlks{zm|zaWMlek|red\[[dc\ttsUTS~tslkk]ult{{t|ultd\\|uultf]cLKR:97MRKllk{||{{ttzllri\[[llktslu{{|[[Tztlu{{[[Tlrirfk\[[VTLmtt{||v}{{t|uzt]cd|tt{fkk{{|{{{{|~||ttsnv}}{{nvlks{{}|}nvmk}{{tttsllk{{}ult{{lks|\UZtts|f]cred|zuzttts{{tJHF||lddldd{ttultSKJVZT{u{uzt{{|u}|zuzt}|v{|tt{edk|lks{{mtt]cd|{{tt{tll{{tmtt}lldrfk}}ultrfkztl}ztf{zmd\\|zdc\dc\]bZ}aWMtt{\UZFD;?;C?;Credlldj]\f]ctlllld{{llkekd||j]\ultlektt{\[[lddtygek]ult\UZ]bZ||lridc\{ttult}{u{rfklri|ult{||||tsl|u|{{tdc\cbVMRK*)(UTSlldmttddcekdllkttsllk{u{]bZ\[[|u}|ddcleklld}kjVSKJUMR}tts||lks{{u{{mtt~}}|^^q}ntt{{{|zu{{|{||||zllktt{|lksvttsllk||redsre{{t{zmuztlddlldsle\UZttstts|{u{{{{{tuzt{tt|rg]kk]|{{t||u{{fkkmtt|JHFv{tzli\VtslbVUv{rfkr]gyleSKJtsl\[[leklld|JHFztfb[U]bZ[[TUUY:97lldsleuztrfkr]gekdVTLj]\d\\\[bdc\|u||{u{{||tsl|v[TTkk]lri|u|zu{{{tttsl{tt{||ultsle{u{\[[||{||ekdbVUlldtts{ttJHF:97owVTLuzttzl|lldrg]j]\usreJHFlrillkrg]dc\}ddc|z]bZ|mttSKJmwf]cf]clkslks|z|ult{{{{{||mtt{{}n{{ylmtt|{{}|nv^fs{{mtt}|lksedkċ}tts{{mtt{{tllkztl{{\[bbVZred{||ztlu{{ekdlekmtttsllriu{{tts{||{u{\[b{u{{{|f]ctll|z]cd|edk|{{ttsu{{{{{{lekttsmttlkstt{lriddc||uztsreUMR|tllbVU||}SKJut}kd\wlultdc\llkPF=]bZSKJVTLf]c:97lekztlutzllek[TTf]clks]bZu{{{{tsltll{||}|}\[[u{{mttVTL}{tt{{srettsLKRmtt{||sletzl~ultttslksf]cbVZUTSVTL[TT]cd}||lddf]c{tt[TT[TT{u{d\\UMRJHFJHFlekekd}tzl]cdkd\ultu{{r]gf]cJHFddclrilriultv{u{\[blks|mtt|]cdmttmtt}||\[bmttOS`lks{{}Å|{{}ttsslekk]|tt{tts{||uztultztlekdtll{tttsl||||f]ctt{vlddJHFMRKfkkiq]uztttslks\[b]bZlksult]cdlri]cdSKJbVUMSS{{|\UZult|tt{u{{{u{lddmttlld{||lrilri|zlldtsldc\dc\|mtt|zuztSKJtllkd\{ttultzlliWUztlsleSKJzllslekd\v{ekdtslUTS]bZllkVTLd\\VTLek]\[b*)(f]credtllsre{{tekd[TTddcultdc\dc\tsltsl|zu{{}sreuztl}b[Ub[U\UZlekulttt{}|z{u{|sletslsre|{u{f]cedkUUYUMR|{{lriztl{u{|ztllUMRVTL\[[||zkd\slellk[TTult{ttkd\D;9edkJHFllkd\\sretts|}llklkslks\[b}ekd{{ow|{{lks{||ult{{mttmtt^fsu{{}|}nvnv||mtt}}Ä|ęuztlri|tzlb[U||~u{{{||lkslekztl||lri|{{tdc\ult}||z}lek]cd\[bUTStt{}{{tSKJ[TTtt{lldfkk~{{ultttsult||\[bultf]cu{{{u{|tt{ttsldd}||zdc\j]\d\\VTLlri{ttf]ctsllddvztl{ttlddv{cbVuzt}tllVTLllktsl\[b)+2mtt|utlltsllekb[Urg]u{||dc\ek]|zzllsre||{|||z|z|uulldztlttstt{ultttsulttt{rg]||{u{|ultvredldd}d\\[TT||}lek|lri{u{lld{||\[[ek]SKJtsl[TTb[Ulld|dc\usresle\UZldd{u{ztltsl[TT>B9owulttslnv}{|||ultnv{{u{{u{{|lksmk{{}{{|z{||red{u{lri|z||{tttsl||{ttslezl|uzt{u{{u{ztl{{tllduslesle}tt{j]\f]cf]cultultlks{ttedk\[b{{llkddc]bZ{{tlld{tt}]cd{u{ttsUTS|zttsuztekdlld|ztl\[bmttlksSKJ{ttlrikk]dc\UUYsle[[TjcVmttkd\||rg]tts{||tllsleJHFddcdc\b[Uult{||\[[:97zll{{ttslztlsreUMRztltts\UZ{{t{{tttslek}|ult{{t}kk]d\\{u{vtzltslzlllrif]c|uutUTSulttzlf]c||ult{u{{u{|}ldd[TTSKJ{{t~ztl{tt{ttreddc\{tt{||uztSKJ{zmek]lrittslddvu{{UMRultD;9UTSLKRlri{u{{u{{{{{tt{lekttslri}tts]cd{{u{{{{lksmtt{{^fs|mtt{{~tt{tll{{{|||zedk||{ttSKJ{tt}|j]\tllJHF{{{{lri|zdc\tsl{||{{{{kd\ztl\UZ}|{||f]cv~f]c{{{tt||lek|u{ttuztulttts}||}}lld}{ttu{{ultlks{{tts|z\UZllk[TTddctsl]bZtzlSKJreduztu{{ldd}|{ttekdztfred[[T{{tek]redllk}[TT:97zllkk]d\\kd\lldred\[bf]clldlri{u{{||tzllddf]c|llkult{zmztl}v{kd\ttslks}mttu{{mttuzt]cdultut||[[T|{tt|{||||lri||ztlbVZ[[T||cbVlldMRKd\\ekd}SKJj]\SKJUMRult{zm|mw{{}}ult{{|]cd]cd}lkslkstt{{{\[b{{f]cmtt{zm}v{Ó{zmtts|]cdlektsltt{ztltts|ztsl{zmtslultu{{tll|v|tlltsl{{}b[Uv{}v{ldd{{fkk}UTS}{|||llk{tt{{t}tlllekv}ldd{u{||tt{|{u{cbV|lldiq]jV[}ztltslSKJutVTLlrivlriUTSlddJHFFD;llkttsSKJ:97lld{u{||rg]JHFlek[[T|zekdlddbVU|zVTLek]|zdc\|z}||tsltllut{||tt{llkekdtllu{{t[[T{{|z{{VTLtt{tlltts}tsl{tttts[TTyl{u{lddekdVTLUMRwlsre{u{kd\lksu{{\UZf]csleg\rredmttv{{||{u{}||lek{||{{{{{||}{{tt{|mttmtt^fs{{|{{{{{{|}ă}lddv{tlluzttsl{{tf]cJHFf]culttt{u||[[Tsle[[Tkd\f]c||tt{\UZ{{|\[blkslri]bZttssle{ttttszllkd\tllult}lekmttedk{{{{{{{{lld|zlldlrittscbVUTStt{|z\[[{{t\UZ{ttttssreslerfk|||u{ttfkkddc[[TllkzlmttlriztlUMR:97||ukd\ztlu{{ylekd\{tttllek]llk|{tt||{||wl}]bZlriuztldd}{{t|uuztult{{ult{||||||z{{f]czllult||SKJ{ttsleuzt||{{MRKUMRlekf]c{ttdc\tlld\\tsltllj]\VTLVTLutt{vtsl|[[T[TT\UZultzllultedkldd|z{u{lddddc{{tts{{{{yllks|\UZmtt|{{nv{{|{{nv{{{{}u{{}lriuztllklek{||f]c\[[llk|z{ttultmwlekb[Ulrimttf]csle{ttVZ[mtt]cdnv|lks]bZzlltslldd{ttultfkku{{{{lddtsl\[[lri{{ttt{d\\VTL||ttslrikd\|SKJaWM[[Tf]c[TTVTLlldlriJHFUUYsle||ldd||{ttultedkvlritsltts{{||{zmultntzlsretts|zztl{tt{{t{{|ztllut|]bZkd\{u{ztlldd{{d\\edktt{||UUY[[TLKR{{f]cultttslksultUMRlksddc\UZ\UZlek}rfk}|tsl|{{tulttts}{||tllf]cmtt{{tj]\f]c}mk{tt|zmttu{{lks{{|lksult\UZtlllek\[b|^^q\[[mtt|n{{MSSult{{~{{^fs}{||}|llk{tt|]bZ|}{{uttll|u||{{t||lri|ztt{{||SKJekd{{t|{{lri||{{tuzt{u{}mttfkkult|uuztuztlksultttsb[U|zultlek|||srerg]||d\\ddcztllldFD;f]clkskk]|z|zllk3+*ttsUMRf]cr]g{u{tsllek{zmsletzllek}}ttsldd|zztl{{t{u{{||}||}|}|kd\ult{{tsl|}{u{[[Tddclld{||VTLJHFVZTtsllks{u{{||{{t{{\[[\[[}f]c{ttlldttsf]c|uttskk]aWMVTLedklksmtt||f]clddtt{\[bult{||{{{u{|{{t}{{ttsttsmtt\[bedk\[bmtt{{mttnv~{{tttssre|tts{||||tts|z}|z}{{t|zwlu{u{ulttt{lek\[[||{||llk{{\[blks}}VZ[UMRedkuzt}{{tfkk{{{{{{f]c}ultult[[Tmttfkklek{tt{tt|ddckk]yfdtts||kk]|ttsSKJtt{tzl[[T]cdlek}UTS*)(ultbVZlek{{t{u{||{{wluztlriu{{{||f]cu{{|z||}|ultrg]wlsleut||{tt|tt{{{t|z|uztf]c[TTddctlld\\tllkd\ldd\[[ultttsekdlkslks||UTSd\\llkVTLtt{tts|{||{||[[Tg\rLKRlksf]cek]dc\VTLkd\]cd]cdek]||}ult|llklksmtt{{{{|{{edk|\[[edk{{{{vuzt{{{{tt{}{u{|ztsllksultult||tll||{||]bZttstt{\[[lri|ztzl]bZttsu{{tllwl}u|zedkuztu{{{{mttult{{t{{lri\[b]cdmtt|zz}lri|lksf]c|u{{\UZ}|ult}tll{tt|uUMRllk{{tlksultlks{u{mtttts}}[[TSKJbVZ}tt{}[TTllktslkd\||sle|ztll{{tllk74,SKJtllddcmttldd{{tslef]cslesle|lri|z|u{tt|usre|lldmtt|ddctt{{u{tslr]Zu{{|uultllkfkkSKJ]bZ]bZF=CF=Cmttlri|{{ttsllkstlltts]bZlekuzt|ddclkslrid\\sleu{{slesred\\cbVtll}uztlritll{tt{{llk{u{}lks|{{|tt{||nv|{{lks{||}{{tlltts[TT{tt}v{ztl||mtt{u{{||SKJ|u{{t~{{|edk|tsltzl{{t{{lektt{{{mttldd]cdvlksu{{\[bUUYmtt|{{{{VZ[|mtttt{lkslksult\[[dc\||UMRyflreddc\j]\j]\{ttllkedkb[Uultult]cddc\[TTVTLtll[[Ttllr]g}{{tekdultbVZj]\UTSC8.JHFlddJHF!ekd{{{{tultllksle|zb[U{{|||}{tt}v{|ttssleuf]c}mtt{{tlri|{||tt{dc\tllekdlldvmkmtt{|||rfkekd[TTekdlldmttek]}lek\UZVTLlks}redultd\\{{{||}\[[ddcult{||}lks|tts|v||~|lks{u{ldd{{mttMSSUTStts~ztlv|]bZcbV|z\UZddc\[[[TT{|||mtt\UZlksultJHF\[bUMR}|||ult{{tult||z~{{}f]c[TTleksleztl{u{red{ttrfkult|ddcztl|||j]\u|cbVddcztlllk}kd\u{{t||{zmMRK*)(|ztlltts[TTlriredtsl|}lld||n||u}{zmlriztlbVU{tt|ztt{uzttts|z||ttsmttUTS^^qlks{u{{{{||lddztldc\ult}||}{{}\UZ{{||}~|{u{uzt{{|ultmttedk{ttllkult|ult|z|{||tzlsle{|||]bZult{||{zm||{{|z{{t}{{t{{t|{{tdc\tsl[TTkk]f]cf]c{{tt{tt{lek|tt{fkkmtt]cd}|Ù{{ult|}{||tsl{||llkedk}||{u{ldd{tt||slesle{{tj]\}kd\ek]dc\ekdredVTLb[UVTL]bZSKJlksVTL*)(|{u{{u{ztlttsutsre|u{{b[U|zultut|iq]{{t{||b[U{zm{{t|z{||{u{tt{tt{tslmttuzt|z}ttsuztlritsl]cdMRKllkmtttll\[[|ztl{{{{t{tt|utsl{tt|zbVZ}}{ttmttlldSKJlddJHF|z}|}lrimttmtt{{|}wl~mtt|ztt{|{||ultu{{mttmttlks{||lks|ddcf]c{{{u{lks[TT\[[dc\|ztsl|z}}{{d\\llktsl{{t}ttsdc\ult[[TUUYlriuztMRKtllllkylddc{{ult{||}tt{ztl{||tsltt{u{{ddc\[blldlddedkdc\{{tlldj]\{ttSKJSKJ]bZlridc\d\\j]\j]\lddekdttsUTS*)({tti\Vldd{tt}zllsre{{t{{tllktsllrid\\yle||{u{lldyletts}|{||d\\|u|{|||lrikd\kd\uztu{{uzt]cdUMR]cdddcd\\]bZult\UZd\\nsleu{{||{ttf]c{{tdc\|}JHF{tt[TT|utsl|mwUMRttslksultlkstts{u{{{||{||{{t|lks{{{{{{{{{{{{nvlksnjultu{{ut{{tts{{{||\UZult]cdult{ttultllk|ultedktts\[bf]cult{u{{{ttsmtt|tt{mtt{{}lld|zdc\v{tts|zd\\lks|d\\red{{}\[[tslSKJ||tsl{ttultdkVSKJVTLVZTmtt\UZredtllztl\[[SKJ{{tJHF*)(dc\ultd\\i\V{tt|~sred\\v{lldek]f]c|z||zlltll{tttt{|z|llk|||}ek]|cbVlldmttd\\lldllkedk{{llkulttts~bVU[[T|sreddcttsf]cv|||sleb[U|utt{d\\\[bLKR{{llku{{{||}rfk}{{{u{zllu{{ultult{{{{{{tsl}|{||lldmttlrittsslemtt\[bult}|zuztlldttslriurfk}dc\JHFf]cultlldult{u{f]c}{||mttlld{{}{u{ztl|z{{ttslsleudc\ztl|tzlslelksekd{{t{||ultleksleUTS{||d\\slett{vldd{ttsle{{tUUYztlult|sremttSKJcbVF=C*)(d\\tts[TTv{{tt{{tu{zmultred{{t}lddllk|z\[blld{{|uu|ult|zf]c|z}ttsu{{]cdJHF}[[Tf]c\[[tt{ulttlllri{{}lekedkllk|z|u|udc\llkb[Ui\VUTSlddUMRkd\VTLrg]f]cf]c|u|v{{{||tll}|uztlks{{{{|}{{^fs}|~}tll|tt{tsllriullk}lektt{}lldf]ctts{tt|uztj]\|}tzl}ukjV||ztltll\[[ddcultult{u{{{tlluzt|utll{{|{{{u{u{{{||]bZlriUTSd\\u{{f]c}ult{||d\\{ttsle|uztl}u{{|{||{u{||{|||||u}JHF[TTkd\VTL74,ulttslttsbVU|wl[TTsle{tt{ttultvleklldlriekd||tll|ut|u}|{|||z{tt{{t|zulttslult}{||ekdf]cUMRVZ[\[b}||u{{ek][TTlri{{|ddclridc\j]\lriultlek}[TT}}{{~|tt{}uztlri}|zu{{lriuzt{||lkstt{{{||lld||z|||ztts{ttlekUTStts}}|{zm{{tv{ttsVTLlldlldSKJlekedkuzttts}}{u{{ttult~tts||mttf]c}lldv{}tt{ztlrfkultbVUu{{|ultslev{{}{||cbV{{tedk{||JHF*)({{lddttsztlultcbV||rfk{zm}tllj]\uztuztztflddd\\|tt{u|{||lri{{t|llklek{||||tts||}mtt}d\\{||srett{lekztltzlkd\|kk]kd\{zm}{ttu{{lrilldf]cztl~{{tddcvmttrfkUTStsl{{|lldtslylult{||mtt{||{{tleku{{}|{u{lriuzt{u{ē}bVZsleult}lekrg]sle}lri{zmtzl{{t[[Tllduztu{{mtt}]bZultu{u{ulttsllksVZT{{u{{}{u{}{{}lldsle|z{{ttslkd\ultlksult}ddcu{{bVZ[TTd\\{tt{tttygtts{{tlektllkd\|ulkslldtslFD;*)(|vtt{rg]||utsltsltll{u{kd\|vztllriedk{{|uultzllld{{}lldf]c}{{ttlltts|\[[rfk||uzt|zu{{lri{{{{|z||}{tt}rg]{{t|z}}|zlriuzt}leklldllk~u{{llk{u{||{||tts{||vtts{ttf]ctt{|{{t{{tddc}u{{tts{{|mtttt{u{{{{|||{u{edk{{u{{redtll}VTLztl}usleztlVTL{u{}f]c|u{{mtttt{lks||z||u{{~bVUtsl~JHFek]lks\[[lrilri\UZbVUultkd\zll[TTd\\uzt|usred\\uztmw[[TSKJ|JHFd\\ultJHF*)(|uztlredulekrg]ztlult}sreult|zttsfkk|z}srellk{u{{||{u{lldu{{|uztultLKRVTL\UZlekuzttts{u{[[T{{lldultllk||uztl}redvlddtsl{ttuztlldlks||~lri[TTtslf]cuttsltllv{}||||lks|||zult{{||{{{{}{u{llkĂvyfd||rfk}{||ztluztlri|lrillktt{|{{]cd]cdmttfkkfkk{{Ù|}|{{mtt{||lldlrikk]lldddc|zlld||ddcldd{{{{JHFUUYu{{lddJHFf]cldd||ttsllklriv{ddclldj]\dc\}}lri|JHFJHFuztlld{ttztlllkjV[|z|zkd\uzttsl}|zztl}tsltts{tt{||ult|zlekuzt]bZMRKlld]bZ|tt{{{tllk||u{{||zbVUtsllldfkk|tslsred\\fkkldd}|{{t}{||tts]bZ{u{~|||{u{tts{||f]c|u|tts~ldduztu{{|}||mtt|{{||ttstt{uzt{ttut~}~f]cmw}llklektts{{lrilriedkultJHFlks{{{{lksedk|z|zlks|zuzt}|}|uVTL|v}slerr]tzl|z|[TT|lri}|tslUTSd\\|ekduztyl[[T}~VZTlekvlldultztlf]c{ttF=Ckk]rg]UTS*)(slej]\}||uldd}}ttsrg]sle|utt{VTLsleztl}zll|}u{{{{tts|zlriUTSJHF[TT{{{{}|uzt{{t{||fkktslmttsre{ttu{{}b[U}{||tzlkd\74,{u{ztl}ztl||uztmtt{u{f]clrid\\lddttsultult}[TTlks{{|z|fkk||{{ttsu{{]cdtts{u{||\[[}|kd\{zmttsekdttsf]ctlldc\tzlJHF{||lkstll{{lkszlld\\dc\v{redv|{u{f]cedku{{~llkekduzt|zttsmtt}{||tllkk]{||tllllklri|zVTLek]dc\|z|dc\{{t{||lksmttultmtt{{}{{|[TTsresle{||lld]bZrr]JHFttsJHF{zm|uJHF:97tsllrilld|}|}}uukd\v{|tt{}{u{u{{lks||lri||{||llkmttf]c{{{||{{t|zuztlekdc\tt{kk]lek||d\\|z|z{||||||kd\VTL{||tllsre|||UMR~}{tt||kk]}{{{u{{{|{tt|z|{||{||{{{||}ttsuztUTSUTSSKJSKJ|}utultslelksddcd\\lek||uztddctsl}{u{\[b}{{f]c]cdJHFultllktsl||lddD;9lldbVUuztekd|z{ttek]|z|z|z|z|z||yleekd}||||[[TbVU{||||{{t|dc\\[[mttlld[[TSKJVTL}tts|\[b{{tj]\JHF*)({tt|z|u}}|u{zmdc\leklld|{{tslellk||uzt{||}zl||||llk{u{|z~{{v{mttlekullk{{ldd|{{ekd{tt|z|ttsldd{u{|z|u|ztllztldc\b[U[[TddcVZTtlldc\ekdldduztlri||{ttlek}u{{ekd{||}zll{{ultmtt{{{{{{mttek]lri||z|z{{tlldultttsUUYdc\v|Ē}|v{s_qred}VTL]cdtzltzlmtt{||f]c[[T|lksedk\[[}tt{|u{{}b[U{{d\\tt{|mtt{{{{}|||redslej]\ultbVUr]ZcbVkd\slelddkd\{tttll\UZVZ[dc\edkuzt[[T[TT\UZlld[[Tzllkd\VTLj]\>EC:97ult|z{{tzllztlVTL|}}|}|red{tt{tttllttsuult||ultdc\{u{}vedk{{{|||LKRtslmttu{{ttsd\\ttsuztldduztj]\|tt{llklddkk]tt{|uldd|{zm|zlrid\\||ekdlek|z|z{u{{zm[TT|zttsUTS|u{{t||{{{ttfkklks{{|]cdtt{fkktt{||mttultttsf]c|z|z{u{{u{ultkd\SKJkd\tll}{{t{{t}uttslSKJJHFb[U|tslvldd|]bZdc\mtt|ttsVZTult|{{}{u{}ċ||bVU~ult|z}dc\ldd|ztslUTSSKJlld[TTslej]\\[[MRK[[T{{tlksllk{||{||mttlrimttddc[TTj]\}kk]lddtslu{{{u{\[bVZ[}|JHF*)(tll|z|uyleutkd\sle||j]\{{tvddc}kk]ztl||}tts}|{tttt{|ztts{tttsl{{t{u{tsllriuVTL\[b[[Tedk|u|zlektt{{{lddtts||leklddlldtll}tll||tsl\[[{||ult{{tMSS|z|zu{{|lddu{{|{tt|sleSKJfkkVTL{ttztltzl|u}{{t{{{zmtllv{ult{{|znvultmttult|zttstt{|{{tkd\dc\{{kd\ult}{tt}kd\iq]|zUTS|{ttllk[TTedklksu{{]bZVZ[lri]cdlek|lekllkllkkk]{tt{{tllk||u|ulksllkb[Udc\VTLjcVcbV]bZlddVTL}dc\\[[uzt{{tlksttslddmtt|z]cdlld{u{[[TVTL{{tlrillk{{tuddc[[TedkmttUMR>EC74,|||ztsl|utllkd\{zmldd|z]bZ|u}}tt{{zm|ztl{u{lks|z}|}u{{||{ttf]c[[Tsre{|||ztslldd]cdtt{{{lks|lksfkk||tllSKJlddSKJ[[Tlek}ultekdlld\[[||uMSS\[b\[[lldd\\edkf]ckd\|zult|||zultult}|edkf]c{{lks|{{mttmtt|{u{|tsl{{{{Ǧ}sreutsre}{{t{u{{tt|zwv{{tukd\|ulldtsl{{ttt{leklksult}u{{ulttts{tt~ultllk|||llku{{tts|kd\||ult|zllkkd\usre}VZTekdlksJHFUMRlri|]cdbVZ|zlldUTS|ulld||dc\sleVTLJHFJHFJHFztlJHF3+*{u{u]bZtsl|u{ttut{{tjcVb[Ukd\ttssle||{u{{u{rfkutfkk}llkult{||}|zf]c{u{zll\[[tt{lekdc\\[bf]cult{{tllkllkldd}uf]cv{|uultVTLuztttsslef]c||ddc\[[|z}u{{ldd|||tllrfkttslek{||{||tzl{{t|{u{|}lriedkllk}{{|||z|{{||bVUredtllƨ|udc\}|uv~]bZuztkd\lek~\UZ|bVZultf]cf]c}}}fkk{{{{mttUTStzl}tllultult{{tultdc\u{{uztekd[[Tlridc\|zlrisleddctzldc\VZ[lriUTS\[[ddcVZT|fkk}bVUtt{|tsllld{zmlriulldf]c{ttUTS|zJHF*)(lksuztuztzlluu{tt{ttuzt}{u{|bVU|u}tll}{||uzt{u{lekvtts{||}v{{u{{||{{t{u{SKJlld{{t|{u{ult{u{lld{||{||{tt}j]\}s_qzll}tsl|ud\\zllcbVtslmtttsl\[[tll\UZ{zmuztu{{u{{|{{t}ttslek}uzt{{tult}{tt{{~ttstt{{{uzttt{ldd|zu{{|z|tsltt{tt{ddcddcSKJ{tttllv{}||ztlmw{||uztfkkMRKlrilrillkddc}{||edk{{f]cleku{{u{{mtt{{tsl|mtt|z{||tsl|dc\{u{edk|JHFVTLVTLiq]VTLu{{]bZlekllkuzt\UZttsJHF]bZvJHF]cd]bZSKJut}ub[UlldcbVzll|}|{{t|zmttmttJHF*)(ldd{zmvu{zm}|{{tut|vutv{{||tts|u{tttts{zm}{u{tlltt{ztl|{||}v{||llktlllldlddlri}{{f]cult||}mttf]c||ultrfkulttll~}{tt{||{ttddctzluztttsuzt||edktts{||{{{{tmtt||{tt}|tts}d\\lekttstt{|}}tts{ttekd}|b[Uzll{tt}lksult{u{~}tllv{v{tll{{|z|zlldf]c}{{]cduzt}{{}v{[[Tuzt{||{{tVTLcbVllk|tzl[[TuztUTSuzt\UZVZ[ekdtll\[[uztUMRlri[[Ttts}|zkk]ekd{zm||ztzl[[Tedkv{:973+*|zttslld{zm}||ztlldd|utsl||{ttą{{t{u{||lrif]c{{\UZ\[bf]c{{}||[TT}\UZ{u{sle~ut|z|lriuztSKJ{||ultlksMSS|{{}|zlks{||||}|uzt}{tttts||ult}vuztttslddlddtsllks}ultlksultlddldd~||}ulttll}|zlridc\|zekdlri|tslf]c||{{t{{uzt|z|lldllduztkk]]bZ{ttllk[[T|mttddcVTL{{}f]cUTSlkslkslri{||lksttsultultlks}|{{tdc\]bZ|z[[T[[TLKR*)({{tll{zm|z{{t}z}|{tttt{uzt}{||}}|ddc{u{{{{||ttsleku{{ttslek\UZlddVZ[}lkstt{{||tllttsrfk}|v|lddrg]v{utlddlldekdtzlekdtlllld~{{}\[[f]c|z{||llkllk{tt|lldtts{u{{{{{ddcttsultult{{|z{{}d\\{ttv{}tt{tllf]cut{{\UZrfkult|||uztllk}sle{u{d\\]bZtsllrillkmtt{ttmttd\\|||v{ult|tsltzl{|||lriuztlksztl||z{{t{{t[TTlldekd}d\\{u{d\\[TTJHFVZTuzt{||ekdf]c{{lek||lrizllztltzl|z{{t]bZ]cdu{{:97*)(kk][TTu|uzt}}}sle}|ult}|{||edk|z}{{d\\]cd|z}}~ylemttkd\ddcf]c{u{sre}ttskd\zlldc\llktslttsd\\|ultu{{ttslrilksddclksddc||lks}}||z{{{ttrfk{zmtsl{{tv{{}tts|{{t|tts|{{tv|}}}}\[b}ddc{{ttllf]culritsl}|{zm||}}]cdu{{u{{[TT{{mttv{|ztl{{tll{u{{{|z|z|zlrikk]|z}tzltllllk{tt|\[[kk]||tllVZT|u{{tt{|z]bZ}[TTtt{lri{||ultlld|zllkekd[TT{||mtttzltll{||F=C7-2utztl||{zmsrekd\{{tsleultzlut{u{}}mtt}{u{uzt|lksmtt{ttu{{{{tuztdc\tt{ult{||||tll[TT{{tddcut{||\[[{||ekdlld|{{t{||tts\[blks|lrilks}llklddllkllkf]c\[[tts|ulldu{{edk}}ut}|u{||}|ttssre}}}u}{{f]c{u{zlllddztl{ttttslksedkFD;kd\zl[TT}UMR\UZ|lksedkUTSu{{u{{|zyl{{t}{{tllkd\\||{{|ult{||]bZ{{tlddVTL{||||{{t|mttf]cuztultlksllktt{{u{edkrfktll}lri{{{tt|u}ztl[[Tztl~|{{tlldlldJHF*)(tsld\\|zztlwl[[T}v{u{{}{tt}~zll}~ttstts{u{|z{||||tlllritt{\[b|}ekdldd||llk{{t|z|ztsl}{{ult{{tcbV{tt}||cbV|u{||VTL\UZ|{{||||uyle|{tt|tllllktts|ztts||~|f]c{{~|lld{u{{{lri{{{{ztl}tlltsl}f]c{u{tts{||[[Td\\zllj]\vSKJv{sre\[[}|{{mttf]c}tts}tzlVZT}\[[ultdc\lri|{{tu{{ult}ddc}|VZTVTLuztmttJHF|z|zlld}lld}tts|ultf]cddc[TTtslf]c{{trfk>EC{{tVTLlldllk{ttfkktsl|z]bZ:97:97}||tll|u{{t|ztl{{t|u}u}|ultdc\slerfk|v{{{t|{||vtt{{{t]cdtt{uzt{ttddclri]bZrfk|{{t|u{{ultlriredu{{|r]g{{t}ldd||lddredredmttUMRu{{{tt{||srett{}{{||rfk{||{||ttslri{||}{tt~f]cv|\[[vtt{llk|u|z|||lldtt{ztf}{||dc\f]c}}|}kd\lekVZTlrisleredzlltllztlsreVTL{{tv{{lks|zuztsle\[b]cd}~uztmttttsmttddc{|||z{||sleJHF|\[[[TTdc\}lri|z\[[]cdrg]ekdtsl||ddcuzttt{|lld|vdc\u{{SKJdc\tslVTLlld[TTsre||lriaWMSKJ|zD;9*)(}tslu}{{t|lekaWMut|}}|[[T[[T]bZmttd\\{zmtsl{{t||}lriztl}{ttldd}{u{}ult||z|zekdu{{f]cztltts}ztfddc{{tsre||{tt{||lksulttt{llk{{sle{{|{{tult}vllktllcbV|z|ztltt{{||mwsresleult{tt}uzllutylelritlltlltzlkd\b[Uddc}lekedkut|||u{{|zllk{{|tslu{{}lld}UTS|z[[Tultuzttt{mtt{{t{{tlld]bZbVUultultUMR}{||b[Uztlf]c{{ultult|{||{{{{kd\tt{fkkf]cd\\utzll{{tlrilridc\\[[ekduzt:97*)(tzlsre}{tttts|{tttts||z{tt||ddcldd|]bZ\[b||tt{v}b[U|z|{||u{{ldd{u{}kd\zllkd\lekv{kd\edk}{{|tts[[T{{mttdc\]cdSKJleklkskk]{||tsllldllkslelld[[T{tt}|ddc|zldd}v{ultuztttslddmw{ttultv{{|||tlltsl{{t{||\UZ{{|{ttSKJttsjcVldd]bZ|}|lekf]cdc\tts{{}lri{{}yledkbVZj]\[[T|uekdd\\{{{ttddcttsf]c[[Tek]sleultlksFD;zllztl||tt{UMRfkkultu{{|uJHFred}}{{{||\UZztl{||||z]bZkk]dc\\[[UTS]bZ:97*)({{t{ttlddred}{zm}ztfztl|}{||{tt||{||ddc{{||lektlld\\lld}sredc\u{{{||sleSKJ|tlltllzllr]gmtt{||tsl}|z{{tuztd\\||ddc|ztllrittsztl|z|||{u{ut{{lld{{t}}|lekult}tt{tts{{UTSlksttslritts{u{||}|uek]|u{||tsl{{t||{||tts|z{{t\UZddcztldc\VTLVTLek]tll{ttyfltt{\[[}[TTtt{leku{{VTL]cduztu{{lksd\\|zf]clri{u{j]\edkttsllk]bZllk{{\[[SKJek]tll|vVZT[TT{||dc\ldd[[Tvlksf]c}ttsf]cJHF]cd{{lektt{fkk}v{|zsle\[b~lrisre]bZ[[TFD;||:97:97rfkkd\{tt{{t|||zult}{{lektts{{tllk{u{{{{ttb[UbVZtsl|ultztfv{{u{llkztlUTS{{sre|mtt||mtt}ek]}{{\[[lrisle{u{}rfk}lri|||}tslultmtt||llk|u}{u{}ttsllk}{||dc\{||ult|z{{ttslult||uztÓ|{||{||lldv}}ultbVUf]cldd}edk[[Tlriultultlriek]{{tdkVmtt}ztlulttt{llkUMRLKR}{tttts{{\[[ttstts}|kk]llk|||uztlek}{{f]cJHF{||VTLlri}|mttllk\[b{u{ultllkttssre{{trg]|zuztMRK\[[dc\:97*)(dc\ztl}||{u{u}|{||}uuzt{{t{{{u{SKJ[TT|zkd\u{{UTS||j]\{zmldd}rfk{{tll{tt{tt{||JHFtslv{{{tu{{uzttts|zlldd\\v{|z}|ullkf]cultult|u{tt|z{||v|ylult{u{|{u{{||ztlult[TT{tt{{[TTtlltsl{u{tlltslred}{||tts{tt|uzt{u{||||z{tt{{[TT]bZb[Ulriuztdc\{tt{{tredult|z{||{{t{zm{{t{{tVTL\UZttsd\\}ddc||\UZek]SKJ{{ttt{UMR{{td\\VZTUMRlri{ttddc||}d\\tsltts[TT|}|u{{zllri}ddcUTS[TTlektslFD;,55}yle}ut||}{{|}~|sre|z|ulri|tllu{{|z}ult|v{||dc\fkkleklks~|{||j]\tll~{u{ututtts{u{}{||uztuztllklld\UZVTL{{|z|lrikk]{{t}tllrr]{{ttt{lddf]cv{lri|~{{|]bZ}~fkk}|llkb[U{u{||d\\||tzldc\cbV{{dc\j]\ddc}|zu{{tsl}{||leklek}zll|zvsle}v{VZ[ultultbVZ}|tllSKJVZ[uztUUYUTS|ddctslllk{{}{ttleku{{lri{{{{tztltll[TT{{{ttut}ddcUUYllklritt{ztlVTL|{{tlddtslmttlriztltslUTSJHF:97*)(}{||ut}tll{{tztlultuzt{{t|{|||u|}|zlks{tt|tsl{tt||v{ddcutJHF}tts}bVU{u{{{t{u{{{slerfk{{|{{tult\[[]cd[[TmttlriVTLlri|ztl||lld|{ttd\\{{}{{tll~||}}lri{tt{||llkzll|slellk{u{sletll|u||}lkstzl||ulld|v~{tt{u{\[[}{||uzt[[Trfkd\\{u{tsl|z|uult{u{UUY\[[ldd{{t{u{utult{{t}ultj]\lektt{ztllriddc{ttb[ULKRVZ[lksf]cttslddult||{u{ultut{{tbVU{||VZT\[[{{ttllVZ[mtt{ttmtt{{tf]cSKJ{u{|\UZztldc\SKJv{tsl{{tuztuzt|\[[VZTUTS:97*)(||kd\{{tztl||srettstsltt{}|z{u{UTSztl|z{||tts{||ekdbVZekdu|uVTL\UZ{||f]cult{u{}|lekv{{u{leklksf]clldUMR{{cbVddcSKJuztddc|usle{u{}kd\ult}}{{t{{{ttdc\zllztlut||zv{{tttsl|kd\}j]\~{{{tttts[TTmttu{{kk]leku{ttuztlekedklrimttd\\\[[||{{ultwl{u{UTSedkd\\|UUYtllf]ctts}|z||UTS\[[llkUMRrededk{{|lek|sre||utddclrimtttt{{u{|lri\[b\[b[[Tlri{||lldf]cmtttlllekdc\uuttsmttv{[[Tekd:97*)(ztlutsl}||{tt||{{}tsl}{tt|zUTS]cdlritll|lkslldtslmtt||uultwltslrfk}j]\\[[uztleksresre{||{u{||{||d\\}{tttt{|z|ulks}|ulld}|z|tllu{{|||u{{|sle}{u{}lddv{|umwtll{{t}}ttsfkklri{{t{|||ztts{u{b[U{||i\Vvllk}tt{lriSKJb[U]bZ{u{llk{ttdc\uztfkkddc{u{||}tzl{zmtsl{ttztllldllktt{||lri{u{slef]c|{{tMRKsretzlsretslUUYUTS~ttsldd{||{u{\[b[TTf]ctslcbVtlltt{b[UUUY{{kd\ultJHFleklld{ttfkk}UTSJHFVTL|z}JHF*)(}ut|z||}{tt}{||v{||uzt|ztts|lri|uedk]cd]cdf]ctsl{u{|z{{tt{ult|bVUlrif]cJHFbVZlek|ultvslezlltt{}fkkj]\}{ttult{zm{||||}|~n|ztll{u{{{t|zddctllztl{{|z|}}}}{||||||||~ultzll{||llkkd\lek}sle{tt|ullkllkzll~[[Ttlltt{[TT\[[ddcSKJutredu{{tt{|z|zlridc\tt{lrif]c{u{{||{u{lkslektllylezlltslmttsleultJHF{{ek]lldzlllldekdztl|z]cd|ekdUTSultJHFVTLkd\v{sle|tt{tll{{ttts}lek{{tlks]bZF=C*)(lld|z|tslvtll~rfk{{tts{||ttstll||sremttu{{fkk|uzt{ttuztmtt}{||||z{||uzt||tts}tt{f]cJHFfkk{||ddc{tt}ultult|zddcsle}lrillk|sle||tll|{{||lrilks|u{||||{u{tll|ztt{v[[T|u|ztl|uwlzllsleuztut{u{yfdllklld{||{u{cbV}||ttszllb[U}ttsrg]ultUMRrfk[TT{||ttslldllkJHFedk{zm]bZred||cbVlkslks}|ultrfkulttts|ult[TTztlVTL{{|ult[[T{zmfkklrilekJHFdc\tsl~lddlldlri|{{tztlSKJ||mttiWUd\\lritzl}ldd{||tzlfkkLKR*)(u{{|||v{|z{|||z}{||{||lkslddlrilri{{||u||ztl{|||uJHF|rfk{tt{{kd\leklksf]cmttbVUult[TTtts]bZdc\tslv{ztlttsekd||uddc\UZsle{ttu{{tts|z{tt|z{u{tts||\UZztlwl|mw||urfk}|f]cultsleu{{}{{uzt\[[{||ut}}zllztfVTLlekddc}lddultkd\mttekd]bZ||SKJuzt\UZdc\kk]{||zllv{|tts{{t{{tUTSdc\tt{JHF]cdddcjcVlriyflu{{{{[[Tmtt|zlri|zlks{{tmttVTLredcbVlksdc\ttsuzt||tsl{||ddcfkk]bZJHF*)(||z|u}|~}sre}|z|tsl||tt{|u{{mttlekulttsltts{||lldslelldultf]c}fkktt{f]c{{tlritll|lddultultttslld}{u{{zmtllultekd|{zm|uultult|ttsddc{{tedkred{{}tts}|llk{{}{||ult|u|usle}sleyfl[TT{||ddc{||lri{tttsllksi\V|u{u{{tttll{u{{{rg]tll}v{ttsredtslztltslVZT\[[ekdu{{ek]ultbVZf]clek|ldduzt}rfklksu{{ult|z|{||lld[TTf]clri|{||]bZddcllduzt|llduzt}bVUtlltlltlluv|zfkktzltslllkllklek\[b|zVTLsle\[b:97]bZrr]ut}ztl|\[[{tt|kd\lld{{tultu{{tt{ultu{{lksmttedk{{||{||tll|zf]c||kd\tlllldlld}llk||{{|zultedkekd{u{||JHFtllUTSmttultuzt\UZ}|zd\\ult]bZd\\tts{zmtts|||[TT||lld|||z|z{{|z||u{{dc\{u{llk}}|||v{||||||lks}{tt|uultultleklek}||ututfkkddc}wlj]\{yfj]\f]c|uekdllkv{ultd\\i\V[TTv{v{ttsutek]ldd||\[[ult{{ttllfkk|f]cuztldd{u{uzt}u{{|UTSult{{t]cdVZ[}uztJHFMRK{{t|zSKJ\UZlld}{{llduztllktll|JHFJHFVTLllk\[[&&ek]{||}|||{{ldd||z}{||}|lriultlksmttlriUMR{{sle{{lriult}bVZtslfkk}{u{ddc{tt]cdUTS|mw{||d\\|dc\llk{||lri||{ttu{{ultldd}{ttUTSVTLrfk{u{slelritllztllld{||}ddc{tt|ttsv|b[Uuzt|{||sle{{tttsulttsltllultred|ulddVTLcbV}||ldd||}v}||ttsttsddctsllekSKJd\\{{t\[[dc\}ult{||llk||v{{u{mttlldf]cbVZf]c}ddcttslek}\UZv|uultredUUY{zmmtt|z{{tult||||~lrilritsltsl|z|zf]cu{{{tttllllklddekd|ztzl|ztl}\UZlek\[[VTLslemttMRK%&tsllld{tt||ultuztuzt|z|UTS|{{|[[T\[[]cdlekd\\{ttleklrif]cldd{{}sle}mttSKJllklldsle{ttddc{ttj]\llklritlluzt|lld|}{ttbVU]cdVZTlldultslef]cdc\ztl||{||||mtttslmtt{{tlltt{|tll{{sleztl{u{|||ukk]v{dc\v|f]c}|v}f]c}|||ukd\||kd\}\[[ztlsre{tt{{t{||sre[[Tlddkk]{||bVZ{{t{{tzllf]clek{tttsltt{ztllekult}{{tf]c|uddc{{j]\{u{f]c\[b|zlek|mttlek]cdtts|z}[[T{ttlddlldlld}ekd\[[dc\lriu{{{u{}llkmttf]clddddcMRK*)(VZTmttztl|u}|}{{t|zlekllktsl|z}[TTd\\{{{u{}f]cttstsl{tttslmttJHFlld[[T{{llkj]\VTL||ldd|z{ttllkult|z{||MRKutll|v|j]\}lldsleulttts}|}|z}}tt{|z}{tt}utrfkb[Utll[[TlksbVZ}|{ttrg]}}ulttt{tts}}lksrfk|j]\{{tllkllk}ut{u{lri}ddckk]|{u{ttstll|lekb[U{tttts{zmuzt{ttuztztlldd}{{}}|tsl[[T||}tllyl\UZ|}[TTVZTtlllri|tllztlrfkultd\\ult|zu{tt{{t{{tlld{||]bZtzl{{lekmttlldztldc\>ECtts{u{}|||z{{|zuzt}SKJ|]bZVTLkd\lld]cd\[blek{u{{tt{{ekdlldult{||{tt{{t{ttSKJlld|lriuzt|{tt||u{{u{{{{|ulttt{lri|zllttsttstt{kk]ut}{u{tlltts}tts}v{|umttldd[[Tlldsleztlultllk|lddztl{{tmtt{tt{u{zllut}{{t||}||tsl{||sle[[Tlldlri{{{{tt{{u{lksuzt{||sled\\SKJ[[Tuzt{|||}{u{|tsl|z{|||||lks]bZmttslemttedktslmttldd{{t{||ultttsj]\llklld{tt}lek{{ttstll[[Tmtt}lek{||{{tlldlld]cd-1+tsl|{||Ĥult|||z}}|lddu{{uztllktt{lek{u{|ztlu{||{||}}}kd\lld{||u{{zlllkstzlmtttts{||ldd{||mtt|z|}}ddc{zm|z{ttlriddc}}tt{{{{{{{tllttsfkktsl{||{tt{u{d\\SKJu{{rfkv{zll{{t||{{tu{||ttskd\tsl||lekut|u{{ztlsre{||]bZtsl{||tlluztuztsle{ttedkzll|ztsltllj]\zllslelld|{tt||tsldc\tsltt{lrikd\slered{u{lddddc|u\[bllkmttSKJtsllrib[Uedk{{ultedk}|ztll}zll\UZllktt{ttslksmtttt{[[Tultlri{{tlrisle\[bLKR%&}{||Ħ|{{{tt}{{{{t||utll|zVTLlddmttmttlksttsult|z\[[ztld\\tlllld{{tsl{{sle|lld||{ttUTSlek{zm{{LKRekd|ukk]|z{ttttsuuzt}||{{t{|||u|fkktts{||{|||z{||ttsu{{lddlddd\\tts~[[Ttsl||}}}|u{{t\[[j]\lriSKJ}||}||ztzl}{tt}ldd|{{ttll{||lddrg]{u{lrilri\[[|mtt{{t|z{{tVTLbVZztl{{ttsldc\]bZllk|ttsldd{u{|tt{u|u{||[[T{{\[btt{b[Umtt{{{ttrfk{u{UTSlritlltts}ult{||ddclri{||tsl|b[Uttsllk[TT\[[ek]FD;}~|{{t||{tt|lri{u{llklri\[[{{{||{u{dc\{tttslzll||{tt}}||sreut{||ddc}ttslrikk]llkllklld{{tUMRttstslultuzt}{ttultlekekdlriddcu{{}lldtt{uzttts{{t|}lddult~|z}SKJ{u{v{sre|ztl}||||mttllk}{ttv{}ldd\[[lldjcV}]bZkk]bVZ{tt}u{zmVTL\[[|\[[f]clddekd|sle{ttutf]cVTL|UTS]bZztluztlridc\}rfk\UZ|z|u{{{{tts}u{{tt{u{{|z}|lrilddf]cVZT{||UTSttsVTLtsl~dc\ultu{{ultllkUTS)+2|||zl{{t|||z{{ddc{||lks}uzt{{t}{u{{u{utlddf]ctllztluVTLult|d\\ultVTL}{{llkllk{tt{u{u{{ztlttskd\JHFlri|tll|||lld|tllsle|ztl\[[}{||tt{||zll{{t}llkdc\yleutlltts}{tt}uzt}{tt{u{ttsdc\{||{{tllkztlztflddlrillkddcek]|zdc\|zdc\lddUTSf]clekred[[T{{|u{{t}edk}|srett{{u{lrimttuztddcekduzt]bZedk|ziq]lks{||sletllutult{||uztu{{dc\tts{{dc\tts\[[|zddc{ttuzt}{u{tll\[bLKR|zu}v|||Ĝ||||fkk{{{||{{}ult{u{tsltt{}tslldddc\rg]llk{ttlldsleutult}llk{||d\\|u|{{llkdc\]bZttslek|uldd{u{}cbV{||{ttu{tt{||{{||z{u{ttsult{||fkk\[[u{{{u{{tt|{tt{zm{tt|u|ldd\UZsled\\kd\{tt{{tlldmtt]bZekdtts}bVZ}llklldkd\SKJddc{u{ztlllktzlb[U{u{{tt{{tu{{lri||r]g||ucbV|z}||zekd|z|zmttuzt||d\\UMR||lksf]c{{t]bZ|uuztmtt[[Tttslri|zdc\JHF}tll}[TT{ttultd\\MSSLKRv{|||tzledk\[b}lks||||llkztl|z{{t||lld|utsl{||}sleu{{|z\[[ttsu}ekdllktt{ddctzltsljcV||{|||zzll}||{ttu{{zll{{t||{tt|tt{tslttstlltt{tt{\[[ultllk}lksu{{t|}tts{u{||tts||}|{ttsle{tt[TTkd\tsl{u{{{tkd\{u{v{JHF}|ztllri{ttultbVUdc\{u{lek}ttsttsut||{{ut{||ztl|zsle|tzl|]bZ|]bZu{{\[buztJHF\[b{tt]bZyle\UZ{||tllredVZTek]fkklddlekedk|ttsu{{]bZ]bZ|zv{ult|||sle\[bMRKUTS|cbV~}|znsle|{||lldllklri|u{|||u{{ult{{}{{lkslldd\\ut}}ztlutv{lek|ured{u{{u{{tt}lddldddc\sle||z\[[{||ult{u{\UZllkf]cf]ctzlsreSKJ|tzl[TTutsle|u[[Tu{||tsltsltsluzttts}|u}uztldd{{tldd||ztl}f]cuztult|u|ztsl}ult}}|ult{||d\\}ult|{{t||uyle{|||usle{{t||tsllldFD;uztllktzllld\[[lld}dc\bVZSKJtzlztllriultztlkd\{{tkk]ztltsluztu{{mttv{u{{{||lksddcllkMSSlldult}{{tUMRf]clektll{{tlld{||u{{tll\[[dc\]cd]bZlriutult}~UMRf]cJHF?;C|}}u}|ztsluztUUY}lksultlksmtt|||{u{}{{t|||z}ldd~{u{cbV{{tuu{zmj]\||ttstts|ztllf]c}|lrilriulri{tt{||zllut||||||z{u{{{ulttll{u{u{{tsl{{t|tllf]c{{||{tt{{zll\[[||{||uu{{b[UslejV[|uztl}ttsv{}j]\|v{tt{tt[TT|u}|ylett{sre||tlllddiq]{u{|||kd\{{ttslf]ctll{u{b[Ulksztl|uzt{{tmtt{||\[b|lksUTS{||\[[|lkssle\[bllk\[bUMRttsuzt\[b{{lekdc\tt{u\[[{{t|[[T{{t|{{tultldd}tlllddbVZldd\UZJHFlks||u}{{t|z|uyleult]cd{{tlekultedklksu{{|dc\lek{||{{tlri{ttultlddUTS|||sleddc\[[lri|lek[[T{tttll|u|uztJHFlkscbV|zllk|z}}|kd\|ztll}tll}{{||{tt|ddculttll[TT{u{}}|zn{||{{tlddmw}||}ylebVZ}|ekd}{ttkd\zll{tt{u{ult[TT}[TTlri{u{{tt}mtttt{ultllkztlUTStll{tt{tt[[Tllk\[[ttsLKR[TTtzl\[[SKJmtt|mttddcu{{lekdc\ultlks{u{ult[[Ttzl{{t}fkkfkk|{||uztuzt{tt{{t}ultkd\tllJHF*)(|zzlī}|}lld}ult{u{llk|lri{tt||utddc||{u{f]c[TTlldcbV}UTSn[[Tlrikd\{{lri{{tlri{zm{tt|zll{{t}|z||{{t|}fkkuttslultu{{}}ddctt{||lddldd{{d\\ultv{{ttlriut|z}uztztlzll||tllttsuzt|ulddztltts||lek|uttsek]||}}}lek||ztlslewldc\uztztl{ttuzt|zllklddu{{|{{t]bZ{u{SKJUMRmttSKJ]cd]bZ|zmttlriMRK}f]clldJHFdc\UTSd\\mtt|tlllriekdlri|\[[tlltt{dc\lridc\{u{{{lddlektll}d\\lddJHF$|lektsl{{t\UZUTS|{ttlri|lri|zltllutv{||ttsslebVUldd|zdc\|j]\dc\redzlluztttsJHFlek{{sretsl{||{zm{||}sleult|uzt}tts||ulttzl{||tt{|lriv{{u{|||zmttultek]{u{ttszllv{lekutslcbV|zuztkd\}zll}tsl|z|uv{red{{r]glrilld{u{{u{}|[[Tkd\}|u|zj]\lddf]ckd\{u{}[TTdc\|ek][TTlld{{t{||{u{ult{|||mtt{{tUTSddc|z\[blrimttuztlriu{{leku{{lksmttlri{{{||{{t{{|zllddcttsuztllkuzt|zlekdc\ztl{u{ult}}{tt{||ttsultVZT*)(|utslwl}Ǥ|zĜ||tzl|z||z[TTVTL[TTlriu{{utv{tll||v{}}zll}lld{{tlldlekyfd~}kd\tsl{tt{{t{tt||v|uztllklddcbV{u{SKJlri|ztzldc\{u{{zm{tt{tt}tsltsl|z|zutsl|utts||}ultult|ttsuzt{{t}|utsl{{tlltts{{tult|zdc\tslv{||{{t|uut{{tuzttzl{zm}||u|uuzt||}|ztllztfb[Uekdttsj]\u|zllk{u{~{u{{||||[[T|]cdUTS|uf]cbVUb[U{{tj]\llk{||}{tt[[T[[Td\\llk|z{tt{{|lks{{MSSlriVTLbVUf]cUMR>B9|||]cdtts]cd|ek]}{{t|z{ttb[U{u{ult{ttr]Z{ttMRK*)(ultmw¿wl{||{ttllku|zFD;ultu{{u{{fkkUTS{ttzll}d\\{u{lld}|||}uzt{ttkk]UMRrfkutttsSKJztlrfktsl\UZwlllkttsb[Uldd{||{||kk]}ek]|ultlldllk{tt}slesle{tttsl{u{}}|ut|uztu{{{{{{t}lri||ttslriult{tt{{tkk]{{tultttsllddc\{{t{zm{{tj]\zllv{{u{tll|tzlb[U{{t}|tll}|}ult}lrilriVTL{zm|u|uultlddzllztlf]ctts|z{tt{||uztlldtsl{||fkkek]tts{zmddctllVTLultuztbVUlriuztekdf]cttstt{u{{UUYJHF]bZ}{{[[Ttsl{{mttv{{tldduztttslriuztuzt{zmllkf]ctllkd\lddv{rfkztlv{leklekJHF,55llklks}|z~v{uzt}|z{tt||ztl|v\[[lritlllld{{t{{t~tyguzttll|z}{||rg]kk]}|ult|tsllek}v{zll[[Tb[Uultrfk||u{u{}{{}|{u{}tt{jcVi\Vu|||{u{|sreztf{u{|u|z{zm|tsl|z|z|}|tll{{t}~{u{}fkku{{tllult{tt\[b{{t|sle|lektll|zu{u{|u}{||tsltslrg]|sle{{t|tslkk]ult|||lld}ut{||bVUrg]kd\lek||tsluzttts{u{zlmtt{zmztlj]\tts{{zlekdtll|yl]bZ|u{||fkk|\[bUTSD;9lksmtt|u{{lksmtt{{}{||ttsuttsltt{|ztlllekredf]cf]c}{tt}tlltllMRK*)(||vƤtts}ttsVTLttsuzt{tttts]bZ|uztllk{{tztl|uztd\\ldd|||uztl}utedkttslldldd}}}f]c{{tldduttts[TTSKJlriekdu}ttsv|}ukk]||ztlult|}}{|||{ttlrikk]{u{|tll{||}{||u{{{{tult|u}tslv{{{trg]{{t||ut{{td\\ttskk]~tts|vsre|u{{tdc\kk]|||d\\{u{slered{tt{tttll\[[{u{lld{||VTL{tt|ttslldztllks{||lrittsuztlddtll|zllk{||VZT\UZlrislef]cu{{{{tlldc\UTSlrilks|{|||{|||zddctsl}ekd{tt[TT|{tt{u{}{tt}dc\JHF*)(}}Ǧ|||tzl}}uuztuzt}tsltts}ddc|z}|zlridc\||ttsuzt||ldd{u{d\\zll|{{tll}ttsyletll|mttVTLtt{|kd\uVTL|uwltt{|ullkdc\tslult||jcVmw{zm{u{{||{u{{||{{ttsl|||{||}tts|z{zmtll{u{|{{t{{t||||{{t||u}yle||red||dc\uzt||slekd\mtttzl\[[ult||sle|||z{{tb[Utlllld|||ztllddtts}|zmtt{tt{{mtt|tt{}redv{lksekdleklksztllekuztdc\[[Tekdlek}lld{||[TTtlllddlek{ttut}}|]bZJHFF=C~|~|ēllk{tt}}lrittstsldc\tts|\[[[[Tkd\VTL[[Tr]gek]{ttlldllkut|ttszlldc\{||rfktsl|||tllllktzl||wl{||redsleSKJ{{t|zllsletsl{zmlekf]crg]vtts}{||sle|z}u{{{ttut}tt{}llkllk|lld{tt{ttultf]c|u}sre{|||u{ttllk{ttJHFtts{zmrg]{{t{{tjcVdc\sre]cd{{tutttsut[TTddcsref]clldultu{{kk]ztl}ultu{{|lri]bZlldfkkVZT]cdllk{tt|uVZ[mtt}llk{ttmtt]bZedkdc\{||fkk{u{lddzll{{tllultyfdredldd|||JHF*)(tsl~wl|vu{{}{||dc\uzt]bZ{|||tzllri}|u{tt{tt|}kd\r]gztltsl{||llkVTLtt{}uzt{||sre{{tsletsl|lddtt{{{kd\sre|ztll||{zm}f]cVTLztl|vsleu|}mtttslultd\\lksldd|ztts}tsl[TT|{zmdc\ztl{tt|u}{{tult{ttlri}zllulttll|uf]cult}sre|lddredSKJtslcbVtll||||sleVTLb[Uddc|tll{{tllkuzt|zSKJlri{||{ttlri{{kd\uzt}JHF|lri}f]c\UZ]bZult|}}lkslrimtt|zttsSKJlriuztedklks|||ttsttsrfkd\\{u{}}{||:97*)(}}}llk{{tuzttll||ztzllri{zm{tt{tt|utztltsl}{||{zm{||{{{u{|uzt{{tVTLf]c|z{||d\\{zmdkV[[Tddc}|u[[T{{{ttsle||f]c{u{}{tt|tsltt{ultzllddc{tt||{{tu{{ut|utll{zm|||wlv{yl}{ttsle}{{t{tt{ttlddekdut}{{tredkd\VTLsleldd{|||u{tt}|z{ttlldlriztl{{tVZ[tts]bZ{||}tll}{zm{tt{||ztlfkkrg]tt{mtttslddcMRKlkslri}tlltts{{{{}|{||ekduztttsedklrilks|lri[TT{{{u{||kd\{tttlltts{{t:97*)(||}}||}}}}}|u|z[[Tkk]|z|z}{zm||uztlu|z{||f]cttstll{{tkd\tzlf]c\UZ{{tut{tt|zekd}ttszlrg]u||}{||utf]c{||lddkd\tllsle|z||{||{tttts}|||{u{|z|z]cdtts{{|||ttsttsult{||ztlwlzll}{{t\UZ{{t{{tn{||wlldd{zm{u{mwzllbVUkd\lddslef]c[[Tredtlluzt{zm\[bj]\VTL|z{{tVTLlri{tt\UZek]lld{{tt{ddclddUMRlldztltt{ddcleklddf]cv{lksVZTf]ccbV{{lldddc{{ultvlksfkk|zuztlld\[[mtt{||ldd|ztt{}llklddztftts|lriVTL:97*)(}|}}~}u||dc\llk||{{tiq]|zuzttzl{{t|u}sle}ttstlltsluzttzld\\{ttlddrfkkd\{{tdc\{ttutu{{tllrg]UTStllsleultred|u{{t|[[Trg]j]\tllldd{{ttsl{ttzll|uddclld{{{||{||lek{{lldultmtt{ttdc\{tt}{ttuzt{u{}ztl}tslulttts|zultutrg]{{t|uVTLSKJkd\|||{{tztlttsd\\ztltllzllkd\f]clld[TT\UZultVTLsrelri]bZ{ttd\\:97{ttekdntt{ztljV[{u{VTL[[Tdc\|lek|{ttultldd{||lld}|UMRbVU}mttFD;llkuztf]clri{{ult{tt[[TVZ[nv\[b]cdtsllkstsluztf]clddd\\lkstsllek}bVUzll||tll|ddcb[U:97*)(ǜu{zmzll}|{||VZT|sleulttzlut|u{{|]bZ[TT{{ukd\sletsl{zm}{{ttts}{|||ddc{||SKJzllslesreUUY|u|UTS{ttVTLJHF|{u{{{taWMmtttsl{u{}|tzldc\uztut{||}{tt}ultut}||lek||{{llk\[[uzttlllldlks|u|z||}}||utll}u||z}VTLvek]tll{zmaWMlldVTLkk]rg]\[[{tttts{u{|u{{tult||[TTultbVUSKJ}dc\dc\{||ldd[TTlrildddc\|u||v{tzl{{t{{tutll{{t{tt}v{~}edkVZ[\UZVZTfkklldUUY{|||z]cdekd||mttlekVZTlksuzt|u{{lekf]clddultsleult||ztl{ttsreJHF74,}}||v{{{{{ttsl|||{tttslddcMRKuztsre\UZ|||}ztlulldVTL||{u{}lddf]c{{rfk~rr]}v{||}||tzl|z{||lks|{{|u||}z|{{t|tt{ut{tt{{|z|z||tt{mtt||u{{tztl||lek}lrirg]|z{ttddcwl|z{tt}dc\|u}wlcbVkd\ztld\\tzl{{tlldkd\tllllk{ttsred\\llklek}redkd\SKJekd\[[dc\\[[UTSsre\[b{{dc\rfkultult}llk}UMR\[[lldddc{||{u{|{{t{ttulttll}||z|tt{}MRK{{mtt{||tsl{||mtt|tts}{{UMRSKJred|lddd\\ttsu>B9:97}|}}}||u||usre|u{||}tlllrilritslultmtt|z|utsltslrfk{tt}|}kd\[[T|zkk]}redUMRbVUrfk||VTLldd{ttut|uut[[TVTLb[Uztlf]clksut}|zred|ulritsllekzll||z{tt}|||ekd}|tts||tsl~{u{sle{{yleut}|f]cttslriUTSd\\lldtsltzlllk{yfslewltsltll|lek|uuiWUslettsslelek||ultult|VTLztlkk]}{||]bZulddtt{tts{zmbVU}f]c|ttstsl{u{}lektll|zaWMlks{{{||}fkk|\[[VZ[ult\[bttsekdf]c{{{||srett{j]\|uj]\lddlddddclriJHF-1+slev|u}{zm|ztf}{tt[TT~|utll[[Tr]Zrfkult{||llk||UMR}}}tllbVZ{zm}tslkk]uzttslUTSmw\UZ{{SKJkd\ztfdc\{u{|uut||}lld{tt|z}|zll{{t||ekd\UZ{{rg]{zmjcVlldult|||lri||{zmu{{tsltt{llkmttUUYredu{{llk|zuzt{||}|dc\}||lksf]credult{{tsle{ttrr]tt{||||{zm{{twltllztl|j]\VTL|}vd\\ulttllultf]cuztlri{||[[Tztlf]cutek]ekduzt{{ztltllult|lritt{ztllek{{t|z{tt}{{{{\[[||lks|u{{{{VZTllkztlult{{t{{{{tts|tsl}lddbVUbVUtts{{tuzttslvMRK*)(wl{tt}}||||{{}|ljsleutyfl||{{}}}|}ultuztztl\[[vlldddc{ttut}ttsb[UlksttsbVUUMRj]\zllztfiWU}d\\}|utult|lddtslSKJlddred||i\V}|zv{}lldedktsl|uzllddclksztl|}{u{llkkd\~llktsltts}d\\{{tlldllk||||v{|u{{|srekd\{u{lek||uzt{{tddcttsfkkv{}UTS{{t||~uzt{||}kd\kd\rg]lritzluztzltts{tttll|{{||f]cddcut|lrif]c}ddcuztu{{tts[TTllk{tt{u{bVUlek{ttldd{{tJHF*)(zllwlü¿wl}|}}i\Vtslzllllk||tllekdlri}u{{tslelldlrilldaWM[[Tj]\}|zdc\ultutSKJ\[[VTLtllztlv{lekUMR{||\UZzllusledc\{{{u{ut{tt|ullkd\\|{tt}{tt|||ttsfkkv{tllleklks|z|||ult{{ult{||{ttlld}lddUTStsl}}{ttztff]cUTSd\\lri|tsllldVTL[[Tsre{u{lldtslddc{tt}slekd\llku}{tt{{t}tsl}|vkk]llkuztult}ultldd{ttttstts{zmtsl|||lkstzllkslekdc\utsleVTLlek|{||b[U{u{}|sle{||tll{{||vtll{{~tslldd{tt{{\[[mtt|lks|z{{\[[slered{u{|:97*)(}}}}ult{tt}{{tzll}slezllUTSVTLtsltts{||{u{{tt}uttsl{|||u|uUTSredrfkuztdc\VTL}{ttVTL}d\\uztyfd|udc\ut||}|f]c{tt|ttsUTSu{||kd\|sle}{tt}||||}}lektsldc\{zmtt{{{tt{|{{||bVZ{||{ttttsd\\[TT[[Tulttll~tll{u{||}VTL|ztl{||aWMbVUVTLSKJcbVlek[[TaWMMRKrg]{||}d\\v{}{tt{{tVTLub[U{tt\UZ{{tUTSkd\{||ult{{ttslb[Uult{{t|{{tbVU}lek\UZzll|tll]bZ{{t{u{tts|z}ttsf]c{{\[[\[b]cd]cd\[b{u{{{{{uzt|tslu{{{{utztlkd\ztllld[[TD;9:97wl|utult{tt}|ulld|ubVZuzt}{yf}lri}}ttsu||ztl|usrelddkk]kd\[[T[[T{tt|ub[Ured}ultv{|}|||f]cr]ZultcbVjcV{||ultred{{tlldrfklrillk|zrfk}}||||}tllu{{edk|zlld|utddcmtt||~jV[edkzlllriu{{tt{sleuzt|uult{u{rg]mtt|zu{tt[TTbVUb[U[TT3+*kd\kd\ek]cbVlld}ztl}{tt|uttslVTLtsl|u|z{ttv{\[[dc\b[Uddcb[Ub[Ulld\[[{u{lldultllddc\tsllekllk~sleuztlritslu{{ultlddv}}|}|{u{f]cllk}lddlekmttmttdc\tt{mttedktll|}lri\[[{{tuztutslezllkd\red{ttdc\uztlldUMR:97}ljlj}}sle}d\\|ztsltzl|uv||ztlttsv{{{uzt{{lld{ttdc\{{t|lldrfk{||||}||ulldlldbVU{ttv{yleek]{ttddc||]bZtsl{zmlddutdc\aWMddcttsredtll{{tzll{{tlddutb[U}uzt}{ttsle\[[||llktts{||lrifkk|rg]ult|ullk{||llk||ztllkd\llkuztf]c{{ttslsle|ztllultVTLj]\{ttrfk|ub[UvVTL|ulld{{tdc\|uzttslsledkVu|llk{ttv{tslrg]lldVTLlrivttsllkb[Ullkttsrfk{u{llk|z|{{d\\ldd|ulriuultf]cldd|tt{ddctt{{{edklri\[bu{{ultd\\lksek]lkslri\[[{tt}}|tlllddi\Vlriwlj]\||tzlVTLJHFwlv~}|¾Ʋtts}}ttslddtll{{utultlrileku{{t||ttslriulttts}ukk]SKJj]\ldd[TT}|ztt{||zllbVUVTLbVZ{tt{tt{{t]bZyle||d\\|{{t|u}sletsltlltll|ztllek{u{{tt{{tttsttsu{{ultttstllulttt{ddcllkulttlltt{|ulttsl[TTtlltsl||ultztlkd\|ullkkk]UMR}srezll|uyle}SKJllk{ttsreVTLuuzt{{tztl\[[{tt{tt}|j]\{tt|sletllzll}}LKRuztutljedkv{|uttslridc\|u{tt|utsltsl~lksttsf]cztl]cd[TTtzl{||mtt{{u{{UUY]cdkd\uzt|lriUTS{||d\\{tt{u{yleyleyleJHFkd\red{{t{{t}JHF*)(wlüü|||}|ult|rfkjcV{{tldd{|||zultj]\lldldd{{tcbV{ttwl{{tcbVSKJ|ukd\j]\lld{tttll}kd\tsluttyg|zdc\uttll}tll{{t}f]csleuzt}||rg]b[U{u{{u{lld{tt{tttts{|||}|ldd{u{u{{tlllek{{{tt|v{}|||ztl{{tsleVTL[[Tzll}}z|}|redtsldc\]bZldd{||ek]mtt|rfkzllult}kd\tslcbV}edktll{ttuzt{{d\\VTLbVUlrib[Uldddc\dc\}}|uztl{tt{{tf]ctsl{tt|zmttVTLdc\|{{{{tt{ekdddc{{t{|||d\\uztlldtlltll||tllztlllkr]Z}}}kk]{{tFD;74,~~}|||u{{ttsl}sretts}bVUddc}lek||||u{{ttsl}|z|u[[Tj]\\[[tts|u|mttultbVU}VTLcbV[TT}rfkekd\[[uztj]\MRKultrg]sle{{t{tt{||tll||tts|||zj]\yle|||z|llk|z{u{d\\|ult{|||z}}|[TT||ztl{zmrg]d\\ekdztlwltsl}||}ut}utdc\kk]}{{t|||ultlekkk]{ttsle}|yle||[[Tek]tzltllultultutb[Ulri\[[bVZwld\\sleultztl{u{}{zmuttll}|u|tsl{{tMRK{||{||lri{||lddekdd\\f]cddc{tt}{ttcbV|u{{t|u|uVTL-1+}}uzt{{t}}llkdc\uztfsrerg]lddttsulturfk}{{t{tt{||u{{tzllddultsle}}ttsVTLrfkf]cv{|lri{||{||lld|uztlkd\ztl|u[TTdc\|utsltllbVZ||}|tslsre|z|cbVkk]{||{tt{||tsl|utts{||{ttuzt\[[|lksztl|uekd{tt||f]c}dc\{||lldmttrfkldd{tt}|zll}|ztltll||{{t{tt{{t||ukd\kk]tslv|red}|utllztlddclri|z{||uzt}{ttzllztlddcllduzt{{ttll{tt}|zllultldd{u{lldr]g{{sleztl{{uzttsl|u{|||v|{u{{u{{u{rfklri|zulttts}VZ[|zlritts{|||z]bZtslsleztl}||vdc\llk}|ut{tt|z[[T*)(tllwl}ü}}}|{tt}ztf{zmuultb[UlldVTLrg]ultzlltsltllultslef]c}|zllk{{tztlbVU}tll\UZJHF[TTtllllk[TTldd{u{f]c{tt{||sleulti\VVTLVTLkd\ztlekdcbVcbVttstlllddtllut}ldd}}ttsult||{tt|f]c{{t{{}{{|znv{u{||ult{u{|}tts|rg]{tt|jcVSKJjcV{{tf]c{zmtsltzltll\UZzll||}ultv{|u}|||}{||zllf]cdc\tsl{{|u|[[T}{||}|ek]~|slef]cmttzlltllbVZSKJ{||||{{{{t{||\UZv{{ttlekutztl{tt}VTL}{{tu{{ultult{ttuzt|z}{ttb[U|utllyle{ttutv}sreD;9*)(}||v}~sre}}|||}|zltsl}tt{v{}VTLultulttt{|f]c{||kd\}srebVUbVUult{u{\[[sleultlld||b[UtslbVUSKJFD;]bZSKJsrekd\[[Tlddd\\ztltzlttskk]sleut|u{ttvztl|||z|zlksf]ctt{fkklksUMR}tsl{{lldleku||||lldsletslb[Uztfldd{tt{{t{{tlldultcbVut|u|uult}j]\{tttts|vrg]tll{ttd\\uzt{{tuztrg]bVZlddlddtts|u}MRK|tslrfkv{UMRbVZ}}|{{tll{tt}sretts}f]cut}|{{tdc\dc\}||||ddcf]cf]c{||{{ut}zlltllredj]\|utslj]\red||ztlJHF*)(~utüütsl||ztluztztlutkd\rfklddutJHFuzt{||{||uzttzl{{t{{lrizllrg]{||lddlrijcVttsv{ultf]cSKJtll{||}|{{t{tt[[TUTSVTLj]\llklddlksttsv}{||r]Zekdddc|||ztl{||||}j]\{ttllkuzt{{|u{{{||{{lksedk{u{tsl|z|zttslks{{tkd\lksttsedk{tt{u{{{tultllddc\redredut{tttts||ttstllkd\yfdzll|uultdc\d\\{tt{u{}ldd{{tttsv|lddllk{tt}|usre{||tsllddlek|uUMRultbVZtts[[T{u{||tsl|tllult||ultbVU{{td\\[TT|tzlfkk}sre{||lri|uldd{||{||||}|{u{wl{zmtlld\\utwlv|rg]rg]FD;74,}zj]\ü|zv}||{{tslellk{{t||{tttt{{tttts{zmztl||tll||}|||zlddtts[[T{{ttzlkd\{tt{u{[TTd\\[TT}{tt{{tddc[TTd\\ekdrg]kk]bVZllkldd[TTtzllritll[[Td\\b[U{{t{tt{{ttts}|}}|{u{||u{{{{tllktt{{{|}tts}|vtt{}|{u{tll{u{{u{}||llkdc\red}zf]c}{||ut{{tUTS|utllsreyletts}|yfd{{t||sleyfl}{{tut}{{||v{{u{}v{VTLv{{edktllf]c[[Tslelddllk{zmu{{ultztlrg]{zm{{t|tll{{t|]bZtt{|zlek|}ddclekd\\kd\llkddc{tt}|uztldd\UZf]c}|v>B93+*||ü}}||ztt{u~lld{ttkd\tts{ttlldj]\tllv{f]ctsl{tt{ttrg]ddctll|}|llkiWU]bZtlluzttsl{{t{||ultlekdc\}|JHF{|||ttsrfktllJHF{||v{srellkddckd\b[Utslslekk]d\\{|||lekyleztl}ddctts}u{{uzt|zuztddc\[[|z|}\[bf]clksldd||}}}|j]\lldi\V{{tzllkd\ldd}|i\V||llktlllld{||llk}|b[UbVUutbVZ{ttsrettszll}ult||{tt}lek{{t}[[Tddcttstlledktll{{|}srecbV{{tsreu{{kk]tll|vzll|u||||ult{tt|{||{||n{u{}ult|tsld\\rfk}|{zmtll{zm}|zllyleztlkd\kd\:97*)(}u|||ztf{u{yfdut{zmulddtslv{}}}llksle{{|uldd}tzl|uddclri|FD;d\\u{{]bZllkd\\rfklddlddsrezllSKJ}tsl|zsleVTLtsldc\|lddsleVTLzlllldrg]srelddultd\\{u{||{tt|uztl||mttllk|{{|}||ddclriuzt{ttlkslekUUY}||kk]ldddc\}tllsrekd\bVZultlldv{bVZbVZlddlri~kd\v}{{|}|f]clddultldd{||llkd\\kk]{u{v{|||||{||tsl{u{VTL{zmbVUddcttslriztltllUTSulttsl|vttsrg]||tslv||kd\[[T{{tll|lek||{tt|vutztfzllsle||kd\wl:97*)(lddut}}{{tuut|u||}ttswlv{{{t|u|u}|sle{||f]crfk{{t||}zll{||d\\rg]redlddztlllkf]c}rfk[[Ttll}tt{j]\VTLkk]lldslettslridc\||tll}dc\tyg|ztllddj]\mtt{zmut{{t||f]cv{tlllddd\\}}ekd|{{tt{|z{u{tlllek{||~{{{{tllkleksle|zsle|u{ttllklriredkk]VZTzllredbVZ[[T{{t{tt}ultddc{tt|utredrfk{u{{{{||}lriztl]bZ\[[utVTL|lldlriddctsl{zm[[Tf]ctsl{tt}v{lek{||bVZ}{u{ztl{{tkd\uztuzt|z|{{||ztt{ut{||{{t{zmlldlldd\\sletll|uzllldd}|yle|}>B9&&~{tt}u{{t|||utrr]redtsl{u{tsl}ztl}|{{t}{{t{||zllsle|tll}}ult{tttllsleultllksrettskd\\[[tllf]csreztld\\ttstll}{{tVTLUTS[[Tlldztlkd\b[U{||}kk]ekduzt||kd\lddlkszll||{ttkd\u{{{{ddcek]lks|mtt|edk}||{u{}ddc{||||~cbVkk]tllkd\f]clrib[U||j]\ztf{||{u{{zm||ldd{tt|ud\\}||rfk}|utsltts{||tslkk]}ut{ttredsrej]\ttsUTStts{u{{||{tt~ult}|uztttszll{|||u~{zmztl|zllsrelri}|zekdekdslellkldd|u|u|tzl|u{zm|{tt}|vredkk]i\VD;9*)({{t|v||}u|uutztl}}yleb[U[[Tzllf]czll~{ttulttsl{u{kd\{tt|zkd\||zll|ultlldzll|v}|sledkVv{dc\dc\{tt||}lridc\kk]mttSKJ{{trfkFD;sre{{ttll{{t|[TTb[Usle}b[U{{tsre||tll{||tll}~v{||tt{lldultuztmtt{{{{{{lrilks|z{u{uztult||}ttslddlks{u{{{tvu{{{u{|}yle{||tsl{{ztlkd\d\\f]cuzt}tzl{||bVUrg]}|v{tttslkd\}|||{u{{ttrg]kd\[[Tlldtsl]bZult{tt{{sleztlztfztlut}|||uztlsle}lek|zwl}tll}ek]{||{||tsl||{||{tt||JHF}i\Vutztl}|wlredFD;*)(v|}ut~vldd{ttubVU{||tsltll{{t{||ultuztttsu}|{tt{|||u}lri}sleldd}FD;{||ult|z}lri{ttttsllkekdu{{lldb[UlriutUTStygtllsreuzt}ztlsre[TTaWM|zztlrfklld||}tll}tll|||zlkslrilek]cd||lkstt{}fkkllk{ttultleksle{{{{t{{t|z}{u{ultrfktsltt{rg]lldutUTSzllyleslekk]{{t{||lddutlekf]c{u{{u{r]g||||{|||}tllredtzlsleVTL|z{{ttllttsllk{ttv{||]bZ{{vulttsl||}tsl{{t}}mttmttu{{{{tlddlldtzlllk{ttj]\lddsle|||uztlsletslrg]JHF*)(~{{t}}|uzll}{{t}|v|z}{||srelri}}}|u|z{{}{{tyfl}slellkr]ZbVZllkred{ttddc[[Tlld}lldlld||tzltll[[Tddc{||rg]dc\b[Usresleslensre}{{ttll|lritzlzlltll}tts{{ult]cd|z{{||u{{|mttlriultuzt{{ultf]clks\[bmttultlddztldc\kk]{ttut}llkddc|sre{ttutzllztl{{{u{kd\d\\ut{u{utred{tt{||ztltllkk]\[[lri}ult}uztwl|zmtt}tt{mtt]bZ}tts}sretts{u{{||v{ztl[[T}zl}lldttscbVlldttssrerg]sle{{tutztl|ui\VzllutllJHF!¾ƣu}{{t}{tt{{tttsztl|u{|||lld}tsldc\dc\kk]tsl|ut|||}zllllk{u{{ttb[U}{{ttsl{{lribVZlritlllriVZTUTStlluztf]c}mtttslkd\||vuztyle{zm{u{JHF||||{zm|}{{||lkslksekd}|fkkdc\ulttt{|lddd\\tsl{u{tts|uVTLn}ultf]cult|zlks{{||ztl|u{{tlekttsldd{||lddrfkbVZdc\{{tu{{tll{{t{tt|ut}||z}|u{zmkd\u{{ztlrg]||llku}}|||}{ttlri{tt}|}{||sre{{t|z{{t||sletsl}{{t{{tztl[[Tu[TTsleultb[Uztl}|{tt}v{ult>B9*)(||v{v{zlltts~dc\lekylev{{{{{ldd{||{{td\\[[Tuztllkn}ulddsle|zztlu|u||tts|ztts{tt|u{{t[[T\[[|||ldd}|tts|||}|sleslejcV||kd\tzltts|u|v}{tt{||{{{{}{{tslmttmttmttmttuzt\[b\[[{||lddlekultult|rfk{ttldddc\}tsllldttsldddc\[[Tlldlld{{t{{[[TbVUkd\ttslddedkzll\UZd\\tll{||uztlriultzll\UZ{{ttyg[TTMRK\[[llk\UZ{ttult}wlkk]||ttsztldc\{{tulld||tzl|z{zmkd\|lriiq]lldtllsrebVU{zmztlztl}|utllyle}D;9*)(}wl|wl||kd\{{t{||{tt{{tu{||{{trfkrg]}}{{t{u{wl|{tt{u{d\\|uztlu|ztl|SKJttssle}bVU[[Tultllkultlks|llk|u[[Td\\tts|u{{t|u|u|u{{tf]csle||{{tsleztllldv{ztltsltlledklld{{{{|ztt{|mtt{{mttu{{{||{{llduztd\\\UZlks[[Tf]clld{u{llk{{tlddcbVultlddult||}dc\{{t{tt[TTUMR{ttb[UmwVTLrfk{u{VTLSKJ{tt{{tv{vredldd[TTtsldc\|utsle}z}ekdllkllkldd{||{{uzt}sre}|vlekllk}|zll}||tts|{{t}|ztlb[U|{tt{||{{tlddtts|uutztl||ut||wl}:97*)(||zutll{||tts||f]cultttssleb[Uvu]bZ[TT|zddcb[U|z|u|tsl}kd\{zmv{||llklddsle}ultttsb[U}cbV}||tlli\VVTLSKJkd\tll{{t|uyletll|u}|utslsle{||b[U{tttsltsldc\{u{{ttlks{{{||uzt{{mtt|mtt|z||z|{||llk{ttlek{||{{d\\bVZbVZ{u{|z}|uzlulttlluztdc\redUTSztfkk]SKJ|lekkd\f]ctllVTLmttd\\tsl|||u\[[kd\{||{ttsle}ldd{{v{}lksmtttllsleultztlultUMRlddutllkuztttszllsre|}|u}}lddztfsre||]bZred||u{{twlztlztl||tslwlJHF*)(Ƶ}u|v|u}yle}||uuztmtt{{td\\||u}{zm|u||u}|{||f]csresre}ultllksle{||ultultuztlldd\\{u{VTL]bZ{{tsre{zm}JHFSKJdc\dc\|uztf[[Ttllkd\|u||}}lldkd\ztlj]\{tttsl{{t{ttttstllddclddlekmttu{{mtt|tt{{{{{ttslkstt{|}||ttsf]c}bVZylelri|zsre{||kk]{|||uldd|zkd\rg]|vsreztlrfk|}rfkztlkk]b[U|u}zlltlltllf]c{{trfkrg]rfkuzt|z}{u{leklektlllek||ttsmttut}|vzllnllk}|ultf]c}|lddtsl{u{}}tll{||}wl}{{t[[Tdc\tlltsl}|u|||u}{tt~ztlD;9*)(uut}lldwl{tt{u{zll{{ttts}MRKsre|z}|udc\||{{tlriuut}|utsl}|||zll||||ztld\\ddcsre\UZ{{t|}|u{{tdc\j]\f]cVTLslelddttsuzt}}b[Utll|vyleztlkd\kd\wlf]ctsl}}d\\||}{ttllktts{{n{{mttlkslksultlek|mtttt{ult]cdv{bVZ{tttt{tsllld{{tzl{{tutslf]cj]\llk{{t{{tut{{tu{{tlek{zm|urfklks||kd\}|SKJf]ccbV||sreldd}slesletsl|uzllttsultlriekd|{tt||{tt{||{ttrfk||}{u{}tll|ud\\|u[[Ttsl|usrekd\lld}lldrg]u|v{kd\||r]Zsle|uredredVTLcbVFD;*)(|v{zm{{t}}{{tu|u{u{||{{taWMllk|{{tredllk{||ut{tt}tzlSKJJHFVTL{tt{zmb[U|ult{ttutldd[TTult{ttd\\slej]\kd\|zudc\slelddkd\f]ctslb[UJHF|tts{u{dc\{tt|u}llkvtts|lddtts{{ttslcbV||{{t}ttslks||{{{{VZ[]bZfkklksleklkslrimtt|\[[\UZUUY{ttldd{u{{{tcbV[[Ttllultldd{||sretsltts{zmkk]lld}||{||ud\\tll|zv{kd\b[Utzlu{{tsl|ztsl||tll}{{tkd\|vVTLlldslelri{tt{u{lksmtttt{|z|}||{||tsl{ttult}{||uztkd\||}|}bVU{ttd\\ttstsluuzttsl|{||{{tuztf]cult{zmzlluzt}ztlrg]d\\j]\tllrg]rg]}|||{{tztlUTS*)(}|u{ttrfk{{tztltll{{t{||rg]{{t{||zll|z||tts{||{{t\[[llk|u}||ztygv{ttsj]\}||u{u{bVUztl}VTL]bZlddllk\[[UMRtll[[Ttsl{||dc\{zmlrij]\tll{zmtsltlldc\{{tztl}{ttkd\VTLlldbVUb[U{{t}|}rfk}|VTLsre{{|tt{|{{llknv{||mttd\\{{fkk|ttsf]cUTSlks\[[bVZ}v|u}~sre|llk{{tttsllkd\\ztllri[[T||z}sre}}dc\tllf]c{tt}|tts{{{u{sle{{t|z}{{t{{{{t[TTtllVZT[[T||{|||bVU{u{llk|zu{{||{||\UZ{{lrizllzllsletts{ttv|z{{tlddj]\ztl{zmslesle|}ztltsl{ttSKJlldek]v||sleutsleSKJ*)(}ƨ}{zm{zmtll}|||tll{u{lld[TTlrisle}|{{t|zek]{tt}|usle{{tlddzll{tt||{ttkd\{u{{{tttstts}lldSKJ]bZuztkd\tsl}{{ttllVTLd\\[TTD;9{{tlldv{sre{||kd\ztldkVkd\|b[U{{t}ztl|{{tlrislelksmttmtt{{VZ[{{fkkmtt{u{ulttsllksd\\d\\llk|ukk]sreuztttskd\tt{\[[lldredztl{{t}llksle|utll\UZ||ult{u{{tt{||dc\jcVtslult{{t|u{zm{{ttts{tt{u{j]\d\\edkekd|{{{||tts{{}u{{{{ttts}uzt|{ttv{|{||{{t}ttslldttsult{{t}lridc\b[UcbV|llkkk]|utsl{ttutztlrg]ddc||redD;9:97wl}||}}{tt||||{tt|uuztrg]llktts{zmultb[U\[[[TT{||kd\{||{ttsled\\||uv{tslj]\dc\sled\\||kd\lek{{ddcldd\[[dc\[[Td\\f]cslesle{ttb[U[TT]bZrfklddut|bVZj]\ztlztl}|kd\|z{zmztf|z}}rfktsl{|||zkd\tt{{{lri{ttlri\[[|mtt{{]cd\[bttsf]c{u{lks{{f]cddc\UZ{|||lld{{t|kk]kk]{{tlrildd{{ttllddcult]bZ~uzt{{tb[U}f]cf]c{ttj]\{ttsresle|ulddult{{ttts||u{|||u|zultUTS{ttttsttsf]c{{{u{ztl}ut{{{||}{||lrizll}uu{|||uuzttts||{{ttsluzt|||sre{{twl{{ttslztfkd\ztl}|sre||{{ttsl{||FD;*)(vvu||redredu{u{||}{ttztl}{||}lld{{tred[TTldd{ttslelekrg]sledc\tsl|||}tllv{[[Td\\|uztltll{||}uztf]c]bZlddb[Ulddd\\{u{{{tutulddvredVTLkk]lddbVZ|usleldd}|ldd{ttllk||u|u{{t}{||sleutztl||lri|{{{{tt{]cdult{{mtt{{|tt{edkf]clksllkekdmtt{{tlks{u{lek\[[d\\ek]lldllkkd\|tslsreldd\[[d\\sle}llktslsleddclddtt{utv{{ttultldd|uVTLkd\UTSu|}{tt{||uztldd]bZtsllks{{{u{lksult[[Tlektslllkuzt|ztzl}lek}|zlld{u{||b[USKJd\\mwFD;[TTllk|ttsudc\{tt{zmek]llkcbV[[T}{{t]bZtllsre{ttjcVyle}sleSKJ*)(}|}{ttlld{ttlld||}|z{||{{t|z{{ttts{||ult|u}|v{zmtygrfk{{t}|{tttsl||zll||ztl}{ttldd[TT}{{tddc{||tsltlltsl{u{ek]lektllrfkztl{ttlddkk]kd\ddcf]ckd\b[Uekdd\\zllaWMMRK||{||lri{ttj]\{zm}{yf|zkk]}{tt}uztddc||zlksmttuztllkmttf]c\[bultekdlksult||iq]b[U{u{}{u{\[[ldd{{t{{t[TT{{tlldtsl{zmlld}dc\sleddcd\\aWMlri|{{tVTLlldtllr]gtt{}lddd\\tslutddcztlddcb[U{||[[Tlld{{t]bZ|||u{{{||\UZ\UZSKJkd\ekdtll{tt|zf]c{||lksfkktslttsb[Uf]c{||v{{u{{ttllktsltllaWM|z{tt{||ztl{ttj]\tsl||dc\dc\lri{zm{{[[Tred|u||lldtslsre{zmtsltllcbV{ttkd\ztl{{t{ttmttlddD;9:97||uzt{ttv{|{u{|u{zm|z||{ttultlri|z||z}||{zmtsldc\red{{t||{|||slered{u{{ttredlldslelddlekj]\dc\SKJslelritslb[U{||ddcuzt{{t{{tldd{{t[TT{tt{zmSKJ|utsle{{ttll{ttztlv[TTslelrilld{ttj]\}|kd\tslllkztlbVZtts}{{tdc\lkslksddc{{{{llkmttu{{ddc\[[UUYUMR{{{{uztmttlddlekdc\ddclekllkult}lrilddlriu{ttd\\lek{{t{||ztlldd|zkk]VTL{u{j]\b[U\[bd\\[TT|ub[Ured{||[TTllkVTLb[Uredb[Uj]\]cd{||j]\tllttsekd{u{{||{ttVTLlri{u{||tll{||tllkd\{||]cd|zdc\lks||ddcbVUSKJztlVTL[TTlrittscbV{||sletygtts|zrg]||||{u{lddztllri}|z}dc\ldd[[T|zttskd\[[Td\\tslb[Utzl[[T[TTkd\{||}red|||tslj]\SKJ*)(ult}{tt|uztl||{zm|wl}{{tlks}{{t{|||zztlsredc\sre{tt}|ut}{{tzllekdttslddllktll{||kk]{{t|uultulttll\[b]bZbVU[TTtslf]c{||tsltlltll}lldkk]tlld\\kd\j]\|uFD;tll{ttsleVTLb[UlddVTLztl||ttsultkd\cbVdc\{zmusletts}tll[[T]cdslelks{{{{edkddc{||u{{mtt\UZ\[bJHFVZ[lkstt{ddclks}lks[[Td\\lekllkf]ctts}VTLtslttsbVZ[[T[TTzllkk]||mttzldc\lks||VTL\UZSKJd\\lekkd\zlllddlldddcSKJVTL[TTtsl}\[[dc\tslVTLVTLlrildd\UZlldd\\{u{llkllk{ttttstllbVZlkslridc\uztmtt}lektlluztlekj]\b[Uu{{d\\{tttts[TTVTLtslVTLkk]ddc|uddc}{{t}tll||ekd|[TTdc\lld|uultttsf]c{||kk]sredc\kd\lddztlddcb[Uutlld{tt||sleJHF*)(}|uu|{tttsl{{tt{{ttsletsl{{tzllztlllk||UTSkk]dc\ekd{ttlddtslulttsltslkd\|z|zkk]{||d\\{||lddlri|utts}ttsSKJddctllult[[TVTLSKJllkJHFSKJ\UZdc\ldd|tsllldtslb[UUTS[TT]bZVTLj]\b[UVTL{tttslVTLzllztlztfldd{u{lrilddJHFb[UVTLkd\redtsltts||{ttllk{{tsllldUTSttsekd{{]cdf]cllktts{{\[bfkkVZ[}u{{lksddc|{u{{tttlledkuztlekutuzttsltslVTLtt{\[[d\\[TTekdj]\{{tlddkk]tzl[TT\[[d\\b[Umttllkllkldddc\\UZlekbVZlldtllzll}tslj]\[[Tdc\lldttslldllkuztkd\edk\UZVTLb[UJHFf]cUTSu{{ddcb[Ukd\UTSlriuzt]bZttslddMRK{ttUMR[TT{ttllk[[TlddcbV\[[{ttlldj]\[[Ttslsre||kd\ddcb[Uddctll]bZkd\|lldtlltsl||{||ult}d\\dc\ztldc\kd\tsl{u{sle|vsleddc{{tlld[TTD;9ztl||{|||{{t|zllk|z|tts{||llkd\\kd\{u{}lrilldlldztlkk]lldtsltslu{{sleedk[[TVTLrfkf]credkd\kd\]cd|zsle}lldtts{||ekdf]ctlllld|zslelldtts{tt{||tllcbVzll[TTdc\d\\{u{]bZbVU{tt\[[VTL[[Tkd\\[bb[U[TTtllslekd\|z[TTutztl\[[b[Usletsl{||tts[TT[TTlld|zd\\tsl{{t{{t{||lldtllttsd\\[[Td\\{{lrif]cfkklkslks|z{||mtttt{VZ[LKRVZ[mttmtt]cd\[[\[bd\\d\\lddlekmttedk\[[r]guztekdekdd\\lridc\{{t[TTlldd\\FD;[TTd\\kd\tslUTSlld\[[[TTkk]f]cj]\f]cf]c[TTtllf]cbVZUTSllkkd\ttslksllkd\\SKJmttUTSUMRd\\tllSKJ[TT\[br]gf]cUMRUTSztlddcslelkszlltll\UZtllVTL{||llddc\lldtt{VZTtt{}ultd\\d\\tt{mttekdlkssleVTLkd\{{tdc\dc\{{tldd[TTztl\[[dc\d\\b[Uddcd\\f]cb[UcbVlldlld{{ttslcbV[TTztlVTLkd\dc\lldtllb[Urg][TTUTSredkd\[TT:97{||}|ttsllk|tt{mtt|}{{{u{ztltts{u{{u{llk{{}{tt{ttkd\kd\dc\{u{tsldc\slelld|{{{||{|||tllttstlldc\{ttkd\{||{u{|zlld|zVZTSKJkd\lek|ztts\[[JHFf]clrildd{||sledc\ttsttsllddc\\[[JHFd\\UTSdc\ztfkd\\UZsleVTLd\\tslaWM[[Tllk{ttkd\lldlritsl||uzttts{||{{tlld{u{kk]ztf}{{tlridc\lddultekd]bZdc\llkSKJtlllksmttlksVZ[f]cllkUTSlks\[b\[btt{\[bult\[bVTL\[bJHFUUY[TTdc\UMR\[bd\\UTS[[T[[TVTLMRK\[[|ztllttsekdd\\b[USKJUTSSKJ\[[dc\lldttsllkj]\d\\leklddUMR[TT{tt\UZleklldtsld\\VTLkd\[TTuzt[[Tddcu{{{ttd\\JHFmtt[TTldddc\\UZtts{u{u{{SKJ\UZ[TTVTLUTSekdlldedkddc[TTllkddcddclridc\JHFedkttsult\[[[[Tllktslf]ccbV[TTkk][[TlldSKJSKJtlltlld\\fkkd\\sretslllkVTL{||{{t[[TVTLUTSd\\ldd[[Tdc\tllrg]]bZttskd\ldddc\d\\[TTztlJHF*)(||{{ttzl{||tll|llk|zttstll|tt{ldd}b[U{||ddcllk[[Tultlksultu{{{ttd\\JHFdc\VTLek]lld{{t{{tlddldd||sre|||lri||ddc{||{{t|u{{ddcddcedk{u{{u{tsl[[TJHF[[T\[[ddc{u{lddultkd\f]c[TTddcd\\dc\cbVlddultuztkk]b[U[TT[[TVTL\UZtllVTLb[Udc\kd\redlldVTLb[Ulldtzl{||tllekddc\lldtll{{tlddztltsl]bZlrilldlddttslld{||\[[UUY]cdedktt{mtt\[b]cd\[bUUY\[bmttlkslksUUYfkkUTS]bZUMRJHFUMR:97JHF:97UTSUTSJHFllkllkVTLSKJllk]cdcbVLKRb[Ub[U[[T\[[SKJVTL\[[dc\lriddcVTLdc\llkf]cllklddlldlddUMRUTStts\[bkd\VTLllkJHFtllbVZuztttslddddcbVU[TT[TTUTSJHFJHFddcUUYUMR\[bJHFJHF[TTdc\d\\ekd[TTUTSJHFVTL\[[]cdD;9f]clld]bZd\\VTLSKJVTLJHFllktt{|uekdUTS]bZdc\JHFkd\[TT[TTtll[[TVTL]cdb[U[[TSKJVTLdc\lldFD;[TTUTSSKJJHF[TT[TTdc\dc\b[Ulddd\\VTL\[[bVUd\\jcVkd\}JHF-1+{tt|u}{tttts{||{ttttsdc\uztllkttsu{{tts|zJHFedkleksle\[[sleek]llk\UZf]c{{tf]cedkSKJtts{ttlddlrillddc\\[[]bZ{{ttslUTSldd{u{llklksfkkllkultkd\[[TUTS]bZ[[Td\\tllUTSddctts\[[\[[dc\VZTJHFJHFJHFFD;UTSVZTVZTtllredd\\VTLVTLdc\kd\UTSd\\kk]dc\ddcUTS[TTdc\bVUcbVJHF[[T]bZtllb[UJHFd\\tllb[Umtt[TTUTS\[[VTLb[U[TTdc\VTLb[U[[Tddc[TTUTS\[[cbVVTLddcf]cf]cUTSlksllkVZ[]cdultmtt\[[edk\UZJHFLKRUMRJHFLKRUTSJHFJHF)+2:97F=CF=CJHF:97D;9d\\d\\VTLdc\VZTLKRJHFUTSJHFFD;JHFFD;UTSMSStllMRKUTS\[[UTS\[[\[[[TTf]cSKJSKJD;9JHFUTSUMRlddVZTUTSlekdc\lks\[[[TTddcF=CSKJFD;UMR:97JHF:97:97MSS:97\[[UUY\[bllkult{||JHFJHFFD;>B9>ECJHF:97JHFLKRUTS\UZ[TTUMRMRKd\\VTLJHFekdlldlddJHFF=CFD;MRKSKJSKJlldlddSKJllkUTS[[TJHFJHFD;9D;9:97:97>B9:97>EC:97D;9:97JHF[[TSKJSKJlddJHFFD;\UZJHFJHFSKJSKJSKJ*)(ztl{{t||{{t{tt{ttllkdc\lldldddc\[[TJHFedkdc\ddcmttlkstts]bZllklddtllultVTLMRKJHFUTS]bZ[[TUTSJHF\[[UTS\[[tslbVZllktsl[TT]bZ]bZFD;JHF>ECJHFJHFJHFVZ[UTSddc[[Td\\UTSVTLd\\SKJ\[[\[[UTSVZ[JHFJHFD;9dc\JHFJHFUTSSKJUTSJHFJHFd\\JHFJHFJHF:97UTSJHF:97FD;JHFVTLJHFJHFJHFdc\[[Tkd\JHFD;9JHFJHFJHFFD;FD;SKJ[TT[[Tldd\[[JHFddc\[[lldd\\[[Tddcllddc\VTLFD;JHF]cdllkddcldd\[[[TTd\\]cd\[[]cdJHFLKRJHF]cd*)($:97*)(*)(?;C:97:97*)()+2:97:97:97:97UUY3+**)(74,!*)(*)(*)(*)(*)(74,*)(*)(*)(JHF*)(:97*)(:97*)(74,3+**)(*)(3+**)(*)(7-2*)(:97*)(*)(*)(:97*)(,55*)(*)(*)(*)(*)(*)(*)(:97&&%&*)(>EC-1+%&FD;)+2LKRLKRUTS?;CJHF*)($*)(*)(,55*)(*)(F=C*)(*)(*)(*)(*)(74,:97-1+*)(*)(*)(:97:97JHF*)(74,-1+*)(*)(*)(74,3+**)(*)(&&*)(*)(*)(!*)(*)(*)(*)(*)(*)(*)(*)(:97*)(*)(:97*)(*)(D;9:97*)(-1+VTLSKJFD;\UZ[[TJHFSKJJHFLKRJHFSKJSKJ3+*:97:97JHFJHF74,:97LKRUTSMRKMRKJHF:97*)(:97*)(:973+*:97*)(:97:97JHFLKR>ECJHF,55:977-2*)(-1+74,:9774,-1+3+**)(*)()+2*)(*)(*)()+2:97JHF:97,55*)(*)(*)()+2*)(*)(?;C*)(74,:97*)(:977-2*)(JHF*)(&&*)(*)(3+*:97*)(3+**)(*)(*)(*)(74,3+*&&&&3+**)(*)(&&-1+*)(*)(*)(SKJ*)(*)(:97*)(D;9:97:9774,74,*)(*)(>EC*)(:97*)(*)(*)(*)(*)(*)(74,*)(-1+,55,55:97)+2*)(,55:97:97:97LKRJHF?;CUUYf]c\[b\[b\[[[TTSKJUMRJHFllkUTSllkJHFMRKVTLUTSJHFF=CVTLJHFFD;JHFJHFUTSJHFJHF>ECJHF>ECJHFJHFJHF:97LKR:97F=CJHF:97D;9:97:97:97:97FD;:97:97:97JHFF=CLKRJHF\[b\[[MRKMRKdc\]cdLKRek]UTS\[bMSSMRKJHF\UZJHFJHFVZTMRKJHFMRKJHFJHFJHF:97:97:97:97JHF>B9JHFMRKJHF:97D;9UMRVTLJHFFD;VTL[[TD;9JHFFD;>B9:97:97>B9D;9FD;JHFJHF>B9D;9:97JHFD;9FD;UTSSKJD;9FD;SKJD;9SKJJHF[TT[TTJHFJHFVTLVTL:97[[Tdc\VTLllkbVZf]cek]>B9VZ[\UZ>EC\[[VZ[UUY\[[\[bLKRVZTfkk]cd\[[[TTUTS>B9MRKMSSJHFSKJddc[TTVTLVZ[UUY\UZUMR\[[MRKllkVTLJHF:97SKJ[[TVZTJHFJHFVTL\[bJHFMSS[TTLKRJHF:97JHFD;9:97JHF:97JHF\[bf]cJHF:97VTLJHFJHF>EC:97>B9JHFSKJ:97:97SKJJHFJHFJHFJHFFD;SKJD;9MRKJHF74,JHF:97:97JHFFD;UMRD;9SKJbVUFD;MRKb[UJHF:97UMRMRKMSSLKRFD;:97FD;JHFekd:97JHFUMR]bZJHFUTS:97JHF\[[LKR\[bLKRMSSJHFLKRMSSOS`OS`JHF|ztlv{tsl}Ĥv}ult}wlztl}[[T\UZ¿¾Ƶ}Ʀü||}||lks)+2?;CLKRdc\ultd\\7-2>/Att{\[[f]c]bZ!:97%lrilridc\ddc:97SKJlddlldSKJ|:97*)(JHF[[TLKRJHF\[[JHFSKJVTLldd{u{f]ckd\]cdddcred{zmSKJVTL3+*:97%JHF\UZlld7-274,%&$VZTuzttll[[TUTSMSSVZTVTLVTLtlldc\tll[[Tddc[[TJHFJHFUMRekdddcUTS74,@/7 74,73FD;VTLRP:tslredbVUVTLD;9MRKFD;FD;D;9C8.]bZ&&&&3+*FD;D;93+*3)D;9dc\VTL3)FD;%&&0FD;SKJD;9D;9VTLdc\[[TVTLjcV||SKJ>R.VTLJHFGSu]cd|z|zlrityglldsreD;9SKJsre{{t|u{ttlddf]cMRK}{tttllek]f]c[[T]cdUMRD;9UUY"%VTLFD;JHF\[bf]cMRKfkktsllri[[T ,55-1+>B9VTLUMRD;9VTLVTLlldSKJ\[[sre{||VTLd\\{ttSKJfkkJHFD;9SKJsleVTLcbV>B9VTLVTLyledc\3+*"FD;FD;d\\D;9Q?@SKJ >B9*)(:97*)(]bZ7-2SKJ3+*dc\zllUTScbVJHFlldtslJHFlldf]cJHF\[[LKR%&-1+,55{{VZ[llkUMRlks]bZJHFF=CLKRf]clddlek\UZf]cMSSSKJf]c>ECf]c74,[[T]bZVTLttstll|]bZedk{u{[TT{ttUTSLKR\[bUMRJHFVZTUTSJHFJHFVTLdc\lldultVTLtlldc\uzt{ttSKJSKJSKJ74,UTSf]cf]cJHFkk]JHFD;974,*)(>B9*)(JHF3+*fkkultUTSJHF\UZUMRVZ[[TTd\\lriowd\\uzt]bZtsl\UZLKRultuzttts\[[lddFD;-1+FD;>B9%)*)("*)(FD;SKJFD;j]\UMR[[TFD;SKJ:97C8.D;9D;9SKJFD;JHFFD;JHFtllUMR:97SKJb[UVTLFD;JHFVTLD;9F=CPF=JHFD;9D;9SKJJHFVTLJHFvu|u|vlricbVJHFtsl\[bSKJ7-2[TTuzt|lldllklrib[UJHFb[Uultult[[Tlek{{tlldSKJ\[b{{{{tj]\tllultekdSKJSKJ\UZD;9ldd\[[[[TekdF=CVZ[JHFdc\uztultlri:97]cdfkkMRKJHFttsddc\[bJHF[[Tdc\]bZlriUTSddcVTLSKJUTSf]clri[TTztlb[UVTLVTLlldVTLVTLlddd\\cbVSKJMRKVTLkd\{ttb[UUMR\UZFD;*)(:97[[TFD;[TT:97>EC:97[[TJHFFD;sle[[TMRKVZTSKJVZT\[[>EC\[[UUYUUY>EC>ECJHFJHFUUY]cdJHF\UZ]cdlksddc>ECedkJHFddcj]\UTS\UZ\[[edkbVZf]c\[b[TT:97D;9[[TMRKb[Uek]VZTUUYJHFUUYVTL]cdd\\f]c\[b\[bD;9lriMSSSKJd\\[[T[TTsle\UZ\[[UTSb[Ullk\[bSKJtll\[[SKJSKJ*)(UMRUMRSKJJHF&&3+*:97JHF74,:97JHFLKRSKJf]c]cdf]c]cdedkVTLb[UVZTmtt[[T[[T]bZ[[TUTSu{{ddc{{t{u{lksf]c]bZ]bZVTLlri&&&&SKJaWM[TT[[TVTL[TTb[UFD;3+*FD;FD;VTL74,D;9VTLSKJ[TTd\\[TTD;9SKJJHFdc\JHFJHF[[T[TTJHFbVUUTSaWM[TTVTLtllllkSKJtsl{{t{zm{u{kk]]bZ|zMRKdc\VTLJHF%UMR{||ttstts\[[|tzlrfklddult{||ekdlddldddc\ddcb[Umtttt{ldddc\{ttultlriUMRUUY|dc\lekmttVTL\[[F=CMRKVTLfkk{u{{ttMSSMRK\[b:97ekdb[Udc\ult\[[:97dc\JHF[TTMRKddcu{{dc\j]\d\\[TTllkSKJkd\j]\d\\tll[[TlddmttVTLlldVTLJHFFD;D;9SKJJHF[TTddcD;9D;9*)(FD;b[U:97SKJsle:97SKJVTLddcVTLlld{||VZTddc{||llkF=CultlrimttJHF]cd>ECLKR:97MSS\[bMSS]cdVTL\[bddc>ECSKJ\[b\[[{||}JHFddcbVUulttts\[[FD;:97VTL3+*JHFVTL:97d\\:97]bZdc\ekdddcUMRLKRD;9[[T[[TJHFf]cbVZkk]tlldc\zllSKJb[Ukk]edkf]c{u{lek]bZUTStt{f]clddUMRUTSSKJJHFVZTFD;VTL:97FD;FD;lddJHFv{fkkVZ[VZ[\[[slelldlkslriJHF[[Tkk]\UZdc\VZT{ttVTLlks]bZ[[TJHFJHF&&
6&&3)[TTSKJbVUkd\f]csleSKJ:97FD;&&FD;PF=FD;VTL[[T[TT[TTb[Ured:97[TT[[TVTLFD;VTLJHF[TTVTLf]cVTLSKJVTLD;9lldbVZJHF{zm}{ttlddMRKmttiq]zl|zUMRVZTJHFSKJ|tt{d\\lkstts[TTJHF{{tlrid\\[TT[TT]bZ[TTddclldlddlldSKJJHFedkUUYJHFlekJHFUMR[TT\[[{zmUTS\[bMSSVTL]cd{{UTSekdSKJLKRddcSKJllkJHF[[TFD;]bZlek]bZek]\UZVZ[UMRkd\lddztluzt[TTb[Ulekd\\{u{FD;VTLmttmttllkSKJMRK74,D;9VTLVTLb[USKJbVZ[TT&&PF=VTLVTL\UZek]>B9D;9tsl\[[ekdkk]mttdc\llk{ttllkSKJ\UZ{{llk\[b]cd>ECLKR:97LKR{{|z\[bf]ctt{MSS\[bVZ[LKRttslldj]\iWUUUYldd[TTf]cf]cJHFJHFJHFFD;JHF[TTtlldc\FD;JHFbVZlldlldddcJHFUMRSKJSKJSKJJHFSKJ{ttSKJkd\ulttll[TTSKJ{zm\[[ult{ttj]\cbV]cd\[bJHFf]cv\UZkk]jcVVTLMRKVTLsreUMRFD;UTSlekllkUMRUTS]cd{u{{{tddcu{{]bZuzt[TTsred\\b[UVTLVTL{ttVTLf]cFD;74,VTLVTL>B9 :97*)([[TD;9SKJVTLkd\d\\VTLredb[UPF=FD;sreVTLjcVek]UMRldd[TTUMRlddSKJkd\b[UFD;D;9SKJdc\JHFtll[[TSKJ74,SKJlldf]cLKRuslev{JHFVTLsreFD;ZbNlldf]cmttUMR{{ekdttsttstll{|||{||ultsleek]llkdc\ddctlltllddcd\\\[[mtttt{\UZUTSJHFb[U\[[{{JHFUMRVZ[UTStslu{{{||\UZ\[b[TT]cd>B9FD;f]ctt{:97\[[VTLdc\[[TlritslMRKFD;[TT[[Tredtts{zmdc\UTSd\\SKJSKJD;9VTL]bZrfkttsFD;!D;9VTLJHF\[[SKJUMRVTLJHFSKJj]\d\\D;9i\VJHFD;9ztlUTSlek[[TekdVZTekdlddtsllekd\\]cd{{tbVZJHF\[b>ECLKR]cdlkstsl{{mtt{{f]cJHFUTSultlddVTLUMRf]c\UZf]cv{lekUTS]cd>B9MRKVTLVZT{{tlekfkktlltts{||]bZF=C74,SKJddc|lldlekf]cdc\zlltll|ubVUb[Ulekd\\tllultddcSKJSKJf]cUMRldd\UZSKJD;9JHF[[TVTLSKJVTLVTLJHF}}{{llk]cd[TTd\\sleultleku{{|tslf]cVTLFD;[[Td\\UMRD;974,MSSVTLFD;%>B974,MRKJHFj]\kd\FD;UMRcbVjcVkd\ztfcbVC8.VTLFD;VTLek]VTL[TTkd\PF=JHFVTLjcV{zmd\\PF=FD;SKJ[TTSKJbVUVTLcbV]bZtslek]JHFzllf]clri]bZztl|g\rq^è|~tllultuztddcf]c{u{{tt{{tuztutllultfkkf]cSKJv{dc\{u{ddc}JHF{{lrid\\|z\[[UTSUUYlksJHFddcD;9edkVTL:97lld||{||ttslldldd[TTUTSj]\b[UVTLSKJ:97{u{lddSKJrg]b[Ullkllk{{t{{D;9JHFMRKVTLUTSuzt[TTddcD;9:97sle[TTdc\SKJHR>SKJrfktslmttJHFdc\ttslrilri|z|lek{{t~MSSmtt^fsfkktt{mtt{{\[b{||[[T\[bultkd\\[bVZTmttlek~mtt{{mtt{u{JHF[[Tdc\|llktlltsluzt{u{ultllkJHFUMR]cdcbVVZTddcF=Cb[U||tlltlllddlld{{tdc\mtttll}zlldc\d\\SKJ[TTlekrfkbVZwlaWM74,JHFlriD;9ddctllekdttszllu{{u{{VTL{zmb[U{{u{{tllutll]bZ]bZztlcbVultUMRF=CSKJiq]MRK3+**)( *)(JHFredsleb[Ub[Ukk]cbVtslVTLFD;ZbNdc\jcVztfFD;]bZbVUtslb[UVTL[TTtsl}VTLZbNkd\rg]j]\{tt|vcbVFD;tll|z>B9SKJ}}]cdjcVmttkk]ekdultǜË{{{u{{||}ztl{{|uttsllk\[[b[U\[b]cd|z{u{\UZ]bZlkslld}{||llkVZTMRKF=C>ECrfk[TTMRKttsJHFlddllk|mtttllj]\redUMRJHFSKJcbVVTLFD;ek]dc\j]\lldJHFlekttsuzt]bZSKJ]bZult|u[TTUTS]cdVTL[[TsleVTLD;9aWMVTLtll{{tuzttsl{||lri|zzlllksOS`]bZlks]cdtts\[b~\[bddcUTS{||||{ttddcedkzllf]c{{fkkUMRttsJHFllkVTLlddztl{ttttsdc\lri]bZddcttsVZ[JHFrfkf]cllk[[TSKJ}lddrfkjcVslekk]lld|||SKJ{{UTSv{\[b[TTb[Uuzt[[T\UZkjVJHFD;9VTLllkbVZ{{ddc\[[\[[|lldddcrfktzl{||b[UFD;d\\VTL{ttd\\UTSFD;\[[FD;&&%74,>B9uzt{tt{yfztl{zmb[UaWMSKJVTLJHFVTLVTLVTL|zkk]VTLkd\lldbVUSKJ[TTkk]sleaWMVTLkd\SKJj]\tllutd\\ulektslVZ[SKJzllv}aWMtts]bZUTS|}}]bZdc\|d\\ztl|tts{zmj]\f]c{tt}\[[\[bf]cf]c}|||mtttyg{||UUYtt{ttsllkUMRUMRnv\[[}ddctt{{{t{{t\[[lddUMRredkd\lldaWMb[Urfklddsletllldddc\lldvUTSJHFuztv{tllkd\||LKRJHF]bZb[UuMRKUTSkk]JHFbVUdc\{{sleult|ztts{{t{{tulttts]cdMSS>ECMSSlddmttf]c}ult{{t]bZdc\f]cSKJf]c[TTleklrif]ctts]cdD;9MRKFD;[[TSKJbVU[[T{ttlld|\[bekdlritslUMRlldttsbVUtts}|||ulldiq]{tt||lkslektll|vFD;JHF\[[dc\ultlri}llk{||tts{{{{b[UztflldddcUUYiq]zlluddctsl]bZf]cultf]ckk]\[bC8.D;9]bZJHF!FD; 74,VZTtllwllddwl[TTSKJrg]C8.dc\sreaWMaWMPF=JHFFD;{ttSKJSKJ[TTVTLek]i\VSKJVTLVTLSKJ|ukd\VTLsrellktsl\UZ3+*}||zrr]tzlrg]ekd|zlldvut!VTL{yfu{{|rfk[TTlri|uj]\|zLKR{||tt{|FD;}||lks}ultlri{||lrif]cuztedklksf]ctllttsllkUUYVTLdc\dc\SKJ[TTd\\llk{||||SKJsle\UZf]cylemwrg]ekdddc}VZ[JHFVTL{{tslekk]tll\[[ekdd\\VTLb[U{ttSKJkk]kd\{u{|uldd{zm{ttu|z{ttlldultyltzlddcMSS\[bMSSUUYddc\[bMSSlks{{mtt\UZlld{{tsl{tt||f]c]bZ~ultfkkztfMRKMRKtt{SKJr]ZVTLj]\sle{{tlkskk]ttsdc\JHF]cdlritll{tt||ztllldtts}|f]cf]culti\Vfkk]bZultkk]SKJ>B9VTL|tsl{{mtt]bZdc\{zm\[b|ztll|tt{f]clri}|tllek]JHFsleJHFaWMJHF*)(:97!JHFbVZd\\j]\sle|ubVUVTLsleaWMztfztfHI/VTLFD;jcVVTLVTLSKJSKJJHFkjV}VTLd\\d\\bVUSKJztl[TTkd\VTLult{tt>EC:97{||vvu|v{{||}*)(&&nddc|}||VTLD;9tll|u{{||SKJtzl{zm\[[ztf}{||VTL[TTb[U{{tztl[TTSKJUTSMRKf]cUMRllklddultlekddcztld\\VTLwl\[[rfkkd\}|{||b[Ukd\red{u{iq]|u[TT|tslekd[TTJHFD;9[[Td\\|usle{||JHFVZTdc\kk]VTLVTLVTLjcVd\\{{t]bZ{{t{zm||z}||lek{{tsl{u{{u{>EC>EC]cd\[[\[bmtt\[b{{ultFD;d\\lkslld[TTlekUMR|{u{ult~mtt[[TVTLllkSKJztlredlld[[TtsluztVZTJHFFD;lri}f]cbVZztftzlred~{zmsleFD;sletsl{u{ddcJHFUTSSKJf]crfk\[[d\\JHFJHFlldMRK|ult{{tll{u{{{ekdsletslmtt}|||}|z|zzl||lks}UMR\UZlekb[U\UZJHFVZT?;C3+*:97SKJ|u}ztlrg]r]ZcbVd\\SKJi\VjcVcbVcbVVTLVTLaWMztl[TT[TTsrejcVredb[Utllred{ttredrg]cbV[[T|\[[:97{u{Ɣ]bZ{{|lks}|dc\iWUred||tslredcbVf]cfkklri}|lri]bZldd\UZj]\lddllduttslekSKJUTS\[[{u{rfkbVZJHF[[Tllduztwld\\[[T\[[tll|u||{{tlldf]cutb[UUMRztlbVZ}JHF[TT\[[uztdc\|u}\[[srelddkjVnVTLaWMj]\VZTllkd\\ekd}{u{{u{[[T}{u{f]cMSSn{{~ttstt{\UZJHF\[[|z|zultlekf]cvddcekdJHFmtt{tt}|{tt{||SKJkd\|ztzluztkd\j]\F=C\UZSKJ{||{u{kd\uttlltllult{u{ztlwl\[[{zmuztl[TT\[b\[[\[[llklri}UTS\[[tll}|mttiq]FD;]bZut}ddcVTLddckd\{tt\UZtsl||tyg|f]cUMR\[bd\\|VTLUTS>B9JHFUUY3)JHFj]\|u|uslecbVdc\jcV}aWMSKJb[Udc\rg]nrg]d\\rg]lldb[UztfaWMSKJlldd\\||VTLdc\j]\¿VZ[JHFtslu{{]bZ}~^~Y3+*}|zVTLiWUyle|z}|slesle|}\UZ]bZ|ztzl{{llkmttj]\dc\{{ttsltts\UZttsJHFSKJd\\lriult{u{{tt||UMRd\\ut{tt}lddldd[TTut}ultkd\lddttstllUTSSKJUTSddcb[Ulri|z}lrisresreJHFldd|{zm\[b{u{f]clrilri{||uzt{{{{uzt}\[bJHFVTLfkk|z{{tult}lriwl{u{tsltygmttlriVTLmw~sle|zbVU{zmVTLf]cbVZldd}|v{zllf]cSKJutult}zllllkcbVkd\{||b[U}}SKJSKJllk]bZekdd\\f]cFD;VTLaWMcbVj]\ddc{u{\[b~d\\ekdFD;|z}|}}tt{D;9lksJHF:C+MSSJHF MRKttsi\Vlld{{tkd\f]crr]rr]ultzllkd\VTLrg]VTLrg]j]\|uj]\FD;sletllu\[[{yf[TTUMRaWM}|VTL|u|u¾UUYJHFnVTL}JHF{{LKRr]g|zkk]kk]|{||d\\lld{||{tttsl}{||]bZ{{redtts|ldd{{lek]bZbVZlks|{{tllk|||z|u{tti\Vredd\\|j]\\[[tsl}[[T||lks\UZtt{slev}|z|uf]cuztek]ztlkk]tslSKJ\[[{zmztl}{zmuztfkktt{{{tts[TTUTSlld[TTtts|mtt]bZtt{ekdtslllk}mttd\\UMRekdtlltllleku{{MRK]bZ|kd\|zkd\wlcbV|ztslekdlddttslldyleultzll{ttutSKJzllttssle{tttslldd|{ttultlriuztVTLJHF[[TUTSFD;JHFkk]rg]|ztsl|z|z{tt{{td\\tt{fkkVTLredtts[TT\UZ:97SKJVTLFD;:97%:97\[[dc\llkztlb[UjcVd\\kjVd\\aWMdc\VTLPF=SKJylelddVTLSKJVTLdc\{zmrg]{yfrg]bVZjV[zllwl{{t|u||\[[74,ldd}rr]b[U}j]\lj}:97SKJztlnjwl||llk~{||v{kk]{{||{zm}{ttmtt[[Tf]cldd}{u{tllmttllk}tts{{tsl|VTLut|z{||rg]}{||sleVZTFD;red|vztfsle\[btsltts{ttldd[[Ttll||u\UZultlldkd\cbVztlj]\bVUlriuzttsl|}{tt{{JHFiq]llk[[T{u{{{|mtt{{ttsekdVTLddc|ttsj]\~ddc{ttf]c{||]bZMRKmttu{{|z}{||tslllk|utsltts{tt\UZ{tt|bVUllkredrg]}ut|v{ttutbVUd\\VTLtllttslks}}¾Ɯ|f]c{ttdkVkk]jV[llkf]c{zmfkkVTLzldkV}|UTSekd:97r]gUTS:97ultedkJHFD;9dc\,553+*[[TD;9JHF[TTUTS|u}{{t||zll{zmutrg]rg]kd\SKJVTLVTL[[TVTLVTLldd[TTVTLsreusreiq]VTLsleutred||lldwlztl|\[b:97wl{tt}|}zlJHFjcV.1SKJŲultf]clldv{||v{|tll|u|z|wl{ttrfk}ultlritsl}tzllrilksSKJf]c{tt}UTS|zred{||v{tslutb[Uztl{||[[Tzllkd\i\Vldd}ultuzt||tllb[USKJ[[Tllkv{yleldd~[[TMRKkk]d\\SKJkk]j]\}{{tult}|tslu{{uzt{||v{{u{{{|LKR\UZlddllk{{{{lksnvmttUTSVTL]bZtt{llktll}}|tslMRK]bZ]bZiq]]cdtzl[[Tsre{zm{{t||ztts||rg]f]c|v{dc\llkSKJv{{tt}llkztl|ztslztf}j]\rfk}sle\[[ultekd{{{{lrizlJHFtzltslyle|b[Uuztlrilrilld|ztt{]cdlrisreztlf]c{{tll*)(SKJkd\VTL3+**)(D;93+*JHFJHF{{tztl}ztfVTLSKJjcVVTLSKJb[UVTLkk]jcVwlj]\kd\i\V[[Tkk]u{{ttslZbNzllr]Zzllyle[TTkd\{{tLKRLKRf]c}}tt{j]\JHFUTSldd]bZ|u|z{{tred[TTslemttmttuzt{{t|z{{t|{{{{t}{||{||ultlld\UZllk{||lddb[Ud\\v{uztutlri{||dc\jcV{{llk||{tt\[[kd\{ttb[U|tsl||sleSKJr]glldf]c\UZVTL}|{{tVTL{ttlksSKJtsl[[TJHF{{tlrimttuztuzt|z|ultllk{{{{lks{{}|edk{{|{||sleddcddclld|f]c{tttslVTLVZ[tzltsl{ttddc||z}ut|mwUTS{{tslelekv{}}ttsutsre\[[b[U{tt}{{tslelksd\\ldduztmtt}[TT|zttsJHFz}llk|{{\UZek][[T||tlllks|mttSKJzllekd\[b?;CFD;"[TTslei\VsleutVTLrr]bVUPF=VTLjcVd\\lldVTLsrelddi\VVTLSKJwlzl}|lrirg]b[U{ttbVUut|v|ukk]|zVZTUTSult}zrg]uj]\j]\bVUMRKSKJ{ttutztl{{t|z}|usleu{{{||{ttu{zm{tt|{||}{ttlri|uv{d\\lek\[[]bZ[TTf]c}uztbVZ||wldc\lddd\\{zmtlltsl{ttj]\ztfkk]SKJ}|{tt{ttJHF[TTd\\ultekdJHF[[TSKJ\UZdc\dc\SKJVTLultult|uu{{{u{||z{tt\[b\UZultlksu{{{u{kjVu{{\UZJHFj]\]bZ]cd\UZ{tt}tzldc\{{t{||sre|z|uredf]cSKJllkf]cVTLJHFSKJbVU~ylebVZFD;kd\{yfd\\{zmzll|rfku{{d\\r]g{{tf]cJHFultf]c]bZ]bZek]{{t\[[{{{{llkf]cslett{edk{{tldd|u|jcV{||ekd\[[VZT[TTF=CFD;74,lldf]ctllwl|utVTL[[TVTLb[UVTLb[Ulrikk]bVZddcSKJsle{ttVTL{zmu|ztsllldlddtllv{rr]wlztf{{twlfkkMRKtts}|tzl}jcVVTL|zF=C?;C}tslsle||z}u]bZ|{{t||rfk{u{tsllddekd||d\\}lldllkbVUzll|z[[Tsreultulddtslwl|u{{ttslf]cekdPF=bVU}j]\[[T}lddtt{f]c{tt:97lldUMRultekd]cdVTLbVUbVZfkk|ztltslSKJ{tttsllri|u{{lrifkklkstt{JHFVZ[g\rmtt\[b{{tt{d\\[[TVTLVTL{zmcbVtts{u{bVU{u{uztVZTttsuztuztlddf]c}[TTtslMRK[[T{{v{d\\||tslf]cutrg]VTLkd\{{tlek[[T}tygllkljVTL[TT\[[|zldd|dc\lriedkekd]cd{{\UZ[[T}|uzt{{tmttttslriVTLslelldr]ZD;93+*|zkd\{yfFD;JHFSKJjcVMRK|u|dc\utkk]SKJtsl]bZbVUkjVsre[[TtllD;9aWMslesreultj]\sreusreredttsutultwlu{{t]cdMRK\[[{ttldd]bZ]bZzllwl|}||SKJFD;}u{tttll{{t}|tll|||zred{||cbV]bZ{u{ztl\UZ}|z}{||tsldc\{tt||}slekd\ultsleztlult|vtll{ttllktllredUMRtslVTLtts{tt{ttekd]bZaWMredllk|kd\u|u{||ultlek{{ddc]cdf]ctsl{{lks{{j]\VTLFD;[[Tldd|ultllk{||lri|{{t{{t{|||zd\\tzl{{t|zu}[[T3+*lektllyfltsld\\ldd}|ut{ttwl{u{VTLcbV}||[TTVTLVZTuttsl{u{{yfmtt\[[{u{kjV}|tzl|lkslldkd\llku{{|ztt{VTLusleJHFbVUUTS:97UTSD;9VTLiq]JHF%PF=b[Ulekrg]}|z|||utslkk]kjVVTLdc\llkdc\JHFb[Ukd\[[Tb[U{ttwlwlvtsl{zmred|vsle}}\[[JHF}ultdc\dc\kd\VTL}{{[[Tdc\b[Ukd\lri||}tzluzt|zsretllr]gzllri|u}}|zttsVZT}|{{tsl[[T|u}||llktll|tsl}}lddredaWMtllcbVJHF[TTult{u{j]\UTSllkztl|tzlkd\ult{{tztltslkk]|u{||lkscbVmtt}lksJHFuztmtt|ulttt{{||mtt\[[{zmSKJMRKlekultult[TTlritsl|ztsllri{tt||zdc\b[Uedkrfkred[TT}}v{[TTkk]|uutwv{lld||SKJd\\tll{||j]\mtt}tsl{zmztl|z}f]c]bZu{{{tt||ztlredu{{tslu|z|UMR7-2SKJFD;MRKLKRtt{3+*73JHF[[TutsledkV[TTPF=VTLFD;bVZu|u{zmtsl]bZ{||i\VztlSKJedkwl|zr]Zljzll|vlj|u}|v{[TT:97tsluuzt\[[}|lld]cd~f]c[TTb[Uyletzl{{ztl[TTbVU|{{tddclrisreVTLtllultkd\u|z{zm}lritzl{tt{{ttslkk]}redtslutztllri{zmaWMujcVd\\SKJVTLkd\{u{\[[lri{{tf]cSKJ{{[TTrfktts||lriyfllek{{tult{ttsresre{zm}sretll{||lrikk]{||{{tultf]cVTLVZ[|z]cdmttllk}ttsdc\MRKjcVtslztlultf]ctslult}dc\|zVTLttsult|||uztliq]lriSKJu{{UMR|zSKJf]c}{||}f]csre{u{ldd}ultuzt\UZVTLlrilld{u{ddcek]lddkk]b[Usle}\[b{zmztl{|||z}]bZu}|zttsmttlks[[TVTLFD;74,UTS3):97iq]dc\|z{{tVTL|ucbV[TTVTL|zsle\[[VTL|uztl}|edktllwl|utsllldd\\d\\}|ztl||u{zmuv{UTS*)(ztfVTL|vlriVTLllkr]Zb[U:973+*rfkyfl|ubVUVTLFD;red|ultult{{ttslv{lrilksuzttt{}zedkaWMek]|uztfzll|tll{ttwlkd\rg]sle}|ztllrir]gSKJf]cb[Uekd|u{ttd\\UTSulttslsle|kd\uztlkskd\SKJlld|zlld{{tzllldlld}ddcf]clksJHF]bZmtt\[[tt{}{{u{{bVZFD;tslddclld|uu{{lks{{t|{{tuztekdUTS~ztltt{uzt{{tztl}kjVuztultjV[|vjV[v||utf]c{{tcbV|{||ztfultb[UttstllddcMRKlriVTLFD;lld|llk{u{llkmttllktt{}lriekd]cdf]cbVUVTL>B9FD;:97FD;&&C8.{{t}kk]ultsleulttslJHFVTLVTLsre]bZVTLbVZlldlddcbVlld}wlttskk]||||}|wlbVU|usrei\V|u}>B9:97jV[bVZu{{i\Vekdllkkd\aWMVTLJHF|tts{u{sle\[[tzlr]gtslldd|z||||lri|z|SKJ}{|||zkk]tsl|}VZ[|{zm}ztflld{zm{||}SKJb[U|[TTredzllztlldduylelj{u{tll||llktllultb[U{{JHFtsl{||lriuv{]bZ}|}u{{ttswlsle|ulld}ztl}|udc\ekdrfk{{mttF=C>EC]bZf]cdc\\[bVTLVTLUTS|ui\VF=Clldiq]dc\[[T||{||uuztuzttsl]bZredult|rg]f]c[TT|v{}|z|uv{}|{zm||redbVUUTS{u{lld|||lri|zkd\d\\kk]u{{ult\UZtts\UZtt{u{{{||lrilld>EC%FD;74,FD;SKJVZT3+*&&C8.yle|z|||z}JHFJHFlri]bZVTL:97VTL{u{tzl}lddrfkllk{zmlri|VTLrfk}|v{u{}utztfMRK*)(ut|z}{zmJHF|zllkuztlekttsi\VD;9D;9}{{cbV[TTedk||b[Ulrikk]ddclldVTLekdSKJj]\F=Cj]\{{sle]bZlld{zmrg]ddcf]cj]\j]\ddcldd}tzlztlsle}ut{||~fkk}|tslmttf]ctslUMRSKJlksslef]clddddc{{tslttslriuzttslzl{||utsre||uztVTLtllultddcedkekdLKRu{{lkstts{tt{{j]\MRKVZTrfklektsluzt}ttstsllkstts|lld{||ldd~}mtt{{lek||tts||wlb[U\UZtllrfklddv{|z}j]\|uSKJ{{JHFddcredulttt{ult{zmultlddutlldllk]bZ:97aWM3+*C8.Q?@F=C%&&&tlllri{zmVTL||VTL|ztl{u{JHFVTLlldJHF\UZ[TTtsllddtlld\\tts[[Tsre[[TVTLkd\kd\}rg]}sleutMSS:97tsl|wlekdJHF|ztt{uztdc\|rg]74,bVUUTS{||ddcekdlritsl}slellkVZ[{tt\UZ{|||VTLSKJ]bZFD;[TT|zmttrg]ttsd\\rg]}|{ttkk]tsllldtslv{{zmkd\lddmtt}}{u{f]cultUMRztlultj]\}kd\llk||lri{||ttsf]c[[Tsre{tt{||ttstsl{tt{||}lek{ttuztMSSmtt{u{ek]{u{{u{f]ckd\lddd\\SKJtslf]cdc\{{t[[Ttllf]c\[[u{{mtt{||ekd|vkd\|u{ttVTL[[TVZTlri|u}|{u{tsl{u{{tt|u|zllkultlddslej]\{u{j]\}tzl}UMR[[Tj]\{ttultf]c\UZslerg]f]c{ttvfkkf]ctsl\UZ}{u{{{:97lldmttF=CFD;>B9FD;|zj]\|z|zwlsletzlaWMrfk[[T[TTlri{zm\UZlddcbVtsllldSKJttsttsVTL[[Ttllsre[[Td\\{zmrg]lldrg]||v{zmJHF3+*{{trr][TT||llk{{t|uC8.JHF{{tuzt{{t}lksdkVlld|\[[|ztltzl|zlri}{u{utult{{ttslkd\jcV||usler]gyledc\d\\|ulld{{tsletllrfklddllkyleekd{u{edktzl{zmlekf]c{{VTLrfk]bZ|z[TT{u{tzlfkk{{tredlriv{lld[[Ttslzll|z{{t}lek{||{{{{{u{ttsttsfkkd\\\[[zll{u{||||]cd||ut|tslJHFmtt{{tuulttt{kd\{zmsre{u{\UZlekult|lrirg]iq]||ttsldd[TTult||lldredlldv{||kk]u{{VTLb[U\[bSKJ{{r]gUMRuVTL]bZJHF\[b{|||udc\kk]ultrg]\UZtsltzlddclddu{{tts{{tVTLredUTSUTS]bZdc\]bZrg]SKJrg]{yfkd\i\VSKJsrelddSKJ:97{zm]bZttslriukd\dc\rg]PF=bVUv{ztl}tsl||ut{||ddcb[Uttslddkd\lrilritzlutts~d\\dc\lddjcVVTL{{t{ttztltsl|ztl{{t}|}rg]mw{zm{zmredrg]v{lddredultv{fkkd\\kk]|lek\[[kd\}tll|zek]uzt}uztlri|ufkk|{tttsl|{ttldd|ulttllb[Ukk]|fkk|z{tt[[Tslelri|z{||{{tVZTdc\\UZ||llk}||ekdttstts{u{{{tttsztluztv{tlld\\sre{ttd\\}{{tldd[TTlldbVUtllutllktzl|ubVZlekllkSKJlri[TTttsd\\{zm||tllbVZkd\}]cdu{{:97{{JHFD;9|]bZ:97dc\{||rg]wlekdtslztlllkultsretts}|mtt{{{tt|z{||||d\\slesrett{}b[Ub[UcbVrg]cbVjcVwlrg]ddc*)(zllu{{lldsleUTScbV{zmHI/ultultredf]c{zmtts{{tultultdc\{||tts}||cbVtt{{{ttsutvddc||f]cUTSkk]lldVTL{{t||ud\\ztlsre||vbVUutlrilldVTLVTLd\\kd\b[U]bZ{{JHFd\\ultek]tsl||}lri]bZdc\lek]cduzt{{kd\b[UUTSult}slelekek]tsl{{tred{{t{zmj]\lkscbV{{t|zultkd\lekUTS{{ekd{{{||{||tllek]tt{}{||lldlek{{tsl||zmttf]c]cdddcztl|u|zuzt{{f]clks|{u{zllultfkktlllldsle|u{{||lrildd|ubVUttsultztf}tllrfk{{tcbV{||mtt|UTS]bZUMRD;9\[bekdzllVTL{ttedkSKJ>B9f]c{zmredVTL}}b[U\[[{{fkk{||lks{{[[Tllkdc\dc\u{{}dc\lri{zmljsle~[TT:97uztttsj]\f]cVTLbVU{{t{ttFD;JHFyflzllmtttsldc\d\\kk]lks}llk{|||z|{||uztultlritts{ttult{||sle}{zmslesreVTLtllsrei\Vwlultlldztllldtllkd\VTLSKJ|}lektslzlllriVTLd\\{ttultuzt\[[VTLrfkttsttsuztkd\b[Ulri}{zmrfkJHFJHF74,b[U{{tVTLllktslsrelriutsl|zultbVU{u{ekdmttfkk}{{u{{f]c}JHFcbVllk}{||{||lld}||z}|{{u{{JHF]bZredyllksllksreztf|z{{t{u{f]cd\\lldsle|z\[[tllztlred{tt}tllek]bVUtslv{{}|ultekdlekylelldtzl{||slemttuztMRKVTLJHFFD;FD;tzlD;9lldsre]cdJHFJHFddcaWMrg]VTLtsl|edklddlek{{llkUTSddc{tttzlult{||llkult}|{{tSKJi\V{zm{||}VTL:97v[TTjcVkk]kk]VTLbVU%UTStsl|{{tlrid\\lksuztldd{||}zlekddc\||\UZultkd\v{VTLddcleklldultkd\rg]|u{{tlddlrid\\}wlred\[[sref]c|uVTLSKJVTL|uultredfkkd\\|dc\lldlektlllld[[Tv{f]c{ttlrid\\zlllriultztl\[buztddclldrfkuztcbVllk}{||ldd}|z||}mttlks|tsl]bZ|tts}tts\UZtts]bZultlldlks|u||tlllddllk}fkklld\[blldtt{d\\dc\}|v|uedk{||[[T{{t|r]g}|{{|zrg]llk|u}||rfktt{{u{zllkd\}|tt{sretll|\UZddcek]|z\[b>B9\[[ddc\UZVTLJHFC8.JHFFD;ddcylecbVztllriztlllkddclek{ttttsllkllkttsddclek{tt|tslsrerfkcbVv|v|v|uVZ[JHF|u{{t}||{{~lldtllkk]vsleD;9UMRultsle{{tuztu{{ultutldd[[Tddctts}b[Ullk|ztslllklldlldrg]cbV|uVTLj]\{{tztlztlredd\\u{ttFD;cbV{{tultztlSKJ]bZMRKkk]}u{{tsl|zu{{}tts}ylef]c]cdlridc\{tt{zmultlld{||tllllk{u{[[Tdc\]cdlkslks{{tt{lksubVZldd\[[{tt\[[]cdut}tll}|lksċkk]ttsuztllk{{t{||edkJHFutuztlekv{~tlltsllri|||ultj]\|utts{ttldd||b[Uslelri{||||||{{tslemttjV[tslllkmttSKJMRK]cdJHFD;9JHFSKJD;9fkkaWMedkv{ddcrg]{zmlld{zmtts{u{bVU|ztll}|lddtts}lldtslrg]b[U|ztl||v}rg]UUYLKRv}|[TT{ttuzt|ui\Vrg]FD;VTL[TT{||dc\|z||tts]bZ\UZ}|tt{dc\}}jcVzlllrilksekdd\\lkstsl}srerfksre{{tutjV[}{||u||tzlek]cbVmtt[[TlekSKJlld|zut|z[TTtsl|slelldFD;sre|||z{{t|u|v{}{ttultuzt|MSSmttu{{ttsllklkstt{{||}lekuztuddculttts{{lddĄ|zfkktslztl|uzttlllekdc\||VTL}|||{ttttsu{{||wllks|zkk]}sle~v{redrfkntslcbVztlu{||||UTSFD;ZbN:97:97SKJ[TTcbVsreSKJVTL[[T{u{[TTsleultwlcbVdc\{ttlekztlnvmtt}tllf]clddcbVdc\kk]}||uwl|u\UZ>ECztfrg]iq][[T}llkztlkd\ttsredFD;{tt{tt||zekd{{|||mtttll{{tekdkk]tt{utekd{{ttt{}|{{tjcV|||wl{{t\[[d\\lld{||iq]rfkvdc\d\\[TT\[[ttsllk|v{f]csle{u{|lldSKJd\\tll|uztfllduzt{{t|ztlbVZddctsllld}|z{{ddclks}ddc\[[{||tt{{{{tt||lkstt{{{t{u{lriztlrfkf]czllztltsl}ultldd|z||dc\b[Ukd\{zmtsl}|||}lriSKJrfkultf]c}lks|u}}|||}{zm}|zttsb[Ullk\[bFD;%UMR[TTtzlJHFVTLVTLlri}|kd\}|llkttsllkddcllk|ult{{{u{u{{lksult{||u{tt|uv{|vUMRJHF{{tj]\|uttsb[Ub[Ured|v|u{ttztlD;9FD;{{sle|zllk[TT|zv|mtt|z|{{t{||{||lkskd\f]c{u{{tt}{ttrg]|uldd{u{}|tllkk]tsl[[TVTL|z~wtlllritsld\\JHF|tsl||{tttts\[bekdllktsl|ulritlllek|zdc\lldttsd\\bVUtlltts[[T[TT{{ttsVTL{u{lridc\}||||lddf]c{{t{{mttfkklldmttuzttt{lksVZ[{||ztlVZT|llkult\[bv{||{{u{{|||f]csretllllkkd\{||d\\llkulttts]bZlld[[TSKJultv{{||{||tzli\V{tt}fkk\UZ{u{tll||redvuztdc\{||ekdj]\tlllddVTLMRK[[T>B9\[[kd\tsl\[[MRK*)(u{{{||redj]\ttsekd[TT[TTddcedk\[[tts|ztts|lekldd}~vtll\[[,55|jcVzl]bZttsztl|utFD;sref]cVTLd\\lekttsӛ|z{{tf]cult|{ttd\\}tzl}tll|redu{{zllkd\wl|}i\Vw}{zm|||lldbVUttsb[U|tygredzllv{\UZ[[Tkk]{{lkskd\rr]llduztmw||d\\ddcultzll}|ylesle|ubVU{||SKJ}|[[Tult}||zllllkttsutuzt\UZMSSMSS|UTSUTS\[[ult\[b|{||{||ultedkddcv{{{t{||{||mttutt{llk{|||zf]ccbVtllmtt|z\UZv{jV[sle[[Tkd\{||ttstts{tt|uztlkd\ttskd\r]gtslsleut||||zut|ztts|lrimttut|{ttek]JHFJHFFD;JHF{||MSSMRK}JHF|zdc\UTSyfllekf]cmttredllktts{tttll|v{zm}{tt}MRK:97{tt|usreSKJsrezll{{t|u|ubVZsrekk]SKJrfk}}lks|zedkUTS|||lritllddcrfkf]cult{u{{{t|zddcf]c|ulri|zrfk{{t{tttslzlluzll|ttsb[Ullkdc\uVTLd\\f]cddcekdf]cf]c|}tsl{ttv{tt}lldSKJtllbVZztf}|ultdkV|zllv{{{tv{ttred{{t}ult{|||ultllk>ECMSSUTSllkddc{{mttfkk{tt{||ekd{||f]clksddctlltll{{tultult}Ц|uuztsre||{{t||{{t{{t{tt{||ttsztl{ttkd\|ult{||lld||}{{|ulddult|ztzlztluztl{ttyfllddtll{u{VTL\[[FD;F=CUMRd\\[[TZbNedkUTS|u{{t{||rfk||z|ttstsl}lriu{{]cd{{t{{tkk]{{tuttll{zmllk7-2}cbVkd\wl|tzlyfd{||SKJPF=kd\|z{{]bZztld\\|ztsl}vd\\lldf]c{{rfktlllkstts{{}tslMRKlks{tt{zmtll{|||[TTredkd\}uddc||||u{{lldbVZ[[Tek]\[[{u{leklek}|zultsleekdtllkd\redllksleuztcbVlldFD;lekj]\ztl|v{tt|||}ult||i\Vredrfkult{ttultlrifkklld|z]cdmttultuztult^^qf]c||}fkk}||uztf]c{|||f]ctlltslddclri}}{||{tttt{ultlddzlluzttzl{u{v|}ddclldlld|ut|utslekd\ult|kd\{{twl|ulriztllek|}tll}lld}|kd\VZTVTL:97UMR{zmekdUTSFD;MRK]bZ|zsle{{t|z{{tztl{{tllkd\\sle|ttskk]llklddlektslztl{tt{zmv{}||}VTL*)(tzlljcbV|zzlltzlkd\sre}|74,D;9{{ttll}{||}ultjV[yfd|z|}~||tsl}}{{|tt{[[Tddcek]sletts|{zmultsle\[[kd\tslVTL|{{tlddlddulttllJHFultredtsl{{bVZmttlriv|mttkd\kd\dc\|z}{{ttslUTS{{t{ttljtlltll{u{ttsultredlddkd\{ttult{||edkultJHFmtt\[bfkk{tt|zult|{||vUTSdc\llk|vv{u{{mtt{{|{{}v{{tt[[T|u|||}}|z}|{zm||{{tmttttszll|uztd\\{{ttslztf|ztsl}}tslsle}{u{kd\d\\}ekdrfkJHF||bVUlekb[USKJJHFFD;MRKSKJVTLJHF|\UZ|f]c||u}|llkekd||lri{||kd\MRKred{|||ztts||ultu{{{||{||kd\|u}}{{tsle|u}JHF-1+|zrg]kk]jcVvb[Ub[UVTL3+*ttsVTL}tts|zmtttt{}llktt{{tttslf]clkstsl{{||vultttsdc\f]cut||redi\Vkd\zllVTLldd{||[[Tllk||ttssredc\bVUttsSKJ}ultllklriredztltsl}d\\ztl{ttdc\d\\|uztl}|cbVkk]kd\||}|wlkd\ult{{ultlldfkk|JHF\[btlluzt{{}|{{t{u{ddctll{||lri{tt||z||}edk|zslelek{||tsl}}{{t{{t{{t|zdc\rfk}{||llkult|{{tslett{{{|}|bVZlldlekztluztkd\D;9VTLFD;[TTsleUTSf]c&&\[b|u}~sle|}}lldztlttsttsutlld|v{yletsl|:9774,|u{{t|urr]rg]tslyle{u{||VTLSKJ}}|}tt{lriuztult|z|||dc\d\\[[TUTSrfkldd|}j]\b[U{{tkk]{tt|kk]uzt|zttsf]c{{tsletsl}d\\v{|z{{ult{||}uzt{||jcV\[b||{u{ultut{{ttll}|}{u{f]c}lri|lri]cd\[[ekdtt{{{tsl{u{{||||ekdtll~llkwlultwlult|z}|ultult{tt{{t{tt||sletsldc\{||lek{{t{{t}|tllmwmttd\\mttztl{u{{{t|redlldtll}|rg]uzttygC8.dc\[TTldd\[bmtt\[bkd\rfk{{t[[T|ttsv{{{tslellk|ztlutüSKJ:97kd\kjV}ztlkd\}d\\tsl|zuzt}{zm[TT{zmuztu|b[U{||{u{{{{{t{||tts\[[ek]|u{{ulksult{{t{{uu{{ut}||b[Usre||sre}tt{|||uult{ttsretzld\\lrir]Z|zuttts{{t{{{ttek]tslkd\d\\tlltlllddf]c|llk}|||lddsre}{{|]bZ{||{u{|z|}mtt{|||zttstt{}tllultldduf]cttstzl|z}ut{||ldd|{tt{{t{zmuzt{u{||{tttts}lddldd{{t[TTllk|u|}u{{~ztf{{tslekk]D;9ult{{|zmttUUYd\\fkkzll|uuzt}{u{\[[~ddc]bZ[[Tddctsltslb[U|{||v{ztl[[T74,{zm}}|z{zm|zllduzt|||zztlldd[TTddc|{u{{u{}}VZ[u{{|ldduztdc\lkslriult{tttsluzt{{d\\}}ult}zll{ttldd}{{t{{lddtsl{||u||kd\|uultj]\tllllkrfk||{{t|{ttlld|zrfkj]\v{mtt}lekrg]}ztltslldd{tt{{}reduztkd\b[Utts{||{{|{u{~mttlks[[T{||llkdc\rfkmtttt{|}f]c~tsl{{tt{{zm}|u{||v{}|u}lld|lldututttsut~mw{tt|ddc|lks{u{|z}||d\\sred\\|z|vtts\[b>B9f]cJHFtll{||uztkd\tsl{{}|z}{||lld{{t\UZmtt|llktslSKJVTLkk]kk]{{t}|tllVZT-1+|||ukd\tzlVTL[TTllk}ulrilks{{t|zlks|sre[[TUTSUUY}zll||lri|cbVslettslrikk]lddlkstts||u[[Tttsekdlddtt{[TTztltts{u{ut|zuutll{u{lddkk]vlddredbVUtlllld}tt{||||z|b[Utts{{t{u{sleSKJd\\d\\}sleldd[TTddcek]utllk{u{{{t[TTkd\|slelrimttlek|||{{{{{||llk{|||z|{||||{u{}{{}|zult{||{{|zlld}{||}|{u{{u{||tsl|||{zmd\\f]csle{||}{u{uztbVU|zkd\tsl|z]bZtll}}sletzl{{lddtzltt{SKJJHFFD;llk|ztsl|ztt{sleztl{u{kd\ekd{u{[[TbVUtts|ztsltt{lldlrib[UaWMcbVdc\tsl}tsl|vJHF3+*}|uwltsltslsletlllri|u{{sle{||ddclri\[[ttsf]cUTSzll~{u{sre||mtt|zf]cttssleddctsl:97ek]VTL[[Tttslri{|||{||v|||z{u{zllv{}ult|uztlultsreyfdsleredd\\kd\bVUttssre|]cddc\{||ttsredredUMRd\\|ud\\yle~|u{tt}{u{ttsreduzt}tll{u{\[b]cdyllks||}llk{{|}}||ztsllld|uult|z\[b}{tt|zsleult|uv{}tsl}{zmsle||u{u{utlld{{tult||}||tts|udc\tt{zll|zj]\[[T}|SKJ}SKJVTL[TTlrimttddcwl{{tu{{tt{||{u{v{b[Utsl{{}lldlek|ultttstslv{{zmtsl{ttJHF*)(}uzt||f]c|udc\|ulritllUTS|ulri}SKJvlldekd\[[UMR{tt}lks}{{tredlldSKJ{||tsl~uztlri||z||ult||zllztl}dc\|}rg]|zd\\tlltsl{ttrg]ultSKJ{|||{{tsre{{t}||tsld\\mtt{ttsleldddkVbVU{||{||mttuztllk{{}lld{||[[TbVU\[bd\\\[bedk|]bZu{{|ztts|u{u{|}{{zll{u{|zleklld[[Tlld{{||zztlutVZT}}{tt[TTkd\ek]}}|}}|ttstsl||{u{}||||}|||||ubVU||rg]ztl|ult[TT{{tslelrif]c{{ldd{|||z{{t{||d\\f]ckd\VZTtts{u{{ttv{lksVTL*)(sre|lriztl|uVTL{{t}{tt[[T|zb[U{tt]cdut||}|}zl}vsle[TTUTScbV|udc\{||u}u{{v{}tsl}tllut|zek]zll{zmv{{tuzttll|v}bVUztlslered}ldd}sle|llddc\{ttllkd\\{ttkd\tll|zj]\}}{tt}llkllk||v{}tll{{ttstslmttf]c{{mttuzt{{|z|{ttVZ[{tt}uztv{~||tll{||ddcv{}dc\{||rfk}}ztl}tslztf{{t{ttkd\sle|u|zult}ċ|j]\}red|utsl{||utlldtzl{{tSKJutVTL{{t~f]cJHFlritts}ultj]\}llktsllks|{zm{{t}tsl~\[b)+2}|}dkV|u}sreVTLsle|ulrimttztl|\[[lrizll|uuztVTLlld}lrif]ctsllri{{{{{u{tllsle}{u{}sle{ttj]\}ldd{zm|u||sledc\|vj]\]bZtll{{t{zm{u{|ukd\ttsedktlllddsleztf{u{||v{tttsldc\v{|u{u{uedk{u{ttslldult{{t{|||zuzt||||zlksu{{{zmlek}tt{}ultlks|{|||tts}{{ultyfl|usre}yfdztl|u|u{tt|z|zrfklri{ttult|{tt{{tuzt}lldztfVTLSKJsleuzt[TT:97f]cmtt\[[lri{{tmtt}{u{||}ek]tlltt{[TTu}JHF*)(lriztliq]lld{u{VTLtsld\\|uzt||uztu{{u{{tllulttts{||rfkldd\[[{{t{tttt{u{{|zultred||{{tllb[U{||tts{zmslei\V}{ttutddcddckd\|ud\\}tll||zllUTStll|zusle{u{tts}}{||{ttf]ctllwllldsle|||z{u{ultttstts{tt||||lks||lriu{{||VZT]cdu{{{{]bZ}{u{tlllri}|sle|ulttts{{tJHFztl{{t}ult~tll}|}ljlri{zm}|zllkd\|z||UTS{tt{||tll\[[}|{tt{u{|z]cdztlVTLSKJ}MRKSKJuztd\\mtt|tt{|}}ttslkstlltsl{{t|ullk||tts|MSS*)(cbV}{{t|cbVdc\sreztlekdldd|u|zJHF|[TTred[[T}~{zmllk{{tut}|{{lks}|z}wlv{yflf]clld{|||uddcdc\uztb[U||{||}|tllkd\lekut{tt}tt{|lektllztlrg]tts{u{lldv{{{tddcVTL||ult|sleiq]]bZlri}\[[v|sle||{tt{{tu{{u{{fkk}mtt{{\[btsl{{tkd\lekultddc{u{UMRuztuztu{{tllk{u{iq]tll}{{}{tttsl|ttsuzt}|||b[Utsluzt{u{||ult}{ttedkSKJslett{u}slecbVrr]SKJdkVMRKf]ctzlmwekd}ldd}tts}{||tll|z{{ttslztl}ult[TT*)({{tlks{zm{tt||{{tuzttslyle{{t|zultuzt{||f]c{ttmtttlltzlttssle]bZ}lri\[[\[[uzttt{tts{tt|uztttslddb[U|zddc{{tlriztl}ztlttsztllddb[U|uslekd\{{t}|z{||{{j]\|VTLtll|z{u{ttsllk{{ttllztl|z}tlledku{{ddc|z|ekdmttmtt||tllztlztlultulttts}v{|}|{{t{zm{{ldd||~|u|udc\|||u||}}u{{}}{||||tlltts|lddedklldztlkd\|ukk]b[U{tt~mtt}tts{||llkVZ[{tt||mwmttuzt{||||}ddc||[[T{u{{zm{{}}|LKR)+2ud\\}|usleuzttt{VZ[VTL}\UZ|u|u{{|zlriuztcbV|u|}|tsl\[[|zu{{|ulksu{{tzl|z|ztl{u{{{tlrittsvtslsleylelrirg]ztl|uult}ztlcbVf]cd\\|u{zm}|{u{lldtslddc|zu|tsl{||d\\sle|u{||sre|ud\\|vkk]tlltsluzt}sre}|||{u{{{|tts|ztl}{||}tt{sre}ddctslult{{}tll|z|z|u}}yle{||llk}f]credlddldd|zuultdc\ztl|zVTL{u{lek{{tv{llku{{v{lek}v{|{tt|llk}}kk]ultf]c[TTJHF:97sre|{tt|[[Tb[U||lldtlllrilld[[T|z}tzl{||mtt{{t~ult||u||}tsl|dc\\UZ\[[{{ddcztlVZ[ztl}}|z}lriddc}{{tsre}{|||z{ttdc\tts|lldkk]ztlSKJi\V[[T{{ek]||{ttzll{ttj]\|zllutztlllk{tt{|||ztl}zllllkdc\lldultUTS|ub[Usle}sre||{{t|z}{{t{||\[[{u{{|||]cd|{|||{{t{u{{zm}zllred|{{t|tzl{||{{||{ttwllri|||uvutlri{u{{tt{||{||{||ult}|||{tt{zmyle|uzt]bZ|zu{{ult]cdf]c|ultdc\|lekredsrev{||{|||zbVUrfk{{tlld|uldd{ttzllut:97JHF{{t|sle|||||u|ekdlritsl|||tll|VZT{{t||}{||b[U|sre}lekttslri\[[lkssleVZ[{u{{tt{{t||lri{tttllVZ[|||f]c|{||sretsllddsre{{tsre{{td\\{||lldd\\|v||b[Ukd\lddtsllldb[UUMRtllred[TTtsl{||}{||{ttut|ukd\tt{uztldd{tttt{fkkmtt{ttu{{{{ulddtt{{|||utslvrfk{||{u{tts{|||vvv{{{t{{{{t{{ttzlzll||lld}||\[[||ttsMRKztl|lkslks}bVZult}}ut{u{{u{SKJlrifkkred|u|}||utlddJHF:97rg]|z|tzllri}tll}{{t]bZVTL||llktts|d\\tt{d\\\[[yle{tttlllksttslldVTLleku{{edkd\\UTSult{u{slelrilldu||}{ttztlldd|zttsv{lld}j]\jcVkd\VTLtzl~ult{zm|u[TTjcVult{u{{{tdc\}bVUldddc\{{ztl|utslrg]}||}{{tlddztlkd\sle{|||zult||{u{ttslriedkUMRtll{{t{u{}|rfk}{{t}ultiWUzllrg]utztf}|ztl|ukd\|u}u{{ttsmttllk{||ulttsluzt}|zultuztzlllddttsVTL[[Tsref]cJHFultultzll{tttll{u{|z||{{tsledc\|zw{{ddc||tsl{||ztltll|vlddultldduD;9,55|UTS{||lld\[[{u{tll|zuztult|u{ttv{lkslks]cdddc{{tcbV~d\\wlf]c||utzl[[Tmttlld\[bttstt{lrittstsl|ztl|zlldc\{||sleVZTuztlri|tts{tt}|MRKwl{{tsletllkd\tslsle{u{lriwltt{}tlltlllldutb[Uredllk||}{tt{{t}}|ulttzlf]c{{tsled\\|u{u{\[[]cd}tts}{||edk{u{kd\|z}}kk]ttsut[[Tztl|}{u{{{t}|b[Uztl|uek]}~utztf{||{||tllulttt{tsl||usreuu{{lld|JHFdc\tsl[[TUMRMSSUMRultlks{{t{{t{ttldd{||llkuzt{{ttts{ttlld[TTv{ut}lldldd~:97*)(|}ztlu{{|d\\}|u|tts{{tUTSttsredldd{u{llkekdtt{{{tlld{||ttstllv{mttdc\||ekdlrikd\{ttlri|tts}|ztll}tzl}{u{LKRd\\rr]f]cd\\ddcf]cutdc\kk]ztltt{srekd\[TT[TTj]\ultsle}ut}|tslult{{|||uulttsl}{yf|uzluzttllrg]|tsl{u{{ttvdc\{tt{{{u{{{{ttred}ztl|u{u{|u|rfkllk|u|ttsutzllrg]}jcVsrev{red}ztlkd\}VTLtslv{kk]lriedktll{{t{{mttd\\VZT||||[TTJHFf]c{{f]ctslutlri|{||uzt}|u|wlult{||ut}JHF*)(|||mttztl|uut{{tlri{||d\\ldd]bZ}}|z|z|uuztlrillddc\{{tztlrfkkk]|[TT{||tts{||{ttlldllkmw\UZ{zm{u{||v{tslsreztfwlkk]ddcdc\ultzll{ttv{{{tkd\dc\d\\d\\[[Tkd\rfktslVTLuttslb[U{ttulttllztltllut|zlrif]c}{zm}d\\f]clri{|||zlldtt{{{|||}|tts}uztsle}ult}v{}}|zlldc\dc\{||||mtttllv{{tt}|}|kk]slev{utztf}|zsreSKJllk{||kk]ldd|}|z{{lekttslrilddlriv{ttf]clri}|{u{}||~ztl}{{ttts|z{u{{u{}|||}:97*)(}{tt}|}||{||llkkd\{u{tts\[[zl{|||u{{tslerfk{{tdc\}ek]f]c||v{zll{tt{u{[TT{{tllkzll{ttllklribVUultf]cdc\{{tVTL|||lri{zmkk]|lddtll}VTLred}f]c|zsle||tllddc{zmbVUudc\[[T{{t||}ztlttsultttsfkkllk|z\[bttsmttlrittsultutult|u{{tttstll{{tredf]c}|\UZ|ztsldc\{||ult{{tv{ztl}zllb[Utzl}dc\}wl{zm{{tuzt{tttzl{tt}{{tuztu{{}tsl{ttfkk}|{||sle]cdtts|u|z|edkf]cult}}||u||vlddultultredwlJHF)+2}ultv{slelldlek[TTlksv{|}uztu{{{u{}||umtt[TT|zlek{||{||lldultddctslslejV[{{trfklekv{f]c||lddd\\d\\b[Ullkrg]{{tkd\|}|ttstts||slen|u}lddlddtllkd\utrg]f]cztl|u}b[Ullddc\||}{u{llk{||tsl|u{ttddc}{u{ddctt{{{ttt{UTSv{lek|zddcd\\kd\ztl¾ƣ}ult|vuzt}}{||{ttd\\||sresretslv{}{{t||lld|z|ldd}uzt||{u{tts|]bZ|u|z|u\[b\[bbVUkk]|tsllld{u{}|dc\{zmzll\[b*)(zll[[T{tt|uddc{tt||ult{{t|u}edk{||tt{|uztl|zulttzl||ztltts]cd|z|u{{llklddtllmtt|}tts{u{}tllUMRllkttstll{ttmwSKJ[[Td\\cbV|uyle|ulld}ttssle}{u{zllrfkf]ctsl{tt{tt{zm}|||kd\llk||zzlltsl{zm|{tttlltsl|{{t{||{u{lriv{ult{|||||ü{zm{{tf]c||}{{tlri|v{lekf]cwl{|||{{tsre|zddc{{ttsl}llk\[[}ztl}}fkkultllksle|z{||VTL\UZ}lddedkUMRf]c{{tult{||utttslddllk~uzttsl~|z}j]\|tt{f]c*)(tll|umtt{u{}|{zmtslf]c|zlrikd\[TTtt{|ulri}dc\}{tttts{{t|||utt{~{{VTLv{|z|}}utdc\kd\\[[ut||{{t|ulriv|ttsttsllk|zj]\{u{i\Vsre}||VTLylellkztfmwlddtsl{zm|}{u{vutullksre}d\\kk]}ut{ttut{||ekdtsl}|{||{{t{{{u{{{t|tllv{u{ekd}|kk]ttsrfkv{||zlllriut}{{t{u{tsl{{tu{{ddcttsu{||{{t{u{tlllek{{|d\\ult{zmultlkslks{u{rfkdc\}lri{{t}{{tut{tt|llk{zm}||tts{zm{{ttllrfk}{ttsre||{yfztlJHF?;C}tzlulttll[[T\[[ult||tll|||z||lriekdlldu{{ult|ukk][TT{ttkd\ddc|u{{t||tllek]ddcw[[Tllkd\\f]c{u{llkutlrittstllultsle{ttj]\{||ddcsleztl[TTredlddzll||\[[v{{||{{t{ttlldu{{{||lektsl||ztltsl|z|{{ulri|llddc\{tt|ztfult||lks{{t|{u{tllllkdc\|zulttll}ult|lldlritll||kk]uttts{||rg]||}}|||{||}ukk]v|ldd||~]bZult|slellk}|z}{u{|z]bZ}|JHFlksult||tll}{{wlvslettsut{||ttsztl|uztl{{tek]:97*)(tlltslekdult}|ultkd\mtt||u{{kd\{u{lddekd{{lekVTL{{{|||lldtll|z||tslult|ddc||}{{t\UZllk{u{}ultj]\r]g{||||{u{j]\}tsl|v}ult{yftzlutbVUllkzllf]c||uttts\UZ{{tztl|||lld{{tzltts{{tttsut{||d\\ztfzllult||{u{lksllkztl{{t{{tllkv{{{utkd\lld{{ttzl|u{{t{u{dc\ut{{tjcV{u{lekmttuzttzllrimtt\UZmtt{ttztltt{tll|UUYUMR\[bultuzttll}{||lksulttt{lddsretsl||tll{u{utv{}{{t|z||lldVTL74,tt{||v{[[T]bZlekztllri{{ult{||llkultkd\sleut{{t||}{||b[Umttultf]clddttsuztSKJ[TTultultllki\V}{ttj]\||dc\}{{tVTLutSKJtzlb[U{ttSKJ{ttkd\bVU[TT}{ttuztzllkk]tll{||lddbVUutkk]lritts}|z{ttrfk{tt}ttstll{{{ttkd\ultttslldsle}|}u{{tzl}edkv|redut|}{||{zm}}{{t||z|zllk|zddc||{u{u}tt{lri}[TTf]clek{||lld|zmtttt{{{t||tt{{u{redd\\}{u{tslztlulttllut}}{tttzlmtt{zmJHF:97{{t}dc\ztlztlllkdc\|cbVzlultllk{||ult}v||}tt{{tttt{lriztl{||tll|VZT|ztt{fkkllk||[TTJHFf]c\[[lldultf]cf]c\UZllkultlekyfllek}{zm}wlSKJd\\JHF{{t|zsre{{t||red{{t|usre{||}|cbVtllzll{ttztluttllllk||{tttzlVTLtll]bZkd\u|lld{tt|v{}|{|||tt{{ttmttultzll}lddlddddc||tts}u|uredu{{ztl~}||{ttb[Ukd\}kd\|}|{{ttts{{tlritsllriz}tslultztlzll}||{ttztl||z\[[lld{u{uzt{tttll|{zm}|ulttll{zm{{ttllJHF*)(ultcbV|ztts]bZred{ttj]\tsl|kk]ultf]ckd\bVUdc\d\\|z}|}|zll{{t{{llkuztowlkstt{u{{UMRd\\lddv{UMRj]\ultmwtsledkUTS||||tt{tll{{t[[T{ttredztllldlri}tzl{{td\\u|u||u{||ldd{tt[TTd\\FD;rr]{tt{tttlltsllldd\\ztl{{tztltzl{{t|zztlrfk{u{{{ztllddj]\mtt{ttlektt{\[bllk|z|||tll{||{||u}ģf]c{{tf]cldd{tt}tll}cbVddc{u{||ztltts|}|ztl{{tu{{lddlrimtt]cd]cd}edkj]\|uredultuzt}|dc\tlllri||ztt{u{{{{t|||}tsl}|z}|umtt{u{{zmztlddcztlult{ttztl||kd\|uultf]c{{||>EC:97tslSKJ{{tVTLwl}|{u{d\\rg]|z}mtt{{tbVZ{u{sre||{||zll|z{u{uztulttll{{tldd}{tt|zUTSult\[blrilldf]ctllmwtsllekJHFuzt{tt[[T{||kk]utSKJredv{llk|zvd\\tslultedk}||b[Uztl}kjV|utll{{t{ttdc\||{||lldu}}tts{tt{{t}|{|||{||ttslektt{{tt{||}{{tv{tsltsl{tt}{tttts{zm{tt{{t{tt\UZred{u{uzt}{ttbVU{|||]bZultult|zultdc\llkkd\tlledkttsultfkklks\[blekllk{{kk]ekdtts}{||{u{uzt{{tdc\|z{{tztfllk:977-2}llk{u{|{u{tzllld|zlldu{{ttstt{lriult}]bZkd\{tt||tlllld}|z}rfk|z|{||llktt{lksf]c{u{SKJ}{ttlldtll{ttv{|z|zuzt[TT||llkwlrfkVTLsle||slettslldtts|zsle||aWMSKJFD;ztlultu{{[TTslelldkd\|utslttsuzttllb[Utyg{{ztlsrekk]{{tddcsle|ztts}{tttt{{||ddc{||{{tts~}{{tf]cmwwl|uuztbVUlldddctsl{ttsle|uult{||rg]|}lri{||mtt|ztt{ddc{||rfk}ztlzll||ldd|v{uztVTLultSKJtsl[[Ttzl{||{||{tt{{ult|{{t{u{}|||tsl{u{|u{tt|uzt>B9*)(zll|||{{tllklddbVUd\\lddek]UTSlri[[T{{tslult{{td\\}u{{cbVbVZ}sleb[U{||zll{||}tsl{ttu|zuzt||{{\[bJHFJHF\[[f]cd\\\UZb[Ud\\ttsd\\VTL}{zmtsl{|||u{{t|f]c]bZslelddddclld|ztzl|utllaWMsre{{{zmj]\tll||tslztlf]cb[U|z{||}dc\|zllek]tslut{tt|lriv}tlliq]tsld\\{||{{t|z{{}}{{{||}{u{||}{{}}sle~|||u{{t|||z\[[v{}ztl{||tsllldj]\ttstzl{||wl}lld||lldmttlks|lksuzt{{ttts}{{t||lrir]glldmtt|zlddv{tt{{{|~{{t{{tdc\VTLtllVTL]bZJHFJHF|z|]bZSKJd\\ultddcd\\b[U||zlekttssleultuzt{{t{{||zllkldd|ztts{u{ldd}|z|zMRKddcult]bZlddultf]cmtttsl[TTultd\\lddu{{}tllj]\f]c|ukd\{||{u{[TT}|{u{sreztl{zmcbV||tzltzlultkd\{||llkzllutultkd\VTLsle|zdc\||ztlsresrekk]tslutslelddulttlllddllkSKJiq]tsl}{tt{{{||llk{{|z||tts{{tkd\||{||}ult|zuzttsl|{{t|u}ldddc\ldd|utt{tt{tsl||{{t{{|ttsut}sleut{||ekd|ztsl}ztl{u{llk||}v{{{t{||{ttj]\tts}|zttsddcSKJ*)({||dc\lddtllVTLf]c{u{uztttstslu{{lriu{{f]cu{{lld||||dc\b[Ullkuzttzlddcu{{d\\ddcJHFVZTSKJv{tt{[TTlks||tsld\\[TTddc|utts{||red{ttd\\sled\\}\[[zlbVZ}|||||{||v{rg]rfkkd\|kd\{{tslesrelldred|zsletslztl{tt|u}|}{{t|u{tttsl|sle|v{tsl{tttts||{u{ttstt{mttv{llk{tt}ztl}|z}¾ƣ~}{tt{||ttsut{||}}}ult|lri|||zult|dc\{u{}|u{zm{tt}{ttttsu{{j]\uzttslv{}uztbVU||ztl{{t{tt{{tut{ttllk|u{{t|z\[[dc\:97&&UTSd\\d\\u{{ztl|{{t|z|mttsle{{tlldsletts{ttekdekdsrelrif]c{{mttsle{zmzll||lddlektlledkult{{t\[[|f]cttslddtslkd\sleSKJ\[[leklldtts{u{tll{{t}ztlrfkttssleVTLtllsleztf{u{uzt}f]csredc\}sre{u{{zm{||}|lldkd\{tttlld\\sre{{t||ttstll{u{mtt{tt{{{{{tt{{f]c~ttstts}|tsllriǔtsltsl}|ult|u{u{{{t{u{tts}{{llk|||z{{|mtt\[[||mttf]cd\\|z|uttllmtttll|mttztl{ttu{{tts}|lrilektts}|{||{tt{{t|uuztutv{lks{||{{JHF:97*)([[TSKJJHF\[[lri{||tsl{ttlri|z}u{{kd\v|zf]cf]cVTLek]kk]ultd\\VTL}{||f]ctt{edklddedkuztVTLmttldd||kd\lddzlllks|||{||{u{||lddtlld\\u{{|f]c[TTtll|||u{zmj]\zllj]\{{ttll{{tSKJ|z}|ldd}{ttuldd|z{{{tt{{t{{sle{||uzttts{u{||{{{tt{u{tsltslllktt{lek|vtt{v{}||}|{||{{|{ttv{}zllmtt|JHFlldlks{ttsleldddc\}tts{u{lldllk{||tts|zlek{{ult|uztlv{|utzl|vtlluztttsllklld{{tSKJ*)(lkslldVTLUTSsref]ctllbVZtzllldmtt|z{{t||zlld{||\[[}{||tll|zultlld{||mttdc\MSS{{}lriztlsrezllttslddztl{||llkf]cllkultVTLsre{zmzll|f]ctsl{||{u{dc\SKJultlldnf]c{||}v}ult{|||tts{zm{tt{||{tt{tttsl}|kd\sleulttll|{{t}utllkllkttsllk{u{ddc|u|||z{{{u{}|z}]cd|uztkd\{tttsl{tt|lek{tt}tzl|tll}|redUMRtt{UTS}}}|tlllri{u{u{{tt{uzttts|tslv||}kk]|ldd{u{{||JHF3+*||UTSdc\}|ut[TT{||lkstsl|z||z|z}lri{{|z{||||ekdrfkkd\utts||mtt>B9JHFlks|tsl\UZ{{\UZfkkVTLult|ud\\\[[ultek]llkbVUj]\tzlztlslekd\ult}ldd{tt{u{tt{b[USKJiWU{u{{zmVTLrg]sreedk||{tttts}|zlltll||rg]ztl||ztlbVUlddu{{}kd\lldtsltllsle{{t{ttllkedk{ttttslldedk{u{tt{llklks|sre}Ӕ|zu{u{{{v{lrif]cdc\|uwsretts{ttultvtllult|z{{tv{ldd{tt{||{{lkslek|u{{{{t}{{tult|zllktslmtt|llklddlek{{{{t|v{||vkd\redulttsldc\sle}lekJHF{{tlldkd\UMRUTSlksSKJUTS]bZ||lritslkk]tslllk{tt{||||}|ut|zv|z|ztslllkj]\|z{u{tt{\[[|zllduztkk]||tt{lek{u{dc\f]cuzt|ucbVu{{tzlddc|dc\sle|VTLb[Ulri{zmvek]lldsle{||llkd\\JHFttsb[UbVUztl{zmtzl}SKJ]bZfkk|ztll[[Ttslult}|}llkyle|utll||v{ztld\\{||yletlllriwlj]\uztldduztult{{{u{{{lekmttddc{||{||Ĩ|zu{{tsl||tsl}tll}tts{{t||[[T{|||ztll}mtt|fkkv{|ztlllrilddw|{{u{{lrillk{{tlksylelks{{tsl|lksv{{{}ztlztlbVZ}ztld\\}{u{}srelekedkJHF:97llklldj]\lek[[Ttslldd{||lekdc\dc\{ttb[Ulkstsl|u}}|{{sle{u{tts}lld}lddmtt|mtttll{{slef]cJHFlks|b[UJHF{{tD;9u{{|tts{||b[U]bZ[TT||dc\||ttstsllldllkztl{{lekbVZf]c||v{}|||ztfrg]VTLd\\lldllkttsf]cu|z|u}lld|utll}zllrg]j]\{{td\\|zztltt{uztv{lldlldmtt}{u{|mttllk\[[{{|z|{{lks||{{tuzt{u{||ultddcslerfk{u{{tt{{ttzl]bZmttlri{tt{tt\[[mtt{{}tt{fkk{{t}ztluzt{{uedk}{u{lriultn|{{lriut{{fkk|u{tttzl{{tv{{u{tsllddcbVSKJlddf]cJHF*)(\[[[TTSKJdc\}[TT{{tlddSKJtsliq]b[U{{tek]slelldlrittsultlld]bZddcttsf]cttsu{{ultUMR|ulddult}|z{ttyfl{|||utsltt{edkSKJlksuzt{{tJHFtll\[[kk]||lld}{zm{ttddcb[U{||zl{||b[Ud\\VTLf]c\[[b[UUMRj]\|u{tt|uredsre|{||uztkd\kd\}{{t|tsl{u{lritlllld{ttzllyle|tslttslldekd{{yl]cdultuztult{{{||tt{uztlrimtt||ċ}{{{u{{{|}{tt}||}{tt}|zmttddctzl{{ultf]c||UUYldd|rfkmttf]cd\\edk{u{||||lld|umttf]c}ttslri||llk|ttsred{{t}{{t|tll\[[{{tkd\ek]fkkFD;3+*VTLb[Ulrisreldd||[TTJHFd\\\[[||sre{zm|ztlutztlztllldult|uzt{u{uztult||tt{llklektlld\\[TT\[[[[TbVUztlb[Uttsf]cf]c{||}[[TVZT|ztzl|z{tt{u{{zmrg]ztfkd\dc\{{tultlrikk][TTtts|dc\ek]\[[mwiWUzlltsllldldd|lri|tslut}|srekk]kd\ekdv{bVZdc\}tygb[U||redlldlekult|ztts{{t{{t}{{{{]cd{{tt{{|||z{{tt{{{}|{||edkUUY{{tt{ultuztult{||{{tldd}{{tredztltsltts{tt{u{}tslu{{lksmtt}]cdttsut{{|zrfk|utt{{u{lksttstllultttsf]czllri{u{uttts|]cd{u{{{tllkSKJ*)(|zd\\\UZ[[TJHFultddc|zsleut|zv{ultlldzll|zkd\{{tv{}kk]f]czllddcnultulttt{kd\{{f]cult\[b{||\[[llktt{dkV]bZ{u{|zslesleztlekdlri{||[TT{zmslewl}}|{||wl||dc\~wl}n}kk]tsllriv|ztsl}}ztlcbV|zd\\utult}edk{{ttlltslb[Utlltll||mtt{{tuztkk]lld{{tlks{{}{{{{tt{||tll{{t{{mtt|{{}ztl{u{}ttstsl{tt|||z{||ztlultnv{||lri[[T{||{{f]c[[T{{tlritsltt{|u}|z{{||{||{||sle{u{{u{j]\j]\v{{{t}tll|uztuzt{||D;9*)(f]cVTLlriu{{sre{u{ztlVTLttsddc[TTuztlritzluztlriult|z{tt{{t{||d\\llklri|ttsv{{tt||ultult}uztJHF[[Tutlritlldc\tt{]bZkd\tsl{u{redslelddtsl}sle\[[{{tbVU{{tztfrfklddsre~r]g{|||{u{lri|lek[TTb[Utsl[[Tsledc\tllrg]|z|u{tt{u{kd\{zm[TT||ztltt{uztlri}tt{}{{||edk{{{{|}ќ}tzl{{lks{u{}tts{u{llkv{{u{tll{u{tll|{ttultllkttsu{{|{u{lks~edklks{{lksb[Uyle|{ttut|||ztt{|tlltts{{ttslu}}||{tt||tts{||{tttslfkkMRK*)(leksre]bZ{ttlddkd\d\\UTSUMR{{tuztmttdc\{zmvtllldd|SKJu{{|||uukk]\[blksedklddbVU{tt{zm{{{u{{u{tll|tzl|[[TbVUlriFD;ttsredkd\b[Ud\\{zmVTL|[TTllk||{||b[U{tt}|sle||kd\lldn{{tlld{|||}lri|ttsb[Uek]ztlrg]uztf[TTttsvzllkd\llkuztddc|u{tttt{tsl|ttsfkk}{u{{{{{}||}mtt|ttsęttsrfk{u{zll{||wl|zuztlkslri|zttsf]clekekd|z|lkslriultlksdc\tsl|}UUY{{}kd\sleult{{t{{||{u{{{{||f]crfk}|lriztltt{~|ddc}||{u{ttsultddc{ttultsre\[[||JHF*)(llklldkd\llduddcd\\UTS{u{ddcttszllddc{zmtll{||tts|u}lkssretsllrij]\j]\{||lek}}{||[[Tf]c|zzllkd\ttstsllri>EC|z{u{uztztl}{{t{{tslebVZu{{ldd{{tlld|zlriVTLVTLultkd\||j]\||]cdv{VTLdc\dc\tzl{ttuztyle{{tllkut||}llktsltllztl{{tek]sle|ut}ldd|lld}{||mtt{{{{lks|tt{{||{{|}}|zttslksnvmtt|z{{}|}mttztlult{u{|||{{t||llkddctts|v{lks{u{{{t{u{{{ultlksUMR|lri|z]bZUMRd\\b[Ullk|z{zm}ldd}|{ttsrev{||llkd\\{ttsre|}{{kd\ldd|||v}|ddc\[[d\\[TT\UZ[[T}74,74,lddVTLb[Uuztdc\ddc{u{u{{dc\d\\tsl]bZddcredlritllsle|ekd|leklekultu{{b[Utlllri{{tt{SKJUTS{u{{tttsllldtt{ylttsztltll|kk]\[[ddc}}ulttts}|zj]\|uztlu{{tll|ttsd\\fkk{ttult{|||{zm|lksdc\}|ztf{u{ttsutult[TTek]||ztl{ttkd\ztl{tt{zm|uultldduzt{{|{{tuztllkultf]c|nvfkk{||{{u{{|||}tts||{{mttdc\{{|{ttultzlltllllkttsu{{ekd}tzl}lldttsf]crfk\UZd\\\UZ|ztsluzt]cd|lks[[T{u{|uzt{tttts{||{tt}{u{bVU|v{|||uult}|zult{||}kd\|u|lrif]c|tt{JHF3+*bVZllkj]\tll]cdlld]cdult{{tUTS[[TlriVTL|ulksd\\j]\ttslddlddlddutd\\uztttsedklek{u{|v{|{{tslellkVZTlri|zzlddcttstll|u{{sreb[U{tt}sled\\tts{ttldd\[bldd{zmtt{vtzlf]cdc\lri|ukk]{yfd\\llkf]c{{t}tlltll{u{utj]\zll|sle{{tv{{{tsl{{|||z||lks{||red}{ttultă|lddtt{sleuzt|fkk}}lld{||{{{u{MSSf]cUTSf]cmtt{{|u{{edkedktsl||}}wl{||ult}bVU[[T}tts]bZ}|{||v{{tttsl{tt[[Ttsl}|slev||ultuztuzt|tllUUYddc\[[:97&&red{zmJHFVTLMRKu\[[[TTVTLJHFVTLtslsle[TTllddc\i\Vtslttslri\[bddc||ult{tt|||}{{lksSKJedk{{}lldsle]cdbVZUTSVTLdkVfkkFD;aWM]bZVTLSKJ||uztlrilddldd}tts{ttddctll||redf]c}zlld\\tzl{ttuztdkVVTL}JHFredf]cult{||tll{u{lek{tt{|||utll||ldd|z}ttsut{ttf]c|u{|||z}||v{}lks{u{|tt{}{||{{v{ult|rfk}|u{||{{}{tt{{||zd\\{{]bZ}lld}|{{JHFulttt{tzl{||{tt||lldldd||||zsre|{yff]c|}{{lriVTLek]}llkcbVldd[[Ttlledk\[buztztl[TTUTSedk:97&&\[[SKJVTLzlVZTek]FD;ultd\\|zlldsreslekd\jcV|llklld\[[}uzt{tttsl{||tllf]ctlllldut\[[ultSKJ{{{zm[[TVZTlddJHFu{{lddVTLtlllldd\\tsltslv{ztllrillkttsj]\lriUTSb[Uldd}ldd}ultzllf]ckd\lritzluztwllddtts|utreddc\uttts{{||}wl{{t{{tddctlllri}redddc{{tztltsluzt|u{{}{{{{u{{{{{{{{edk~|||tt{lrimttekd{u{rfklks\[buztu{{f]c[TT}ult{|||zttsult}|zb[Utts{||{tt}}|u|zldd\[[|u]bZkk]sle}ldd{||{{t{tt||ztlllek{||JHFJHF3+*edkek]lldb[Udc\lld\UZVTLVTL[TTlddlld{{ttllldd|}yle{||{{t|{u{{u{{{fkkr]Z{{s_qrfklekllduztv{uldd|MRK]bZVZ[llklldutekdddcztl]bZUMRztfdc\}JHF\[[f]c|}{||j]\tllkd\d\\||{ttttslks|}}|lldllkultlddlld{ttv{rg]{tt{ttlldf]c{{ttllllklddred|{{tu{{mtt{{lks{{{||lrisreu{{||z|zulttts}}}u{{ztl{{tttsj]\uzt|ubVZmttVZ[|ztts{{|uf]ctllekdUTSlks~[[T{{tlks{{ttll|lddtt{}ultedktt{{{t|u||{||lldlksultb[Ulld{{t[[Trfkult|lldekd[TTtslddcFD;*)(ultddcSKJD;9JHFcbVf]cSKJ[TTldd\[[tsl[[Trfk}|lld{zmuzt{{tlri{tt\[[{{f]c{||}ult}bVZbVU{{tult]bZultldd[[Tlddlld[TT|ub[Ulld|u{ttek]ddcddcVTLSKJFD;kk]ult{{tddcuztVTLtllbVZ{||[TTtsllddlritll}|{{t||bVUttsredredzll{{t|z{{tztl||zutkd\ztledk|zllduzt|{{}}}|{{{{|f]ctt{ult{||mtt~{{}|}||{tt{{d\\{||f]cv{r]g{{wl{|||z]cd|z|z{{|z{||f]ctsl||lld~||{{lld||}||tsllddrfk}ldd{u{|tt{||lri}{||{||d\\kd\tsl\UZlddultu{{uzt|z}|f]cVZT\UZUMRlddVTLFD;FD;[[Tut[TTfkk}[TT[[Tlek[[TztfVTLcbVdc\tslfkk|zmttek]||tzl{{tttstt{ddc}VTL\UZ|lriedkdc\|zztlttstllekdSKJttskk]|uztlldSKJ|utsltlld\\f]ckjV|SKJb[Uztluztulttsl|zsle{tt}lks[[Tkd\red|kk]u{{lddllk{{sledc\f]c}ulttllztl||llk{||{{}mtt}|{{nv}ult{{}|{{}|||tzl||zult||lks{tt{||ow|{ttsle|ultredekd|z]cd|mtttslmttedkuztcbV\[[|||f]c}|v{[TT{{tll}{{d\\}}{{t{||ddcddcrfktsluztddcultllkdc\|uUMR}tsl{||tsld\\ttsddcu{{{u{{ttlekVZTddcD;9*)(dc\VTLFD;D;9ek]kk]bVUult{{tlksd\\lrilriVTLlks|uj]\cbVlldVZTuztMRKu{{{ttlriu{{u{ttmtttts|mttf]ctslult}|ulttts]bZ{ttultztl{{tztl]bZ{zmlri\UZ}{u{}|d\\uzt}|}|sre}f]cv{{tlddSKJddcvek]VTL[TTdc\llkddc\[b||tsllldredUTSlldkd\redVTL{||[[TFD;llklddtsltsl{{f]cfkktsl||llkultlrifkkmtt||{{mk}|{{lks{tt||zlri|{u{}{{t||z]cdlks}{ttlek{{{u{mtt{||VTL|z]bZtslultdc\|v{{ult{u{||tsllek}{u{{tt}{u{slev{f]c{{t}||lriztledk{{|sle{u{d\\{||mtttslultdc\|z{{kd\ldd\[[tt{\[[SKJ&&j]\}f]cVTLJHF]bZzlltll]bZllklldtzlsleuztultVTLtll]bZ[[Tu{{tzlllk|z|z{{td\\{||ekdlld{{f]cedklldbVUlddult[[Ttt{SKJ{ttlddu{{lriUTSdc\rfk|tsl{{ttslzll|z||{ttttslldddcMRKf]clkstslekd|{{ldddc\{u{FD;Q?@ult}dc\||z{{t~mttlldult}|z{zmf]cuzt}{||UTSylerfk{ttdc\sle{||VTLtzlbVUlddllkdc\ldd||ztfllkldd}u{{mtttt{uztnvedklkstt{lks}}|u{{||{{u{{ultyltts\[[lkstslllklri{{{||{{ldd|zlks}mttlrirfk\UZd\\\[b{{tslmttlkslks{tt{tt|}||{||{{ultult{{|z|z{{t{{|||z||{||}{{tddc{tt{{kd\lri|lld{ttttsztlfkk]cdllkbVU-1+ldd{{tF=CsletllSKJ{zmzllldd\UZslelldddcd\\r]Z}}|JHF{zmfkku{{}lriuzt}|tt{kd\{||VZTlksllk[TT|uzt}lddtlllriUUYVZTVZTUTS{{tslettskd\VTLkd\tsl[[T\UZ|vkd\|{{tsle||SKJf]csre{tt{{ult|rg]}lddtslbVUlriv{d\\UTSslekk]||{{t}|{ttttsek]{||ztlttslddjV[\[[\UZ{ttult|{{{||fkk{{nv{||u{{{{}{{{{yl{{tts~tzllldlrimtttllztl}zll|{{bVZ|{tt{{[[Ttll|z[[Ttts|z]cduzt{{t{{UMR|d\\{zm}|sleldd}{u{{u{}|zddc{||{{ult|zkd\red}|tzlsle[[T|z]bZb[U[TT\[[UTSf]cFD;*)(f]c|uSKJ]bZlddJHFddclldddc\[[~tzlekd{||ulttzlu{{llklldtt{ekdlkszlltt{uztu}|tsltllVTL{ttztluztVTLlri|{tt]bZJHFb[U]cd]bZmtt{tt{zm[[Tlld{u{sreult{||]bZttslld[TTcbVVTLb[U[TT{zmi\VbVZtll}sletlledkUMRek]kk]VTLlddUTSutultkd\{||cbV{tt|ztllbVZuzttsl{|||lldvtsllksbVZ{||ulttll{{ultmttfkk{{lksmtt|~ekd}||{{{{ldd{{}|zztl{u{{||{{utf]clriUUYmttUTSdc\]cdtts{{ekdleklekttstzlwl~lks|{{tsl{{~u{{}}||u{||tt{fkk}|ultlri{{t|u}}||ztltslVTL{ttultfkkUTSMRK*)({tti\Vkd\FD;bVUPF=dc\UMRdc\sle}tsl{u{ttstlljcV|utyg|u{{d\\mttekd}}|}uzt||zb[Uddctll}}\[[{zmj]\[TTtllttsu{{lrillktllztld\\v{|ztlVTLttstzl{{{||[[Tb[U{{t}\[[VTLJHFlddiq]d\\VTLlld]bZSKJJHF||||f]c}}ddcd\\tll|ulld{u{|mtttsl{||mtt|mwtts[TTtll|z|ddcMSSleklks|}|{{{{nv{u{{{}|zNjlks\[b{tt]bZult{{t}ttsult{||{{{{tJHF\[[LKRMRKVTL\[bJHFu{{u{{red~|zttsv||ttstt{ult}||ekdddcedkldd{zmmttultdc\|llk{{sledc\{tt]bZ]bZVZTb[U*)(f]ckk]}|FD;UMR{tt[[TVTLSKJVTLj]\VTL{u{||tlllldkk]ztltslmtt\UZ{u{{{{||{{tutekdbVZUMR{u{{|||ulek{{uzt{{tekdJHFUMRldd|z|vf]c{||ztl{ttVZ[~{{ttll{tt[[Tkd\}FD;VZTd\\lddb[UtlllldlddJHFultekdudc\tsl||dc\{{tkk]{tt|ultredtt{|ztsl{{tzllLKRmtt}bVU{{lriuztmtt{{tt{}|{||{{|{{|Ѩ{{|}|zfkkf]clkszllvÚlldred|||lld|{tt{u{{||uzt|z{tttt{JHF~}zlluztlriVZTlrillk}|llk{u{|uztl}ult|}f]clld}{{ldd|llkttsekdvtll||{ttleksletll||JHF{||zllkd\JHFUTSlekutfkk\[[ddc}JHFSKJbVZkk]b[UPF=3+*FD;[TTD;9JHFlddtsldc\{ttdc\ut{u{{||||ttslddddcult[TT|è~iq]tllb[UddcUUYf]c{tt|zddc{u{dc\v{tslultrg]|zekd[TTlks{||lek||b[U[[TUTS{ttrfksreslej]\ttsUUYuzttllVTLleksreutwl\[b|ddcultlld||\[[{{{{t{{tlksredult{||tllmttrg]ttstt{{u{ult{u{{{u{{{{ǔtzlu{{ylMSSuzt{{t}}}tts||z\[bu{{{{t|[TTmtt\[[{{UTSult|zlddllk{{llk|uv{ttstt{ultztlv{|\UZ}rfkldd||llkmtt}mttu{{ulttts|v{{zllSKJd\\lriu{{ek]|zsleztl[TTVZTllk:97*)(u{{SKJJHFSKJ3+*SKJD;9F=Cf]crfkVTL|{tt~ddcsrejcVlldlldedk[TTmttulriek]lri|ztl{tt}|u{{[TTd\\VTL{{tultu{{u{{ttsfkkUMRb[Ulld{tt\UZ}VTLv{ult||redlksi\V[[Ttyglddult|uuf]c|ztlltslVZ[tzl[[T{u{ult|u|tts{{t{u{VTLlri{u{ddcultkd\u{{mtt{{||{{|{{t}~|\[[tt{{||}|ddc}}}UTSVTLb[Ulriuzttt{lri[TTultultult{{tlllrilks|zlksutf]c{{ult}tts{||{tt~||v{tzllkssreUTSddcnVZ[lks||ldd|||uzt{{{u{}{||sle[TT\[b]bZsletslVTLekdztlu[TTu{{llkUMR*)(\[[rg]bVUVTLVTLkd\tts|rfk~tzl|||[TTtt{kd\VTL{{tsl|uf]c[[T{{ttsmttek]{{tuztlriVTLlekttsslettsuztkk]r]Z}|kd\f]cJHFddcfkkf]cUMR{u{lldult[TT[TTrfk{{td\\|ultlks|u|tlllldkd\{u{|zuttslb[Uddctsluzt|u}v{{tlltts{||ttsutzll}{{ldd{u{}llk|u|}{{{{}|mtt}|ddcttsult|z|lkslks{{uuzttllmtt\[bmttmtttt{ultlks[TTuztVTLddcfkk{tt~lddyl{{ttslri{{|ztlult|z}|{{t{u{{u{tts{||lritt{ddcu{{\UZtsl{tt}ult}}{tt{{tt{llk{||ddcf]crfk||}|tslbVUf]c|u\UZ{zm|tts[[Ttsld\\|{||MRK:97{ttdc\D;9SKJVTLVTLf]c\UZbVZv{uzt{||slekd\ekdlkstzl}uztlrifkk||tts||\[[ekdtll\[[\[[mttv{ttVTLdc\rfklddtll{u{|tts|UTS{{tv{tllbVUVTL\[bttsult\[bllk}{{ttllddc|UTS|zVTL|zultrfkult}i\V|{{ttt{utlriztllriu{{lddlj|{||{tt{u{}}ldd}{{t}|uttskd\tts}tts|zlks{{|z|edklri||}||æ}lriultttsd\\{||f]c|tt{}u{{lks|mttlld[TTekd|||{{{{tekdek]ddckd\ult{u{ttsldd|tlllek|zuzt|sre{u{[TTtslultult{{t|||z}tt{lksmtt{{{{llk{{ttstsl{{t}rfkVTLtllVTL]bZ{||||tllf]c[[TddcMSS*)(tslb[U[[TaWMJHFSKJuztVTL[TTultddcdc\{zmlldcbVUTScbV}|\UZ{ttult}u{{tll|ttsztl{{tdc\tt{{tt{{tekd\[[srekd\||v{u{r]g|zddclkslldyld\\ttstlltll[[T[[T}|{ttlri|zVTLrfktllsreldd{ttUTSkd\UTS]bZu{{uzttlllld{{sle\[[|uztf]c|ttsddclek|{u{ttsttskd\edklld{||{{\[b|{{tt{{{{{lks}\UZ]cdldd|z|tt{||lriedk\UZttsttsmtt]bZlri|u{{\[[|zkd\lddu||SKJtt{u{{ultulttt{|{|||ult]bZ}UUY]cdldd{{{{t|zlek{{|lks|zuztulttt{tts}ut||dc\|urfkv{{||{tt|z]bZUTSsle[TTllkUTStt{LKRD;9lldkd\[TTVTLPF=VTLVTLf]cultf]cddc{{tdc\{u{kd\lrilldtslkd\VZTred{u{uztu{{|lddldd{tt]bZMSSlddkd\|{u{lks|zdc\}ldd}}lriUUY|z{{:97lksult|zult{{td\\mtt{{tllkrfk[[Tdc\}|}|{||u{{tsle||lek||}tll{{t|z|u{{tlld|zuztldd}lks|]bZUTS{u{{||tts{||mtt\[b||Ù|~|{u{{{||u{{ekd|tllmttd\\lksrfk}{{rfku{{llkekdlddztltt{ekd{{t}|tll|z|zmttrfk||fkk{||ddcultultrfk{{}{{}[[T{u{u{||edktzlult{tt|{{tts{{u{{|lld}|{{tddc|uJHFJHFlddttsult{{tlritsl[TTllkdc\ddcFD;:97UTS]bZd\\VTLSKJrg]lriyle{{tekdlrilldkk]]bZedktsluzt{||edk}{u{|{tttsl|lld{tt|mtt{{t{||[[Ttts\[[|z{{\[[ekdUTSf]cUTS|v[[Tlks{ttlks[[T}SKJr]gSKJUMRkd\}b[UultekdllkaWM}||{{}{u{zlluzt}|zlddtsllddlek||{ttuzt||uztllktt{|z{{{{tmtt|lks|Ī{{{{{{tts{{~ċ\[[tllf]cekd||}u{{tt{{u{{{tts{u{lrittstt{mtt{{mttlekrfku{{\[[|ztldc\lldkd\|lldu{{d\\||ult{{tllF=C}}z~}{tt|}{{llk|zuzt{u{|mtt|}llk{{|rg]VTLFD;[TTUTSekdlddztlllkllkdc\[[TUMRztlUTS:97:97sreb[UlddSKJsreD;9lddSKJldd{||lldsrezllf]csleutuultlld{tt||]bZlri||tsl|ut[[T[[T[[Ttsltsl{{tldd}ttstts~uzt|MSS\[[[TT]bZ[TTi\V|{u{{{t||{ttsrej]\leklddcbVrg]{{t{tttlltyg|uttslldmttdc\UTSf]cut|z{tt|u{||{||ddcultedk{{|zlks|}|||^fsх{{{{{{|ult}tsllksu{{mttmttlksddc{||}mttlkslrimtt}|lritsllri|{{tsre{{tredlld]bZ\[bUMR{{{{redv{}{u{||uzttsl|]bZ||tlltt{mttv{uzt}lksmttuztekdllktlltzlek][[Tlldslettsv{|ddcekdtslztlultdc\,55||FD;74,{{tlrif]c{zmlriFD;\[[VTL{|||zsle|zttsjV[tslrg]tslslej]\sle||lekllk{{ttzlllddc\|{||ek]b[U{ttlrivlri\[[ekduzt|utt{{{lri|kd\UTS\UZdc\[TTlldbVU{{t\[[lldVZTultyle}cbVkk]lri{zmzll[TTsreztlf]c]bZ|UTSlri]bZztl{||tsl||d\\{ttmtt{u{tt{}]cdtts{{lks||}{tt}|}{{|}}{{|zultmttttsuzt}edk|zmttUTS\[b]bZdc\tsl{{nv]cdd\\\[[|z{u{tllj]\|ldddc\|mtt|z}v{lks}v{{wltt{ylv{}ut}llktllulttt{~tzl}|}nvddcmttlksd\\lrilddd\\ekd{tt{{tddc{||}{tttzltts{zmj]\\UZUTSUTSJHF74,lridkVSKJVTLJHFbVZVTLbVUtllu{{d\\srelksztlkk]tslztlddclri{tt||ztlfkk{||tzl}]bZmtt{u{llk|zFD;MSSlrilri]bZ{{tlllkslddllkddctll\[bultuzt\[b}tsl}lks]bZUMR||b[Uultrg]LKR{ttkk]UTSlddVTL[TTUMRlriu{u{lld{||{tt|kd\tzl\[bek]tt{{{u{{|mttÙ}}{{|zulttt{tt{UTSultlksu{{}|lksekd]bZ]bZtsl}|mk\[b\[[kk]|zultztltlllri|zddcultttsek]]cdMRK}UMRv{~{{ultv{llk|zmttmttf]c|ek]\[bultllktts|{{}{{lksVZTJHF{ttultUTSu{{tlllld{{tedk||sletsl{||kk]SKJSKJaWM|ekd*)(kd\kk]bVUVTL:97D;9\UZbVUllk]bZtsl}f]ckd\mttcbVldd\[[ztlztllldmttcbV|dc\b[Ulld|]bZ]cdekdJHFu{{MRKVZ[llkkd\edk{||{{|lddldd{{lks|zllktslztlutUMRjcVj]\lddbVZ{|||z|uf]crfkrg]\[[ldddc\{||mtt|z{{t[TT\[[\[btsltts|||{||lek|redlldmttu{{uzt{u{{{lkstsl}{{u{{{{fkkmttu{{|mttmtt}~{||~~{u{|nv{u{|{|||u{{|ttsult{u{mtt}|mttfkk|mtt|z|ultmttleklldllk{||VTL}UTS[TTlldVTL{||utJHFtllJHFtslkd\lkstslu}JHFleksle}ttsuztlri\[blksu{{tsl\[b}f]c||~tt{{|||tts{tt{||mtt|uztlldf]clrilld{{tztl]cd\[[redVTL[[T|zrg]FD;[[Tdc\SKJ:97*)(UTSVTLaWMVTLSKJJHFf]ckk]llkSKJlrikd\zllrfkd\\lrilriVTL}yle|ubVUmtt{zm{{tkd\tts{{t{tt||z||lddlrilksekdmtttzlult||{{lrimtt}tt{|zredrg]lrifkk{{tlddsle|utsllri}|}|D;9||lldulttt{[[Tlddttslrid\\b[UJHFd\\lldtt{{ttuztkd\{{f]ctsl{{t{u{{ttult{{mtt||{{tt{]bZ]cd{{mttmttmtt{{nvmtt{{|lks{{}lrif]c{u{[TTedklekuztlks]bZlrimttmttmtt~u{{mtt{{{u{||ztllkk]lddb[U||{{tultlekdc\MRKllkrfkf]cf]cUMRtll{{||ultuzt||}mttlksVTL\[[u{{tslultttsult{{{{edk}mttVZ[tts{{uzt\[[tlltsl\[btts[TTztlVZTkd\VTLb[UyleUTS[TTJHF>ECSKJVTLJHF74,[TTrfk}b[U}f]cllklld{||UMR\[[VZTi\V]bZlriekdVTL|ztll|zfkktzlfkk[[Trg]ekd{{tll||{u{g\rUTSedkkd\u{{mttmttSKJult|z{u{ddcd\\{u{lddsleldd|z]cdred|cbVd\\f]c|zmttd\\\[[utttsu{{uztuztttsult|z{{t|||lri}mtt|zlkskd\{{Å|{{lks|}{{{{uzttsl|llktt{|z[[Tmttu{{|||u{{lek|lkslrimttu{{lld|z}lrib[Uekdr]g\[[VTLf]c}{||f]cmttult|{u{f]c||tyg{tt}lekrfk{tt}|z|z{||llkllk{u{tts{{{{lksttstll}uzt{{\[[d\\ek]d\\edkllklddtsllri[[TVTLb[Uultlddu{{UMR*)(aWMVTLd\\VTL[[TD;9[TTb[U{u{]bZ{{tttsztlSKJlld||tsltsluztddc|u{zmekdkd\ddc\[[lldttstygb[U}sle\[[|zlri|uzt]cdlri{{|z]bZf]c{{lrimttb[Ud\\\[[||lldlld{{lldtslsleekd|zldddc\tslj]\VTLv{u{{MRKVZT|uztsre}|z|z{||||{{ttsl|{{ultmttVZTtt{{{|}}}}~|lri|z}ultult|{{lldu{{uzttsl}|nv{{mtt{u{ttsekd}lddddckd\uzt{{SKJttsUMRdc\D;9{ttMRKsle{{}{{tll{{t}lrid\\kd\{tt|}}{{t{u{}|u{{mttu{{tlllks|{{f]c{||{tt{{{{lrilkstsl{ttlld{{tmttultkd\rfk{{]bZkk]tllVTLUTS]bZ]bZ:97}VTLtzli\VJHFi\VUMRVTL\[[\[[mttnv|uzttll}|bVUultlld]bZedk|sre{ttkd\bVUf]c}|z[TTtll[[Tllkd\\||}u{{edkVTL\[b\[bVTLdc\{||||ztlttsred]bZek]cbVllk]cdedkd\\lld]bZkk]tslUTS[[Tedk{||lriddcu{{mttsrei\V{||uzt{||{{{{UTS||||ttstt{tt{}tll|u{{}{{Ümtt]cd|~{||lri]cdu{{]cd~|u{{mtt}mtt{u{cbV]cdf]cSKJttstllztlddcttsekdlrilksSKJ]cd|[TTlriddc[[T{u{lksylttszll{|||ztsl{{{{|{tt}tt{lri|]bZmtttt{tllddcuztbVU\[[tsl|zsrecbVyfdlddred[[TJHF*)(kd\VTLek]VTLMRKD;9{{t[TTlddJHFVTL\[[tt{{u{{||zll}ekd|tts}tsllekkd\VZT\[[{ttSKJ{{tzll|u|ztsltlluzt{tt}u||\[bcbVnfkkbVZSKJzlttstllkd\}VTL|zlek[TTtsld\\]bZult[TTUMRultrfklri]bZUMR|lriVZT{tt{{|z|ztslult||[[Tfkkuzt}tts{||{{mtt{{nv|{{u{{f]c{u{}uztedk]cd|zVZ[mtt]cdddcuztfkklkslksUTSSKJtsl{{t]cd{{tuzt|ztts||fkktt{lrif]ctts[TT[[TVTL{u{ttsmtttzl{tt||}{u{{u{{||u{{{{lkslksttsf]c]cdlks|\[b|ttstsl{tt|tll{||uztlld|z[[TVTLJHFlld[[T]bZultUTS*)(dc\[[TJHFaWMD;9D;9jV[FD;JHF\[[b[Uf]cultd\\lek}tt{ultiq][[T}zl|ek]u{{}uttzl|}rg]j]\}zlllddek]mtt{{tttslri{u{|tll{{||lldMRKSKJF=C{{trfkr]ZtllbVU]bZekdsle{tttlluekdtlltllv{ult{u{\[[ultfkk>B9tll|cbVekdu{{||{{|ttszlllddmtttslttstt{{{ttts|{ttmttlriuzt|\[b}}{{~u{{lkskd\f]c|z|mttVZTnv|llku{{ult}f]c{|||zllk|z{{t]bZsle||dc\||\[[{tt\[b[TT}tzl|VTLek]JHF{u{{{{ttuzttsl}~tll|ztl|]bZ{|||u{{{{{ttu{{mtt]cd{{||b[Uekd{ttfkkZbN|z\UZekdSKJVTLldd[[Tdc\VTL:97*)(slejcVD;93+*JHF74,JHF[TTult}|ulldttsult||ult[[TttsUTS[[Tek]ddc{{|z|uultultultlksuzt\UZlritslek]{u{tsllri]cd?;C{tt[[Tsle{tt|ulriJHFddcdc\ddcd\\tlluVTL[TTttsd\\ultttsb[Uult[TTUMR[TTlri{||ttsekdfkk}|}}tllllkēmttuztztl{|||zu{{tslmtt{{|}|}}ã|vlks]cduztmttu{{{{tts|fkkmtt|{{edk]bZlks}|}rfk{{ttsl]bZ[[TUTS~u{{|uekd[[Tdc\u{{VZ[lrilekuztuzttsllrilriultd\\|tt{mwtslVTL{{{||}tslllklriult{{}tt{lks]bZ{{{u{{||f]cdc\SKJtsl|llk[TT[[TztlVTLsrett{d\\JHF*)(j]\cbVJHFSKJF=CF=C[[T[[TbVU}{{t||{u{tlllekllktll{zmdc\kd\{{t{{tlri]bZwl}||red|}sleSKJlektll~}\[bultleklritsld\\{ttddcv{mtttllb[Ud\\kd\b[UbVZdc\lddF=Cf]clekmttf]cmttttsu{{lri}|lldtsl{u{fkkuztf]c|{ttlld{{|{{}}|tt{{{tÜlkslek~mttlddmttUTS|mtt|ztt{{||{{lks{{ttllkk]uztVZTddclekbVZtslkd\lksVTL]bZtlluzt[TTtll]bZekdu{{{{{{|zlri{{{u{lld{u{v{ekd{{tzll||}|{{tts}f]cmttf]clri{{mtt]bZedkmtttt{dc\]cdu{{ttsllk{tt|zztl]cdlek[[T{{trg]VTL[[TSKJldd\[[*)(sleJHFbVZJHFJHFVTLVTLkd\[TT{{t||ttsrfk{{{{ttslllklrillkttsu{{f]c}}{{tek]lksfkk}ttstzld\\uzt]cdultttsd\\UUY|||zddcdc\UMRdc\mttrg]leklddlri{ttjcV[TTj]\ek][TT{tt}|llk{ttv{}|ztt{\[[]cd\[[||{||{||tsl|ztt{{||ekd}|zsle|ekd]bZ|zdc\}||{{{{{||{{|ultČlks]cdlksmttlri\[bmttmttult{{t{{{{t}tts{{t]bZ[[T|zuztllkf]c{{]bZek]tsl\[[JHFmttmtt|{||ddcztl[[T\[[}lld{{tllduzt}lkslld\[[tsl}uzt|{{lks{||VZ[{{||leklddlri{{[[T{{tsl{{t]bZ|{u{{zmedkddc[[Tdc\VTLztl\UZlddLKR*)(ztf{{t{ttUMRVTLj]\|zrg]v{f]ckd\tts{u{fkkv{tt{slekd\dc\ttsuztlks{u{tt{{||{tt\UZ|uf]ckk]{{t{{\[buzttslmttlkstsl{||SKJ\[[[TT|[[Tdc\tllkd\lkskd\uttzl|u{zmtsld\\kk]lld{{ultf]c||ult]cdlkslks{||lek}uċekd{||ult{{|ztts{||{||{ttlks}||}|{{|{u{\[bѣř{||u{{|mtt\[[tts}|mtt]cdfkkddc|ultlriv{||d\\[TTkd\kd\fkksre\UZJHFmtttts{{VTLb[Uutmtt\[b\[b|{||u{{|[[Tlld}}{{|u{tt{u{|{tt{ttmttunvmttmtttslvultmtttt{||uztu{{ultmttUUYult{{t{||]bZsle\[[UTS[[Tllkdc\VTLVTLVTLd\\jV[SKJ\[b74,red]bZlddekd[TTSKJ]bZSKJf]cb[Utslddcztl{{rfkvultdc\kk]{{tkk]dc\ult{{t|ud\\}[TTtzllri[[Tekdtsltlltts|z|zfkk}u{{{||uzt]cdJHFlksdc\[[TtllSKJtsl|zmtttllVTLsretll|{zmf]cllk{{t{ttUTSztl{ttllkf]ctllf]cSKJJHFultu{{JHFtt{}{tt{u{mttvdc\leklldkk]{||edk{{t||ult{{mtttts|ztt{uzt{{mk{{{{}lekd\\|}f]clks|z|z{{tfkkVZ[|{{^fs]cdmtt\[bult{{f]c||tslddcJHF|uutf]cult\[[lkstt{{ttultnv\[[]bZekd]bZJHFddcultkk]|{||tll||tslult\[[|SKJf]c|{||tslmttlks{{mtttslultyl\UZtsluztultuzt||ddcd\\kd\UTStslVTL[TTlld]bZrg]d\\LKR*)(bVUVTL74,JHFJHFf]clldUMR{tt|z|uztb[U}{u{ztl{{tkk]b[U[[T{{tdc\v{ut{{{tt{{tlricbV|zlek||tts{tttslult{u{{u{tts|zmttUTS\[bUMRd\\ekdVTL[[TbVZult{{srered[TTbVUf]cSKJsletsl{zmu{{}[TTSKJ||bVZlddllk{u{SKJf]clkstt{MSS{u{||uddclkstslult{{t{||{{{{\[btt{{{mtt}}lksmk~tts{{t}ttsu{{|tsl]cdu{{{ttlks]cdUTS}nvmttVZ[\[b\[b|}\[[|}|{{{u{MRK{{f]cllkkd\{{lkslksmtt|z^fs\[[mttu{{{{t|zVTLtsltslVTLfkk{{ultuj]\u{{|f]cultLKR}lddtts}lekuzt{u{|lksmttlri|lriuztlekultd\\dc\UMRek]sle[TT]bZSKJ\[b[TTMSS-1+VTL[TTPF=UTSddc\[[lldutred|z|z||u{{{ttbVZlek{zmj]\VTLmttdc\tzl|{||lek}{{t{{t\[[}UMR}tt{|z{{fkk{{|zwlVTLtsl[TTlksvSKJ|zddc{||}lddj]\tts|vJHF[TT|urfk{{tultslettstll{ttMSSf]cult\[bldd{ttultf]clek|z{||||}lld|uzt{||mttedk|z|{{mttuztllkult||zf]cf]c{{}mtt]cd\[[ldd|mtt{{VZ[lks{{lksmtt{{lek\[blks{u{{ttSKJ{u{tll{u{VZ[tt{llkddclddrfk|{{tt{edk|mtt]cd]cdlld{||{ttult{{]cd{{t{ttu{{u{{|z[TTtt{{{|u{{ekd{{t{||tllfkk{u{VZT|{||ddc|ultldd{tt|zekdddcUMRztlfkkSKJVTLdc\D;9JHFlldVTLlddJHF,55sled\\:97JHFredbVUlri{u{tllUTSVTLlriultf]cultult]bZ{{tsl]bZ|uf]clekultdc\llkVTLVZTlek{{UTSd\\{||tt{}ult{{tJHFf]cult{ttsleztlrfkredrr]sletts{||{{rfk{zm\UZJHFddc{{\UZLKR}{u{ldd|zmtt||lksut|u{||{tt[[Tmkuztlks{{Č}~mtt{{t{{t{{}]cd{||{{ult{{{{ttstt{{||]cdtts]cd|znmttlkslksultu{{}}}uztg\r}edk||f]c|{{|lks\[blksnv|z{{}|tlltsltslulttt{}mtt~mttfkk}ttsfkkttsu{{{{{{\[[mttmttUMRllk}mttuztUTSfkkUTSSKJ|ztsl[TTSKJ[[Trg]aWMlrilddcbVultLKR,55wl[TT\UZddcJHFtll[[Tultllk]bZtzl{ttult[TTtsl||SKJmtt|zttsek]lddllkd\\{||d\\mttJHFVZTbVZlksmtt|}}{{u{{lks{ttsle[[TUMR?;Cf]cSKJ}lekttstt{f]c|UMRkk]ztl}|VTLuztf]c||VTLlddldd[[Tekdd\\mttlks\[b{|||lksldd{{tts}|zu{{{{||||}tll}||tll{{{{љu{{b[Ulld{{||ult~|z|mttlkslddmtt|{{nv]cd|\[b|zlek\UZlkslek~}}lks}lks{||{{LKR{{\[b~|mttd\\lri}{{t||lks{u{|tllf]cfkklriu{{ultu{{{{|||mttlkslkslks]cddc\\[[dc\[TTultddcsre{ttlrikd\ztlVTLMSS:97tzl}ultSKJVTLVZTVTL[TT[[Tf]cutllkdc\lekb[Utts}tt{|||mtt|zuztlld|f]clksultult|zddc{ttJHFtsl|u|u{{|ttstt{}tlld\\iq]lriUMR|d\\llktlllri\UZ[TTsle}\[[ult}ztl\[[||]cdJHF[TTVZTVTL\[[ekdSKJ^fsmttSKJdc\lddult}|}{||uztllklldtll{||{{tzlltts\[b}ultu{{ulttt{lek{u{}{u{|v{}|lri{{|}mttlektt{v[TT{{t{{t{{tztl]bZ{{||tts{||JHFVZ[lksnMSSmttmtt{||fkk\[[|ldd}|nvultdc\tt{edkUUY{||{{mtt]cd\[b^fsmttmttmttf]cmtttslekduztUTS|utleklrid\\f]ccbVlddSKJlldUMRr]ZVTLOS`)+2|llkFD;[[TSKJFD;SKJVZTUMRJHFJHFtsllldredSKJ{||UTS\[bekd|z|tts{||mtt{||lri]cdvuztztl[TTztltts\[btsl{{{u{UTS|]bZ{{JHFddcult}|\[[d\\srelri{tt}|rfksrebVZdc\edksleddcu{{\[[ekdf]c\UZ|d\\|z[[T\[[\[bd\\{{td\\||lritts}{tt||||ttsUUY{{}Æ~uzttt{~{tt{||{tt}lks]cdlriddcult|uzt|Ìddcultult[TTtllekdiq]]bZekdkd\{{\[[ekdf]c{u{lksmtttt{||nek]|lksuztmtt{{lks{{~tll}|{{lksddc{u{{{tult|mtt|{{lksfkk\[b]cd\[b]cdfkkddcuzt]cdlri|z{||[TTb[Ukd\sleb[UyleyfdllkJHFaWMlriOS`*)(tts}{ttd\\sre{{tb[UVTL74,JHFFD;UTSVZTkd\redjV[{u{ekdmtt{{tult{{t|zu{{lkslri\UZuzt}[TTlri]cdddc{||UTStt{|tts{u{|uztultUTSlddztl|zek]{{:97f]c\[[{ttlld{u{|z{ttrfk{ttsref]cUMR[[TlriJHF||\[b{{ult]bZult}||mttekdtt{{||{||}{{t}u{{|{{ultmk}~ult|tll}|lks{ttVZ[{{]cdmttUUYultylf]cf]cwlddcJHF[[T|edkulttt{edkmtt}]cdMRK{{|OS`lri]bZLKR{{lksuztyl}edkttslekmttfkk{|||\[[f]c\[b]cd{{lks|}||lksVZTf]ckd\b[Uf]c[[Trg]red{{tekd]bZtslJHF,55mttlldbVUFD;b[Uzlekd[[TekdlriSKJlld}{u{{u{d\\UTSlks|zlrimttu{{mttllk\[[llk\[[ldd{tt{||lri{{ulttsl{{mtt|{||}}ult{{ttsdc\{{t{{t[[TlksJHFJHFd\\|z{{|utsl[TTrfkVTLrfkdc\FD;sleekd[TTkk]|lld}{u{JHF{{\[[UUY]bZ{u{SKJllkzlllek{||||}lldlri}ldd|z{{llklkslekmtt{{|{{ \ No newline at end of file
diff --git a/libraries/ode-0.9/drawstuff/textures/sky.ppm b/libraries/ode-0.9/drawstuff/textures/sky.ppm
new file mode 100644
index 0000000..8b541b1
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/textures/sky.ppm
@@ -0,0 +1,5 @@
1P6
2# Created by Paint Shop Pro
3128 128
4255
5}}~~}}y{}}z~|zz~zz|~{y~~~~|{x|yz}~xvuwzzzzyw~{zz}wuttyzyxw{~~zy~||{xwvwvwz~|{~}}~|zwyxx|~~|{||zz~~~}y}~}z{~||}}~~||||yw|{{|wtz}||~~vsuz}xwvw}~~zxwz}}|{{}|}|z|~|wuux{{~zxvuw||}}}||yv||~z|||~~|{y~}}z{|~~|yz}~}||x{|}|}z}~ \ No newline at end of file
diff --git a/libraries/ode-0.9/drawstuff/textures/wood.ppm b/libraries/ode-0.9/drawstuff/textures/wood.ppm
new file mode 100644
index 0000000..a53d2dc
--- /dev/null
+++ b/libraries/ode-0.9/drawstuff/textures/wood.ppm
@@ -0,0 +1,5 @@
1P6
2# Created by Paint Shop Pro
3256 256
4255
5ǿżŰ̻ÿǻʻǻŻÿ¸øŸۼƿ̼ÿÿʻõƼɿǾøشſ·ɻþǼƾŻǼʿƿÿǿٳſ̺ɿǼɿ»Ƽǿпƿпǵص̸Ǽǿ¾ſѾ׼ʾǸ¿ŵƻɿƿ̼¾׿Ƽ°»ºɺغǸۼſƿžؿ̼ƾ¿μſžÿúƸ¿¾žÿɻͿŸɿÿ»οüʿſ¿»ξǼſ¿μǸ¿¾ƾ׼δ¼ǻͻüп»ſŻžǼþÿþǿ¿ǿ¾þÿ¿¾úƿ¼̾źſº¼ƿѻŷ÷þþ׾ŷƵüſ¿¾ƸɵƼ¸ÿƺʵǼǻ¿ƾƼɺžžżƾƿſƾ÷ÿ̷ǻþ̿úƿÿԻżξþɸûпž̺Żí¾ǼʾʻŻñɼͿλпƻ¿ŻѼտúǾÿżԼԿʸѺǿÿſ̼;ͿռżԼƸǾſʼŵ¿ǺǺƾǿÿóοƾ»üѿǿƾÿƷҼƾü׻źþûѸܾҿûǿÿ·຺ƿÿ¾¸߾»żƻƸ߻þſҸмݺп̼Ƽ¼ſ¾;վÿٺԵλŵƾ¼¿ǷǸ¾»ܴѻǼúüʺ¼ưźžб׼Ƿ¼¾Ŵƾ¾ܵٿƼʼż´¾ƿº׾຺¾¾Ϳ;º̴¾ƺûɸžҸҿ;ƿǾ㸸Ե̸Żſ¸¼ÿ걱ƻ۾Ʊſ¼о»ǸµǷ߸ƿ¿Ǿؼ¿Ѻ¿¾ξûú侾ѵ¼¿ͺƿ¸Ƹ¾ƻǼվ¼üÿƴ۳һǼŻ¾¼ػƺɸ¿రưǸƸøſ·¼žõ¼ƿʿԾ÷·̼ƿ¿ƺ¿ƾ¸·̿Ʒ;ʼøſҾŵźҺǼͻþǿžտ±ŷɸžƿٳʼ̼ο¾¿÷þɸþſԷߴɼûþû÷żƸǺÿ¼ÿ¿»Я¾ſɼǻÿ¿üγɿƿɻǿÿɼż̼ſұǿ¿»ǺƵ¿ٸſɾſ¸ɾſǿºþغƾ̿¾¿λ¿¿Ǵƾſǵɼ»θƸ¿»ŵǾƿǿɻɺž¾żÿ¿úþµɺ¼¾ŵǻ¿ÿ¿Ǽɾ¼ÿƿ¿ſº¿ʺ¼źô俿ƺºŵžð¿Կúɻÿɿٻ»źƾξǾƻ⺺üξƻûǿƿÿǻÿ¾úµݵþǸ¿ǿ¼Ŵÿ¾ʨ¼¾ջƼƿÿɺþø¼¿ÿΰμ¾¿θѸ»º»¿´¿»ǿͼɼο¼ž¿üŷǸǼλ¿ÿŸ°Ƽ¾ø¿μ¿¿¾þɾžƿÿôŸ¼¿ż¼ÿ¿ƿſʼƿž¾ɸź¿ú¿ü¾û¿̿ʾ¾ø¾¿¾µǼſ¼µǼµƾƿÿ÷¿ƿƿ÷Żÿɺǿú÷¿¼ŷƿ¿ɼѾ¿¾üʿ¾üԱͿž¿Լ¼»¾ر¿÷Ÿüп¾ɿ̵þ¿Ǽҿ¿ʿ¸¿¿ɻɸþºҾ¿ż»Ǿпž¿¾¿ܿ̾·ÿƷǼɼ¿øƿþɻ¾㾾̼¼óɺú۷¼ñ뾾ɺǸ۷þɾ¾ų̺;¼̿謬ǾƼǿʺɿſżٺ¿ƿƼҾþżž̵¿ÿûʴݻǼ̼ü¿üƻƸݵÿǺ¾¸õƴٵɾ͸¾ͻƿپƻƾ»ƻƺ̼÷ѳǿ¾ſƸ¼һſƻ͸þѻʾξóοüƺͿ»۱̾Űеüʾíº¿ɾ㷷¾¾ƴ÷Ƽŭ¸ºŵ߷ɿƵ߼Ǹɼɵ¬ƿܷ̾´ݸºõ̻¿ŵ´üɷܺÿ;õžþƵƷƸαÿɻɷÿÿǸ¿»Ÿŭΰ¾Ŵʿþ໻ƿʸþǺſɾǷ͸ü̿Ƴ¿ⳳƿþþǴ俿ÿƺú´źźúǩÿźпʻ¾¾ſ¿ʼпʻ¿úÿкÿûþ¸ѻ;¸Żѱü۷ƿǿƿ´Իͺô¿ұÿþ¿̾ɸǿǺżͼºƴƸǿ߾ÿͻ³żûɾƳſ´ſհǺ״ſ̺¿¾ǿ¾̼ɿû³ÿץШǻƿøŻµ̻ɻôǿצɬúǾкþмѿŵ¾ըűþǾƻžźлƿѿǿêſõɱž̼¸ÿɻƿɾ׿ŭ¼μ¿̴¿¿οƻƼ¿ѺůǻоǬ̿¿ɻÿǿ̿ƻð¾ʼɵÿǻ¾Ϳþÿżűž¼ɾƯʿżôǰſüʿƯ躺Ǿ¯¸ÿüʼ绻žõ»Ŵͷɿ¼Ϳ̾ǿƺҿ¾λ¿»ЬɭʺǾ̿¾׾Ծ¿þ¸ҬƸƿ¿ƿׯŻɻž¼տ¾üҿٵ¸ÿ¿­翿DZ¼ʸܻÿŻÿ÷⼼ž¯¾ܼɷ¿ɸ¬»պǿ۷̿ǻǺñǺƸͿÿþ۱¼طÿǼǻۼѾ»Ǽ̯µ̷¿¿õʻ¿Ǽÿº̱¼ÿ¼ʿ¿Һ¿ʿͿǾʵŷǾƿ¼ú׻оſͰʼ¿ÿüظмʻͿ;еξ̾¼о¼Ǿ¿¿ǵƼʿοƿŻ¿;͵ۼŸտƺԸż̿ذƺſɾγŷݸ꿿ſɿ۵¼մоʼ󿿿ۼ¾ѿʿ¼¾үѻþվſǴǷоſƾ羾ʺʿ¾¿θƦοǾ྾ѾػǼŻ̼ûҨþͿûԾԴҺ¾߿СɾŻ»ÿº׻հһʻؼټШüǾɻƻǻݼ׺ŵü¿Һ¿ʨ¿ټźƿþغƵ̼ƺÿɾԻίɿǰǾžʼǺǺǿʿʸʼԩվƷ»ƻ྾ɿ̼ƾŷ̺似ŷ̿ſɳԸ̾»ǾŻµ¿ߵͿ»ø¾ҺƼŷǿŵǾ¾ܿǸɼǺſŴôξͿο¿̵ƸǾƿҾҿ뼼Һʴɿ¿þÿͷξóݻ۷̷ǿɻƺǸ¼Ǿƴ¾۸ε¿ÿþ̾ŻɷصʰǼиɻƺ̺ͬþûŸ±ƻƻͼ¢Ѵƿʸ㾾ƿ»̼üǸ¿̿ɰ»׻θ¸¼ŸкɼʰʿƯºƿԷǸշʱ·ͪ¿ǻƸþܸҴ¾¿лµͿ侾¾üſûҴл·»л俿ÿ¿þƻ׸ǷʿԿüþպ¾¾һͿԻ»»¿¿ɻƾžſżз̸Լ¼λ°¾÷տͿξŸ»оλúۿÿͿܸƾɰƳ¸Ƶ»ѾɼŸŵ⺺¿»ſվ¼ұƼ¼¿̷ƻ¿ݷþø㻻վ»ǵ¾ø¸ʸͿÿ׵ſٱѺƿǷžʰ¿̷ɻƺο¿̺üͼ·ǰ¾ԾƼDZÿƿƺ׵ÿԾſгԿ·þ׿õ¿źÿճɺſþű³»ü¾Ѻñп¿ɼ͵Ƽÿκ³Ƹû¿з·ſѺҺǾʿѷǴż»һ̼źԪžż¿¾һµõƾžþλ±þԯǼǻþѼҼ¼ÿǿμƾ¾Ԭÿ¿¿¿űʴ̾ƿſûܭɻѾ¿ѵǿúüƿ¿կпżƼƸ̻úƾ¾ñʻſ¼ðκºǺµҵ÷Ʒſÿʷ÷Ǹ̴ƾǾ¿¾ûþξ»Ϳܿ̿;ƿ¿ɾŸ״Ǿʵиſdzʼɼǵ׿»ÿξͼ̾Ѹʻż¿¿ѻƼ̾¿ſ¼¾̺øμεžſ̿ŻͻͼžżÿʻººþοøҼž»žͻɿű¾¿ž¾̿̿ۿŸżݼƺ͵¿ʿƴ¾ɳʹѸǸسǾǷ»¿ż¸ó̸¿ѿŻ绻ɿžǻʿ¸¿ʿú¸ŸžǾպ¼ƿǿ¿ɸ¿̼ƾѻƼþſүܾʾ̺ǿûԷƻԾ¼¼żƻÿɿø״ÿƷǭƿſ¿׼¿¿ƿ¿Ǿʺͼÿſżյþƿ¿ŵżһƿռξ»οžüбƾʿÿüκ¿Ƹ¼Żƿ¾ǿθŻûǵ¼ɳºǿ߾¼þüſ·μɻþѭѼɾʵþ·ǿž¿αͿɺ¼žŵžƿſ¼ÿƾǾ̷ʿοúɯ¾ÿҺؿǼǿſ⼼¼þôǷÿǾдźѾÿþüżſǾſɺſüа¿ſѿ;ÿǾÿƾ»¿иܴ̻»¿¾ʷƾſźºž¿ûºüǺóþſþŵºż¸ƿǼѴ³̾ÿþ»ôп¾žþǸüʵ¿¿̸þ̸¾üʼƻƵƸſƸ¿ôÿþžûмǻʿ;̻žɷƿƿ¿ʾøþɸƯ»ѸʻŻɵ»ſɼ±ǿλҼð̺Ƹžɻɼÿοÿ°¿žپ׼þɿ»۾žŻûƾƾ¿Ǽغ͸һǿ¿ۼú¾ʾ»ÿǿ·¸¾¾ԿżǷͻŷþ¿λ¸»ûÿÿξǿ̻ſ¾ô»Ƽɺɿ¾ƻƿ̿¾ɻ¾мɼǺؼ̼ɷɾÿɸŵÿ̾ſøźδ̷¸ûžƾױſ¾¾ɺʴɯɾǾ̴Ƽµ̷¼ƸÿƱ¼ƾÿɻƼ۴Ժ̼¿ɳƸͻ¿иźżû±ǵμ·¼¾¿¿ǾƼ¿ɻú¸͸ſô³Ʊǿûžûƻ¾¿»ɼʻԷŵ·ǼżüÿԿŻƿ±ƻɻǿŷξſ̿¾̸ͻҷøɼ»ʿ¿Ÿüٿſɼ¼Żͺ¿ż¸λƵƿʿŰƾ¾͸ƸɼžŴú׷żüʿҷ÷ŷǾͱɾ¿̷Ƹóż»ƺԸƿŵżƼηžʹоʿѼǴξøñǿ¿ѿɾ´¼żô¿ʺûƺƸп̺Ѱðűɿɴ¿͵õú»¸̺»ž¾Хƿǻ׾ʵ¾Ʊ̾¿ǼʿüǿDZ¼Żʷ¿þžûүǼɴ¿ƿο¾Ǫ¼µÿʾºƾǸ¼Կ¿ɺúɼͺɾѾǻþŪ´û¿ǾžøջóżǭƿʸǾͿþʿſ;ɿǾÿ¿ƺƼʿ¿̷ʻüؾ̱ƺɸ߿þ¬̿þ»Ǿíƻվ¾ʿÿ۾мͻɼ̺úſ÷°Ǽ¿þ»ŸͰµʺ¿пźº̾ʼ¿ǿ¿¬оʷʼ·ͼǿúεɿƾоÿż»þ̺ͿпøûƸžʾþʾտʸũտſðҸǼ¸žпƺÿüɺѿ;þƾλÿŸ·¾̿ƻþſξ»վ·¿ÿ⻻ſ¬ø¼̺̿ѿɼÿɻƾǾ»ⳳ¿ʻ¼κ¼þ̾з͸οſ´人ºðºƸ̸ûѴпºûżܿž㷷ǿ¼ʴ¾Ƽɺθ;ɾʷδξ̻Ǽʾ侾зƿɺγصѿаʸ̺¼̿໻͵žÿźſÿҷ̻ǿ¾þ似㿿̴̿¿ú̾ʾɷºɿƻøµ侾ʴɼüͿഴξǼ;ǿ°ɾƸ㾾ѿ̾ǻžѳ̺ɿ͸ǿƾƿǺǴſ÷Ǽ¼ߴοԺ¸ɿǿǿκ¾ʹÿûž糳Ǽü´ºŷ¾׿¾ź¾ɺؿ̱ \ No newline at end of file