diff options
author | suyambu.rm <suyambu.rm@samsung.com> | 2015-07-28 12:24:20 +0530 |
---|---|---|
committer | suyambu.rm <suyambu.rm@samsung.com> | 2015-07-28 20:01:26 +0530 |
commit | f3e38868285b2a9d04304b9861038da96d27d3cb (patch) | |
tree | de44e3ef494258294f296fcfdcdbecd6b1877438 | |
parent | 705a610dc057c3d8964922750b930e1022288a0b (diff) | |
download | cairo-f3e38868285b2a9d04304b9861038da96d27d3cb.tar.gz cairo-f3e38868285b2a9d04304b9861038da96d27d3cb.tar.bz2 cairo-f3e38868285b2a9d04304b9861038da96d27d3cb.zip |
Opensource Compliance Issue.
Remove modules with GPL3.0 copyright : cairo-fdr, cairo-sphinx, cairo-trace
Remove unnecessary modules : perf
Change-Id: I81d79eab3d9bef3e722665cef60b99f37836cc59
Signed-off-by: suyambu.rm <suyambu.rm@samsung.com>
92 files changed, 19 insertions, 28783 deletions
diff --git a/Makefile.am b/Makefile.am index 03fa35236..a797f2b9e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,11 +16,15 @@ EXTRA_DIST += \ ACLOCAL_AMFLAGS = -I build ${ACLOCAL_FLAGS} -DIST_SUBDIRS = src doc util boilerplate test perf +#DIST_SUBDIRS = src doc util boilerplate test perf +#SUBDIRS = src doc util +DIST_SUBDIRS = src doc util boilerplate test SUBDIRS = src doc util + # libpng is required for our test programs if CAIRO_HAS_PNG_FUNCTIONS -SUBDIRS += boilerplate test perf +#SUBDIRS += boilerplate test perf +SUBDIRS += boilerplate test endif configure: cairo-version.h diff --git a/configure.ac b/configure.ac index e4a92d4d3..1ace52bf7 100644 --- a/configure.ac +++ b/configure.ac @@ -920,17 +920,11 @@ boilerplate/Makefile src/Makefile test/Makefile test/pdiff/Makefile -perf/Makefile -perf/micro/Makefile util/Makefile -util/cairo-fdr/Makefile util/cairo-gobject/Makefile util/cairo-missing/Makefile util/cairo-script/Makefile util/cairo-script/examples/Makefile -util/cairo-sphinx/Makefile -util/cairo-trace/Makefile -util/cairo-trace/cairo-trace doc/Makefile doc/public/Makefile ]) diff --git a/packaging/cairo.spec b/packaging/cairo.spec index 850546ee8..e25c15d00 100644 --- a/packaging/cairo.spec +++ b/packaging/cairo.spec @@ -203,16 +203,16 @@ make %{?_smp_mflags} V=1 %license util/cairo-script/COPYING %{_libdir}/libcairo-script-interpreter.so.* -%files -n tools -%manifest %{name}.manifest -%defattr(-, root, root) -%license util/cairo-trace/COPYING util/cairo-trace/COPYING-GPL-3 -%{_bindir}/cairo-sphinx -%{_bindir}/cairo-trace -%dir %{_libdir}/cairo -%{_libdir}/cairo/cairo-fdr.so* -%{_libdir}/cairo/cairo-sphinx.so* -%{_libdir}/cairo/libcairo-trace.so* +#%files -n tools +#%manifest %{name}.manifest +#%defattr(-, root, root) +#%license util/cairo-trace/COPYING util/cairo-trace/COPYING-GPL-3 +#%{_bindir}/cairo-sphinx +#%{_bindir}/cairo-trace +#%dir %{_libdir}/cairo +#%{_libdir}/cairo/cairo-fdr.so* +#%{_libdir}/cairo/cairo-sphinx.so* +#%{_libdir}/cairo/libcairo-trace.so* %files devel %manifest %{name}.manifest diff --git a/perf/.gitignore b/perf/.gitignore deleted file mode 100644 index 02af7a93c..000000000 --- a/perf/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -TAGS -tags -cairo-analyse-trace -cairo-perf -cairo-perf-micro -cairo-perf-print -cairo-perf-trace -cairo-perf-chart -cairo-perf-compare-backends -cairo-perf-diff-files -cairo-perf-graph-files -cairo-traces -valgrind-log -callgrind.out.* -index.html -*.png -*.perf -*.o -*.gcda -*.gcno -*.exe -*.manifest -*.obj -*.ilk -*.suo -*.lib -*.pdb -*~ -.*.sw? -*.data diff --git a/perf/COPYING b/perf/COPYING deleted file mode 100644 index 17754cf7b..000000000 --- a/perf/COPYING +++ /dev/null @@ -1,5 +0,0 @@ -Cairo is free software. - -These tests are mainly available under a liberal MIT license to simplify -any use of the code for reference purposes. Please check the opening comment -of each file for copyright and licensing information. diff --git a/perf/Makefile.am b/perf/Makefile.am deleted file mode 100644 index 40b35bc38..000000000 --- a/perf/Makefile.am +++ /dev/null @@ -1,154 +0,0 @@ -include $(top_srcdir)/build/Makefile.am.common - -include $(top_srcdir)/perf/Makefile.sources - -AM_CPPFLAGS = \ - -I$(srcdir) \ - -I$(top_srcdir)/boilerplate \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/util/cairo-missing \ - -I$(top_srcdir)/util/cairo-script \ - -I$(top_builddir)/src \ - $(CAIRO_CFLAGS) - -AM_LDFLAGS = $(CAIRO_LDFLAGS) - -SUBDIRS = micro - -noinst_PROGRAMS = \ - cairo-analyse-trace \ - cairo-perf-trace \ - cairo-perf-micro \ - $(NULL) - -EXTRA_PROGRAMS += \ - cairo-analyse-trace \ - cairo-perf-micro \ - cairo-perf-trace \ - cairo-perf-diff-files \ - cairo-perf-print \ - cairo-perf-chart \ - cairo-perf-compare-backends \ - cairo-perf-graph-files \ - $(NULL) -EXTRA_DIST += cairo-perf-diff COPYING -EXTRA_LTLIBRARIES += libcairoperf.la - -LDADD = libcairoperf.la \ - $(top_builddir)/boilerplate/libcairoboilerplate.la \ - $(top_builddir)/src/libcairo.la - -cairo_perf_micro_SOURCES = $(cairo_perf_micro_sources) -cairo_perf_micro_LDADD = \ - $(top_builddir)/perf/micro/libcairo-perf-micro.la \ - $(LDADD) -cairo_perf_micro_DEPENDENCIES = \ - $(top_builddir)/perf/micro/libcairo-perf-micro.la \ - $(LDADD) - -libcairoperf_la_SOURCES = \ - $(libcairoperf_sources) \ - $(libcairoperf_external_sources) \ - $(libcairoperf_headers) \ - $(NULL) - -cairo_analyse_trace_SOURCES = \ - $(cairo_analyse_trace_sources) \ - $(cairo_analyse_trace_external_sources) -cairo_analyse_trace_LDADD = \ - $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ - $(top_builddir)/util/cairo-missing/libcairo-missing.la \ - $(LDADD) -cairo_analyse_trace_DEPENDENCIES = \ - $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ - $(top_builddir)/util/cairo-missing/libcairo-missing.la \ - $(LDADD) - -cairo_perf_trace_SOURCES = \ - $(cairo_perf_trace_sources) \ - $(cairo_perf_trace_external_sources) -cairo_perf_trace_LDADD = \ - $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ - $(top_builddir)/util/cairo-missing/libcairo-missing.la \ - $(LDADD) -cairo_perf_trace_DEPENDENCIES = \ - $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ - $(top_builddir)/util/cairo-missing/libcairo-missing.la \ - $(LDADD) - -cairo_perf_diff_files_SOURCES = $(cairo_perf_diff_files_sources) -cairo_perf_print_SOURCES = $(cairo_perf_print_sources) -cairo_perf_chart_SOURCES = $(cairo_perf_chart_sources) -cairo_perf_compare_backends_SOURCES = $(cairo_perf_compare_backends_sources) - -cairo_perf_graph_files_SOURCES = \ - $(cairo_perf_graph_files_sources) \ - $(cairo_perf_graph_files_headers) -cairo_perf_graph_files_CFLAGS = @gtk_CFLAGS@ -cairo_perf_graph_files_LDADD = @gtk_LIBS@ $(LDADD) - -# Install rules to rebuild the libraries and add explicit dependencies -$(top_builddir)/perf/micro/libcairo-perf-micro.la: - cd $(top_builddir)/perf/micro && $(MAKE) $(AM_MAKEFLAGS) libcairo-perf-micro.la - -$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la - cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la - -$(top_builddir)/src/libcairo.la: - cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la - -$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la - cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la - - -# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that -# one can limit tested targets both through CAIRO_TEST_TARGET env var -# and TARGETS make var on the command line. Same for the rest. -TARGETS = $(CAIRO_TEST_TARGET) -TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE) -FORMAT = $(CAIRO_TEST_TARGET_FORMAT) -ITERS = $(CAIRO_PERF_ITERATIONS) - -CAIRO_PERF_ENVIRONMENT = CAIRO_PERF_ITERATIONS="$(ITERS)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" - -perf: cairo-perf-micro$(EXEEXT) cairo-perf-trace$(EXEEXT) - -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-micro$(EXEEXT) - -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-trace$(EXEEXT) - -html-local: index.html - -perf-tag.html : cairo-perf-micro${EXEEXT} - $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ `git describe --abbrev=0` HEAD -perf-commit.html : cairo-perf-micro${EXEEXT} - $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ HEAD - -# Summarise changes in index.html, with details in links -index.html: perf-tag.html perf-commit.html - echo "<html><head><title>Performance Changes</title></head><body>Against <a href=\"perf-tag.html\">"`git describe --abbrev=0`"</a><br><a href=\"perf-commit.html\">Latest commit</a></body>" > $@ - -EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS) -VALGRIND_MEMCHECK_FLAGS = \ - --tool=memcheck \ - --suppressions=$(top_srcdir)/test/.valgrind-suppressions \ - --leak-check=yes --show-reachable=yes -VALGRIND_CALLGRIND_FLAGS = \ - --tool=callgrind -CLEANFILES += \ - valgrind-log \ - callgrind.out.* \ - index.html - -perf-valgrind: - $(MAKE) $(AM_MAKEFLAGS) perf \ - $(top_builddir)/libtool --mode=execute \ - valgrind $(VALGRIND_MEMCHECK_FLAGS) $(EXTRA_VALGRIND_FLAGS)' \ - | tee valgrind-log - -perf-callgrind: - $(MAKE) $(AM_MAKEFLAGS) perf \ - $(top_builddir)/libtool --mode=execute \ - valgrind $(VALGRIND_CALLGRIND_FLAGS) $(EXTRA_VALGRIND_FLAGS)' - -.PHONY: perf perf-valgrind perf-callgrind - -EXTRA_DIST += Makefile.win32 diff --git a/perf/Makefile.sources b/perf/Makefile.sources deleted file mode 100644 index 1fcf14809..000000000 --- a/perf/Makefile.sources +++ /dev/null @@ -1,38 +0,0 @@ -libcairoperf_sources = \ - cairo-perf.c \ - cairo-perf-report.c \ - cairo-stats.c \ - $(NULL) - -libcairoperf_external_sources = ../src/cairo-time.c - -libcairoperf_headers = \ - cairo-perf.h \ - cairo-stats.h \ - $(NULL) - -cairo_analyse_trace_sources = cairo-analyse-trace.c -cairo_analyse_trace_external_sources = ../src/cairo-error.c - -cairo_perf_trace_sources = cairo-perf-trace.c -cairo_perf_trace_external_sources = \ - ../src/cairo-error.c \ - ../src/cairo-hash.c \ - $(NULL) - -cairo_perf_micro_sources = cairo-perf-micro.c - -cairo_perf_diff_files_sources = cairo-perf-diff-files.c - -cairo_perf_print_sources = cairo-perf-print.c - -cairo_perf_chart_sources = cairo-perf-chart.c - -cairo_perf_compare_backends_sources = cairo-perf-compare-backends.c - -cairo_perf_graph_files_sources = \ - cairo-perf-graph-files.c \ - cairo-perf-graph-widget.c \ - $(NULL) - -cairo_perf_graph_files_headers = cairo-perf-graph.h diff --git a/perf/Makefile.win32 b/perf/Makefile.win32 deleted file mode 100644 index 084abf00e..000000000 --- a/perf/Makefile.win32 +++ /dev/null @@ -1,78 +0,0 @@ -top_srcdir = .. -include $(top_srcdir)/build/Makefile.win32.common -include $(top_srcdir)/perf/Makefile.sources - -CFLAGS += -I$(top_srcdir)/boilerplate -I$(top_srcdir)/util/cairo-script/ - -PERF_LIBS = \ - $(CFG)/libcairoperf.lib \ - $(top_builddir)/boilerplate/$(CFG)/boiler.lib \ - $(top_builddir)/src/$(CFG)/cairo-static.lib \ - $(NULL) - -PERF_EXES = \ - $(CFG)/cairo-perf-trace.exe \ - $(CFG)/cairo-perf-micro.exe \ - $(CFG)/cairo-perf-diff-files.exe \ - $(CFG)/cairo-perf-print.exe \ - $(CFG)/cairo-perf-chart.exe \ - $(CFG)/cairo-perf-compare-backends.exe \ - $(NULL) - -all: inform $(PERF_EXES) - -perf: inform $(CFG)/cairo-perf-micro.exe - ./$(CFG)/cairo-perf-micro.exe - - -libcairoperf_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairoperf_sources)) - -$(CFG)/libcairoperf.lib: $(libcairoperf_OBJECTS) - @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(libcairoperf_OBJECTS) - -cairo_perf_trace_OBJECTS = \ - $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_trace_sources)) \ - $(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib \ - $(NULL) - -cairo_perf_micro_OBJECTS = \ - $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_micro_sources)) \ - ./micro/$(CFG)/libcairo-perf-micro.lib \ - $(NULL) - -cairo_perf_diff_files_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_diff_files_sources)) -cairo_perf_print_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_print_sources)) -cairo_perf_chart_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_chart_sources)) -cairo_perf_compare_backends_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_compare_backends_sources)) - - -$(CFG)/cairo-perf-trace.exe: $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - -$(CFG)/cairo-perf-micro.exe: $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - -$(CFG)/cairo-perf-diff-files.exe: $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - -$(CFG)/cairo-perf-print.exe: $(cairo_perf_print_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_print_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - -$(CFG)/cairo-perf-chart.exe: $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - -$(CFG)/cairo-perf-compare-backends.exe: $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) - @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) - - -./micro/$(CFG)/libcairo-perf-micro.lib: - $(MAKE) -C micro -f Makefile.win32 - -$(top_builddir)/src/$(CFG)/cairo-static.lib: - $(MAKE) -C $(top_srcdir)/src -f Makefile.win32 - -$(top_builddir)/boilerplate/$(CFG)/boiler.lib: - $(MAKE) -C $(top_srcdir)/boilerplate -f Makefile.win32 - -$(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib: - $(MAKE) -C $(top_srcdir)/util/cairo-script -f Makefile.win32 diff --git a/perf/README b/perf/README deleted file mode 100644 index 9e402098a..000000000 --- a/perf/README +++ /dev/null @@ -1,239 +0,0 @@ -This is cairo's micro-benchmark performance test suite. - -One of the simplest ways to run this performance suite is: - - make perf - -which will give a report of the speed of each individual test. See -more details on other options for running the suite below. - -A macro test suite (with full traces and more intensive benchmarks) is -also available; for this, see http://cgit.freedesktop.org/cairo-traces. -The macro-benchmarks are better measures of actual real-world -performance, and should be preferred over the micro-benchmarks (and over -make perf) for identifying performance regressions or improvements. If -you copy or symlink this repository at cairo/perf/cairo-traces, then -make perf will run those tests as well. - -Running the micro-benchmarks ----------------------------- -The micro-benchmark performance suite is composed of a series of -hand-written, short, synthetic tests that measure the speed of doing a -simple operation such as painting a surface or showing glyphs. These aim -to give very good feedback on whether a performance related patch is -successful without causing any performance degradations elsewhere. - -The micro-benchmarks are compiled into a single executable called -cairo-perf-micro, which is what "make perf" executes. Some -examples of running it: - - # Report on all tests with default number of iterations: - ./cairo-perf-micro - - # Report on 100 iterations of all gradient tests: - ./cairo-perf-micro -i 100 gradient - - # Generate raw results for 10 iterations into cairo.perf - ./cairo-perf-micro -r -i 10 > cairo.perf - # Append 10 more iterations of the paint test - ./cairo-perf-micro -r -i 10 paint >> cairo.perf - -Raw results aren't useful for reading directly, but are quite useful -when using cairo-perf-diff to compare separate runs (see more -below). The advantage of using the raw mode is that test runs can be -generated incrementally and appended to existing reports. - -Generating comparisons of separate runs ---------------------------------------- -It's often useful to generate a chart showing the comparison of two -separate runs of the cairo performance suite, (for example, after -applying a patch intended to improve cairo's performance). The -cairo-perf-diff script can be used to compare two report files -generated by cairo-perf. - -Again, by way of example: - - # Show performance changes from cairo-orig.perf to cairo-patched.perf - ./cairo-perf-diff cairo-orig.perf cairo-patched.perf - -This will work whether the data files were generate in raw mode (with -cairo-perf -r) or cooked, (cairo-perf without -r). - -Finally, in its most powerful mode, cairo-perf-diff accepts two git -revisions and will do all the work of checking each revision out, -building it, running cairo-perf for each revision, and finally -generating the report. Obviously, this mode only works if you are -using cairo within a git repository, (and not from a tar file). Using -this mode is as simple as passing the git revisions to be compared to -cairo-perf-diff: - - # Compare cairo 1.2.6 to cairo 1.4.0 - ./cairo-perf-diff 1.2.6 1.4.0 - - # Measure the impact of the latest commit - ./cairo-perf-diff HEAD~1 HEAD - -As a convenience, this common desire to measure a single commit is -supported by passing a single revision to cairo-perf-diff, in which -case it will compare it to the immediately preceding commit. So for -example: - - # Measure the impact of the latest commit - ./cairo-perf-diff HEAD - - # Measure the impact of an arbitrary commit by SHA-1 - ./cairo-perf-diff aa883123d2af90 - -Also, when passing git revisions to cairo-perf-diff like this, it will -automatically cache results and re-use them rather than re-running -cairo-perf over and over on the same versions. This means that if you -ask for a report that you've generated in the past, cairo-perf-diff -should return it immediately. - -Now, sometimes it is desirable to generate more iterations rather than -re-using cached results. In this case, the -f flag can be used to -force cairo-perf-diff to generate additional results in addition to -what has been cached: - - # Measure the impact of latest commit (force more measurement) - ./cairo-perf-diff -f - -And finally, the -f mode is most useful in conjunction with the -- -option to cairo-perf-diff which allows you to pass options to the -underlying cairo-perf runs. This allows you to restrict the additional -test runs to a limited subset of the tests. - -For example, a frequently used trick is to first generate a chart with -a very small number of iterations for all tests: - - ./cairo-perf-diff HEAD - -Then, if any of the results look suspicious, (say there's a slowdown -reported in the text tests, but you think the text test shouldn't be -affected), then you can force more iterations to be tested for only -those tests: - - ./cairo-perf-diff -f HEAD -- text - -Generating comparisons of different backends --------------------------------------------- -An alternate question that is often asked is, "how does the speed of one -backend compare to another?". cairo-perf-compare-backends can read files -generated by cairo-perf and produces a comparison of the backends for every -test. - -Again, by way of example: - - # Show relative performance of the backends - ./cairo-perf-compare-backends cairo.perf - -This will work whether the data files were generate in raw mode (with -cairo-perf -r) or cooked, (cairo-perf without -r). - - -Creating a new performance test -------------------------------- -This is where we could use everybody's help. If you have encountered a -sequence of cairo operations that are slower than you would like, then -please provide a performance test. Writing a test is very simple, it -requires you to write only a small C file with a couple of functions, -one of which exercises the cairo calls of interest. - -Here is the basic structure of a performance test file: - - /* Copyright © 2006 Kind Cairo User - * - * ... Licensing information here ... - * Please copy the MIT blurb as in other tests - */ - - #include "cairo-perf.h" - - static cairo_time_t - do_my_new_test (cairo_t *cr, int width, int height) - { - cairo_perf_timer_start (); - - /* Make the cairo calls to be measured */ - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); - } - - void - my_new_test (cairo_perf_t *perf, cairo_t *cr, int width, int height) - { - /* First do any setup for which the execution time should not - * be measured. For example, this might include loading - * images from disk, creating patterns, etc. */ - - /* Then launch the actual performance testing. */ - cairo_perf_run (perf, "my_new_test", do_my_new_test); - - /* Finally, perform any cleanup from the setup above. */ - } - -That's really all there is to writing a new test. The first function -above is the one that does the real work and returns a timing -number. The second function is the one that will be called by the -performance test rig (see below for how to accomplish that), and -allows for multiple performance cases to be written in one file, -(simply call cairo_perf_run once for each case, passing the -appropriate callback function to each). - -We go through this dance of indirectly calling your own function -through cairo_perf_run so that cairo_perf_run can call your function -many times and measure statistical properties over the many runs. - -Finally, to fully integrate your new test case you just need to add -your new test to three different lists. (TODO: We should set this up -better so that the lists are maintained automatically---computed from -the list of files in cairo/perf, for example). Here's what needs to be -added: - - 1. Makefile.am: Add the new file name to the cairo_perf_SOURCES list - - 2. cairo-perf.h: Add a new CAIRO_PERF_DECL line with the name of your - function, (my_new_test in the example above) - - 3. cairo-perf-micro.c: Add a new row to the list at the end of the - file. A typical entry would look like: - - { my_new_test, 16, 64 } - - The last two numbers are a minimum and a maximum image size at - which your test should be exercised. If these values are the same, - then only that size will be used. If they are different, then - intermediate sizes will be used by doubling. So in the example - above, three tests would be performed at sizes of 16x16, 32x32 and - 64x64. - - -How to run cairo-perf-diff on WINDOWS -------------------------------------- -This section explains the specifics of running cairo-perf-diff under -win32 plateforms. It assumes that you have installed a UNIX-like shell -environment such as MSYS (distributed as part of MinGW). - - 1. From your Mingw32 window, be sure to have all of your MSVC environ- - ment variables set up for proper compilation using 'make' - - 2. Add the %GitBaseDir%/Git/bin path to your environment, replacing the - %GitBaseDir% by whatever directory your Git version is installed to. - - 3. Comment out the "UNSET CDPATH" line in the git-sh-setup script - (located inside the ...Git/bin directory) by putting a "#" at the - beginning of the line. - -you should be ready to go ! - -From your mingw32 window, go to your cairo/perf directory and run the -cairo-perf-diff script with the right arguments. - -Thanks for your contributions and have fun with cairo! - -TODO ----- -Add a control language for crafting and running small sets of micro -benchmarks. diff --git a/perf/cairo-analyse-trace.c b/perf/cairo-analyse-trace.c deleted file mode 100644 index 994148660..000000000 --- a/perf/cairo-analyse-trace.c +++ /dev/null @@ -1,592 +0,0 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* - * Copyright © 2006 Mozilla Corporation - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * Copyright © 2011 Intel Corporation - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Vladimir Vukicevic <vladimir@pobox.com> - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */ - -#include "../cairo-version.h" /* for the real version */ - -#include "cairo-perf.h" -#include "cairo-stats.h" - -#include "cairo-boilerplate-getopt.h" -#include <cairo-script-interpreter.h> -#include "cairo-missing.h" - -/* rudely reuse bits of the library... */ -#include "../src/cairo-error-private.h" - -/* For basename */ -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif -#include <ctype.h> /* isspace() */ - -#include <sys/types.h> -#include <sys/stat.h> - -#ifdef _MSC_VER -#include "dirent-win32.h" - -static char * -basename_no_ext (char *path) -{ - static char name[_MAX_FNAME + 1]; - - _splitpath (path, NULL, NULL, name, NULL); - - name[_MAX_FNAME] = '\0'; - - return name; -} - - -#else -#include <dirent.h> - -static char * -basename_no_ext (char *path) -{ - char *dot, *name; - - name = basename (path); - - dot = strchr (name, '.'); - if (dot) - *dot = '\0'; - - return name; -} - -#endif - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <signal.h> - -#if HAVE_FCFINI -#include <fontconfig/fontconfig.h> -#endif - -struct trace { - const cairo_boilerplate_target_t *target; - void *closure; - cairo_surface_t *surface; -}; - -cairo_bool_t -cairo_perf_can_run (cairo_perf_t *perf, - const char *name, - cairo_bool_t *is_explicit) -{ - unsigned int i; - char *copy, *dot; - cairo_bool_t ret; - - if (is_explicit) - *is_explicit = FALSE; - - if (perf->exact_names) { - if (is_explicit) - *is_explicit = TRUE; - return TRUE; - } - - if (perf->num_names == 0 && perf->num_exclude_names == 0) - return TRUE; - - copy = xstrdup (name); - dot = strchr (copy, '.'); - if (dot != NULL) - *dot = '\0'; - - if (perf->num_names) { - ret = TRUE; - for (i = 0; i < perf->num_names; i++) - if (strstr (copy, perf->names[i])) { - if (is_explicit) - *is_explicit = strcmp (copy, perf->names[i]) == 0; - goto check_exclude; - } - - ret = FALSE; - goto done; - } - -check_exclude: - if (perf->num_exclude_names) { - ret = FALSE; - for (i = 0; i < perf->num_exclude_names; i++) - if (strstr (copy, perf->exclude_names[i])) { - if (is_explicit) - *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0; - goto done; - } - - ret = TRUE; - goto done; - } - -done: - free (copy); - - return ret; -} - -static cairo_surface_t * -surface_create (void *closure, - cairo_content_t content, - double width, - double height, - long uid) -{ - struct trace *args = closure; - return cairo_surface_create_similar (args->surface, content, width, height); -} - -static int user_interrupt; - -static void -interrupt (int sig) -{ - if (user_interrupt) { - signal (sig, SIG_DFL); - raise (sig); - } - - user_interrupt = 1; -} - -static void -describe (cairo_perf_t *perf, - void *closure) -{ - char *description = NULL; - - if (perf->has_described_backend) - return; - perf->has_described_backend = TRUE; - - if (perf->target->describe) - description = perf->target->describe (closure); - - if (description == NULL) - return; - - free (description); -} - -static void -execute (cairo_perf_t *perf, - struct trace *args, - const char *trace) -{ - char *trace_cpy, *name; - const cairo_script_interpreter_hooks_t hooks = { - .closure = args, - .surface_create = surface_create, - }; - - trace_cpy = xstrdup (trace); - name = basename_no_ext (trace_cpy); - - if (perf->list_only) { - printf ("%s\n", name); - free (trace_cpy); - return; - } - - describe (perf, args->closure); - - { - cairo_script_interpreter_t *csi; - cairo_status_t status; - unsigned int line_no; - - csi = cairo_script_interpreter_create (); - cairo_script_interpreter_install_hooks (csi, &hooks); - - cairo_script_interpreter_run (csi, trace); - - cairo_script_interpreter_finish (csi); - - line_no = cairo_script_interpreter_get_line_number (csi); - status = cairo_script_interpreter_destroy (csi); - if (status) { - /* XXXX cairo_status_to_string is just wrong! */ - fprintf (stderr, "Error during replay, line %d: %s\n", - line_no, cairo_status_to_string (status)); - } - } - user_interrupt = 0; - - free (trace_cpy); -} - -static void -usage (const char *argv0) -{ - fprintf (stderr, -"Usage: %s [-l] [-i iterations] [-x exclude-file] [test-names ... | traces ...]\n" -"\n" -"Run the cairo trace analysis suite over the given tests (all by default)\n" -"The command-line arguments are interpreted as follows:\n" -"\n" -" -i iterations; specify the number of iterations per test case\n" -" -l list only; just list selected test case names without executing\n" -" -x exclude; specify a file to read a list of traces to exclude\n" -"\n" -"If test names are given they are used as sub-string matches so a command\n" -"such as \"%s firefox\" can be used to run all firefox traces.\n" -"Alternatively, you can specify a list of filenames to execute.\n", - argv0, argv0); -} - -static cairo_bool_t -read_excludes (cairo_perf_t *perf, - const char *filename) -{ - FILE *file; - char *line = NULL; - size_t line_size = 0; - char *s, *t; - - file = fopen (filename, "r"); - if (file == NULL) - return FALSE; - - while (getline (&line, &line_size, file) != -1) { - /* terminate the line at a comment marker '#' */ - s = strchr (line, '#'); - if (s) - *s = '\0'; - - /* whitespace delimits */ - s = line; - while (*s != '\0' && isspace (*s)) - s++; - - t = s; - while (*t != '\0' && ! isspace (*t)) - t++; - - if (s != t) { - int i = perf->num_exclude_names; - perf->exclude_names = xrealloc (perf->exclude_names, - sizeof (char *) * (i+1)); - perf->exclude_names[i] = strndup (s, t-s); - perf->num_exclude_names++; - } - } - free (line); - - fclose (file); - - return TRUE; -} - -static void -parse_options (cairo_perf_t *perf, - int argc, - char *argv[]) -{ - char *end; - int c; - - perf->list_only = FALSE; - perf->names = NULL; - perf->num_names = 0; - perf->exclude_names = NULL; - perf->num_exclude_names = 0; - - while (1) { - c = _cairo_getopt (argc, argv, "i:lx:"); - if (c == -1) - break; - - switch (c) { - case 'i': - perf->exact_iterations = TRUE; - perf->iterations = strtoul (optarg, &end, 10); - if (*end != '\0') { - fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", - optarg); - exit (1); - } - break; - case 'l': - perf->list_only = TRUE; - break; - case 'x': - if (! read_excludes (perf, optarg)) { - fprintf (stderr, "Invalid argument for -x (not readable file): %s\n", - optarg); - exit (1); - } - break; - default: - fprintf (stderr, "Internal error: unhandled option: %c\n", c); - /* fall-through */ - case '?': - usage (argv[0]); - exit (1); - } - } - - if (optind < argc) { - perf->names = &argv[optind]; - perf->num_names = argc - optind; - } -} - -static void -cairo_perf_fini (cairo_perf_t *perf) -{ - cairo_boilerplate_free_targets (perf->targets); - cairo_boilerplate_fini (); - - cairo_debug_reset_static_data (); -#if HAVE_FCFINI - FcFini (); -#endif -} - -static cairo_bool_t -have_trace_filenames (cairo_perf_t *perf) -{ - unsigned int i; - - if (perf->num_names == 0) - return FALSE; - -#if HAVE_UNISTD_H - for (i = 0; i < perf->num_names; i++) - if (access (perf->names[i], R_OK) == 0) - return TRUE; -#endif - - return FALSE; -} - -static cairo_status_t -print (void *closure, const unsigned char *data, unsigned int length) -{ - fwrite (data, length, 1, closure); - return CAIRO_STATUS_SUCCESS; -} - -static void -cairo_perf_trace (cairo_perf_t *perf, - const cairo_boilerplate_target_t *target, - const char *trace) -{ - struct trace args; - cairo_surface_t *real; - - args.target = target; - real = target->create_surface (NULL, - CAIRO_CONTENT_COLOR_ALPHA, - 1, 1, - 1, 1, - CAIRO_BOILERPLATE_MODE_PERF, - &args.closure); - args.surface = - cairo_surface_create_observer (real, - CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS); - cairo_surface_destroy (real); - if (cairo_surface_status (args.surface)) { - fprintf (stderr, - "Error: Failed to create target surface: %s\n", - target->name); - return; - } - - printf ("Observing '%s'...", trace); - fflush (stdout); - - execute (perf, &args, trace); - - printf ("\n"); - cairo_device_observer_print (cairo_surface_get_device (args.surface), - print, stdout); - fflush (stdout); - - cairo_surface_destroy (args.surface); - - if (target->cleanup) - target->cleanup (args.closure); -} - -static void -warn_no_traces (const char *message, - const char *trace_dir) -{ - fprintf (stderr, -"Error: %s '%s'.\n" -"Have you cloned the cairo-traces repository and uncompressed the traces?\n" -" git clone git://anongit.freedesktop.org/cairo-traces\n" -" cd cairo-traces && make\n" -"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n", - message, trace_dir); -} - -static int -cairo_perf_trace_dir (cairo_perf_t *perf, - const cairo_boilerplate_target_t *target, - const char *dirname) -{ - DIR *dir; - struct dirent *de; - int num_traces = 0; - cairo_bool_t force; - cairo_bool_t is_explicit; - - dir = opendir (dirname); - if (dir == NULL) - return 0; - - force = FALSE; - if (cairo_perf_can_run (perf, dirname, &is_explicit)) - force = is_explicit; - - while ((de = readdir (dir)) != NULL) { - char *trace; - struct stat st; - - if (de->d_name[0] == '.') - continue; - - xasprintf (&trace, "%s/%s", dirname, de->d_name); - if (stat (trace, &st) != 0) - goto next; - - if (S_ISDIR(st.st_mode)) { - num_traces += cairo_perf_trace_dir (perf, target, trace); - } else { - const char *dot; - - dot = strrchr (de->d_name, '.'); - if (dot == NULL) - goto next; - if (strcmp (dot, ".trace")) - goto next; - - num_traces++; - if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL)) - goto next; - - cairo_perf_trace (perf, target, trace); - } -next: - free (trace); - - } - closedir (dir); - - return num_traces; -} - -int -main (int argc, - char *argv[]) -{ - cairo_perf_t perf; - const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces"; - unsigned int n; - int i; - - parse_options (&perf, argc, argv); - - signal (SIGINT, interrupt); - - if (getenv ("CAIRO_TRACE_DIR") != NULL) - trace_dir = getenv ("CAIRO_TRACE_DIR"); - - perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); - - /* do we have a list of filenames? */ - perf.exact_names = have_trace_filenames (&perf); - - for (i = 0; i < perf.num_targets; i++) { - const cairo_boilerplate_target_t *target = perf.targets[i]; - - if (! perf.list_only && ! target->is_measurable) - continue; - - perf.target = target; - perf.has_described_backend = FALSE; - - if (perf.exact_names) { - for (n = 0; n < perf.num_names; n++) { - struct stat st; - - if (stat (perf.names[n], &st) == 0) { - if (S_ISDIR (st.st_mode)) { - cairo_perf_trace_dir (&perf, target, perf.names[n]); - } else - cairo_perf_trace (&perf, target, perf.names[n]); - } - } - } else { - int num_traces = 0; - const char *dir; - - dir = trace_dir; - do { - char buf[1024]; - const char *end = strchr (dir, ':'); - if (end != NULL) { - memcpy (buf, dir, end-dir); - buf[end-dir] = '\0'; - end++; - - dir = buf; - } - - num_traces += cairo_perf_trace_dir (&perf, target, dir); - dir = end; - } while (dir != NULL); - - if (num_traces == 0) { - warn_no_traces ("Found no traces in", trace_dir); - return 1; - } - } - - if (perf.list_only) - break; - } - - cairo_perf_fini (&perf); - - return 0; -} diff --git a/perf/cairo-perf-chart.c b/perf/cairo-perf-chart.c deleted file mode 100644 index 738fe5c7b..000000000 --- a/perf/cairo-perf-chart.c +++ /dev/null @@ -1,1113 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <math.h> -#include <assert.h> - -struct chart { - cairo_perf_report_t *reports; - const char **names; - - cairo_t *cr; - int width, height; - int num_tests, num_reports; - double min_value, max_value; - double *average; - - cairo_bool_t use_html; - cairo_bool_t relative; -}; -struct color { - double red, green, blue; -}; - -#define FONT_SIZE 12 -#define PAD (4) - -static double -to_factor (double x) -{ -#if 1 - if (x > 1.) - return (x-1) * 100.; - else - return (1. - 1./x) * 100.; -#else - return log (x); -#endif -} - -static int -_double_cmp (const void *_a, - const void *_b) -{ - const double *a = _a; - const double *b = _b; - - if (*a > *b) - return 1; - if (*a < *b) - return -1; - return 0; -} - -static void -trim_outliers (double *values, - int num_values, - double *min, - double *max) -{ - double q1, q3, iqr; - double outlier_min, outlier_max; - int i; - - /* First, identify any outliers, using the definition of "mild - * outliers" from: - * - * http://en.wikipedia.org/wiki/Outliers - * - * Which is that outliers are any values less than Q1 - 1.5 * IQR - * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first - * and third quartiles and IQR is the inter-quartile range (Q3 - - * Q1). - */ - qsort (values, num_values, - sizeof (double), _double_cmp); - - q1 = values[1*num_values / 6]; - q3 = values[5*num_values / 6]; - - iqr = q3 - q1; - - outlier_min = q1 - 3 * iqr; - outlier_max = q3 + 3 * iqr; - - i = 0; - while (i < num_values && values[i] < outlier_min) - i++; - if (i == num_values) - return; - - *min = values[i]; - - while (i < num_values && values[i] <= outlier_max) - i++; - - *max = values[i-1]; -} - -static void -find_ranges (struct chart *chart) -{ - test_report_t **tests, *min_test; - double *values; - int num_values, size_values; - double min = 0, max = 0; - double test_time; - int seen_non_null; - int num_tests = 0; - double slow_sum = 0, fast_sum = 0, sum; - int slow_count = 0, fast_count = 0; - int *count; - int i; - - num_values = 0; - size_values = 64; - values = xmalloc (size_values * sizeof (double)); - - chart->average = xmalloc(chart->num_reports * sizeof(double)); - count = xmalloc(chart->num_reports * sizeof(int)); - for (i = 0; i < chart->num_reports; i++) { - chart->average[i] = 0; - count[i] = 0; - } - - tests = xmalloc (chart->num_reports * sizeof (test_report_t *)); - for (i = 0; i < chart->num_reports; i++) - tests[i] = chart->reports[i].tests; - - while (1) { - /* We expect iterations values of 0 when multiple raw reports - * for the same test have been condensed into the stats of the - * first. So we just skip these later reports that have no - * stats. */ - seen_non_null = 0; - for (i = 0; i < chart->num_reports; i++) { - while (tests[i]->name && tests[i]->stats.iterations == 0) - tests[i]++; - if (tests[i]->name) - seen_non_null++; - } - if (! seen_non_null) - break; - - num_tests++; - - /* Find the minimum of all current tests, (we have to do this - * in case some reports don't have a particular test). */ - for (i = 0; i < chart->num_reports; i++) { - if (tests[i]->name) { - min_test = tests[i]; - break; - } - } - for (++i; i < chart->num_reports; i++) { - if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) - min_test = tests[i]; - } - - test_time = 0; - for (i = 0; i < chart->num_reports; i++) { - double report_time = HUGE_VAL; - - while (tests[i]->name && - test_report_cmp_name (tests[i], min_test) == 0) - { - double time = tests[i]->stats.min_ticks; - if (time < report_time) { - time /= tests[i]->stats.ticks_per_ms; - if (time < report_time) - report_time = time; - } - tests[i]++; - } - - if (report_time != HUGE_VAL) { - if (test_time == 0) - test_time = report_time; - - chart->average[i] += report_time / test_time; - count[i]++; - - if (chart->relative) { - if (test_time != report_time) { - double v = to_factor (test_time / report_time); - if (num_values == size_values) { - size_values *= 2; - values = xrealloc (values, - size_values * sizeof (double)); - } - values[num_values++] = v; - if (v < min) - min = v; - if (v > max) - max = v; - if (v > 0) - fast_sum += v/100, fast_count++; - else - slow_sum += v/100, slow_count++; - sum += v/100; - printf ("%s %d: %f\n", min_test->name, num_values, v); - } - } else { - if (report_time < min) - min = report_time; - if (report_time > max) - max = report_time; - } - } - } - } - - for (i = 0; i < chart->num_reports; i++) { - if (count[i]) - chart->average[i] = count[i] / chart->average[i]; - else - chart->average[i] = 1.; - } - - if (chart->relative) - trim_outliers (values, num_values, &min, &max); - chart->min_value = min; - chart->max_value = max; - chart->num_tests = num_tests + !!chart->relative; - - free (values); - free (tests); - free (count); - - printf ("%d: slow[%d] average: %f, fast[%d] average: %f, %f\n", - num_values, slow_count, slow_sum / slow_count, fast_count, fast_sum / fast_count, sum / num_values); -} - -#define SET_COLOR(C, R, G, B) (C)->red = (R), (C)->green = (G), (C)->blue = (B) -static void -hsv_to_rgb (double h, - double s, - double v, - struct color *color) -{ - double m, n, f; - int i; - - while (h < 0) - h += 6.; - while (h > 6.) - h -= 6.; - - if (s < 0.) - s = 0.; - if (s > 1.) - s = 1.; - - if (v < 0.) - v = 0.; - if (v > 1.) - v = 1.; - - i = floor (h); - f = h - i; - if ((i & 1) == 0) - f = 1 - f; - - m = v * (1 - s); - n = v * (1 - s * f); - switch(i){ - default: - case 6: - case 0: SET_COLOR (color, v, n, m); break; - case 1: SET_COLOR (color, n, v, m); break; - case 2: SET_COLOR (color, m, v, n); break; - case 3: SET_COLOR (color, m, n, v); break; - case 4: SET_COLOR (color, n, m, v); break; - case 5: SET_COLOR (color, v, m, n); break; - } -} - -static void set_report_color (struct chart *chart, int report) -{ - struct color color; - - hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color); - cairo_set_source_rgb (chart->cr, color.red, color.green, color.blue); -} - -static void set_report_gradient (struct chart *chart, int report, - double x, double y, double w, double h) -{ - struct color color; - cairo_pattern_t *p; - - hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color); - - p = cairo_pattern_create_linear (x, 0, x+w, 0); - cairo_pattern_add_color_stop_rgba (p, 0.0, - color.red, color.green, color.blue, - .50); - cairo_pattern_add_color_stop_rgba (p, 0.5, - color.red, color.green, color.blue, - .50); - cairo_pattern_add_color_stop_rgba (p, 1.0, - color.red, color.green, color.blue, - 1.0); - cairo_set_source (chart->cr, p); - cairo_pattern_destroy (p); -} - -static void -test_background (struct chart *c, - int test) -{ - double dx, x; - - dx = c->width / (double) c->num_tests; - x = dx * test; - - if (test & 1) - cairo_set_source_rgba (c->cr, .2, .2, .2, .2); - else - cairo_set_source_rgba (c->cr, .8, .8, .8, .2); - - cairo_rectangle (c->cr, floor (x), 0, - floor (dx + x) - floor (x), c->height); - cairo_fill (c->cr); -} - -static void -add_chart (struct chart *c, - int test, - int report, - double value) -{ - double dx, dy, x; - - if (fabs (value) < 0.1) - return; - - if (c->relative) { - cairo_text_extents_t extents; - char buf[80]; - double y; - - dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value); - /* the first report is always skipped, as it is used as the baseline */ - dx = c->width / (double) (c->num_tests * c->num_reports); - x = dx * (c->num_reports * test + report - .5); - - cairo_rectangle (c->cr, - floor (x), c->height / 2., - floor (x + dx) - floor (x), - ceil (-dy*value - c->height/2.) + c->height/2.); - if (dx < 5) { - set_report_color (c, report); - cairo_fill (c->cr); - } else { - set_report_gradient (c, report, - floor (x), c->height / 2., - floor (x + dx) - floor (x), - ceil (-dy*value - c->height/2.) + c->height/2.); - - cairo_fill_preserve (c->cr); - cairo_save (c->cr); - cairo_clip_preserve (c->cr); - set_report_color (c, report); - cairo_stroke (c->cr); - cairo_restore (c->cr); - } - - /* Skip the label if the difference between the two is less than 0.1% */ - if (fabs (value) < 0.1) - return; - - cairo_save (c->cr); - cairo_set_font_size (c->cr, dx - 2); - - if (value < 0) { - sprintf (buf, "%.1f", -value/100 + 1); - } else { - sprintf (buf, "%.1f", value/100 + 1); - } - cairo_text_extents (c->cr, buf, &extents); - - /* will it be clipped? */ - y = -dy * value; - if (y < -c->height/2) { - y = -c->height/2; - } else if (y > c->height/2) { - y = c->height/2; - } - - if (y < 0) { - if (y > -extents.width - 6) - y -= extents.width + 6; - } else { - if (y < extents.width + 6) - y += extents.width + 6; - } - - cairo_translate (c->cr, - floor (x) + (floor (x + dx) - floor (x))/2, - floor (y) + c->height/2.); - cairo_rotate (c->cr, -M_PI/2); - if (y < 0) { - cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2); - } else { - cairo_move_to (c->cr, 2, -extents.y_bearing/2); - } - - cairo_set_source_rgb (c->cr, .95, .95, .95); - cairo_show_text (c->cr, buf); - cairo_restore (c->cr); - } else { - dy = (c->height - PAD) / c->max_value; - dx = c->width / (double) (c->num_tests * (c->num_reports+1)); - x = dx * ((c->num_reports+1) * test + report + .5); - - cairo_rectangle (c->cr, - floor (x), c->height, - floor (x + dx) - floor (x), - floor (c->height - dy*value) - c->height); - if (dx < 5) { - set_report_color (c, report); - cairo_fill (c->cr); - } else { - set_report_gradient (c, report, - floor (x), c->height, - floor (x + dx) - floor (x), - floor (c->height - dy*value) - c->height); - cairo_fill_preserve (c->cr); - cairo_save (c->cr); - cairo_clip_preserve (c->cr); - set_report_color (c, report); - cairo_stroke (c->cr); - cairo_restore (c->cr); - } - } -} - -static void -add_average (struct chart *c, - int test, - int report, - double value) -{ - double dx, dy, x; - cairo_text_extents_t extents; - char buf[80]; - double y; - - if (fabs (value) < 0.1) - return; - - dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value); - /* the first report is always skipped, as it is used as the baseline */ - dx = c->width / (double) (c->num_tests * c->num_reports); - x = dx * (c->num_reports * test + report - .5); - - cairo_rectangle (c->cr, - floor (x), c->height / 2., - floor (x + dx) - floor (x), - ceil (-dy*value - c->height/2.) + c->height/2.); - if (dx < 5) { - set_report_color (c, report); - cairo_fill (c->cr); - } else { - set_report_gradient (c, report, - floor (x), c->height / 2., - floor (x + dx) - floor (x), - ceil (-dy*value - c->height/2.) + c->height/2.); - - cairo_fill_preserve (c->cr); - cairo_save (c->cr); - cairo_clip_preserve (c->cr); - set_report_color (c, report); - cairo_stroke (c->cr); - cairo_restore (c->cr); - } - - /* Skip the label if the difference between the two is less than 0.1% */ - if (fabs (value) < 0.1) - return; - - cairo_save (c->cr); - cairo_set_font_size (c->cr, dx - 2); - - if (value < 0) { - sprintf (buf, "%.1f", -value/100 + 1); - } else { - sprintf (buf, "%.1f", value/100 + 1); - } - cairo_text_extents (c->cr, buf, &extents); - - /* will it be clipped? */ - y = -dy * value; - if (y < -c->height/2) { - y = -c->height/2; - } else if (y > c->height/2) { - y = c->height/2; - } - - if (y < 0) { - if (y > -extents.width - 6) - y -= extents.width + 6; - } else { - if (y < extents.width + 6) - y += extents.width + 6; - } - - cairo_translate (c->cr, - floor (x) + (floor (x + dx) - floor (x))/2, - floor (y) + c->height/2.); - cairo_rotate (c->cr, -M_PI/2); - if (y < 0) { - cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2); - } else { - cairo_move_to (c->cr, 2, -extents.y_bearing/2); - } - - cairo_set_source_rgb (c->cr, .95, .95, .95); - cairo_show_text (c->cr, buf); - cairo_restore (c->cr); -} - -static void -add_label (struct chart *c, - int test, - const char *label) -{ - cairo_text_extents_t extents; - double dx, x; - - cairo_save (c->cr); - dx = c->width / (double) c->num_tests; - if (dx / 2 - PAD < 4) - return; - cairo_set_font_size (c->cr, dx / 2 - PAD); - cairo_text_extents (c->cr, label, &extents); - - cairo_set_source_rgb (c->cr, .5, .5, .5); - - x = (test + .5) * dx; - cairo_save (c->cr); - cairo_translate (c->cr, x, c->height - PAD / 2); - cairo_rotate (c->cr, -M_PI/2); - cairo_move_to (c->cr, 0, -extents.y_bearing/2); - cairo_show_text (c->cr, label); - cairo_restore (c->cr); - - cairo_save (c->cr); - cairo_translate (c->cr, x, PAD / 2); - cairo_rotate (c->cr, -M_PI/2); - cairo_move_to (c->cr, -extents.width, -extents.y_bearing/2); - cairo_show_text (c->cr, label); - cairo_restore (c->cr); - - cairo_restore (c->cr); -} - -static void -add_base_line (struct chart *c) -{ - double y; - - cairo_save (c->cr); - cairo_set_line_width (c->cr, 2.); - if (c->relative) { - y = c->height / 2.; - } else { - y = c->height; - } - cairo_move_to (c->cr, 0, y); - cairo_line_to (c->cr, c->width, y); - cairo_set_source_rgb (c->cr, 1, 1, 1); - cairo_stroke (c->cr); - cairo_restore (c->cr); -} - -static void -add_absolute_lines (struct chart *c) -{ - const double dashes[] = { 2, 4 }; - const double vlog_steps[] = { 10, 5, 4, 3, 2, 1, .5, .4, .3, .2, .1}; - double v, y, dy; - unsigned int i; - char buf[80]; - cairo_text_extents_t extents; - - v = c->max_value / 2.; - - for (i = 0; i < sizeof (vlog_steps) / sizeof (vlog_steps[0]); i++) { - double vlog = log (v) / log (vlog_steps[i]); - if (vlog > 1) { - v = pow (vlog_steps[i], floor (vlog)); - goto done; - } - } - return; -done: - - dy = (c->height - PAD) / c->max_value; - - cairo_save (c->cr); - cairo_set_line_width (c->cr, 1.); - cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0); - - i = 0; - do { - y = c->height - ++i * v * dy; - if (y < PAD) - break; - - cairo_set_font_size (c->cr, 8); - - sprintf (buf, "%.0fs", i*v/1000); - cairo_text_extents (c->cr, buf, &extents); - - cairo_set_source_rgba (c->cr, .75, 0, 0, .95); - cairo_move_to (c->cr, 1-extents.x_bearing, floor (y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - cairo_move_to (c->cr, c->width-extents.width-1, floor (y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - cairo_set_source_rgba (c->cr, .75, 0, 0, .5); - cairo_move_to (c->cr, - ceil (extents.width + extents.x_bearing + 2), - floor (y) + .5); - cairo_line_to (c->cr, - floor (c->width - (extents.width + extents.x_bearing + 2)), - floor (y) + .5); - cairo_stroke (c->cr); - } while (1); - - cairo_restore (c->cr); -} - -static void -add_relative_lines (struct chart *c) -{ - const double dashes[] = { 2, 4 }; - const double v_steps[] = { 10, 5, 1, .5, .1, .05, .01}; - const int precision_steps[] = { 0, 0, 0, 1, 1, 2, 2}; - int precision; - double v, y, dy, mid; - unsigned int i; - char buf[80]; - cairo_text_extents_t extents; - - v = MAX (-c->min_value, c->max_value) / 200; - - for (i = 0; i < sizeof (v_steps) / sizeof (v_steps[0]); i++) { - if (v > v_steps[i]) { - v = v_steps[i]; - precision = precision_steps[i]; - goto done; - } - } - return; -done: - - mid = c->height/2.; - dy = (mid - PAD) / MAX (-c->min_value, c->max_value); - - cairo_save (c->cr); - cairo_set_line_width (c->cr, 1.); - cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0); - cairo_set_font_size (c->cr, 8); - - i = 0; - do { - y = ++i * v * dy * 100; - if (y > mid) - break; - - sprintf (buf, "%.*fx", precision, i*v + 1); - cairo_text_extents (c->cr, buf, &extents); - - cairo_set_source_rgba (c->cr, .75, 0, 0, .95); - cairo_move_to (c->cr, 1-extents.x_bearing, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - cairo_move_to (c->cr, c->width-extents.width-1, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - cairo_set_source_rgba (c->cr, 0, .75, 0, .95); - cairo_move_to (c->cr, 1-extents.x_bearing, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - cairo_move_to (c->cr, c->width-extents.width-1, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5); - cairo_show_text (c->cr, buf); - - /* trim the dashes to no obscure the labels */ - cairo_set_source_rgba (c->cr, .75, 0, 0, .5); - cairo_move_to (c->cr, - ceil (extents.width + extents.x_bearing + 2), - floor (mid + y) + .5); - cairo_line_to (c->cr, - floor (c->width - (extents.width + 2)), - floor (mid + y) + .5); - cairo_stroke (c->cr); - - cairo_set_source_rgba (c->cr, 0, .75, 0, .5); - cairo_move_to (c->cr, - ceil (extents.width + extents.x_bearing + 2), - ceil (mid - y) + .5); - cairo_line_to (c->cr, - floor (c->width - (extents.width + 2)), - ceil (mid - y) + .5); - cairo_stroke (c->cr); - - } while (1); - - cairo_restore (c->cr); -} - -static void -add_slower_faster_guide (struct chart *c) -{ - cairo_text_extents_t extents; - - cairo_save (c->cr); - - cairo_set_font_size (c->cr, FONT_SIZE); - - cairo_text_extents (c->cr, "FASTER", &extents); - cairo_set_source_rgba (c->cr, 0, .75, 0, .5); - cairo_move_to (c->cr, - c->width/4. - extents.width/2. + extents.x_bearing, - 1 - extents.y_bearing); - cairo_show_text (c->cr, "FASTER"); - cairo_move_to (c->cr, - 3*c->width/4. - extents.width/2. + extents.x_bearing, - 1 - extents.y_bearing); - cairo_show_text (c->cr, "FASTER"); - - cairo_text_extents (c->cr, "SLOWER", &extents); - cairo_set_source_rgba (c->cr, .75, 0, 0, .5); - cairo_move_to (c->cr, - c->width/4. - extents.width/2. + extents.x_bearing, - c->height - 1); - cairo_show_text (c->cr, "SLOWER"); - cairo_move_to (c->cr, - 3*c->width/4. - extents.width/2. + extents.x_bearing, - c->height - 1); - cairo_show_text (c->cr, "SLOWER"); - - cairo_restore (c->cr); -} - -static void -cairo_perf_reports_compare (struct chart *chart, - cairo_bool_t print) -{ - test_report_t **tests, *min_test; - double test_time, best_time; - int num_test = 0; - int seen_non_null; - int i; - - tests = xmalloc (chart->num_reports * sizeof (test_report_t *)); - for (i = 0; i < chart->num_reports; i++) - tests[i] = chart->reports[i].tests; - - if (print) { - if (chart->use_html) { - printf ("<table style=\"text-align:right\" cellspacing=\"4\">\n"); - printf ("<tr><td></td>"); - for (i = 0; i < chart->num_reports; i++) { - printf ("<td>%s</td>", chart->names[i] ? chart->names[i] : ""); - } - printf ("</tr>\n"); - } - } - - while (1) { - /* We expect iterations values of 0 when multiple raw reports - * for the same test have been condensed into the stats of the - * first. So we just skip these later reports that have no - * stats. */ - seen_non_null = 0; - for (i = 0; i < chart->num_reports; i++) { - while (tests[i]->name && tests[i]->stats.iterations == 0) - tests[i]++; - if (tests[i]->name) - seen_non_null++; - } - if (! seen_non_null) - break; - - /* Find the minimum of all current tests, (we have to do this - * in case some reports don't have a particular test). */ - for (i = 0; i < chart->num_reports; i++) { - if (tests[i]->name) { - min_test = tests[i]; - break; - } - } - for (++i; i < chart->num_reports; i++) { - if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) - min_test = tests[i]; - } - - add_label (chart, num_test, min_test->name); - if (print) { - if (chart->use_html) { - printf ("<tr><td>%s</td>", min_test->name); - } else { - if (min_test->size) { - printf ("%16s, size %4d:\n", - min_test->name, - min_test->size); - } else { - printf ("%26s:", - min_test->name); - } - } - } - - test_time = 0; - best_time = HUGE_VAL; - for (i = 0; i < chart->num_reports; i++) { - test_report_t *initial = tests[i]; - double report_time = HUGE_VAL; - - while (tests[i]->name && - test_report_cmp_name (tests[i], min_test) == 0) - { - double time = tests[i]->stats.min_ticks; - if (time < report_time) { - time /= tests[i]->stats.ticks_per_ms; - if (time < report_time) - report_time = time; - } - tests[i]++; - } - - if (test_time == 0 && report_time != HUGE_VAL) - test_time = report_time; - if (report_time < best_time) - best_time = report_time; - - tests[i] = initial; - } - - for (i = 0; i < chart->num_reports; i++) { - double report_time = HUGE_VAL; - - while (tests[i]->name && - test_report_cmp_name (tests[i], min_test) == 0) - { - double time = tests[i]->stats.min_ticks; - if (time > 0) { - time /= tests[i]->stats.ticks_per_ms; - if (time < report_time) - report_time = time; - } - tests[i]++; - } - - if (print) { - if (chart->use_html) { - if (report_time < HUGE_VAL) { - if (report_time / best_time < 1.01) { - printf ("<td><strong>%.1f</strong></td>", report_time/1000); - } else { - printf ("<td>%.1f</td>", report_time/1000); - } - } else { - printf ("<td></td>"); - } - } else { - if (report_time < HUGE_VAL) - printf (" %6.1f", report_time/1000); - else - printf (" ---"); - } - } - - if (report_time < HUGE_VAL) { - if (chart->relative) { - add_chart (chart, num_test, i, - to_factor (test_time / report_time)); - } else { - add_chart (chart, num_test, i, report_time); - } - } - } - - if (print) { - if (chart->use_html) { - printf ("</tr>\n"); - } else { - printf ("\n"); - } - } - - num_test++; - } - if (chart->relative) { - add_label (chart, num_test, "(geometric mean)"); - for (i = 0; i < chart->num_reports; i++) - add_average (chart, num_test, i, to_factor (chart->average[i])); - } - free (tests); - - if (print) { - if (chart->use_html) - printf ("</table>\n"); - - printf ("\n"); - for (i = 0; i < chart->num_reports; i++) { - if (chart->names[i]) { - printf ("[%s] %s\n", - chart->names[i], chart->reports[i].configuration); - } else { - printf ("[%d] %s\n", - i, chart->reports[i].configuration); - } - } - } -} - -static void -add_legend (struct chart *chart) -{ - cairo_text_extents_t extents; - const char *str; - int i, x, y; - - cairo_set_font_size (chart->cr, FONT_SIZE); - - x = PAD; - y = chart->height + PAD; - for (i = chart->relative; i < chart->num_reports; i++) { - str = chart->names[i] ? - chart->names[i] : chart->reports[i].configuration; - - set_report_color (chart, i); - - cairo_rectangle (chart->cr, x, y + 6, 8, 8); - cairo_fill (chart->cr); - - cairo_set_source_rgb (chart->cr, 1, 1, 1); - cairo_move_to (chart->cr, x + 10, y + FONT_SIZE + PAD / 2.); - cairo_text_extents (chart->cr, str, &extents); - cairo_show_text (chart->cr, str); - - x += 10 + 2 * PAD + ceil (extents.width); - } - - if (chart->relative) { - char buf[80]; - - str = chart->names[0] ? - chart->names[0] : chart->reports[0].configuration; - - sprintf (buf, "(relative to %s)", str); - cairo_text_extents (chart->cr, buf, &extents); - - cairo_set_source_rgb (chart->cr, 1, 1, 1); - cairo_move_to (chart->cr, - chart->width - 1 - extents.width, - y + FONT_SIZE + PAD / 2.); - cairo_show_text (chart->cr, buf); - } -} - -static void -usage (void) -{ - printf("Usage:\n"); - printf(" cairo-perf-chart [OPTION...] <result1> <result2>...<resultN>\n"); - printf("\n"); - printf("Help Options:\n"); - printf(" --help, --?\tShow help options\n"); - printf("\n"); - printf("Application Options:\n"); - printf(" --html\tOutput an HTML table comparing the results\n"); - printf(" --height=\tSet the height of the output graph"\ - " (default 480)\n"); - printf(" --width=\tSet the width of the output graph"\ - " (default 640)\n"); - printf(" --name\tSet the name of graph series."\ - " This only sets the name for the\n\t\tfirst result file."\ - " The graph series is usually set using the\n\t\tfile name for"\ - " the results file.\n"); - printf("\n"); - printf("Example:\n"); - printf(" cairo-perf-chart --width=1024 --height=768 run1 run2 run3\n"); - return; -} - -int -main (int argc, - const char *argv[]) -{ - cairo_surface_t *surface; - struct chart chart; - test_report_t *t; - int i; - - chart.use_html = 0; - chart.width = 640; - chart.height = 480; - - chart.reports = xcalloc (argc-1, sizeof (cairo_perf_report_t)); - chart.names = xcalloc (argc-1, sizeof (cairo_perf_report_t)); - - chart.num_reports = 0; - for (i = 1; i < argc; i++) { - if (strcmp (argv[i], "--html") == 0) { - chart.use_html = 1; - } else if (strncmp (argv[i], "--width=", 8) == 0) { - chart.width = atoi (argv[i] + 8); - } else if (strncmp (argv[i], "--height=", 9) == 0) { - chart.height = atoi (argv[i] + 9); - } else if (strcmp (argv[i], "--name") == 0) { - if (i + 1 < argc) - chart.names[chart.num_reports] = argv[++i]; - } else if (strncmp (argv[i], "--name=", 7) == 0) { - chart.names[chart.num_reports] = argv[i] + 7; - } else if ((strcmp (argv[i], "--help") == 0) || - (strcmp (argv[i], "--?") == 0)) { - usage(); - return 0; - } else { - cairo_perf_report_load (&chart.reports[chart.num_reports++], - argv[i], i, - test_report_cmp_name); - } - } - - for (chart.relative = 0; chart.relative <= 1; chart.relative++) { - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - chart.width, - chart.height + (FONT_SIZE + PAD) + 2*PAD); - chart.cr = cairo_create (surface); - cairo_surface_destroy (surface); - - cairo_set_source_rgb (chart.cr, 0, 0, 0); - cairo_paint (chart.cr); - - find_ranges (&chart); - - for (i = 0; i < chart.num_tests; i++) - test_background (&chart, i); - if (chart.relative) { - add_relative_lines (&chart); - add_slower_faster_guide (&chart); - } else - add_absolute_lines (&chart); - - cairo_save (chart.cr); - cairo_rectangle (chart.cr, 0, 0, chart.width, chart.height); - cairo_clip (chart.cr); - cairo_perf_reports_compare (&chart, !chart.relative); - cairo_restore (chart.cr); - - add_base_line (&chart); - add_legend (&chart); - - cairo_surface_write_to_png (cairo_get_target (chart.cr), - chart.relative ? "relative.png" : "absolute.png"); - cairo_destroy (chart.cr); - } - - /* Pointless memory cleanup, (would be a great place for talloc) */ - for (i = 0; i < chart.num_reports; i++) { - for (t = chart.reports[i].tests; t->name; t++) { - free (t->samples); - free (t->backend); - free (t->name); - } - free (chart.reports[i].tests); - free (chart.reports[i].configuration); - } - free (chart.names); - free (chart.reports); - - return 0; -} diff --git a/perf/cairo-perf-compare-backends.c b/perf/cairo-perf-compare-backends.c deleted file mode 100644 index ff7359e1a..000000000 --- a/perf/cairo-perf-compare-backends.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <math.h> -#include <assert.h> - -typedef struct _cairo_perf_report_options { - double min_change; - int use_utf; - int print_change_bars; -} cairo_perf_report_options_t; - -typedef struct _cairo_perf_diff_files_args { - const char **filenames; - int num_filenames; - cairo_perf_report_options_t options; -} cairo_perf_diff_files_args_t; - -static int -test_diff_cmp (const void *a, - const void *b) -{ - const test_diff_t *a_diff = a; - const test_diff_t *b_diff = b; - - /* Reverse sort by magnitude of change so larger changes come - * first */ - if (a_diff->change > b_diff->change) - return -1; - - if (a_diff->change < b_diff->change) - return 1; - - return 0; -} - -#define CHANGE_BAR_WIDTH 70 -static void -print_change_bar (double change, - double max_change, - int use_utf) -{ - int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH); - static char const *ascii_boxes[8] = { - "****","***" ,"***", "**", - "**", "*", "*", "" - }; - static char const *utf_boxes[8] = { - "█", "▉", "▊", "▋", - "▌", "▍", "▎", "▏" - }; - char const **boxes = use_utf ? utf_boxes : ascii_boxes; - - /* For a 1.0x speedup we want a zero-size bar to show "no - * change". */ - change -= 1.0; - - while (change > units_per_cell) { - printf ("%s", boxes[0]); - change -= units_per_cell; - } - - change /= units_per_cell; - - if (change > 7.5/8.0) - printf ("%s", boxes[0]); - else if (change > 6.5/8.0) - printf ("%s", boxes[1]); - else if (change > 5.5/8.0) - printf ("%s", boxes[2]); - else if (change > 4.5/8.0) - printf ("%s", boxes[3]); - else if (change > 3.5/8.0) - printf ("%s", boxes[4]); - else if (change > 2.5/8.0) - printf ("%s", boxes[5]); - else if (change > 1.5/8.0) - printf ("%s", boxes[6]); - else if (change > 0.5/8.0) - printf ("%s", boxes[7]); -} - -static void -test_diff_print (test_diff_t *diff, - double max_change, - cairo_perf_report_options_t *options) -{ - int i; - double test_time; - double change; - - if (diff->tests[0]->size != 0) { - printf ("(%s, size: %d)\n", - diff->tests[0]->name, - diff->tests[0]->size); - } else { - printf ("(%s)\n", diff->tests[0]->name); - } - - for (i = 0; i < diff->num_tests; i++) { - test_time = diff->tests[i]->stats.min_ticks; - test_time /= diff->tests[i]->stats.ticks_per_ms; - change = diff->max / test_time; - printf ("%8s-%s-%s\t%6.2f: %5.2fx ", - diff->tests[i]->backend, - diff->tests[i]->content, - diff->tests[i]->configuration, - diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms, - change); - - if (options->print_change_bars) - print_change_bar (change, max_change, options->use_utf); - printf ("\n"); - } - - printf("\n"); -} - -static void -cairo_perf_reports_compare (cairo_perf_report_t *reports, - int num_reports, - cairo_perf_report_options_t *options) -{ - int i; - test_report_t **tests, *min_test; - test_diff_t *diff, *diffs; - int num_diffs, max_diffs; - double max_change; - double test_time; - int seen_non_null; - - tests = xmalloc (num_reports * sizeof (test_report_t *)); - - max_diffs = reports[0].tests_count; - for (i = 0; i < num_reports; i++) { - tests[i] = reports[i].tests; - if (reports[i].tests_count > max_diffs) - max_diffs = reports[i].tests_count; - } - - diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t)); - - num_diffs = 0; - while (1) { - int num_tests; - - /* We expect iterations values of 0 when multiple raw reports - * for the same test have been condensed into the stats of the - * first. So we just skip these later reports that have no - * stats. */ - seen_non_null = 0; - for (i = 0; i < num_reports; i++) { - while (tests[i]->name && tests[i]->stats.iterations == 0) - tests[i]++; - if (tests[i]->name) - seen_non_null++; - } - if (! seen_non_null) - break; - - /* Find the minimum of all current tests, (we have to do this - * in case some reports don't have a particular test). */ - for (i = 0; i < num_reports; i++) { - if (tests[i]->name) { - min_test = tests[i]; - break; - } - } - for (++i; i < num_reports; i++) { - if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) - min_test = tests[i]; - } - - num_tests = 0; - for (i = 0; i < num_reports; i++) { - test_report_t *test; - int n = 0; - - test = tests[i]; - while (test[n].name && - test_report_cmp_name (&test[n], min_test) == 0) - { - n++; - } - - num_tests += n; - } - - /* For each report that has the current test, record it into - * the diff structure. */ - diff->num_tests = 0; - diff->tests = xmalloc (num_tests * sizeof (test_diff_t)); - for (i = 0; i < num_reports; i++) { - while (tests[i]->name && - test_report_cmp_name (tests[i], min_test) == 0) - { - test_time = tests[i]->stats.min_ticks; - if (test_time > 0) { - test_time /= tests[i]->stats.ticks_per_ms; - if (diff->num_tests == 0) { - diff->min = test_time; - diff->max = test_time; - } else { - if (test_time < diff->min) - diff->min = test_time; - if (test_time > diff->max) - diff->max = test_time; - } - diff->tests[diff->num_tests++] = tests[i]; - } - tests[i]++; - } - } - diff->change = diff->max / diff->min; - - diff++; - num_diffs++; - } - if (num_diffs == 0) - goto DONE; - - qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp); - - max_change = 1.0; - for (i = 0; i < num_diffs; i++) { - if (fabs (diffs[i].change) > max_change) - max_change = fabs (diffs[i].change); - } - - for (i = 0; i < num_diffs; i++) { - diff = &diffs[i]; - - /* Discard as uninteresting a change which is less than the - * minimum change required, (default may be overridden on - * command-line). */ - if (fabs (diff->change) - 1.0 < options->min_change) - continue; - - test_diff_print (diff, max_change, options); - } - - for (i = 0; i < num_diffs; i++) - free (diffs[i].tests); - DONE: - free (diffs); - free (tests); -} - -static void -usage (const char *argv0) -{ - char const *basename = strrchr(argv0, '/'); - basename = basename ? basename+1 : argv0; - fprintf (stderr, - "Usage: %s [options] file [...]\n\n", - basename); - fprintf (stderr, - "Computes significant performance differences for cairo performance reports.\n" - "Each file should be the output of the cairo-perf program (or \"make perf\").\n" - "The following options are available:\n" - "\n" - "--no-utf Use ascii stars instead of utf-8 change bars.\n" - " Four stars are printed per factor of speedup.\n" - "\n" - "--no-bars Don't display change bars at all.\n\n" - "\n" - "--use-ms Use milliseconds to calculate differences.\n" - " (instead of ticks which are hardware dependent)\n" - "\n" - "--min-change threshold[%%]\n" - " Suppress all changes below the given threshold.\n" - " The default threshold of 0.05 or 5%% ignores any\n" - " speedup or slowdown of 1.05 or less. A threshold\n" - " of 0 will cause all output to be reported.\n" - ); - exit(1); -} - -static void -parse_args (int argc, - char const **argv, - cairo_perf_diff_files_args_t *args) -{ - int i; - - for (i = 1; i < argc; i++) { - if (strcmp (argv[i], "--no-utf") == 0) { - args->options.use_utf = 0; - } - else if (strcmp (argv[i], "--no-bars") == 0) { - args->options.print_change_bars = 0; - } - else if (strcmp (argv[i], "--min-change") == 0) { - char *end = NULL; - i++; - if (i >= argc) - usage (argv[0]); - args->options.min_change = strtod (argv[i], &end); - if (*end) { - if (*end == '%') { - args->options.min_change /= 100; - } else { - usage (argv[0]); - } - } - } - else { - args->num_filenames++; - args->filenames = xrealloc (args->filenames, - args->num_filenames * sizeof (char *)); - args->filenames[args->num_filenames - 1] = argv[i]; - } - } -} - -int -main (int argc, - const char *argv[]) -{ - cairo_perf_diff_files_args_t args = { - NULL, /* filenames */ - 0, /* num_filenames */ - { - 0.05, /* min change */ - 1, /* use UTF-8? */ - 1, /* display change bars? */ - } - }; - cairo_perf_report_t *reports; - test_report_t *t; - int i; - - parse_args (argc, argv, &args); - - if (args.num_filenames) { - reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t)); - for (i = 0; i < args.num_filenames; i++) { - cairo_perf_report_load (&reports[i], args.filenames[i], i, - test_report_cmp_name); - printf ("loaded: %s, %d tests\n", - args.filenames[i], reports[i].tests_count); - } - } else { - args.num_filenames = 1; - reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t)); - cairo_perf_report_load (&reports[0], NULL, 0, test_report_cmp_name); - } - - cairo_perf_reports_compare (reports, args.num_filenames, &args.options); - - /* Pointless memory cleanup, (would be a great place for talloc) */ - free (args.filenames); - for (i = 0; i < args.num_filenames; i++) { - for (t = reports[i].tests; t->name; t++) { - free (t->samples); - free (t->backend); - free (t->name); - } - free (reports[i].tests); - free (reports[i].configuration); - } - free (reports); - - return 0; -} diff --git a/perf/cairo-perf-diff b/perf/cairo-perf-diff deleted file mode 100755 index 5a4b7b386..000000000 --- a/perf/cairo-perf-diff +++ /dev/null @@ -1,255 +0,0 @@ -#!/bin/sh -set -e - -usage() { - argv0=`basename $0` - - cat >&2 << END -Usage: -For comparing files created my cairo-perf: - - $argv0 old.perf new.perf - -For comparing (cached) performance of revisions: - - $argv0 [OPTIONS] <revision> [-- cairo-perf options] - $argv0 [OPTIONS] <rev1> <rev2> [-- cairo-perf-options] - -If given a single revision, compares its results to that of its -(first-parent) predecessor. Otherwise compares the two given revisions. -The revisions can be any revision accepted by git. For example: - - $argv0 HEAD # Show impact of latest commit - $argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4 - -Options: - --f, --force - Forces cairo-perf-diff to re-run performance tests - even if cached performance data is available. - --h, --html - With this option performance changes are summarized - as HTML table. - --t, --trace - Compare performance using trace replays instead of - microbenchmarks. - -Additional options can be passed the child cairo-perf process -by separating them with a double hyphen (--). For example, to -examine what the impact of the latest change is on the stroke -test you might use: - - $argv0 HEAD -- stroke - -The performance results are cached in .perf next to the .git directory. - -Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both -builds. -END - - exit 1 -} - -benchmark="cairo-perf-micro" - -# First, pull off any known options -while true; do - case $1 in - -f|--force) force_cairo_perf="true";; - -h|--html) html_output="$2"; shift ;; - -t|--trace) benchmark="cairo-perf-trace";; - *) break;; - esac - - shift -done - -# Then if anything is left that still looks like an option, (begins -# with a dash), give usage to catch --help or any other -garbage -if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then - usage -fi - -# Finally, pick up the actual revision arguments -if [ $# -eq 1 ] || [ "$2" = "--" ]; then - old="$1^" - new="$1" - shift 1 -else - old="$1" - new="$2" - shift 2 -fi - -# And post-finally, pass anything after -- on to cairo-perf -CAIRO_PERF_OPTIONS="-r -i 10" -if [ $# -gt 0 ]; then - if [ "$1" = "--" ]; then - shift 1 - CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@" - else - usage - fi -fi - -git_setup() { - SUBDIRECTORY_OK='Yes' - . "$(git --exec-path)/git-sh-setup" - CAIRO_DIR=`dirname $GIT_DIR` - if [ "$CAIRO_DIR" = "." ]; then - CAIRO_DIR=`pwd` - fi - CAIRO_PERF_DIR=$CAIRO_DIR/.perf -} - -rev2sha() { - rev=$1 - git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 ) -} - -cpu_count() { - test -f /proc/cpuinfo && - grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo || - echo 1 -} - -# We cache performance output based on a two-part name capturing the -# current performance test suite and the library being tested. We -# capture these as the tree object of the perf directory in HEAD and -# the tree object of the src directory of the revision being tested. -# -# This way, whenever the performance suite is updated, cached output -# from old versions of the suite are automatically invalidated. Also, -# if a commit just changes things outside of the src tree, (say it -# changes the "test" test suite, or README or configure.in, or -# whatever), cairo-perf-diff will be smart enough to still use cached -# results from a run with an equivalent src tree. -rev2perf() { - rev=$1 - sha=`rev2sha $rev` - src_tree_sha=`rev2sha $rev:src` - perf_tree_sha=`rev2sha HEAD:perf` - script_tree_sha=`rev2sha HEAD:util/cairo-script` - echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf" -} -rev2perf_glob() { - rev=$1 - src_tree_sha=`rev2sha $rev:src` - perf_tree_sha=`rev2sha HEAD:perf` - script_tree_sha=`rev2sha HEAD:util/cairo-script` - echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf" -} - -build() { - build_dir=$1 - sha=$2 - - if [ ! -d $build_dir ]; then - git clone -s $CAIRO_DIR $build_dir - (cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha) - fi - cd $build_dir - - git checkout tmp-cairo-perf-diff - git reset --hard $sha - - if [ -z "$MAKEFLAGS" ]; then - CPU_COUNT=`cpu_count` - export MAKEFLAGS="-j`expr $CPU_COUNT + 1`" - fi - - if [ ! -e Makefile ]; then - ./autogen.sh $CAIRO_AUTOGEN_OPTIONS - fi - - for file in $boilerplate_files; do - rsync $CAIRO_DIR/$file boilerplate - done - for file in $perf_files; do - rsync $CAIRO_DIR/$file perf - done - for file in $script_files; do - rsync $CAIRO_DIR/$file util/cairo-script - done - - make || (rm config.cache && make) - (cd boilerplate && make libcairoboilerplate.la) - - cd perf - make ${benchmark} -} - -# Usage: run_cairo_perf_if_not_cached <rev> <suffix> -# The <rev> argument must be a valid git ref-spec that can -# be resolved to a commit. The suffix is just something -# unique so that build directories can be separated for -# multiple calls to this function. -run_cairo_perf_if_not_cached() { - rev=$1 - build_dir="build-$2" - - owd=`pwd` - sha=`rev2sha $rev` - perf=`rev2perf $rev` - glob=`rev2perf_glob $rev` - if [ -e $glob ] && [ "$force_cairo_perf" != "true" ]; then - return 0 - fi - if [ ! -d $CAIRO_PERF_DIR ]; then - echo "Creating new perf cache in $CAIRO_PERF_DIR" - mkdir $CAIRO_PERF_DIR - fi - - cd $CAIRO_DIR - boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*` - perf_files=`git ls-tree --name-only HEAD perf/*` - script_files=`git ls-tree --name-only HEAD util/cairo-script/*` - cd $CAIRO_PERF_DIR - - build $build_dir $sha || { - rm -rf $build_dir - build $build_dir $sha || exit 1 - } - - echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:" - { ./$benchmark $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed"; } >> $perf - - cd $owd -} - -git_setup - -if [ -e ./cairo-perf-diff-files ]; then - bindir="." -else - bindir=$CAIRO_DIR/perf - - # Build cairo-perf-diff-files if not available - if [ ! -e $bindir/cairo-perf-diff-files ]; then - echo "Building cairo-perf-diff-files" - if [ "x$OS" = "xWindows_NT" ]; then - make -f Makefile.win32 -C $bindir cairo-perf-diff-files CFG=debug - else - make -C $bindir cairo-perf-diff-files - fi - fi -fi - -if [ ! -e $old ]; then - run_cairo_perf_if_not_cached $old old - old=`rev2perf $old` -fi - -if [ ! -e $new ]; then - run_cairo_perf_if_not_cached $new new - new=`rev2perf $new` -fi - -if [ -z "$html_output" ]; then - $bindir/cairo-perf-diff-files $old $new -else - $bindir/cairo-perf-diff-files $old $new | - $CAIRO_DIR/perf/make-html.py > $html_output -fi diff --git a/perf/cairo-perf-diff-files.c b/perf/cairo-perf-diff-files.c deleted file mode 100644 index 36b80cda4..000000000 --- a/perf/cairo-perf-diff-files.c +++ /dev/null @@ -1,506 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - */ - -#include "cairo-perf.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <math.h> -#include <assert.h> - -typedef struct _cairo_perf_report_options { - double min_change; - int use_utf; - int print_change_bars; - int use_ticks; -} cairo_perf_report_options_t; - -typedef struct _cairo_perf_diff_files_args { - const char **filenames; - int num_filenames; - cairo_perf_report_options_t options; -} cairo_perf_diff_files_args_t; - -static int -test_diff_cmp_speedup_before_slowdown (const void *a, - const void *b) -{ - const test_diff_t *a_diff = a; - const test_diff_t *b_diff = b; - - /* First make all speedups come before all slowdowns. */ - if (a_diff->change > 0 && b_diff->change < 0) - return -1; - if (a_diff->change < 0 && b_diff->change > 0) - return 1; - - if (a_diff->change == b_diff->change) - return 0; - - /* Large speedups come first. */ - if (a_diff->change > 0) { - if (a_diff->change > b_diff->change) - return -1; - else - return 1; - } - - /* Large slowdowns come last. */ - if (a_diff->change < 0) { - if (a_diff->change < b_diff->change) - return 1; - else - return -1; - } - - return 0; -} - -static int -test_diff_cmp (const void *a, - const void *b) -{ - const test_diff_t *a_diff = a; - const test_diff_t *b_diff = b; - - /* Reverse sort by magnitude of change so larger changes come - * first */ - if (a_diff->change > b_diff->change) - return -1; - - if (a_diff->change < b_diff->change) - return 1; - - return 0; -} - -#define CHANGE_BAR_WIDTH 70 -static void -print_change_bar (double change, - double max_change, - int use_utf) -{ - int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH); - static char const *ascii_boxes[8] = { - "****","***" ,"***", "**", - "**", "*", "*", "" - }; - static char const *utf_boxes[8] = { - "█", "▉", "▊", "▋", - "▌", "▍", "▎", "▏" - }; - char const **boxes = use_utf ? utf_boxes : ascii_boxes; - - /* For a 1.0x speedup we want a zero-size bar to show "no - * change". */ - change -= 1.0; - - while (change > units_per_cell) { - printf ("%s", boxes[0]); - change -= units_per_cell; - } - - change /= units_per_cell; - - if (change > 7.5/8.0) - printf ("%s", boxes[0]); - else if (change > 6.5/8.0) - printf ("%s", boxes[1]); - else if (change > 5.5/8.0) - printf ("%s", boxes[2]); - else if (change > 4.5/8.0) - printf ("%s", boxes[3]); - else if (change > 3.5/8.0) - printf ("%s", boxes[4]); - else if (change > 2.5/8.0) - printf ("%s", boxes[5]); - else if (change > 1.5/8.0) - printf ("%s", boxes[6]); - else if (change > 0.5/8.0) - printf ("%s", boxes[7]); - - printf ("\n"); -} - -static void -test_diff_print_binary (test_diff_t *diff, - double max_change, - cairo_perf_report_options_t *options) -{ - if (diff->tests[0]->size) - printf ("%5s-%-4s %26s-%-3d", - diff->tests[0]->backend, diff->tests[0]->content, - diff->tests[0]->name, diff->tests[0]->size); - else - printf ("%5s %26s", diff->tests[0]->backend, diff->tests[0]->name); - - printf (" %6.2f (%.2f %4.2f%%) -> %6.2f (%.2f %4.2f%%): %5.2fx ", - diff->tests[0]->stats.min_ticks / diff->tests[0]->stats.ticks_per_ms, - diff->tests[0]->stats.median_ticks / diff->tests[0]->stats.ticks_per_ms, - diff->tests[0]->stats.std_dev * 100, - diff->tests[1]->stats.min_ticks / diff->tests[1]->stats.ticks_per_ms, - diff->tests[1]->stats.median_ticks / diff->tests[1]->stats.ticks_per_ms, - diff->tests[1]->stats.std_dev * 100, - fabs (diff->change)); - - if (diff->change > 1.0) - printf ("speedup\n"); - else - printf ("slowdown\n"); - - if (options->print_change_bars) - print_change_bar (fabs (diff->change), max_change, - options->use_utf); -} - -static void -test_diff_print_multi (test_diff_t *diff, - double max_change, - cairo_perf_report_options_t *options) -{ - int i; - double test_time; - double change; - - if (diff->tests[0]->size) { - printf ("%s (backend: %s-%s, size: %d)\n", - diff->tests[0]->name, - diff->tests[0]->backend, - diff->tests[0]->content, - diff->tests[0]->size); - } else { - printf ("%s (backend: %s)\n", - diff->tests[0]->name, - diff->tests[0]->backend); - } - - for (i = 0; i < diff->num_tests; i++) { - test_time = diff->tests[i]->stats.min_ticks; - if (! options->use_ticks) - test_time /= diff->tests[i]->stats.ticks_per_ms; - change = diff->max / test_time; - printf ("[%d] %6.2f: %5.2fx ", - diff->tests[i]->fileno, - diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms, - change); - - if (options->print_change_bars) - print_change_bar (change, max_change, options->use_utf); - else - printf("\n"); - } - - printf("\n"); -} - -static void -cairo_perf_reports_compare (cairo_perf_report_t *reports, - int num_reports, - cairo_perf_report_options_t *options) -{ - int i; - test_report_t **tests, *min_test; - test_diff_t *diff, *diffs; - int num_diffs, max_diffs; - double max_change; - double test_time; - int seen_non_null; - cairo_bool_t printed_speedup = FALSE; - cairo_bool_t printed_slowdown = FALSE; - - assert (num_reports >= 2); - - tests = xmalloc (num_reports * sizeof (test_report_t *)); - - max_diffs = reports[0].tests_count; - for (i = 0; i < num_reports; i++) { - tests[i] = reports[i].tests; - if (reports[i].tests_count > max_diffs) - max_diffs = reports[i].tests_count; - } - - diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t)); - - num_diffs = 0; - while (1) { - /* We expect iterations values of 0 when multiple raw reports - * for the same test have been condensed into the stats of the - * first. So we just skip these later reports that have no - * stats. */ - seen_non_null = 0; - for (i = 0; i < num_reports; i++) { - while (tests[i]->name && tests[i]->stats.iterations == 0) - tests[i]++; - if (tests[i]->name) - seen_non_null++; - } - - if (seen_non_null < 2) - break; - - /* Find the minimum of all current tests, (we have to do this - * in case some reports don't have a particular test). */ - for (i = 0; i < num_reports; i++) { - if (tests[i]->name) { - min_test = tests[i]; - break; - } - } - for (++i; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) < 0) - { - min_test = tests[i]; - } - } - - /* For each report that has the current test, record it into - * the diff structure. */ - diff->num_tests = 0; - diff->tests = xmalloc (num_reports * sizeof (test_diff_t)); - for (i = 0; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - test_time = tests[i]->stats.min_ticks; - if (! options->use_ticks) - test_time /= tests[i]->stats.ticks_per_ms; - if (diff->num_tests == 0) { - diff->min = test_time; - diff->max = test_time; - } else { - if (test_time < diff->min) - diff->min = test_time; - if (test_time > diff->max) - diff->max = test_time; - } - diff->tests[diff->num_tests++] = tests[i]; - tests[i]++; - } - } - diff->change = diff->max / diff->min; - - if (num_reports == 2) { - double old_time, new_time; - if (diff->num_tests == 1) { - printf ("Only in %s: %s %s\n", - diff->tests[0]->configuration, - diff->tests[0]->backend, - diff->tests[0]->name); - continue; - } - old_time = diff->tests[0]->stats.min_ticks; - new_time = diff->tests[1]->stats.min_ticks; - if (! options->use_ticks) { - old_time /= diff->tests[0]->stats.ticks_per_ms; - new_time /= diff->tests[1]->stats.ticks_per_ms; - } - diff->change = old_time / new_time; - if (diff->change < 1.0) - diff->change = - 1.0 / diff->change; - } - - diff++; - num_diffs++; - } - if (num_diffs == 0) - goto DONE; - - if (num_reports == 2) - qsort (diffs, num_diffs, sizeof (test_diff_t), - test_diff_cmp_speedup_before_slowdown); - else - qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp); - - max_change = 1.0; - for (i = 0; i < num_diffs; i++) { - if (fabs (diffs[i].change) > max_change) - max_change = fabs (diffs[i].change); - } - - if (num_reports == 2) - printf ("old: %s\n" - "new: %s\n", - diffs->tests[0]->configuration, - diffs->tests[1]->configuration); - - for (i = 0; i < num_diffs; i++) { - diff = &diffs[i]; - - /* Discard as uninteresting a change which is less than the - * minimum change required, (default may be overriden on - * command-line). */ - if (fabs (diff->change) - 1.0 < options->min_change) - continue; - - if (num_reports == 2) { - if (diff->change > 1.0 && ! printed_speedup) { - printf ("Speedups\n" - "========\n"); - printed_speedup = TRUE; - } - if (diff->change < 1.0 && ! printed_slowdown) { - printf ("Slowdowns\n" - "=========\n"); - printed_slowdown = TRUE; - } - test_diff_print_binary (diff, max_change, options); - } else { - test_diff_print_multi (diff, max_change, options); - } - } - - DONE: - for (i = 0; i < num_diffs; i++) - free (diffs[i].tests); - free (diffs); - free (tests); -} - -static void -usage (const char *argv0) -{ - char const *basename = strrchr(argv0, '/'); - basename = basename ? basename+1 : argv0; - fprintf (stderr, - "Usage: %s [options] file1 file2 [...]\n\n", - basename); - fprintf (stderr, - "Computes significant performance differences for cairo performance reports.\n" - "Each file should be the output of the cairo-perf program (or \"make perf\").\n" - "The following options are available:\n" - "\n" - "--no-utf Use ascii stars instead of utf-8 change bars.\n" - " Four stars are printed per factor of speedup.\n" - "\n" - "--no-bars Don't display change bars at all.\n\n" - "\n" - "--use-ms Use milliseconds to calculate differences.\n" - " (instead of ticks which are hardware dependent)\n" - "\n" - "--min-change threshold[%%]\n" - " Suppress all changes below the given threshold.\n" - " The default threshold of 0.05 or 5%% ignores any\n" - " speedup or slowdown of 1.05 or less. A threshold\n" - " of 0 will cause all output to be reported.\n" - ); - exit(1); -} - -static void -parse_args (int argc, - char const **argv, - cairo_perf_diff_files_args_t *args) -{ - int i; - - for (i = 1; i < argc; i++) { - if (strcmp (argv[i], "--no-utf") == 0) { - args->options.use_utf = 0; - } - else if (strcmp (argv[i], "--no-bars") == 0) { - args->options.print_change_bars = 0; - } - else if (strcmp (argv[i], "--use-ms") == 0) { - /* default */ - } - else if (strcmp (argv[i], "--use-ticks") == 0) { - args->options.use_ticks = 1; - } - else if (strcmp (argv[i], "--min-change") == 0) { - char *end = NULL; - i++; - if (i >= argc) - usage (argv[0]); - args->options.min_change = strtod (argv[i], &end); - if (*end) { - if (*end == '%') { - args->options.min_change /= 100; - } else { - usage (argv[0]); - } - } - } - else { - args->num_filenames++; - args->filenames = xrealloc (args->filenames, - args->num_filenames * sizeof (char *)); - args->filenames[args->num_filenames - 1] = argv[i]; - } - } -} - -int -main (int argc, - const char *argv[]) -{ - cairo_perf_diff_files_args_t args = { - NULL, /* filenames */ - 0, /* num_filenames */ - { - 0.05, /* min change */ - 1, /* use UTF-8? */ - 1, /* display change bars? */ - } - }; - cairo_perf_report_t *reports; - test_report_t *t; - int i; - - parse_args (argc, argv, &args); - - if (args.num_filenames < 2) - usage (argv[0]); - - reports = xmalloc (args.num_filenames * sizeof (cairo_perf_report_t)); - - for (i = 0; i < args.num_filenames; i++ ) { - cairo_perf_report_load (&reports[i], args.filenames[i], i, NULL); - printf ("[%d] %s\n", i, args.filenames[i]); - } - printf ("\n"); - - cairo_perf_reports_compare (reports, args.num_filenames, &args.options); - - /* Pointless memory cleanup, (would be a great place for talloc) */ - free (args.filenames); - for (i = 0; i < args.num_filenames; i++) { - for (t = reports[i].tests; t->name; t++) { - free (t->samples); - free (t->backend); - free (t->name); - } - free (reports[i].tests); - free (reports[i].configuration); - } - free (reports); - - return 0; -} diff --git a/perf/cairo-perf-graph b/perf/cairo-perf-graph deleted file mode 100755 index a167351fc..000000000 --- a/perf/cairo-perf-graph +++ /dev/null @@ -1,206 +0,0 @@ -#!/bin/sh -set -e - -### -### XXX Source common functions from cairo-perf-diff -### - -usage() { - argv0=`basename $0` - - cat >&2 << END -Usage: -As opposed to its sibling, cairo-perf-diff, cairo-perf-graph targets -reviewing changes between series by graphically comparing the performance -at each commit. - -The two revisions can be any revision accepted by git. For example: - - $argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4 - -Options: - --f, --force - Forces cairo-perf-diff to re-run performance tests - even if cached performance data is available. - --h, --html - With this option performance changes are summarized - as HTML table. - -Additional options can be passed the child cairo-perf process -by separating them with a double hyphen (--). For example, to -examine what the impact of the latest change is on the stroke -test you might use: - - $argv0 HEAD -- stroke - -The performance results are cached in .perf next to the .git directory. - -Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both -builds. -END - - exit 1 -} - -# First, pull off any known options -while true; do - case $1 in - -f|--force) force_cairo_perf="true";; - -h|--html) html_output="true";; - -s|--show) show_only="true";; - *) break;; - esac - - shift -done - -# Then if anything is left that still looks like an option, (begins -# with a dash), give usage to catch --help or any other -garbage -if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then - usage -fi - -# Finally, pick up the actual revision arguments -old="$1" -new="$2" -shift 2 - -# And post-finally, pass anything after -- on to cairo-perf -CAIRO_PERF_OPTIONS="-r -i 25" -if [ $# -gt 0 ]; then - if [ "$1" = "--" ]; then - shift 1 - CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@" - else - usage - fi -fi - -git_setup() { - SUBDIRECTORY_OK='Yes' - . "$(git --exec-path)/git-sh-setup" - CAIRO_DIR=`dirname $GIT_DIR` - if [ "$CAIRO_DIR" = "." ]; then - CAIRO_DIR=`pwd` - fi - CAIRO_PERF_DIR=$CAIRO_DIR/.perf -} - -rev2sha() { - rev=$1 - git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 ) -} - -cpu_count() { - test -f /proc/cpuinfo && - grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo || - echo 1 -} - -# We cache performance output based on a two-part name capturing the -# current performance test suite and the library being tested. We -# capture these as the tree object of the perf directory in HEAD and -# the tree object of the src directory of the revision being tested. -# -# This way, whenever the performance suite is updated, cached output -# from old versions of the suite are automatically invalidated. Also, -# if a commit just changes things outside of the src tree, (say it -# changes the "test" test suite, or README or configure.in, or -# whatever), cairo-perf-diff will be smart enough to still use cached -# results from a run with an equivalent src tree. -rev2perf() { - rev=$1 - sha=`rev2sha $rev` - src_tree_sha=`rev2sha $rev:src` - perf_tree_sha=`rev2sha HEAD:perf` - echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${src_tree_sha}.perf" -} -rev2perf_glob() { - rev=$1 - src_tree_sha=`rev2sha $rev:src` - perf_tree_sha=`rev2sha HEAD:perf` - echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${src_tree_sha}.perf" -} - -# Usage: run_cairo_perf_if_not_cached <rev> <suffix> -# The <rev> argument must be a valid git ref-spec that can -# be resolved to a commit. The suffix is just something -# unique so that build directories can be separated for -# multiple calls to this function. -run_cairo_perf_if_not_cached() { - rev=$1 - build_dir="build-$2" - - owd=`pwd` - sha=`rev2sha $rev` - perf=`rev2perf $rev` - glob=`rev2perf_glob $rev` - if [ -e $glob ] && [ "$force_cairo_perf" != "true" ] || [ -n "$show_only" ]; then - return 0 - fi - if [ ! -d $CAIRO_PERF_DIR ]; then - echo "Creating new perf cache in $CAIRO_PERF_DIR" - mkdir $CAIRO_PERF_DIR - fi - - cd $CAIRO_DIR - boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*` - perf_files=`git ls-tree --name-only HEAD perf/*` - cd $CAIRO_PERF_DIR - - if [ ! -d $build_dir ]; then - git clone -s $CAIRO_DIR $build_dir - (cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha) - fi - cd $build_dir - - git checkout tmp-cairo-perf-diff - git reset --hard $sha - - if [ -z "$MAKEFLAGS" ]; then - CPU_COUNT=`cpu_count` - export MAKEFLAGS="-j`expr $CPU_COUNT + 1`" - fi - - if [ ! -e Makefile ]; then - CFLAGS="-O2" ./autogen.sh $CAIRO_AUTOGEN_OPTIONS - fi - make CFLAGS="-O2" || (rm config.cache && make CFLAGS="-O2") - for file in $boilerplate_files; do - rsync $CAIRO_DIR/$file boilerplate - done - (cd boilerplate; make) - for file in $perf_files; do - rsync $CAIRO_DIR/$file perf - done - cd perf; - make cairo-perf || exit 1 - echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:" - echo "$perf" - (./cairo-perf $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed") >> $perf - cd $owd -} - -git_setup - -# Build cairo-perf-graph-files if not available -if [ ! -e $CAIRO_DIR/perf/cairo-perf-graph-files ]; then - echo "Building cairo-perf-graph-files" - if [ "x$OS" = "xWindows_NT" ]; then - make -f Makefile.win32 -C $CAIRO_DIR/perf/ cairo-perf-graph-files CFG=debug - else - make -C $CAIRO_DIR/perf/ cairo-perf-graph-files - fi -fi - -revs="" -for rev in `git rev-list --reverse $old..$new`; do - run_cairo_perf_if_not_cached $rev rev - perf=`rev2perf $rev` - [ -e "$perf" ] && revs="$revs $perf" -done - -exec $CAIRO_DIR/perf/cairo-perf-graph-files $revs -#exec $CAIRO_DIR/libtool --mode=execute gdb --args $CAIRO_DIR/perf/cairo-perf-graph-files $revs diff --git a/perf/cairo-perf-graph-files.c b/perf/cairo-perf-graph-files.c deleted file mode 100644 index 1fd99e4ad..000000000 --- a/perf/cairo-perf-graph-files.c +++ /dev/null @@ -1,604 +0,0 @@ -/* - * Copyright © 2008 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" -#include "cairo-perf-graph.h" - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <fcntl.h> - -#include <cairo.h> - -static void -usage (const char *argv0) -{ - char const *basename = strrchr (argv0, '/'); - basename = basename ? basename+1 : argv0; - g_printerr ("Usage: %s [options] file1 file2 [...]\n\n", basename); - g_printerr ("Draws a graph illustrating the change in performance over a series.\n"); - exit(1); -} - -enum { - CASE_SHOWN, - CASE_INCONSISTENT, - CASE_BACKEND, - CASE_CONTENT, - CASE_NAME, - CASE_SIZE, - CASE_FG_COLOR, - CASE_DATA, - CASE_NCOLS -}; - -static GtkTreeStore * -cases_to_store (test_case_t *cases) -{ - GtkTreeStore *store; - GtkTreeIter backend_iter; - GtkTreeIter content_iter; - const char *backend = NULL; - const char *content = NULL; - - store = gtk_tree_store_new (CASE_NCOLS, - G_TYPE_BOOLEAN, /* shown */ - G_TYPE_BOOLEAN, /* inconsistent */ - G_TYPE_STRING, /* backend */ - G_TYPE_STRING, /* content */ - G_TYPE_STRING, /* name */ - G_TYPE_INT, /* size */ - GDK_TYPE_COLOR, /* fg color */ - G_TYPE_POINTER); /* data */ - while (cases->backend != NULL) { - GtkTreeIter iter; - - if (backend == NULL || strcmp (backend, cases->backend)) { - gtk_tree_store_append (store, &backend_iter, NULL); - gtk_tree_store_set (store, &backend_iter, - CASE_SHOWN, TRUE, - CASE_BACKEND, cases->backend, - -1); - backend = cases->backend; - content = NULL; - } - if (content == NULL || strcmp (content, cases->content)) { - gtk_tree_store_append (store, &content_iter, &backend_iter); - gtk_tree_store_set (store, &content_iter, - CASE_SHOWN, TRUE, - CASE_BACKEND, cases->backend, - CASE_CONTENT, cases->content, - -1); - content = cases->content; - } - - gtk_tree_store_append (store, &iter, &content_iter); - gtk_tree_store_set (store, &iter, - CASE_SHOWN, TRUE, - CASE_BACKEND, cases->backend, - CASE_CONTENT, cases->content, - CASE_NAME, cases->name, - CASE_SIZE, cases->size, - CASE_FG_COLOR, &cases->color, - CASE_DATA, cases, - -1); - cases++; - } - - return store; -} - -struct _app_data { - GtkWidget *window; - - test_case_t *cases; - cairo_perf_report_t *reports; - int num_reports; - - GtkTreeStore *case_store; - - GIOChannel *git_io; - GtkTextBuffer *git_buffer; - - GtkWidget *gv; -}; - -static void -recurse_set_shown (GtkTreeModel *model, - GtkTreeIter *parent, - gboolean shown) -{ - GtkTreeIter iter; - - if (gtk_tree_model_iter_children (model, &iter, parent)) do { - test_case_t *c; - - gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1); - if (c == NULL) { - recurse_set_shown (model, &iter, shown); - } else if (shown != c->shown) { - c->shown = shown; - gtk_tree_store_set (GTK_TREE_STORE (model), &iter, - CASE_SHOWN, shown, - CASE_INCONSISTENT, FALSE, - -1); - } - } while (gtk_tree_model_iter_next (model, &iter)); -} - -static gboolean -children_consistent (GtkTreeModel *model, - GtkTreeIter *parent) -{ - GtkTreeIter iter; - gboolean first = TRUE; - gboolean first_active; - - if (gtk_tree_model_iter_children (model, &iter, parent)) do { - gboolean active, inconsistent; - - gtk_tree_model_get (model, &iter, - CASE_INCONSISTENT, &inconsistent, - CASE_SHOWN, &active, - -1); - if (inconsistent) - return FALSE; - - if (first) { - first_active = active; - first = FALSE; - } else if (active != first_active) - return FALSE; - } while (gtk_tree_model_iter_next (model, &iter)); - - return TRUE; -} - -static void -check_consistent (GtkTreeModel *model, - GtkTreeIter *child) -{ - GtkTreeIter parent; - - if (gtk_tree_model_iter_parent (model, &parent, child)) { - gtk_tree_store_set (GTK_TREE_STORE (model), &parent, - CASE_INCONSISTENT, - ! children_consistent (model, &parent), - -1); - check_consistent (model, &parent); - } -} - -static void -show_case_toggled (GtkCellRendererToggle *cell, - gchar *str, - struct _app_data *app) -{ - GtkTreeModel *model; - GtkTreePath *path; - GtkTreeIter iter; - test_case_t *c; - gboolean active; - - active = ! gtk_cell_renderer_toggle_get_active (cell); - - model = GTK_TREE_MODEL (app->case_store); - - path = gtk_tree_path_new_from_string (str); - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_path_free (path); - - gtk_tree_store_set (app->case_store, &iter, - CASE_SHOWN, active, - CASE_INCONSISTENT, FALSE, - -1); - gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1); - if (c != NULL) { - if (active == c->shown) - return; - - c->shown = active; - } else { - recurse_set_shown (model, &iter, active); - } - check_consistent (model, &iter); - - graph_view_update_visible ((GraphView *) app->gv); -} - -static gboolean -git_read (GIOChannel *io, - GIOCondition cond, - struct _app_data *app) -{ - int fd; - - fd = g_io_channel_unix_get_fd (io); - do { - char buf[4096]; - int len; - GtkTextIter end; - - len = read (fd, buf, sizeof (buf)); - if (len <= 0) { - int err = len ? errno : 0; - switch (err) { - case EAGAIN: - case EINTR: - return TRUE; - default: - g_io_channel_unref (app->git_io); - app->git_io = NULL; - return FALSE; - } - } - - gtk_text_buffer_get_end_iter (app->git_buffer, &end); - gtk_text_buffer_insert (app->git_buffer, &end, buf, len); - } while (TRUE); -} - -static void -do_git (struct _app_data *app, - char **argv) -{ - gint output; - GError *error = NULL; - GtkTextIter start, stop; - long flags; - - if (! g_spawn_async_with_pipes (NULL, argv, NULL, - G_SPAWN_SEARCH_PATH | - G_SPAWN_STDERR_TO_DEV_NULL | - G_SPAWN_FILE_AND_ARGV_ZERO, - NULL, NULL, NULL, - NULL, &output, NULL, - &error)) - { - g_error ("spawn failed: %s", error->message); - } - - if (app->git_io) { - g_io_channel_shutdown (app->git_io, FALSE, NULL); - g_io_channel_unref (app->git_io); - } - - gtk_text_buffer_get_bounds (app->git_buffer, &start, &stop); - gtk_text_buffer_delete (app->git_buffer, &start, &stop); - - flags = fcntl (output, F_GETFL); - if ((flags & O_NONBLOCK) == 0) - fcntl (output, F_SETFL, flags | O_NONBLOCK); - - app->git_io = g_io_channel_unix_new (output); - g_io_add_watch (app->git_io, G_IO_IN | G_IO_HUP, (GIOFunc) git_read, app); -} - -static void -gv_report_selected (GraphView *gv, - int i, - struct _app_data *app) -{ - cairo_perf_report_t *report; - char *hyphen; - - if (i == -1) - return; - - report = &app->reports[i]; - hyphen = strchr (report->configuration, '-'); - if (hyphen != NULL) { - int len = hyphen - report->configuration; - char *id = g_malloc (len + 1); - char *argv[5]; - - memcpy (id, report->configuration, len); - id[len] = '\0'; - - argv[0] = (char *) "git"; - argv[1] = (char *) "git"; - argv[2] = (char *) "show"; - argv[3] = id; - argv[4] = NULL; - - do_git (app, argv); - g_free (id); - } -} - -static GtkWidget * -window_create (test_case_t *cases, - cairo_perf_report_t *reports, - int num_reports) -{ - GtkWidget *window, *table, *w; - GtkWidget *tv, *sw; - GtkTreeStore *store; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - struct _app_data *data; - - - data = g_new0 (struct _app_data, 1); - data->cases = cases; - data->reports = reports; - data->num_reports = num_reports; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Cairo Performance Graph"); - g_object_set_data_full (G_OBJECT (window), - "app-data", data, (GDestroyNotify)g_free); - - data->window = window; - - table = gtk_table_new (2, 2, FALSE); - - /* legend & show/hide lines (categorised) */ - tv = gtk_tree_view_new (); - store = cases_to_store (cases); - data->case_store = store; - gtk_tree_view_set_model (GTK_TREE_VIEW (tv), GTK_TREE_MODEL (store)); - - renderer = gtk_cell_renderer_toggle_new (); - column = gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "active", CASE_SHOWN, - "inconsistent", CASE_INCONSISTENT, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); - g_signal_connect (renderer, "toggled", - G_CALLBACK (show_case_toggled), data); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Backend", - renderer, - "text", CASE_BACKEND, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Content", - renderer, - "text", CASE_CONTENT, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Test", - renderer, - "text", CASE_NAME, - "foreground-gdk", CASE_FG_COLOR, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Size", - renderer, - "text", CASE_SIZE, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); - - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tv), TRUE); - g_object_unref (store); - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), tv); - gtk_widget_show (tv); - gtk_table_attach (GTK_TABLE (table), sw, - 0, 1, 0, 2, - GTK_FILL, GTK_FILL, - 4, 4); - gtk_widget_show (sw); - - /* the performance chart */ - w = graph_view_new (); - data->gv = w; - g_signal_connect (w, "report-selected", - G_CALLBACK (gv_report_selected), data); - graph_view_set_reports ((GraphView *)w, cases, reports, num_reports); - gtk_table_attach (GTK_TABLE (table), w, - 1, 2, 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 4, 4); - gtk_widget_show (w); - - /* interesting information - presumably the commit log */ - w = gtk_text_view_new (); - data->git_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), w); - gtk_widget_show (w); - gtk_table_attach (GTK_TABLE (table), sw, - 1, 2, 1, 2, - GTK_FILL, GTK_FILL | GTK_EXPAND, - 4, 4); - gtk_widget_show (sw); - - gtk_container_add (GTK_CONTAINER (window), table); - gtk_widget_show (table); - - return window; -} - -static void -name_to_color (const char *name, - GdkColor *color) -{ - gint v = g_str_hash (name); - - color->red = ((v >> 0) & 0xff) / 384. * 0xffff; - color->green = ((v >> 8) & 0xff) / 384. * 0xffff; - color->blue = ((v >> 16) & 0xff) / 384. * 0xffff; -} - -static test_case_t * -test_cases_from_reports (cairo_perf_report_t *reports, - int num_reports) -{ - test_case_t *cases, *c; - test_report_t **tests; - int i, j; - int num_tests; - - num_tests = 0; - for (i = 0; i < num_reports; i++) { - for (j = 0; reports[i].tests[j].name != NULL; j++) - ; - if (j > num_tests) - num_tests = j; - } - - cases = xcalloc (num_tests+1, sizeof (test_case_t)); - tests = xmalloc (num_reports * sizeof (test_report_t *)); - for (i = 0; i < num_reports; i++) - tests[i] = reports[i].tests; - - c = cases; - while (1) { - int seen_non_null; - test_report_t *min_test; - - /* We expect iterations values of 0 when multiple raw reports - * for the same test have been condensed into the stats of the - * first. So we just skip these later reports that have no - * stats. */ - seen_non_null = 0; - for (i = 0; i < num_reports; i++) { - while (tests[i]->name && tests[i]->stats.iterations == 0) - tests[i]++; - if (tests[i]->name) - seen_non_null++; - } - - if (seen_non_null < 2) - break; - - /* Find the minimum of all current tests, (we have to do this - * in case some reports don't have a particular test). */ - for (i = 0; i < num_reports; i++) { - if (tests[i]->name) { - min_test = tests[i]; - break; - } - } - for (++i; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) < 0) - { - min_test = tests[i]; - } - } - - c->min_test = min_test; - c->backend = min_test->backend; - c->content = min_test->content; - c->name = min_test->name; - c->size = min_test->size; - c->baseline = min_test->stats.min_ticks; - c->min = c->max = 1.; - c->shown = TRUE; - name_to_color (c->name, &c->color); - - for (i = 0; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - tests[i]++; - break; - } - } - - for (++i; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - double v = tests[i]->stats.min_ticks / c->baseline; - if (v < c->min) - c->min = v; - if (v > c->max) - c->max = v; - tests[i]++; - } - } - - c++; - } - free (tests); - - return cases; -} -int -main (int argc, - char *argv[]) -{ - cairo_perf_report_t *reports; - test_case_t *cases; - test_report_t *t; - int i; - GtkWidget *window; - - gtk_init (&argc, &argv); - - if (argc < 3) - usage (argv[0]); - - reports = xmalloc ((argc-1) * sizeof (cairo_perf_report_t)); - for (i = 1; i < argc; i++ ) - cairo_perf_report_load (&reports[i-1], argv[i], i, NULL); - - cases = test_cases_from_reports (reports, argc-1); - - window = window_create (cases, reports, argc-1); - g_signal_connect (window, "delete-event", - G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - - gtk_main (); - - /* Pointless memory cleanup, (would be a great place for talloc) */ - free (cases); - for (i = 0; i < argc-1; i++) { - for (t = reports[i].tests; t->name; t++) { - free (t->samples); - free (t->backend); - free (t->name); - } - free (reports[i].tests); - free (reports[i].configuration); - } - free (reports); - - return 0; -} diff --git a/perf/cairo-perf-graph-widget.c b/perf/cairo-perf-graph-widget.c deleted file mode 100644 index 41311f7ee..000000000 --- a/perf/cairo-perf-graph-widget.c +++ /dev/null @@ -1,604 +0,0 @@ -/* - * Copyright © 2008 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" -#include "cairo-perf-graph.h" - -#include <gtk/gtk.h> - -struct _GraphView { - GtkWidget widget; - - test_case_t *cases; - cairo_perf_report_t *reports; - int num_reports; - double ymin, ymax; - - int selected_report; -}; - -typedef struct _GraphViewClass { - GtkWidgetClass parent_class; -} GraphViewClass; - -static GType graph_view_get_type (void); - -enum { - REPORT_SELECTED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - -G_DEFINE_TYPE (GraphView, graph_view, GTK_TYPE_WIDGET) - -static void -draw_baseline_performance (test_case_t *cases, - cairo_perf_report_t *reports, - int num_reports, - cairo_t *cr, - const cairo_matrix_t *m) -{ - test_report_t **tests; - double dots[2] = { 0, 1.}; - int i; - - tests = xmalloc (num_reports * sizeof (test_report_t *)); - for (i = 0; i < num_reports; i++) - tests[i] = reports[i].tests; - - while (cases->backend != NULL) { - test_report_t *min_test; - double baseline, last_y; - double x, y; - - if (! cases->shown) { - cases++; - continue; - } - - min_test = cases->min_test; - - for (i = 0; i < num_reports; i++) { - while (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) < 0) - { - tests[i]++; - } - } - - /* first the stroke */ - cairo_save (cr); - cairo_set_line_width (cr, 2.); - gdk_cairo_set_source_color (cr, &cases->color); - for (i = 0; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - baseline = tests[i]->stats.min_ticks; - - x = i; y = 0; - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - y = floor (y); - cairo_move_to (cr, x, y); - last_y = y; - break; - } - } - - for (++i; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - x = i, y = tests[i]->stats.min_ticks / baseline; - - if (y < 1.) - y = -1./y + 1; - else - y -= 1; - - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - y = floor (y); - cairo_line_to (cr, x, last_y); - cairo_line_to (cr, x, y); - last_y = y; - } - } - { - x = num_reports, y = 0; - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - cairo_line_to (cr, x, last_y); - } - - cairo_set_line_width (cr, 1.); - cairo_stroke (cr); - - /* then draw the points */ - for (i = 0; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - baseline = tests[i]->stats.min_ticks; - - x = i; y = 0; - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - y = floor (y); - cairo_move_to (cr, x, y); - cairo_close_path (cr); - last_y = y; - - tests[i]++; - break; - } - } - - for (++i; i < num_reports; i++) { - if (tests[i]->name && - test_report_cmp_backend_then_name (tests[i], min_test) == 0) - { - x = i, y = tests[i]->stats.min_ticks / baseline; - - if (y < 1.) - y = -1./y + 1; - else - y -= 1; - - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - y = floor (y); - cairo_move_to (cr, x, last_y); - cairo_close_path (cr); - cairo_move_to (cr, x, y); - cairo_close_path (cr); - last_y = y; - - tests[i]++; - } - } - { - x = num_reports, y = 0; - cairo_matrix_transform_point (m, &x, &y); - x = floor (x); - cairo_move_to (cr, x, last_y); - cairo_close_path (cr); - } - cairo_set_source_rgba (cr, 0, 0, 0, .5); - cairo_set_dash (cr, dots, 2, 0.); - cairo_set_line_width (cr, 3.); - cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); - cairo_stroke (cr); - cairo_restore (cr); - - cases++; - } - free (tests); -} - -static void -draw_hline (cairo_t *cr, - const cairo_matrix_t *m, - double y0, - double xmin, - double xmax) -{ - double x, y; - double py_offset; - - py_offset = fmod (cairo_get_line_width (cr) / 2., 1.); - - x = xmin; y = y0; - cairo_matrix_transform_point (m, &x, &y); - cairo_move_to (cr, floor (x), floor (y) + py_offset); - - x = xmax; y = y0; - cairo_matrix_transform_point (m, &x, &y); - cairo_line_to (cr, ceil (x), floor (y) + py_offset); - - cairo_stroke (cr); -} - -static void -draw_label (cairo_t *cr, - const cairo_matrix_t *m, - double y0, - double xmin, - double xmax) -{ - double x, y; - char buf[80]; - cairo_text_extents_t extents; - - snprintf (buf, sizeof (buf), "%.0fx", fabs (y0)); - cairo_text_extents (cr, buf, &extents); - - x = xmin; y = y0; - cairo_matrix_transform_point (m, &x, &y); - cairo_move_to (cr, - x - extents.width - 4, - y - (extents.height/2. + extents.y_bearing)); - cairo_show_text (cr, buf); - - - snprintf (buf, sizeof (buf), "%.0fx", fabs (y0)); - cairo_text_extents (cr, buf, &extents); - - x = xmax; y = y0; - cairo_matrix_transform_point (m, &x, &y); - cairo_move_to (cr, - x + 4, - y - (extents.height/2. + extents.y_bearing)); - cairo_show_text (cr, buf); -} - -#define ALIGN_X(v) ((v)<<0) -#define ALIGN_Y(v) ((v)<<2) -static void -draw_rotated_label (cairo_t *cr, - const char *text, - double x, - double y, - double angle, - int align) -{ - cairo_text_extents_t extents; - - cairo_text_extents (cr, text, &extents); - - cairo_save (cr); { - cairo_translate (cr, x, y); - cairo_rotate (cr, angle); - switch (align) { - case ALIGN_X(0) | ALIGN_Y(0): - cairo_move_to (cr, - -extents.x_bearing, - -extents.y_bearing); - break; - case ALIGN_X(0) | ALIGN_Y(1): - cairo_move_to (cr, - -extents.x_bearing, - - (extents.height/2. + extents.y_bearing)); - break; - case ALIGN_X(0) | ALIGN_Y(2): - cairo_move_to (cr, - -extents.x_bearing, - - (extents.height + extents.y_bearing)); - break; - - case ALIGN_X(1) | ALIGN_Y(0): - cairo_move_to (cr, - - (extents.width/2. + extents.x_bearing), - -extents.y_bearing); - break; - case ALIGN_X(1) | ALIGN_Y(1): - cairo_move_to (cr, - - (extents.width/2. + extents.x_bearing), - - (extents.height/2. + extents.y_bearing)); - break; - case ALIGN_X(1) | ALIGN_Y(2): - cairo_move_to (cr, - - (extents.width/2. + extents.x_bearing), - - (extents.height + extents.y_bearing)); - break; - - case ALIGN_X(2) | ALIGN_Y(0): - cairo_move_to (cr, - - (extents.width + extents.x_bearing), - -extents.y_bearing); - break; - case ALIGN_X(2) | ALIGN_Y(1): - cairo_move_to (cr, - - (extents.width + extents.x_bearing), - - (extents.height/2. + extents.y_bearing)); - break; - case ALIGN_X(2) | ALIGN_Y(2): - cairo_move_to (cr, - - (extents.width + extents.x_bearing), - - (extents.height + extents.y_bearing)); - break; - } - cairo_show_text (cr, text); - } cairo_restore (cr); -} - -#define PAD 36 -static void -graph_view_draw (GraphView *self, - cairo_t *cr) -{ - cairo_matrix_t m; - const double dash[2] = {4, 4}; - double range; - int i; - - if (self->widget.allocation.width < 4 *PAD) - return; - if (self->widget.allocation.height < 3 *PAD) - return; - - range = floor (self->ymax+1) - ceil (self->ymin-1); - - cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height - PAD); - cairo_matrix_scale (&m, - (self->widget.allocation.width-2*PAD)/(self->num_reports), - -(self->widget.allocation.height-2*PAD)/range); - cairo_matrix_translate (&m, 0, floor (self->ymax+1)); - - if (self->selected_report != -1) { - cairo_save (cr); { - double x0, x1, y; - x0 = self->selected_report; y = 0; - cairo_matrix_transform_point (&m, &x0, &y); - x0 = floor (x0); - x1 = self->selected_report + 1; y = 0; - cairo_matrix_transform_point (&m, &x1, &y); - x1 = ceil (x1); - y = (x1 - x0) / 8; - y = MIN (y, PAD / 2); - x0 -= y; - x1 += y; - cairo_rectangle (cr, x0, PAD/2, x1-x0, self->widget.allocation.height-2*PAD + PAD); - gdk_cairo_set_source_color (cr, &self->widget.style->base[GTK_STATE_SELECTED]); - cairo_fill (cr); - } cairo_restore (cr); - } - - cairo_save (cr); { - cairo_pattern_t *linear; - double x, y; - - gdk_cairo_set_source_color (cr, - &self->widget.style->fg[GTK_WIDGET_STATE (self)]); - cairo_set_line_width (cr, 2.); - draw_hline (cr, &m, 0, 0, self->num_reports); - - cairo_set_line_width (cr, 1.); - cairo_set_dash (cr, NULL, 0, 0); - - for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) { - if (i != 0) - draw_hline (cr, &m, i, 0, self->num_reports); - } - - cairo_set_font_size (cr, 11); - - linear = cairo_pattern_create_linear (0, PAD, 0, self->widget.allocation.height-2*PAD); - cairo_pattern_add_color_stop_rgb (linear, 0, 0, 1, 0); - cairo_pattern_add_color_stop_rgb (linear, 1, 1, 0, 0); - cairo_set_source (cr, linear); - cairo_pattern_destroy (linear); - - for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) { - if (i != 0) - draw_label (cr, &m, i, 0, self->num_reports); - } - - x = 0, y = floor (self->ymax+1); - cairo_matrix_transform_point (&m, &x, &y); - draw_rotated_label (cr, "Faster", x - 7, y + 14, - 270./360 * 2 * G_PI, - ALIGN_X(2) | ALIGN_Y(1)); - x = self->num_reports, y = floor (self->ymax+1); - cairo_matrix_transform_point (&m, &x, &y); - draw_rotated_label (cr, "Faster", x + 11, y + 14, - 270./360 * 2 * G_PI, - ALIGN_X(2) | ALIGN_Y(1)); - - x = 0, y = ceil (self->ymin-1); - cairo_matrix_transform_point (&m, &x, &y); - draw_rotated_label (cr, "Slower", x - 7, y - 14, - 90./360 * 2 * G_PI, - ALIGN_X(2) | ALIGN_Y(1)); - x = self->num_reports, y = ceil (self->ymin-1); - cairo_matrix_transform_point (&m, &x, &y); - draw_rotated_label (cr, "Slower", x + 11, y - 14, - 90./360 * 2 * G_PI, - ALIGN_X(2) | ALIGN_Y(1)); - } cairo_restore (cr); - - draw_baseline_performance (self->cases, - self->reports, self->num_reports, - cr, &m); - - cairo_save (cr); { - cairo_set_source_rgb (cr, 0.7, 0.7, 0.7); - cairo_set_line_width (cr, 1.); - cairo_set_dash (cr, dash, 2, 0); - draw_hline (cr, &m, 0, 0, self->num_reports); - } cairo_restore (cr); -} - -static gboolean -graph_view_expose (GtkWidget *w, - GdkEventExpose *ev) -{ - GraphView *self = (GraphView *) w; - cairo_t *cr; - - cr = gdk_cairo_create (w->window); - gdk_cairo_set_source_color (cr, &w->style->base[GTK_WIDGET_STATE (w)]); - cairo_paint (cr); - - graph_view_draw (self, cr); - - cairo_destroy (cr); - - return FALSE; -} - -static gboolean -graph_view_button_press (GtkWidget *w, - GdkEventButton *ev) -{ - GraphView *self = (GraphView *) w; - cairo_matrix_t m; - double x,y; - int i; - - cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height-PAD); - cairo_matrix_scale (&m, (self->widget.allocation.width-2*PAD)/self->num_reports, -(self->widget.allocation.height-2*PAD)/(self->ymax - self->ymin)); - cairo_matrix_translate (&m, 0, -self->ymin); - cairo_matrix_invert (&m); - - x = ev->x; - y = ev->y; - cairo_matrix_transform_point (&m, &x, &y); - - i = floor (x); - if (i < 0 || i >= self->num_reports) - i = -1; - - if (i != self->selected_report) { - self->selected_report = i; - gtk_widget_queue_draw (w); - - g_signal_emit (w, signals[REPORT_SELECTED], 0, i); - } - - return FALSE; -} - -static gboolean -graph_view_button_release (GtkWidget *w, - GdkEventButton *ev) -{ - GraphView *self = (GraphView *) w; - - return FALSE; -} - -static void -graph_view_realize (GtkWidget *widget) -{ - GdkWindowAttr attributes; - - GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget) | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_EXPOSURE_MASK; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, - GDK_WA_X | GDK_WA_Y | - GDK_WA_VISUAL | GDK_WA_COLORMAP); - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); - gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); -} - -static void -graph_view_finalize (GObject *obj) -{ - G_OBJECT_CLASS (graph_view_parent_class)->finalize (obj); -} - -static void -graph_view_class_init (GraphViewClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; - - object_class->finalize = graph_view_finalize; - - widget_class->realize = graph_view_realize; - widget_class->expose_event = graph_view_expose; - widget_class->button_press_event = graph_view_button_press; - widget_class->button_release_event = graph_view_button_release; - - signals[REPORT_SELECTED] = - g_signal_new ("report-selected", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - 0,//G_STRUCT_OFFSET (GraphView, report_selected), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); -} - -static void -graph_view_init (GraphView *self) -{ - self->selected_report = -1; -} - -GtkWidget * -graph_view_new (void) -{ - return g_object_new (graph_view_get_type (), NULL); -} - -void -graph_view_update_visible (GraphView *gv) -{ - double min, max; - test_case_t *cases; - - cases = gv->cases; - - min = max = 1.; - while (cases->name != NULL) { - if (cases->shown) { - if (cases->min < min) - min = cases->min; - if (cases->max > max) - max = cases->max; - } - cases++; - } - gv->ymin = -1/min + 1; - gv->ymax = max - 1; - - gtk_widget_queue_draw (&gv->widget); -} - -void -graph_view_set_reports (GraphView *gv, - test_case_t *cases, - cairo_perf_report_t *reports, - int num_reports) -{ - /* XXX ownership? */ - gv->cases = cases; - gv->reports = reports; - gv->num_reports = num_reports; - - graph_view_update_visible (gv); -} diff --git a/perf/cairo-perf-graph.h b/perf/cairo-perf-graph.h deleted file mode 100644 index 4cb62165f..000000000 --- a/perf/cairo-perf-graph.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright © 2008 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#ifndef CAIRO_PERF_GRAPH_H -#define CAIRO_PERF_GRAPH_H - -#include <gtk/gtk.h> - -#include "cairo-perf.h" - -typedef struct _test_case { - const char *backend; - const char *content; - const char *name; - int size; - - test_report_t *min_test; - - cairo_bool_t shown; - double baseline; - double min, max; - GdkColor color; -} test_case_t; - -typedef struct _GraphView GraphView; - -GtkWidget * -graph_view_new (void); - -void -graph_view_set_reports (GraphView *gv, - test_case_t *tests, - cairo_perf_report_t *reports, - int num_reports); - -void -graph_view_update_visible (GraphView *gv); - -#endif diff --git a/perf/cairo-perf-micro.c b/perf/cairo-perf-micro.c deleted file mode 100644 index d6b52c446..000000000 --- a/perf/cairo-perf-micro.c +++ /dev/null @@ -1,594 +0,0 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* - * Copyright © 2006 Mozilla Corporation - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Vladimir Vukicevic <vladimir@pobox.com> - * Carl Worth <cworth@cworth.org> - */ - -#define _GNU_SOURCE 1 /* for sched_getaffinity() */ - -#include "../cairo-version.h" /* for the real version */ - -#include "cairo-perf.h" -#include "cairo-stats.h" - -#include "cairo-boilerplate-getopt.h" - -/* For basename */ -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - -#if HAVE_FCFINI -#include <fontconfig/fontconfig.h> -#endif - -#ifdef HAVE_SCHED_H -#include <sched.h> -#endif - -#define CAIRO_PERF_ITERATIONS_DEFAULT 100 -#define CAIRO_PERF_LOW_STD_DEV 0.03 -#define CAIRO_PERF_STABLE_STD_DEV_COUNT 5 -#define CAIRO_PERF_ITERATION_MS_DEFAULT 2000 -#define CAIRO_PERF_ITERATION_MS_FAST 5 - -typedef struct _cairo_perf_case { - CAIRO_PERF_RUN_DECL (*run); - cairo_bool_t (*enabled) (cairo_perf_t *perf); - unsigned int min_size; - unsigned int max_size; -} cairo_perf_case_t; - -const cairo_perf_case_t perf_cases[]; - -static const char * -_content_to_string (cairo_content_t content, - cairo_bool_t similar) -{ - switch (content|similar) { - case CAIRO_CONTENT_COLOR: - return "rgb"; - case CAIRO_CONTENT_COLOR|1: - return "rgb&"; - case CAIRO_CONTENT_ALPHA: - return "a"; - case CAIRO_CONTENT_ALPHA|1: - return "a&"; - case CAIRO_CONTENT_COLOR_ALPHA: - return "rgba"; - case CAIRO_CONTENT_COLOR_ALPHA|1: - return "rgba&"; - default: - return "<unknown_content>"; - } -} - -static cairo_bool_t -cairo_perf_has_similar (cairo_perf_t *perf) -{ - cairo_surface_t *target; - - if (getenv ("CAIRO_TEST_SIMILAR") == NULL) - return FALSE; - - /* exclude the image backend */ - target = cairo_get_target (perf->cr); - if (cairo_surface_get_type (target) == CAIRO_SURFACE_TYPE_IMAGE) - return FALSE; - - return TRUE; -} - -cairo_bool_t -cairo_perf_can_run (cairo_perf_t *perf, - const char *name, - cairo_bool_t *is_explicit) -{ - unsigned int i; - - if (is_explicit) - *is_explicit = FALSE; - - if (perf->num_names == 0) - return TRUE; - - for (i = 0; i < perf->num_names; i++) { - if (strstr (name, perf->names[i])) { - if (is_explicit) - *is_explicit = FALSE; - return TRUE; - } - } - - return FALSE; -} - -static unsigned -cairo_perf_calibrate (cairo_perf_t *perf, - cairo_perf_func_t perf_func) -{ - cairo_time_t calibration, calibration_max; - unsigned loops, min_loops; - - min_loops = 1; - calibration = perf_func (perf->cr, perf->size, perf->size, min_loops); - - if (!perf->fast_and_sloppy) { - calibration_max = _cairo_time_from_s (perf->ms_per_iteration * 0.0001 / 4); - while (calibration < calibration_max) { - min_loops *= 2; - calibration = perf_func (perf->cr, perf->size, perf->size, min_loops); - } - } - - /* XXX - * Compute the number of loops required for the timing - * interval to be perf->ms_per_iteration milliseconds. This - * helps to eliminate sampling variance due to timing and - * other systematic errors. However, it also hides - * synchronisation overhead as we attempt to process a large - * batch of identical operations in a single shot. This can be - * considered both good and bad... It would be good to perform - * a more rigorous analysis of the synchronisation overhead, - * that is to estimate the time for loop=0. - */ - loops = _cairo_time_from_s (perf->ms_per_iteration * 0.001 * min_loops / calibration); - min_loops = perf->fast_and_sloppy ? 1 : 10; - if (loops < min_loops) - loops = min_loops; - - return loops; -} - -void -cairo_perf_run (cairo_perf_t *perf, - const char *name, - cairo_perf_func_t perf_func, - cairo_count_func_t count_func) -{ - static cairo_bool_t first_run = TRUE; - unsigned int i, similar, similar_iters; - cairo_time_t *times; - cairo_stats_t stats = {0.0, 0.0}; - int low_std_dev_count; - - if (perf->list_only) { - printf ("%s\n", name); - return; - } - - if (first_run) { - if (perf->raw) { - printf ("[ # ] %s.%-s %s %s %s ...\n", - "backend", "content", "test-size", "ticks-per-ms", "time(ticks)"); - } - - if (perf->summary) { - fprintf (perf->summary, - "[ # ] %8s.%-4s %28s %8s %8s %5s %5s %s %s\n", - "backend", "content", "test-size", "min(ticks)", "min(ms)", "median(ms)", - "stddev.", "iterations", "overhead"); - } - first_run = FALSE; - } - - times = perf->times; - - if (getenv ("CAIRO_PERF_OUTPUT") != NULL) { /* check output */ - char *filename; - cairo_status_t status; - - xasprintf (&filename, "%s.%s.%s.%d.out.png", - name, perf->target->name, - _content_to_string (perf->target->content, 0), - perf->size); - cairo_save (perf->cr); - perf_func (perf->cr, perf->size, perf->size, 1); - cairo_restore (perf->cr); - status = cairo_surface_write_to_png (cairo_get_target (perf->cr), filename); - if (status) { - fprintf (stderr, "Failed to generate output check '%s': %s\n", - filename, cairo_status_to_string (status)); - return; - } - - free (filename); - } - - if (cairo_perf_has_similar (perf)) - similar_iters = 2; - else - similar_iters = 1; - - for (similar = 0; similar < similar_iters; similar++) { - unsigned loops; - - if (perf->summary) { - fprintf (perf->summary, - "[%3d] %8s.%-5s %26s.%-3d ", - perf->test_number, perf->target->name, - _content_to_string (perf->target->content, similar), - name, perf->size); - fflush (perf->summary); - } - - /* We run one iteration in advance to warm caches and calibrate. */ - cairo_perf_yield (); - if (similar) - cairo_push_group_with_content (perf->cr, - cairo_boilerplate_content (perf->target->content)); - else - cairo_save (perf->cr); - perf_func (perf->cr, perf->size, perf->size, 1); - loops = cairo_perf_calibrate (perf, perf_func); - if (similar) - cairo_pattern_destroy (cairo_pop_group (perf->cr)); - else - cairo_restore (perf->cr); - - low_std_dev_count = 0; - for (i =0; i < perf->iterations; i++) { - cairo_perf_yield (); - if (similar) - cairo_push_group_with_content (perf->cr, - cairo_boilerplate_content (perf->target->content)); - else - cairo_save (perf->cr); - times[i] = perf_func (perf->cr, perf->size, perf->size, loops) ; - if (similar) - cairo_pattern_destroy (cairo_pop_group (perf->cr)); - else - cairo_restore (perf->cr); - if (perf->raw) { - if (i == 0) - printf ("[*] %s.%s %s.%d %g", - perf->target->name, - _content_to_string (perf->target->content, similar), - name, perf->size, - _cairo_time_to_double (_cairo_time_from_s (1.)) / 1000.); - printf (" %lld", (long long) (times[i] / (double) loops)); - } else if (! perf->exact_iterations) { - if (i > 0) { - _cairo_stats_compute (&stats, times, i+1); - - if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) { - low_std_dev_count++; - if (low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT) - break; - } else { - low_std_dev_count = 0; - } - } - } - } - - if (perf->raw) - printf ("\n"); - - if (perf->summary) { - _cairo_stats_compute (&stats, times, i); - if (count_func != NULL) { - double count = count_func (perf->cr, perf->size, perf->size); - fprintf (perf->summary, - "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d: %.2f\n", - stats.min_ticks /(double) loops, - (long long) stats.min_ticks, loops, - _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops, - _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops, - stats.std_dev * 100.0, stats.iterations, - count / _cairo_time_to_s (stats.min_ticks)); - } else { - fprintf (perf->summary, - "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d\n", - stats.min_ticks /(double) loops, - (long long) stats.min_ticks, loops, - _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops, - _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops, - stats.std_dev * 100.0, stats.iterations); - } - fflush (perf->summary); - } - - perf->test_number++; - } -} - -static void -usage (const char *argv0) -{ - fprintf (stderr, -"Usage: %s [-flrv] [-i iterations] [test-names ...]\n" -"\n" -"Run the cairo performance test suite over the given tests (all by default)\n" -"The command-line arguments are interpreted as follows:\n" -"\n" -" -f fast; faster, less accurate\n" -" -i iterations; specify the number of iterations per test case\n" -" -l list only; just list selected test case names without executing\n" -" -r raw; display each time measurement instead of summary statistics\n" -" -v verbose; in raw mode also show the summaries\n" -"\n" -"If test names are given they are used as sub-string matches so a command\n" -"such as \"%s text\" can be used to run all text test cases.\n", - argv0, argv0); -} - -static void -parse_options (cairo_perf_t *perf, - int argc, - char *argv[]) -{ - int c; - const char *iters; - const char *ms = NULL; - char *end; - int verbose = 0; - - if ((iters = getenv("CAIRO_PERF_ITERATIONS")) && *iters) - perf->iterations = strtol(iters, NULL, 0); - else - perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT; - perf->exact_iterations = 0; - - perf->fast_and_sloppy = FALSE; - perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_DEFAULT; - if ((ms = getenv("CAIRO_PERF_ITERATION_MS")) && *ms) { - perf->ms_per_iteration = atof(ms); - } - - perf->raw = FALSE; - perf->list_only = FALSE; - perf->names = NULL; - perf->num_names = 0; - perf->summary = stdout; - - while (1) { - c = _cairo_getopt (argc, argv, "fi:lrv"); - if (c == -1) - break; - - switch (c) { - case 'f': - perf->fast_and_sloppy = TRUE; - if (ms == NULL) - perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_FAST; - break; - case 'i': - perf->exact_iterations = TRUE; - perf->iterations = strtoul (optarg, &end, 10); - if (*end != '\0') { - fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", - optarg); - exit (1); - } - break; - case 'l': - perf->list_only = TRUE; - break; - case 'r': - perf->raw = TRUE; - perf->summary = NULL; - break; - case 'v': - verbose = 1; - break; - default: - fprintf (stderr, "Internal error: unhandled option: %c\n", c); - /* fall-through */ - case '?': - usage (argv[0]); - exit (1); - } - } - - if (verbose && perf->summary == NULL) - perf->summary = stderr; - - if (optind < argc) { - perf->names = &argv[optind]; - perf->num_names = argc - optind; - } -} - -static int -check_cpu_affinity (void) -{ -#ifdef HAVE_SCHED_GETAFFINITY - - cpu_set_t affinity; - int i, cpu_count; - - if (sched_getaffinity(0, sizeof(affinity), &affinity)) { - perror("sched_getaffinity"); - return -1; - } - - for(i = 0, cpu_count = 0; i < CPU_SETSIZE; ++i) { - if (CPU_ISSET(i, &affinity)) - ++cpu_count; - } - - if (cpu_count > 1) { - fputs( - "WARNING: cairo-perf has not been bound to a single CPU.\n", - stderr); - return -1; - } - - return 0; -#else - fputs( - "WARNING: Cannot check CPU affinity for this platform.\n", - stderr); - return -1; -#endif -} - -static void -cairo_perf_fini (cairo_perf_t *perf) -{ - cairo_boilerplate_free_targets (perf->targets); - cairo_boilerplate_fini (); - - free (perf->times); - cairo_debug_reset_static_data (); -#if HAVE_FCFINI - FcFini (); -#endif -} - - -int -main (int argc, - char *argv[]) -{ - int i, j; - cairo_perf_t perf; - cairo_surface_t *surface; - - parse_options (&perf, argc, argv); - - if (check_cpu_affinity()) { - fputs( - "NOTICE: cairo-perf and the X server should be bound to CPUs (either the same\n" - "or separate) on SMP systems. Not doing so causes random results when the X\n" - "server is moved to or from cairo-perf's CPU during the benchmarks:\n" - "\n" - " $ sudo taskset -cp 0 $(pidof X)\n" - " $ taskset -cp 1 $$\n" - "\n" - "See taskset(1) for information about changing CPU affinity.\n", - stderr); - } - - perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); - perf.times = xmalloc (perf.iterations * sizeof (cairo_time_t)); - - for (i = 0; i < perf.num_targets; i++) { - const cairo_boilerplate_target_t *target = perf.targets[i]; - - if (! target->is_measurable) - continue; - - perf.target = target; - perf.test_number = 0; - - for (j = 0; perf_cases[j].run; j++) { - const cairo_perf_case_t *perf_case = &perf_cases[j]; - - if (! perf_case->enabled (&perf)) - continue; - - for (perf.size = perf_case->min_size; - perf.size <= perf_case->max_size; - perf.size *= 2) - { - void *closure; - - surface = (target->create_surface) (NULL, - target->content, - perf.size, perf.size, - perf.size, perf.size, - CAIRO_BOILERPLATE_MODE_PERF, - &closure); - if (surface == NULL) { - fprintf (stderr, - "Error: Failed to create target surface: %s\n", - target->name); - continue; - } - - cairo_perf_timer_set_synchronize (target->synchronize, closure); - - perf.cr = cairo_create (surface); - - perf_case->run (&perf, perf.cr, perf.size, perf.size); - - if (cairo_status (perf.cr)) { - fprintf (stderr, "Error: Test left cairo in an error state: %s\n", - cairo_status_to_string (cairo_status (perf.cr))); - } - - cairo_destroy (perf.cr); - cairo_surface_destroy (surface); - - if (target->cleanup) - target->cleanup (closure); - } - } - } - - cairo_perf_fini (&perf); - - return 0; -} - -#define FUNC(f) f, f##_enabled -const cairo_perf_case_t perf_cases[] = { - { FUNC(pixel), 1, 1 }, - { FUNC(a1_pixel), 1, 1 }, - { FUNC(paint), 64, 512}, - { FUNC(paint_with_alpha), 64, 512}, - { FUNC(fill), 64, 512}, - { FUNC(stroke), 64, 512}, - { FUNC(text), 64, 512}, - { FUNC(glyphs), 64, 512}, - { FUNC(mask), 64, 512}, - { FUNC(line), 32, 512}, - { FUNC(a1_line), 32, 512}, - { FUNC(curve), 32, 512}, - { FUNC(a1_curve), 32, 512}, - { FUNC(disjoint), 64, 512}, - { FUNC(hatching), 64, 512}, - { FUNC(tessellate), 100, 100}, - { FUNC(subimage_copy), 16, 512}, - { FUNC(hash_table), 16, 16}, - { FUNC(pattern_create_radial), 16, 16}, - { FUNC(zrusin), 415, 415}, - { FUNC(world_map), 800, 800}, - { FUNC(box_outline), 100, 100}, - { FUNC(mosaic), 800, 800 }, - { FUNC(long_lines), 100, 100}, - { FUNC(unaligned_clip), 100, 100}, - { FUNC(rectangles), 512, 512}, - { FUNC(rounded_rectangles), 512, 512}, - { FUNC(long_dashed_lines), 512, 512}, - { FUNC(composite_checker), 16, 512}, - { FUNC(twin), 800, 800}, - { FUNC(dragon), 1024, 1024 }, - { FUNC(sierpinski), 32, 1024 }, - { FUNC(pythagoras_tree), 768, 768 }, - { FUNC(intersections), 512, 512 }, - { FUNC(many_strokes), 32, 512 }, - { FUNC(wide_strokes), 32, 512 }, - { FUNC(many_fills), 32, 512 }, - { FUNC(wide_fills), 32, 512 }, - { FUNC(many_curves), 32, 512 }, - { FUNC(spiral), 512, 512 }, - { FUNC(wave), 500, 500 }, - { FUNC(fill_clip), 16, 512 }, - { FUNC(tiger), 16, 1024 }, - { NULL } -}; diff --git a/perf/cairo-perf-print.c b/perf/cairo-perf-print.c deleted file mode 100644 index d7ae1311e..000000000 --- a/perf/cairo-perf-print.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include "cairo-perf.h" -#include "cairo-stats.h" - -#include <stdio.h> - -#if HAVE_UNISTD_H && HAVE_SYS_IOCTL_H -#define USE_TERMINAL_SIZE 1 -#else -#define USE_TERMINAL_SIZE 0 -#endif - -#if USE_TERMINAL_SIZE -#include <unistd.h> -#include <sys/ioctl.h> -#endif - -static void -report_print (const cairo_perf_report_t *report, - int show_histogram) -{ - const test_report_t *test; - cairo_histogram_t h; - - if (show_histogram) { - int num_rows = 23; - int num_cols = 80; - -#if USE_TERMINAL_SIZE - int fd = fileno(stdout); - if (isatty(fd)) { - struct winsize ws; - - if(ioctl(fd, TIOCGWINSZ, &ws) == 0 ) { - num_rows = ws.ws_row - 1; - num_cols = ws.ws_col; - } - } -#endif - - if (!_cairo_histogram_init (&h, num_cols, num_rows)) - show_histogram = 0; - } - - for (test = report->tests; test->name != NULL; test++) { - if (test->stats.iterations == 0) - continue; - - if (show_histogram) { - const cairo_time_t *values; - int num_values; - - if (show_histogram > 1) { - values = test->stats.values; - num_values = test->stats.iterations; - } else { - values = test->samples; - num_values = test->samples_count; - } - - if (_cairo_histogram_compute (&h, values, num_values)) - _cairo_histogram_printf (&h, stdout); - } - - if (test->size) { - printf ("%5s-%-4s %26s-%-3d ", - test->backend, test->content, - test->name, test->size); - } else { - printf ("%5s %26s ", test->backend, test->name); - } - printf("%6.2f %4.2f%% (%d/%d)\n", - test->stats.median_ticks / test->stats.ticks_per_ms, - test->stats.std_dev * 100, - test->stats.iterations, test->samples_count); - } - - if (show_histogram) - _cairo_histogram_fini (&h); -} - -int -main (int argc, - const char *argv[]) -{ - cairo_bool_t show_histogram = 0; - int i; - - for (i = 1; i < argc; i++ ) { - cairo_perf_report_t report; - - if (strcmp(argv[i], "--histogram") == 0) { - show_histogram = 1; - continue; - } - - if (strcmp(argv[i], "--short-histogram") == 0) { - show_histogram = 2; - continue; - } - - cairo_perf_report_load (&report, argv[i], i, NULL); - report_print (&report, show_histogram); - } - - return 0; -} diff --git a/perf/cairo-perf-report.c b/perf/cairo-perf-report.c deleted file mode 100644 index 2325f4793..000000000 --- a/perf/cairo-perf-report.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * copyright holders not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - */ - -#define _GETDELIM 1/* for getline() on AIX */ - -#include "cairo-perf.h" -#include "cairo-missing.h" -#include "cairo-stats.h" - -/* We use _GNU_SOURCE for getline and strndup if available. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> -#include <math.h> -#include <assert.h> -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - -#ifdef _MSC_VER -static long long -strtoll (const char *nptr, - char **endptr, - int base); - -static char * -basename (char *path); -#endif - -/* Ad-hoc parsing, macros with a strong dependence on the calling - * context, and plenty of other ugliness is here. But at least it's - * not perl... */ -#define parse_error(...) fprintf(stderr, __VA_ARGS__); return TEST_REPORT_STATUS_ERROR; -#define skip_char(c) \ -do { \ - if (*s && *s == (c)) { \ - s++; \ - } else { \ - parse_error ("expected '%c' but found '%c'", c, *s); \ - } \ -} while (0) -#define skip_space() while (*s && (*s == ' ' || *s == '\t')) s++; -#define parse_int(result) \ -do { \ - (result) = strtol (s, &end, 10); \ - if (*s && end != s) { \ - s = end; \ - } else { \ - parse_error("expected integer but found %s", s); \ - } \ -} while (0) -#define parse_long_long(result) \ -do { \ - (result) = strtoll (s, &end, 10); \ - if (*s && end != s) { \ - s = end; \ - } else { \ - parse_error("expected integer but found %s", s); \ - } \ -} while (0) -#define parse_double(result) \ -do { \ - (result) = strtod (s, &end); \ - if (*s && end != s) { \ - s = end; \ - } else { \ - parse_error("expected floating-point value but found %s", s); \ - } \ -} while (0) -/* Here a string is simply a sequence of non-whitespace */ -#define parse_string(result) \ -do { \ - for (end = s; *end; end++) \ - if (isspace (*end)) \ - break; \ - (result) = strndup (s, end - s); \ - if ((result) == NULL) { \ - fprintf (stderr, "Out of memory.\n"); \ - exit (1); \ - } \ - s = end; \ -} while (0) - -static test_report_status_t -test_report_parse (test_report_t *report, - int fileno, - char *line, - char *configuration) -{ - char *end; - char *s = line; - cairo_bool_t is_raw = FALSE; - double min_time, median_time; - - /* The code here looks funny unless you understand that these are - * all macro calls, (and then the code just looks sick). */ - if (*s == '\n') - return TEST_REPORT_STATUS_COMMENT; - - skip_char ('['); - skip_space (); - if (*s == '#') - return TEST_REPORT_STATUS_COMMENT; - if (*s == '*') { - s++; - is_raw = TRUE; - } else { - parse_int (report->id); - } - skip_char (']'); - - skip_space (); - - report->fileno = fileno; - report->configuration = configuration; - parse_string (report->backend); - end = strrchr (report->backend, '.'); - if (end) - *end++ = '\0'; - report->content = end ? end : xstrdup ("???"); - - skip_space (); - - parse_string (report->name); - end = strrchr (report->name, '.'); - if (end) - *end++ = '\0'; - report->size = end ? atoi (end) : 0; - - skip_space (); - - report->samples = NULL; - report->samples_size = 0; - report->samples_count = 0; - - if (is_raw) { - parse_double (report->stats.ticks_per_ms); - skip_space (); - - report->samples_size = 5; - report->samples = xmalloc (report->samples_size * sizeof (cairo_time_t)); - report->stats.min_ticks = 0; - do { - if (report->samples_count == report->samples_size) { - report->samples_size *= 2; - report->samples = xrealloc (report->samples, - report->samples_size * sizeof (cairo_time_t)); - } - parse_long_long (report->samples[report->samples_count]); - if (report->samples_count == 0) { - report->stats.min_ticks = - report->samples[report->samples_count]; - } else if (report->stats.min_ticks > - report->samples[report->samples_count]){ - report->stats.min_ticks = - report->samples[report->samples_count]; - } - report->samples_count++; - skip_space (); - } while (*s && *s != '\n'); - report->stats.iterations = 0; - if (*s) skip_char ('\n'); - } else { - parse_double (report->stats.min_ticks); - skip_space (); - - parse_double (min_time); - report->stats.ticks_per_ms = report->stats.min_ticks / min_time; - - skip_space (); - - parse_double (median_time); - report->stats.median_ticks = median_time * report->stats.ticks_per_ms; - - skip_space (); - - parse_double (report->stats.std_dev); - report->stats.std_dev /= 100.0; - skip_char ('%'); - - skip_space (); - - parse_int (report->stats.iterations); - - skip_space (); - skip_char ('\n'); - } - - return TEST_REPORT_STATUS_SUCCESS; -} - -/* We provide hereafter a win32 implementation of the basename - * and strtoll functions which are not available otherwise. - * The basename function is fully compliant to its GNU specs. - */ -#ifdef _MSC_VER -long long -strtoll (const char *nptr, - char **endptr, - int base) -{ - return _atoi64(nptr); -} - -static char * -basename (char *path) -{ - char *end, *s; - - end = (path + strlen(path) - 1); - while (end && (end >= path + 1) && (*end == '/')) { - *end = '\0'; - end--; - } - - s = strrchr(path, '/'); - if (s) { - if (s == end) { - return s; - } else { - return s+1; - } - } else { - return path; - } -} -#endif /* ifndef _MSC_VER */ - -int -test_report_cmp_backend_then_name (const void *a, - const void *b) -{ - const test_report_t *a_test = a; - const test_report_t *b_test = b; - - int cmp; - - cmp = strcmp (a_test->backend, b_test->backend); - if (cmp) - return cmp; - - cmp = strcmp (a_test->content, b_test->content); - if (cmp) - return cmp; - - /* A NULL name is a list-termination marker, so force it last. */ - if (a_test->name == NULL) - if (b_test->name == NULL) - return 0; - else - return 1; - else if (b_test->name == NULL) - return -1; - - cmp = strcmp (a_test->name, b_test->name); - if (cmp) - return cmp; - - if (a_test->size < b_test->size) - return -1; - if (a_test->size > b_test->size) - return 1; - - return 0; -} - -int -test_report_cmp_name (const void *a, - const void *b) -{ - const test_report_t *a_test = a; - const test_report_t *b_test = b; - - int cmp; - - /* A NULL name is a list-termination marker, so force it last. */ - if (a_test->name == NULL) - if (b_test->name == NULL) - return 0; - else - return 1; - else if (b_test->name == NULL) - return -1; - - cmp = strcmp (a_test->name, b_test->name); - if (cmp) - return cmp; - - if (a_test->size < b_test->size) - return -1; - if (a_test->size > b_test->size) - return 1; - - return 0; -} - -void -cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report, - int (*cmp) (const void*, const void*)) -{ - test_report_t *base, *next, *last, *t; - - if (cmp == NULL) - cmp = test_report_cmp_backend_then_name; - - /* First we sort, since the diff needs both lists in the same - * order */ - qsort (report->tests, report->tests_count, sizeof (test_report_t), cmp); - - /* The sorting also brings all related raw reports together so we - * can condense them and compute the stats. - */ - base = &report->tests[0]; - last = &report->tests[report->tests_count - 1]; - while (base <= last) { - next = base+1; - if (next <= last) { - while (next <= last && - test_report_cmp_backend_then_name (base, next) == 0) - { - next++; - } - if (next != base) { - unsigned int new_samples_count = base->samples_count; - for (t = base + 1; t < next; t++) - new_samples_count += t->samples_count; - if (new_samples_count > base->samples_size) { - base->samples_size = new_samples_count; - base->samples = xrealloc (base->samples, - base->samples_size * sizeof (cairo_time_t)); - } - for (t = base + 1; t < next; t++) { - memcpy (&base->samples[base->samples_count], t->samples, - t->samples_count * sizeof (cairo_time_t)); - base->samples_count += t->samples_count; - } - } - } - if (base->samples) - _cairo_stats_compute (&base->stats, base->samples, base->samples_count); - base = next; - } -} - -void -cairo_perf_report_load (cairo_perf_report_t *report, - const char *filename, int id, - int (*cmp) (const void *, const void *)) -{ - FILE *file; - test_report_status_t status; - int line_number = 0; - char *line = NULL; - size_t line_size = 0; - char *configuration; - char *dot; - char *baseName; - const char *name; - - name = filename; - if (name == NULL) - name = "stdin"; - - configuration = xstrdup (name); - baseName = basename (configuration); - report->configuration = xstrdup (baseName); - free (configuration); - - dot = strrchr (report->configuration, '.'); - if (dot) - *dot = '\0'; - - report->name = name; - report->tests_size = 16; - report->tests = xmalloc (report->tests_size * sizeof (test_report_t)); - report->tests_count = 0; - report->fileno = id; - - if (filename == NULL) { - file = stdin; - } else { - file = fopen (filename, "r"); - if (file == NULL) { - fprintf (stderr, "Failed to open %s: %s\n", - filename, strerror (errno)); - exit (1); - } - } - - while (1) { - if (report->tests_count == report->tests_size) { - report->tests_size *= 2; - report->tests = xrealloc (report->tests, - report->tests_size * sizeof (test_report_t)); - } - - line_number++; - if (getline (&line, &line_size, file) == -1) - break; - - status = test_report_parse (&report->tests[report->tests_count], - id, line, report->configuration); - if (status == TEST_REPORT_STATUS_ERROR) - fprintf (stderr, "Ignoring unrecognized line %d of %s:\n%s", - line_number, filename, line); - if (status == TEST_REPORT_STATUS_SUCCESS) - report->tests_count++; - /* Do nothing on TEST_REPORT_STATUS_COMMENT */ - } - - free (line); - - if (filename != NULL) - fclose (file); - - cairo_perf_report_sort_and_compute_stats (report, cmp); - - /* Add one final report with a NULL name to terminate the list. */ - if (report->tests_count == report->tests_size) { - report->tests_size *= 2; - report->tests = xrealloc (report->tests, - report->tests_size * sizeof (test_report_t)); - } - report->tests[report->tests_count].name = NULL; -} diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c deleted file mode 100644 index 02e0e29f9..000000000 --- a/perf/cairo-perf-trace.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* - * Copyright © 2006 Mozilla Corporation - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Vladimir Vukicevic <vladimir@pobox.com> - * Carl Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */ - -#include "../cairo-version.h" /* for the real version */ - -#include "cairo-missing.h" -#include "cairo-perf.h" -#include "cairo-stats.h" - -#include "cairo-boilerplate-getopt.h" -#include <cairo-script-interpreter.h> -#include <cairo-types-private.h> /* for INTERNAL_SURFACE_TYPE */ - -/* rudely reuse bits of the library... */ -#include "../src/cairo-hash-private.h" -#include "../src/cairo-error-private.h" - -/* For basename */ -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif -#include <ctype.h> /* isspace() */ - -#include <sys/types.h> -#include <sys/stat.h> - -#ifdef _MSC_VER -#include "dirent-win32.h" - -static char * -basename_no_ext (char *path) -{ - static char name[_MAX_FNAME + 1]; - - _splitpath (path, NULL, NULL, name, NULL); - - name[_MAX_FNAME] = '\0'; - - return name; -} - - -#else -#include <dirent.h> - -static char * -basename_no_ext (char *path) -{ - char *dot, *name; - - name = basename (path); - - dot = strrchr (name, '.'); - if (dot) - *dot = '\0'; - - return name; -} - -#endif - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <signal.h> - -#if HAVE_FCFINI -#include <fontconfig/fontconfig.h> -#endif - -#define CAIRO_PERF_ITERATIONS_DEFAULT 15 -#define CAIRO_PERF_LOW_STD_DEV 0.05 -#define CAIRO_PERF_MIN_STD_DEV_COUNT 3 -#define CAIRO_PERF_STABLE_STD_DEV_COUNT 3 - -struct trace { - const cairo_boilerplate_target_t *target; - void *closure; - cairo_surface_t *surface; - cairo_bool_t observe; - int tile_size; -}; - -cairo_bool_t -cairo_perf_can_run (cairo_perf_t *perf, - const char *name, - cairo_bool_t *is_explicit) -{ - unsigned int i; - char *copy, *dot; - cairo_bool_t ret; - - if (is_explicit) - *is_explicit = FALSE; - - if (perf->exact_names) { - if (is_explicit) - *is_explicit = TRUE; - return TRUE; - } - - if (perf->num_names == 0 && perf->num_exclude_names == 0) - return TRUE; - - copy = xstrdup (name); - dot = strrchr (copy, '.'); - if (dot != NULL) - *dot = '\0'; - - if (perf->num_names) { - ret = TRUE; - for (i = 0; i < perf->num_names; i++) - if (strstr (copy, perf->names[i])) { - if (is_explicit) - *is_explicit = strcmp (copy, perf->names[i]) == 0; - goto check_exclude; - } - - ret = FALSE; - goto done; - } - -check_exclude: - if (perf->num_exclude_names) { - ret = FALSE; - for (i = 0; i < perf->num_exclude_names; i++) - if (strstr (copy, perf->exclude_names[i])) { - if (is_explicit) - *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0; - goto done; - } - - ret = TRUE; - goto done; - } - -done: - free (copy); - - return ret; -} - -static void -fill_surface (cairo_surface_t *surface) -{ - cairo_t *cr = cairo_create (surface); - /* This needs to be an operation that the backends can't optimise away */ - cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5); - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_paint (cr); - cairo_destroy (cr); -} - -struct scache { - cairo_hash_entry_t entry; - cairo_content_t content; - int width, height; - cairo_surface_t *surface; -}; - -static cairo_hash_table_t *surface_cache; -static cairo_surface_t *surface_holdovers[16]; - -static cairo_bool_t -scache_equal (const void *A, - const void *B) -{ - const struct scache *a = A, *b = B; - return a->entry.hash == b->entry.hash; -} - -static void -scache_mark_active (cairo_surface_t *surface) -{ - cairo_surface_t *t0, *t1; - unsigned n; - - if (surface_cache == NULL) - return; - - t0 = cairo_surface_reference (surface); - for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) { - if (surface_holdovers[n] == surface) { - surface_holdovers[n] = t0; - t0 = surface; - break; - } - - t1 = surface_holdovers[n]; - surface_holdovers[n] = t0; - t0 = t1; - } - cairo_surface_destroy (t0); -} - -static void -scache_clear (void) -{ - unsigned n; - - if (surface_cache == NULL) - return; - - for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) { - cairo_surface_destroy (surface_holdovers[n]); - surface_holdovers[n] = NULL; - } -} - -static void -scache_remove (void *closure) -{ - _cairo_hash_table_remove (surface_cache, closure); - free (closure); -} - -static cairo_surface_t * -_similar_surface_create (void *closure, - cairo_content_t content, - double width, - double height, - long uid) -{ - struct trace *args = closure; - cairo_surface_t *surface; - struct scache skey, *s; - - if (args->observe) - return cairo_surface_create_similar (args->surface, - content, width, height); - - if (uid == 0 || surface_cache == NULL) - return args->target->create_similar (args->surface, content, width, height); - - skey.entry.hash = uid; - s = _cairo_hash_table_lookup (surface_cache, &skey.entry); - if (s != NULL) { - if (s->content == content && - s->width == width && - s->height == height) - { - return cairo_surface_reference (s->surface); - } - - /* The surface has been resized, allow the original entry to expire - * as it becomes inactive. - */ - } - - surface = args->target->create_similar (args->surface, content, width, height); - s = malloc (sizeof (struct scache)); - if (s == NULL) - return surface; - - s->entry.hash = uid; - s->content = content; - s->width = width; - s->height = height; - s->surface = surface; - if (_cairo_hash_table_insert (surface_cache, &s->entry)) { - free (s); - } else if (cairo_surface_set_user_data - (surface, - (const cairo_user_data_key_t *) &surface_cache, - s, scache_remove)) - { - scache_remove (s); - } - - return surface; -} - -static cairo_surface_t * -_source_image_create (void *closure, - cairo_format_t format, - int width, - int height, - long uid) -{ - struct trace *args = closure; - - return cairo_surface_create_similar_image (args->surface, - format, width, height); -} - -static cairo_t * -_context_create (void *closure, - cairo_surface_t *surface) -{ - scache_mark_active (surface); - return cairo_create (surface); -} - -static int user_interrupt; - -static void -interrupt (int sig) -{ - if (user_interrupt) { - signal (sig, SIG_DFL); - raise (sig); - } - - user_interrupt = 1; -} - -static void -describe (cairo_perf_t *perf, - void *closure) -{ - char *description = NULL; - - if (perf->has_described_backend) - return; - perf->has_described_backend = TRUE; - - if (perf->target->describe) - description = perf->target->describe (closure); - - if (description == NULL) - return; - - if (perf->raw) { - printf ("[ # ] %s: %s\n", perf->target->name, description); - } - - if (perf->summary) { - fprintf (perf->summary, - "[ # ] %8s: %s\n", - perf->target->name, - description); - } - - free (description); -} - -static void -usage (const char *argv0) -{ - fprintf (stderr, -"Usage: %s [-clrsv] [-i iterations] [-t tile-size] [-x exclude-file] [test-names ... | traces ...]\n" -"\n" -"Run the cairo performance test suite over the given tests (all by default)\n" -"The command-line arguments are interpreted as follows:\n" -"\n" -" -c use surface cache; keep a cache of surfaces to be reused\n" -" -i iterations; specify the number of iterations per test case\n" -" -l list only; just list selected test case names without executing\n" -" -r raw; display each time measurement instead of summary statistics\n" -" -s sync; only sum the elapsed time of the indiviual operations\n" -" -t tile size; draw to tiled surfaces\n" -" -v verbose; in raw mode also show the summaries\n" -" -x exclude; specify a file to read a list of traces to exclude\n" -"\n" -"If test names are given they are used as sub-string matches so a command\n" -"such as \"%s firefox\" can be used to run all firefox traces.\n" -"Alternatively, you can specify a list of filenames to execute.\n", - argv0, argv0); -} - -static cairo_bool_t -read_excludes (cairo_perf_t *perf, - const char *filename) -{ - FILE *file; - char *line = NULL; - size_t line_size = 0; - char *s, *t; - - file = fopen (filename, "r"); - if (file == NULL) - return FALSE; - - while (getline (&line, &line_size, file) != -1) { - /* terminate the line at a comment marker '#' */ - s = strchr (line, '#'); - if (s) - *s = '\0'; - - /* whitespace delimits */ - s = line; - while (*s != '\0' && isspace (*s)) - s++; - - t = s; - while (*t != '\0' && ! isspace (*t)) - t++; - - if (s != t) { - int i = perf->num_exclude_names; - perf->exclude_names = xrealloc (perf->exclude_names, - sizeof (char *) * (i+1)); - perf->exclude_names[i] = strndup (s, t-s); - perf->num_exclude_names++; - } - } - free (line); - - fclose (file); - - return TRUE; -} - -static void -parse_options (cairo_perf_t *perf, - int argc, - char *argv[]) -{ - int c; - const char *iters; - char *end; - int verbose = 0; - int use_surface_cache = 0; - - if ((iters = getenv ("CAIRO_PERF_ITERATIONS")) && *iters) - perf->iterations = strtol (iters, NULL, 0); - else - perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT; - perf->exact_iterations = 0; - - perf->raw = FALSE; - perf->observe = FALSE; - perf->list_only = FALSE; - perf->tile_size = 0; - perf->names = NULL; - perf->num_names = 0; - perf->summary = stdout; - perf->summary_continuous = FALSE; - perf->exclude_names = NULL; - perf->num_exclude_names = 0; - - while (1) { - c = _cairo_getopt (argc, argv, "ci:lrst:vx:"); - if (c == -1) - break; - - switch (c) { - case 'c': - use_surface_cache = 1; - break; - case 'i': - perf->exact_iterations = TRUE; - perf->iterations = strtoul (optarg, &end, 10); - if (*end != '\0') { - fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", - optarg); - exit (1); - } - break; - case 'l': - perf->list_only = TRUE; - break; - case 'r': - perf->raw = TRUE; - perf->summary = NULL; - break; - case 's': - perf->observe = TRUE; - break; - case 't': - perf->tile_size = strtoul (optarg, &end, 10); - if (*end != '\0') { - fprintf (stderr, "Invalid argument for -t (not an integer): %s\n", - optarg); - exit (1); - } - break; - case 'v': - verbose = 1; - break; - case 'x': - if (! read_excludes (perf, optarg)) { - fprintf (stderr, "Invalid argument for -x (not readable file): %s\n", - optarg); - exit (1); - } - break; - default: - fprintf (stderr, "Internal error: unhandled option: %c\n", c); - /* fall-through */ - case '?': - usage (argv[0]); - exit (1); - } - } - - if (perf->observe && perf->tile_size) { - fprintf (stderr, "Can't mix observer and tiling. Sorry.\n"); - exit (1); - } - - if (verbose && perf->summary == NULL) - perf->summary = stderr; -#if HAVE_UNISTD_H - if (perf->summary && isatty (fileno (perf->summary))) - perf->summary_continuous = TRUE; -#endif - - if (optind < argc) { - perf->names = &argv[optind]; - perf->num_names = argc - optind; - } - - if (use_surface_cache) - surface_cache = _cairo_hash_table_create (scache_equal); -} - -static void -cairo_perf_fini (cairo_perf_t *perf) -{ - cairo_boilerplate_free_targets (perf->targets); - cairo_boilerplate_fini (); - - free (perf->times); - cairo_debug_reset_static_data (); -#if HAVE_FCFINI - FcFini (); -#endif -} - -static cairo_bool_t -have_trace_filenames (cairo_perf_t *perf) -{ - unsigned int i; - - if (perf->num_names == 0) - return FALSE; - -#if HAVE_UNISTD_H - for (i = 0; i < perf->num_names; i++) - if (access (perf->names[i], R_OK) == 0) - return TRUE; -#endif - - return FALSE; -} - -static void -_tiling_surface_finish (cairo_surface_t *observer, - cairo_surface_t *target, - void *closure) -{ - struct trace *args = closure; - cairo_surface_t *surface; - cairo_content_t content; - cairo_rectangle_t r; - int width, height; - int x, y, w, h; - - cairo_recording_surface_get_extents (target, &r); - w = r.width; - h = r.height; - - content = cairo_surface_get_content (target); - - for (y = 0; y < h; y += args->tile_size) { - height = args->tile_size; - if (y + height > h) - height = h - y; - - for (x = 0; x < w; x += args->tile_size) { - cairo_t *cr; - - width = args->tile_size; - if (x + width > w) - width = w - x; - - /* XXX to correctly observe the playback we would need - * to replay the target onto the observer directly. - */ - surface = args->target->create_similar (args->surface, - content, width, height); - - cr = cairo_create (surface); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_surface (cr, target, -x, -y); - cairo_paint (cr); - cairo_destroy (cr); - - cairo_surface_destroy (surface); - } - } -} - -static cairo_surface_t * -_tiling_surface_create (void *closure, - cairo_content_t content, - double width, - double height, - long uid) -{ - cairo_rectangle_t r; - cairo_surface_t *surface, *observer; - - r.x = r.y = 0; - r.width = width; - r.height = height; - - surface = cairo_recording_surface_create (content, &r); - observer = cairo_surface_create_observer (surface, - CAIRO_SURFACE_OBSERVER_NORMAL); - cairo_surface_destroy (surface); - - cairo_surface_observer_add_finish_callback (observer, - _tiling_surface_finish, - closure); - - return observer; -} - -static void -cairo_perf_trace (cairo_perf_t *perf, - const cairo_boilerplate_target_t *target, - const char *trace) -{ - static cairo_bool_t first_run = TRUE; - unsigned int i; - cairo_time_t *times, *paint, *mask, *fill, *stroke, *glyphs; - cairo_stats_t stats = {0.0, 0.0}; - struct trace args = { target }; - int low_std_dev_count; - char *trace_cpy, *name; - const cairo_script_interpreter_hooks_t hooks = { - &args, - perf->tile_size ? _tiling_surface_create : _similar_surface_create, - NULL, /* surface_destroy */ - _context_create, - NULL, /* context_destroy */ - NULL, /* show_page */ - NULL, /* copy_page */ - _source_image_create, - }; - - args.tile_size = perf->tile_size; - args.observe = perf->observe; - - trace_cpy = xstrdup (trace); - name = basename_no_ext (trace_cpy); - - if (perf->list_only) { - printf ("%s\n", name); - free (trace_cpy); - return; - } - - if (first_run) { - if (perf->raw) { - printf ("[ # ] %s.%-s %s %s %s ...\n", - "backend", "content", "test-size", "ticks-per-ms", "time(ticks)"); - } - - if (perf->summary) { - if (perf->observe) { - fprintf (perf->summary, - "[ # ] %8s %28s %9s %9s %9s %9s %9s %9s %5s\n", - "backend", "test", - "total(s)", "paint(s)", "mask(s)", "fill(s)", "stroke(s)", "glyphs(s)", - "count"); - } else { - fprintf (perf->summary, - "[ # ] %8s %28s %8s %5s %5s %s\n", - "backend", "test", "min(s)", "median(s)", - "stddev.", "count"); - } - } - first_run = FALSE; - } - - times = perf->times; - paint = times + perf->iterations; - mask = paint + perf->iterations; - stroke = mask + perf->iterations; - fill = stroke + perf->iterations; - glyphs = fill + perf->iterations; - - low_std_dev_count = 0; - for (i = 0; i < perf->iterations && ! user_interrupt; i++) { - cairo_script_interpreter_t *csi; - cairo_status_t status; - unsigned int line_no; - - args.surface = target->create_surface (NULL, - CAIRO_CONTENT_COLOR_ALPHA, - 1, 1, - 1, 1, - CAIRO_BOILERPLATE_MODE_PERF, - &args.closure); - fill_surface(args.surface); /* remove any clear flags */ - - if (perf->observe) { - cairo_surface_t *obs; - obs = cairo_surface_create_observer (args.surface, - CAIRO_SURFACE_OBSERVER_NORMAL); - cairo_surface_destroy (args.surface); - args.surface = obs; - } - if (cairo_surface_status (args.surface)) { - fprintf (stderr, - "Error: Failed to create target surface: %s\n", - target->name); - return; - } - - cairo_perf_timer_set_synchronize (target->synchronize, args.closure); - - if (i == 0) { - describe (perf, args.closure); - if (perf->summary) { - fprintf (perf->summary, - "[%3d] %8s %28s ", - perf->test_number, - perf->target->name, - name); - fflush (perf->summary); - } - } - - csi = cairo_script_interpreter_create (); - cairo_script_interpreter_install_hooks (csi, &hooks); - - if (! perf->observe) { - cairo_perf_yield (); - cairo_perf_timer_start (); - } - - cairo_script_interpreter_run (csi, trace); - line_no = cairo_script_interpreter_get_line_number (csi); - - /* Finish before querying timings in case we are using an intermediate - * target and so need to destroy all surfaces before rendering - * commences. - */ - cairo_script_interpreter_finish (csi); - - if (perf->observe) { - cairo_device_t *observer = cairo_surface_get_device (args.surface); - times[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_elapsed (observer)); - paint[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_paint_elapsed (observer)); - mask[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_mask_elapsed (observer)); - stroke[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_stroke_elapsed (observer)); - fill[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_fill_elapsed (observer)); - glyphs[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_glyphs_elapsed (observer)); - } else { - fill_surface (args.surface); /* queue a write to the sync'ed surface */ - cairo_perf_timer_stop (); - times[i] = cairo_perf_timer_elapsed (); - } - - scache_clear (); - - cairo_surface_destroy (args.surface); - - if (target->cleanup) - target->cleanup (args.closure); - - status = cairo_script_interpreter_destroy (csi); - if (status) { - if (perf->summary) { - fprintf (perf->summary, "Error during replay, line %d: %s\n", - line_no, - cairo_status_to_string (status)); - } - goto out; - } - - if (perf->raw) { - if (i == 0) - printf ("[*] %s.%s %s.%d %g", - perf->target->name, - "rgba", - name, - 0, - _cairo_time_to_double (_cairo_time_from_s (1)) / 1000.); - printf (" %lld", (long long) times[i]); - fflush (stdout); - } else if (! perf->exact_iterations) { - if (i > CAIRO_PERF_MIN_STD_DEV_COUNT) { - _cairo_stats_compute (&stats, times, i+1); - - if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) { - if (++low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT) - break; - } else { - low_std_dev_count = 0; - } - } - } - - if (perf->summary && perf->summary_continuous) { - _cairo_stats_compute (&stats, times, i+1); - - fprintf (perf->summary, - "\r[%3d] %8s %28s ", - perf->test_number, - perf->target->name, - name); - if (perf->observe) { - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, paint, i+1); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, mask, i+1); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, fill, i+1); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, stroke, i+1); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, glyphs, i+1); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - fprintf (perf->summary, - " %5d", i+1); - } else { - fprintf (perf->summary, - "%#8.3f %#8.3f %#6.2f%% %4d/%d", - _cairo_time_to_s (stats.min_ticks), - _cairo_time_to_s (stats.median_ticks), - stats.std_dev * 100.0, - stats.iterations, i+1); - } - fflush (perf->summary); - } - } - user_interrupt = 0; - - if (perf->summary) { - _cairo_stats_compute (&stats, times, i); - if (perf->summary_continuous) { - fprintf (perf->summary, - "\r[%3d] %8s %28s ", - perf->test_number, - perf->target->name, - name); - } - if (perf->observe) { - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, paint, i); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, mask, i); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, fill, i); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, stroke, i); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - _cairo_stats_compute (&stats, glyphs, i); - fprintf (perf->summary, - " %#9.3f", _cairo_time_to_s (stats.median_ticks)); - - fprintf (perf->summary, - " %5d\n", i); - } else { - fprintf (perf->summary, - "%#8.3f %#8.3f %#6.2f%% %4d/%d\n", - _cairo_time_to_s (stats.min_ticks), - _cairo_time_to_s (stats.median_ticks), - stats.std_dev * 100.0, - stats.iterations, i); - } - fflush (perf->summary); - } - -out: - if (perf->raw) { - printf ("\n"); - fflush (stdout); - } - - perf->test_number++; - free (trace_cpy); -} - -static void -warn_no_traces (const char *message, - const char *trace_dir) -{ - fprintf (stderr, -"Error: %s '%s'.\n" -"Have you cloned the cairo-traces repository and uncompressed the traces?\n" -" git clone git://anongit.freedesktop.org/cairo-traces\n" -" cd cairo-traces && make\n" -"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n", - message, trace_dir); -} - -static int -cairo_perf_trace_dir (cairo_perf_t *perf, - const cairo_boilerplate_target_t *target, - const char *dirname) -{ - DIR *dir; - struct dirent *de; - int num_traces = 0; - cairo_bool_t force; - cairo_bool_t is_explicit; - - dir = opendir (dirname); - if (dir == NULL) - return 0; - - force = FALSE; - if (cairo_perf_can_run (perf, dirname, &is_explicit)) - force = is_explicit; - - while ((de = readdir (dir)) != NULL) { - char *trace; - struct stat st; - - if (de->d_name[0] == '.') - continue; - - xasprintf (&trace, "%s/%s", dirname, de->d_name); - if (stat (trace, &st) != 0) - goto next; - - if (S_ISDIR(st.st_mode)) { - num_traces += cairo_perf_trace_dir (perf, target, trace); - } else { - const char *dot; - - dot = strrchr (de->d_name, '.'); - if (dot == NULL) - goto next; - if (strcmp (dot, ".trace")) - goto next; - - num_traces++; - if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL)) - goto next; - - cairo_perf_trace (perf, target, trace); - } -next: - free (trace); - - } - closedir (dir); - - return num_traces; -} - -int -main (int argc, - char *argv[]) -{ - cairo_perf_t perf; - const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces"; - unsigned int n; - int i; - - parse_options (&perf, argc, argv); - - signal (SIGINT, interrupt); - - if (getenv ("CAIRO_TRACE_DIR") != NULL) - trace_dir = getenv ("CAIRO_TRACE_DIR"); - - perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); - perf.times = xmalloc (6 * perf.iterations * sizeof (cairo_time_t)); - - /* do we have a list of filenames? */ - perf.exact_names = have_trace_filenames (&perf); - - for (i = 0; i < perf.num_targets; i++) { - const cairo_boilerplate_target_t *target = perf.targets[i]; - - if (! perf.list_only && ! target->is_measurable) - continue; - - perf.target = target; - perf.test_number = 0; - perf.has_described_backend = FALSE; - - if (perf.exact_names) { - for (n = 0; n < perf.num_names; n++) { - struct stat st; - - if (stat (perf.names[n], &st) == 0) { - if (S_ISDIR (st.st_mode)) { - cairo_perf_trace_dir (&perf, target, perf.names[n]); - } else - cairo_perf_trace (&perf, target, perf.names[n]); - } - } - } else { - int num_traces = 0; - const char *dir; - - dir = trace_dir; - do { - char buf[1024]; - const char *end = strchr (dir, ':'); - if (end != NULL) { - memcpy (buf, dir, end-dir); - buf[end-dir] = '\0'; - end++; - - dir = buf; - } - - num_traces += cairo_perf_trace_dir (&perf, target, dir); - dir = end; - } while (dir != NULL); - - if (num_traces == 0) { - warn_no_traces ("Found no traces in", trace_dir); - return 1; - } - } - - if (perf.list_only) - break; - } - - cairo_perf_fini (&perf); - - return 0; -} diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c deleted file mode 100644 index 18db0c544..000000000 --- a/perf/cairo-perf.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2007 Netlabs - * Copyright (c) 2006 Mozilla Corporation - * Copyright (c) 2006 Red Hat, Inc. - * Copyright (c) 2011 Andrea Canciani - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Peter Weilbacher <mozilla@weilbacher.org> - * Vladimir Vukicevic <vladimir@pobox.com> (win32/linux code) - * Carl Worth <cworth@cworth.org> (win32/linux code) - * Andrea Canciani <ranma42@gmail.com> - */ - -#include "cairo-perf.h" -#include "../src/cairo-time-private.h" - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif - -#if defined(__OS2__) -#define INCL_BASE -#include <os2.h> -#elif defined(_WIN32) -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#elif defined(_POSIX_PRIORITY_SCHEDULING) -#include <sched.h> -#endif - - -/* timers */ -static cairo_time_t timer; -static cairo_perf_timer_synchronize_t cairo_perf_timer_synchronize = NULL; -static void *cairo_perf_timer_synchronize_closure = NULL; - -void -cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize, - void *closure) -{ - cairo_perf_timer_synchronize = synchronize; - cairo_perf_timer_synchronize_closure = closure; -} - -void -cairo_perf_timer_start (void) -{ - timer = _cairo_time_get (); -} - -void -cairo_perf_timer_stop (void) -{ - if (cairo_perf_timer_synchronize) - cairo_perf_timer_synchronize (cairo_perf_timer_synchronize_closure); - - timer = _cairo_time_get_delta (timer); -} - -cairo_time_t -cairo_perf_timer_elapsed (void) -{ - return timer; -} - -void -cairo_perf_yield (void) -{ - /* try to deactivate this thread until the scheduler calls it again */ - -#if defined(__OS2__) - DosSleep (0); -#elif defined(_WIN32) - SleepEx(0, TRUE); -#elif defined(_POSIX_PRIORITY_SCHEDULING) - sched_yield (); -#else - sleep (0); -#endif -} diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h deleted file mode 100644 index eb53d13c2..000000000 --- a/perf/cairo-perf.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright © 2006 Mozilla Corporation - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Vladimir Vukicevic <vladimir@pobox.com> - * Carl Worth <cworth@cworth.org> - */ - -#ifndef _CAIRO_PERF_H_ -#define _CAIRO_PERF_H_ - -#include "cairo-boilerplate.h" -#include "../src/cairo-time-private.h" -#include <stdio.h> - -typedef struct _cairo_stats { - cairo_time_t min_ticks; - cairo_time_t median_ticks; - double ticks_per_ms; - double std_dev; - int iterations; - cairo_time_t *values; -} cairo_stats_t; - -typedef struct _cairo_histogram { - int width, height, max_count; - int num_columns, num_rows; - cairo_time_t min_value, max_value; - int *columns; -} cairo_histogram_t; - - -/* timers */ - -void -cairo_perf_timer_start (void); - -void -cairo_perf_timer_stop (void); - -typedef void -(*cairo_perf_timer_synchronize_t) (void *closure); - -void -cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize, - void *closure); - -cairo_time_t -cairo_perf_timer_elapsed (void); - -/* yield */ - -void -cairo_perf_yield (void); - -/* running a test case */ -typedef struct _cairo_perf { - FILE *summary; - cairo_bool_t summary_continuous; - - /* Options from command-line */ - unsigned int iterations; - cairo_bool_t exact_iterations; - cairo_bool_t raw; - cairo_bool_t list_only; - cairo_bool_t observe; - char **names; - unsigned int num_names; - char **exclude_names; - unsigned int num_exclude_names; - cairo_bool_t exact_names; - - double ms_per_iteration; - cairo_bool_t fast_and_sloppy; - - unsigned int tile_size; - - /* Stuff used internally */ - cairo_time_t *times; - const cairo_boilerplate_target_t **targets; - int num_targets; - const cairo_boilerplate_target_t *target; - cairo_bool_t has_described_backend; - unsigned int test_number; - unsigned int size; - cairo_t *cr; -} cairo_perf_t; - -typedef cairo_time_t -(*cairo_perf_func_t) (cairo_t *cr, int width, int height, int loops); - -typedef double -(*cairo_count_func_t) (cairo_t *cr, int width, int height); - -cairo_bool_t -cairo_perf_can_run (cairo_perf_t *perf, - const char *name, - cairo_bool_t *is_explicit); - -void -cairo_perf_run (cairo_perf_t *perf, - const char *name, - cairo_perf_func_t perf_func, - cairo_count_func_t count_func); - -void -cairo_perf_cover_sources_and_operators (cairo_perf_t *perf, - const char *name, - cairo_perf_func_t perf_func, - cairo_count_func_t count_func); - -/* reporter convenience routines */ - -typedef struct _test_report { - int id; - int fileno; - const char *configuration; - char *backend; - char *content; - char *name; - int size; - - /* The samples only exists for "raw" reports */ - cairo_time_t *samples; - unsigned int samples_size; - unsigned int samples_count; - - /* The stats are either read directly or computed from samples. - * If the stats have not yet been computed from samples, then - * iterations will be 0. */ - cairo_stats_t stats; -} test_report_t; - -typedef struct _test_diff { - test_report_t **tests; - int num_tests; - double min; - double max; - double change; -} test_diff_t; - -typedef struct _cairo_perf_report { - char *configuration; - const char *name; - int fileno; - test_report_t *tests; - int tests_size; - int tests_count; -} cairo_perf_report_t; - -typedef enum { - TEST_REPORT_STATUS_SUCCESS, - TEST_REPORT_STATUS_COMMENT, - TEST_REPORT_STATUS_ERROR -} test_report_status_t; - -void -cairo_perf_report_load (cairo_perf_report_t *report, - const char *filename, int id, - int (*cmp) (const void *, const void *)); - -void -cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report, - int (*cmp) (const void *, const void *)); - -int -test_report_cmp_backend_then_name (const void *a, - const void *b); - -int -test_report_cmp_name (const void *a, - const void *b); - -#define CAIRO_PERF_ENABLED_DECL(func) cairo_bool_t (func ## _enabled) (cairo_perf_t *perf) -#define CAIRO_PERF_RUN_DECL(func) void (func) (cairo_perf_t *perf, cairo_t *cr, int width, int height) - -#define CAIRO_PERF_DECL(func) CAIRO_PERF_RUN_DECL(func); CAIRO_PERF_ENABLED_DECL(func) - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -CAIRO_PERF_DECL (fill); -CAIRO_PERF_DECL (paint); -CAIRO_PERF_DECL (paint_with_alpha); -CAIRO_PERF_DECL (mask); -CAIRO_PERF_DECL (stroke); -CAIRO_PERF_DECL (subimage_copy); -CAIRO_PERF_DECL (disjoint); -CAIRO_PERF_DECL (hatching); -CAIRO_PERF_DECL (tessellate); -CAIRO_PERF_DECL (text); -CAIRO_PERF_DECL (glyphs); -CAIRO_PERF_DECL (hash_table); -CAIRO_PERF_DECL (pattern_create_radial); -CAIRO_PERF_DECL (zrusin); -CAIRO_PERF_DECL (world_map); -CAIRO_PERF_DECL (box_outline); -CAIRO_PERF_DECL (mosaic); -CAIRO_PERF_DECL (long_lines); -CAIRO_PERF_DECL (unaligned_clip); -CAIRO_PERF_DECL (rectangles); -CAIRO_PERF_DECL (rounded_rectangles); -CAIRO_PERF_DECL (long_dashed_lines); -CAIRO_PERF_DECL (composite_checker); -CAIRO_PERF_DECL (twin); -CAIRO_PERF_DECL (dragon); -CAIRO_PERF_DECL (pythagoras_tree); -CAIRO_PERF_DECL (intersections); -CAIRO_PERF_DECL (spiral); -CAIRO_PERF_DECL (wave); -CAIRO_PERF_DECL (many_strokes); -CAIRO_PERF_DECL (wide_strokes); -CAIRO_PERF_DECL (many_fills); -CAIRO_PERF_DECL (wide_fills); -CAIRO_PERF_DECL (many_curves); -CAIRO_PERF_DECL (curve); -CAIRO_PERF_DECL (a1_curve); -CAIRO_PERF_DECL (line); -CAIRO_PERF_DECL (a1_line); -CAIRO_PERF_DECL (pixel); -CAIRO_PERF_DECL (a1_pixel); -CAIRO_PERF_DECL (sierpinski); -CAIRO_PERF_DECL (fill_clip); -CAIRO_PERF_DECL (tiger); - -#endif diff --git a/perf/cairo-stats.c b/perf/cairo-stats.c deleted file mode 100644 index aee9fe8b5..000000000 --- a/perf/cairo-stats.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - */ - -#include "cairo-stats.h" - -#include <assert.h> - -void -_cairo_stats_compute (cairo_stats_t *stats, - cairo_time_t *values, - int num_values) -{ - cairo_time_t sum, mean, q1, q3, iqr; - cairo_time_t outlier_min, outlier_max; - int i, min_valid, num_valid; - double s; - - assert (num_values > 0); - - if (num_values == 1) { - stats->min_ticks = stats->median_ticks = values[0]; - stats->std_dev = 0; - stats->iterations = 1; - stats->values = values; - return; - } - - /* First, identify any outliers, using the definition of "mild - * outliers" from: - * - * http://en.wikipedia.org/wiki/Outliers - * - * Which is that outliers are any values less than Q1 - 1.5 * IQR - * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first - * and third quartiles and IQR is the inter-quartile range (Q3 - - * Q1). - */ - num_valid = num_values; - do { - num_values = num_valid; - qsort (values, num_values, sizeof (cairo_time_t), _cairo_time_cmp); - - q1 = values[1*num_values/4]; - q3 = values[3*num_values/4]; - - /* XXX assumes we have native uint64_t */ - iqr = q3 - q1; - outlier_min = q1 - 3 * iqr / 2; - outlier_max = q3 + 3 * iqr / 2; - - for (i = 0; i < num_values && values[i] < outlier_min; i++) - ; - min_valid = i; - - for (i = 0; i < num_values && values[i] <= outlier_max; i++) - ; - num_valid = i - min_valid; - assert(num_valid); - values += min_valid; - } while (num_valid != num_values); - - stats->values = values; - stats->iterations = num_valid; - stats->min_ticks = values[0]; - stats->median_ticks = values[num_valid / 2]; - - sum = 0; - for (i = 0; i < num_valid; i++) - sum = _cairo_time_add (sum, values[i]); - mean = sum / num_valid; - - /* Let's use a normalized std. deviation for easier comparison. */ - s = 0; - for (i = 0; i < num_valid; i++) { - double delta = (values[i] - mean) / (double)mean; - s += delta * delta; - } - stats->std_dev = sqrt(s / num_valid); -} - -cairo_bool_t -_cairo_histogram_init (cairo_histogram_t *h, - int width, int height) -{ - h->width = width; - h->height = height; - if (h->width < 2 || h->height < 1) - return FALSE; - - h->num_columns = width - 2; - h->num_rows = height - 1; - h->columns = malloc (sizeof(int)*h->num_columns); - return h->columns != NULL; -} - -cairo_bool_t -_cairo_histogram_compute (cairo_histogram_t *h, - const cairo_time_t *values, - int num_values) -{ - cairo_time_t delta; - int i; - - if (num_values == 0) - return FALSE; - - h->min_value = values[0]; - h->max_value = values[0]; - - for (i = 1; i < num_values; i++) { - if (values[i] < h->min_value) - h->min_value = values[i]; - if (values[i] > h->max_value) - h->max_value = values[i]; - } - - delta = h->max_value - h->min_value; - if (delta == 0) - return FALSE; - - memset(h->columns, 0, sizeof(int)*h->num_columns); - h->max_count = 0; - - for (i = 0; i < num_values; i++) { - int count = h->columns[(values[i] - h->min_value) * (h->num_columns - 1) / delta]++; - if (count > h->max_count) - h->max_count = count; - } - - return TRUE; -} - -void -_cairo_histogram_printf (cairo_histogram_t *h, - FILE *file) -{ - int x, y, num_rows; - - num_rows = h->num_rows; - if (h->max_count < num_rows) - num_rows = h->max_count; - for (y = 0; y < num_rows; y++) { - int min_count = ((num_rows - y - 1) * h->max_count) / num_rows + h->max_count / (2*num_rows); - fprintf (file, "|"); - for (x = 0; x < h->num_columns; x++) - fprintf (file, "%c", h->columns[x] > min_count ? 'x' : ' '); - fprintf (file, "|\n"); - } - - fprintf(file, "."); - for (x = 0; x < h->num_columns; x++) - fprintf (file, "-"); - fprintf (file, ".\n"); -} - -void -_cairo_histogram_fini (cairo_histogram_t *h) -{ - free(h->columns); -} diff --git a/perf/cairo-stats.h b/perf/cairo-stats.h deleted file mode 100644 index 2b32d67ae..000000000 --- a/perf/cairo-stats.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Carl Worth <cworth@cworth.org> - */ - -#ifndef _CAIRO_STATS_H_ -#define _CAIRO_STATS_H_ - -#include "cairo-perf.h" - -void -_cairo_stats_compute (cairo_stats_t *stats, - cairo_time_t *values, - int num_values); - -cairo_bool_t -_cairo_histogram_init (cairo_histogram_t *h, - int width, int height); - -cairo_bool_t -_cairo_histogram_compute (cairo_histogram_t *h, - const cairo_time_t *values, - int num_values); - -void -_cairo_histogram_printf (cairo_histogram_t *h, - FILE *file); - -void -_cairo_histogram_fini (cairo_histogram_t *h); - -#endif /* _CAIRO_STATS_H_ */ diff --git a/perf/dirent-win32.h b/perf/dirent-win32.h deleted file mode 100644 index 0f2ed05e5..000000000 --- a/perf/dirent-win32.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ -/* - * Copyright 2011 Andrea Canciani - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * the authors not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. The authors make no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Andrea Canciani <ranma42@gmail.com> - */ - -#include "cairo-compiler-private.h" - -#define WIN32_LEAN_AND_MEAN -#include <windows.h> - -#define stat _stat - -#define S_ISDIR(s) ((s) & _S_IFDIR) - -struct dirent { - ino_t d_ino; - char d_name[FILENAME_MAX + 1]; -}; - -typedef struct _DIR { - HANDLE handle; - cairo_bool_t has_next; - WIN32_FIND_DATA data; - struct dirent de; -} DIR; - -static DIR * -opendir(const char *dirname) -{ - DIR *dirp; - - dirp = malloc (sizeof (*dirp)); - if (unlikely (dirp == NULL)) - return NULL; - - dirp->handle = FindFirstFile(dirname, &dirp->data); - - if (unlikely (dirp->handle == INVALID_HANDLE_VALUE)) { - free (dirp); - return NULL; - } - - memcpy (dirp->de.d_name, dirp->data.cFileName, - sizeof (dirp->data.cFileName)); - dirp->de.d_name[FILENAME_MAX] = '\0'; - - dirp->has_next = TRUE; - - return dirp; -} - -static int -closedir(DIR *dirp) -{ - int ret; - - ret = ! FindClose (dirp->handle); - - free (dirp); - - /* TODO: set errno */ - - return ret; -} - -static struct dirent * -readdir(DIR *dirp) -{ - if (! dirp->has_next) - return NULL; - - /* COMPILE_TIME_ASSERT (FILENAME_MAX == sizeof (dirp->data.cFileName)); */ - - memcpy (dirp->de.d_name, dirp->data.cFileName, - sizeof (dirp->data.cFileName)); - dirp->de.d_name[FILENAME_MAX] = '\0'; - - dirp->has_next = FindNextFile (dirp->handle, &dirp->data); - - return &dirp->de; -} diff --git a/perf/make-html.py b/perf/make-html.py deleted file mode 100755 index 0b4533581..000000000 --- a/perf/make-html.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/python - -from string import strip -from sys import stdin - -targets = {} -smilies = {'slowdown': '☹' , 'speedup': '☺'} - -for line in stdin: - line = map(strip, filter(None, line.split(' '))) - - if 9 == len(line): - target, name = line[0:2] - factor, dir = line[-2:] - - name = name.split('-') - name, size = '-'.join(name[:-1]), name[-1] - - target_tests = targets.get(target, {}) - name_tests = target_tests.get(name, {}) - - name_tests[int(size)] = (factor, dir) - target_tests[name] = name_tests - targets[target] = target_tests - -print '''\ -<html><head> -<title>Performance Changes</title> -<style type="text/css">/*<![CDATA[*/ - body { background: white; color: black; } - table { border-collapse: collapse; } - - th, td { border: 1px solid silver; padding: 0.2em; } - td { text-align: center; } - th:first-child { text-align: left; } - th { background: #eee; } - - /* those colors also should work for color blinds */ - td.slowdown { background: #f93; } - td.speedup { background: #6f9; } -/*]]>*/</style> -</head><body> -<h1>Performance Changes</h1>''' - -targets = targets.items() -targets.sort(lambda a, b: cmp(a[0], b[0])) - -for target, names in targets: - sizes = {} - - for tests in names.values(): - for size in tests.keys(): - sizes[size] = True - - sizes = sizes.keys() - sizes.sort() - - names = names.items() - names.sort(lambda a, b: cmp(a[0], b[0])) - - print '<h2><a name="%s">%s</a></h2>' % (target, target) - print '<table><thead><tr><th> </th>' - - for size in sizes: - print '<th>%s</th>' % size - - print '</tr></thead><tbody>' - - for name, tests in names: - print '<tr><th>%s</th>' % name - - for size in sizes: - result = tests.get(size) - - if result: - factor, dir = result - print '<td class="%s">%s %s</td>' % ( - dir, factor, smilies[dir]) - - else: - print '<td> </td>' - - print '</tr>' - - - print '</tbody></table>' - -print '</body></html>' diff --git a/perf/micro/Makefile.am b/perf/micro/Makefile.am deleted file mode 100644 index 3edbf531c..000000000 --- a/perf/micro/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -include $(top_srcdir)/build/Makefile.am.common - -include $(top_srcdir)/perf/micro/Makefile.sources - -noinst_LTLIBRARIES = libcairo-perf-micro.la -libcairo_perf_micro_la_SOURCES = \ - $(libcairo_perf_micro_sources) \ - $(libcairo_perf_micro_headers) - -AM_CPPFLAGS = \ - -I$(srcdir) \ - -I$(top_srcdir)/boilerplate \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/perf \ - -I$(top_builddir)/src \ - $(CAIRO_CFLAGS) diff --git a/perf/micro/Makefile.sources b/perf/micro/Makefile.sources deleted file mode 100644 index 19ead179d..000000000 --- a/perf/micro/Makefile.sources +++ /dev/null @@ -1,51 +0,0 @@ -libcairo_perf_micro_sources = \ - cairo-perf-cover.c \ - box-outline.c \ - composite-checker.c \ - disjoint.c \ - fill.c \ - hatching.c \ - hash-table.c \ - line.c \ - a1-line.c \ - long-lines.c \ - mosaic.c \ - paint.c \ - paint-with-alpha.c \ - mask.c \ - pattern_create_radial.c \ - rectangles.c \ - rounded-rectangles.c \ - stroke.c \ - subimage_copy.c \ - tessellate.c \ - text.c \ - tiger.c \ - glyphs.c \ - twin.c \ - unaligned-clip.c \ - wave.c \ - world-map.c \ - zrusin.c \ - long-dashed-lines.c \ - dragon.c \ - pythagoras-tree.c \ - intersections.c \ - many-strokes.c \ - wide-strokes.c \ - many-fills.c \ - wide-fills.c \ - many-curves.c \ - curve.c \ - a1-curve.c \ - spiral.c \ - pixel.c \ - sierpinski.c \ - fill-clip.c \ - $(NULL) - -libcairo_perf_micro_headers = \ - mosaic.h \ - world-map.h \ - zrusin-another.h \ - $(NULL) diff --git a/perf/micro/Makefile.win32 b/perf/micro/Makefile.win32 deleted file mode 100644 index f41f781d7..000000000 --- a/perf/micro/Makefile.win32 +++ /dev/null @@ -1,12 +0,0 @@ -top_srcdir = ../.. -include $(top_srcdir)/build/Makefile.win32.common -include $(top_srcdir)/perf/micro/Makefile.sources - -CFLAGS += -I$(top_srcdir)/perf -I$(top_srcdir)/boilerplate/ - -OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairo_perf_micro_sources)) - -all: inform $(CFG)/libcairo-perf-micro.lib - -$(CFG)/libcairo-perf-micro.lib: $(OBJECTS) - @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(OBJECTS) diff --git a/perf/micro/a1-curve.c b/perf/micro/a1-curve.c deleted file mode 100644 index 594c46d5c..000000000 --- a/perf/micro/a1-curve.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static uint32_t state; - -static double -uniform_random (double minval, double maxval) -{ - static uint32_t const poly = 0x9a795537U; - uint32_t n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -do_curve_stroke (cairo_t *cr, int width, int height, int loops) -{ - state = 0xc0ffee; - cairo_set_line_width (cr, 2.); - cairo_perf_timer_start (); - - while (loops--) { - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); - cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); - cairo_stroke(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_curve_fill (cairo_t *cr, int width, int height, int loops) -{ - state = 0xc0ffee; - cairo_perf_timer_start (); - - while (loops--) { - double x0 = uniform_random (0, width); - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double xm = uniform_random (0, width); - double xn = uniform_random (0, width); - double y0 = uniform_random (0, height); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - double ym = uniform_random (0, height); - double yn = uniform_random (0, height); - - cairo_move_to (cr, xm, ym); - cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); - cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); - cairo_close_path (cr); - - cairo_fill(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -a1_curve_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "a1-curve", NULL); -} - -void -a1_curve (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); - - cairo_perf_run (perf, "a1-curve-stroked", do_curve_stroke, NULL); - cairo_perf_run (perf, "a1-curve-filled", do_curve_fill, NULL); -} diff --git a/perf/micro/a1-line.c b/perf/micro/a1-line.c deleted file mode 100644 index ae8660212..000000000 --- a/perf/micro/a1-line.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static cairo_time_t -horizontal (cairo_t *cr, int width, int height, int loops) -{ - double h = height/2 + .5; - - cairo_move_to (cr, 0, h); - cairo_line_to (cr, width, h); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -horizontal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return horizontal (cr, width, height, loops); -} - -static cairo_time_t -horizontal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return horizontal (cr, width, height, loops); -} - -static cairo_time_t -nearly_horizontal (cairo_t *cr, int width, int height, int loops) -{ - double h = height/2; - - cairo_move_to (cr, 0, h); - cairo_line_to (cr, width, h+1); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return nearly_horizontal (cr, width, height, loops); -} - -static cairo_time_t -nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return nearly_horizontal (cr, width, height, loops); -} - - -static cairo_time_t -vertical (cairo_t *cr, int width, int height, int loops) -{ - double w = width/2 + .5; - - cairo_move_to (cr, w, 0); - cairo_line_to (cr, w, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -vertical_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return vertical (cr, width, height, loops); -} - -static cairo_time_t -vertical_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return vertical (cr, width, height, loops); -} - -static cairo_time_t -nearly_vertical (cairo_t *cr, int width, int height, int loops) -{ - double w = width/2; - - cairo_move_to (cr, w, 0); - cairo_line_to (cr, w+1, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -nearly_vertical_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return nearly_vertical (cr, width, height, loops); -} - -static cairo_time_t -nearly_vertical_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return nearly_vertical (cr, width, height, loops); -} - - -static cairo_time_t -diagonal (cairo_t *cr, int width, int height, int loops) -{ - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, width, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -diagonal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return diagonal (cr, width, height, loops); -} - -static cairo_time_t -diagonal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return diagonal (cr, width, height, loops); -} - -cairo_bool_t -a1_line_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "a1-line", NULL); -} - -void -a1_line (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); - - cairo_perf_run (perf, "a1-line-hh", horizontal_hair, NULL); - cairo_perf_run (perf, "a1-line-hw", horizontal_wide, NULL); - cairo_perf_run (perf, "a1-line-nhh", nearly_horizontal_hair, NULL); - cairo_perf_run (perf, "a1-line-nhw", nearly_horizontal_wide, NULL); - - cairo_perf_run (perf, "a1-line-vh", vertical_hair, NULL); - cairo_perf_run (perf, "a1-line-vw", vertical_wide, NULL); - cairo_perf_run (perf, "a1-line-nvh", nearly_vertical_hair, NULL); - cairo_perf_run (perf, "a1-line-nvw", nearly_vertical_wide, NULL); - - cairo_perf_run (perf, "a1-line-dh", diagonal_hair, NULL); - cairo_perf_run (perf, "a1-line-dw", diagonal_wide, NULL); -} diff --git a/perf/micro/box-outline.c b/perf/micro/box-outline.c deleted file mode 100644 index 1e654eb95..000000000 --- a/perf/micro/box-outline.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - */ - -#include "cairo-perf.h" - -/* This test case is designed to illustrate a performance bug that - * exists in cairo in which using cairo_stroke is much slower than - * cairo_fill to draw an identical figure, (and in particular a figure - * that is much more natural to draw with cairo_stroke). The figure is - * a 100x100 square outline 1-pixel wide, nicely pixel aligned. - * - * The performance bug should affect any path whose resulting contour - * consists only of pixel-aligned horizontal and vertical elements. - * - * Initial testing on on machine shows stroke as 5x slower than fill - * for the xlib backend and 16x slower for the image backend. - */ - -static cairo_time_t -box_outline_stroke (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_rectangle (cr, - 1.5, 1.5, - width - 3, height - 3); - cairo_set_line_width (cr, 1.0); - cairo_set_source_rgb (cr, 1, 0, 0); /* red */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -box_outline_alpha_stroke (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_rectangle (cr, - 1.5, 1.5, - width - 3, height - 3); - cairo_set_line_width (cr, 1.0); - cairo_set_source_rgba (cr, 1, 0, 0, .5); /* red */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -box_outline_aa_stroke (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_translate (cr, .5, .5); - cairo_rectangle (cr, - 1.5, 1.5, - width - 3, height - 3); - cairo_set_line_width (cr, 1.0); - cairo_set_source_rgb (cr, 1, 0, 0); /* red */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -box_outline_fill (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_rectangle (cr, - 1.0, 1.0, - width - 2, height - 2); - cairo_rectangle (cr, - 2.0, 2.0, - width - 4, height - 4); - cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); - cairo_set_source_rgb (cr, 0, 1, 0); /* green */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -box_outline_alpha_fill (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_rectangle (cr, - 1.0, 1.0, - width - 2, height - 2); - cairo_rectangle (cr, - 2.0, 2.0, - width - 4, height - 4); - cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); - cairo_set_source_rgba (cr, 0, 1, 0, .5); /* green */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -box_outline_aa_fill (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ - cairo_paint (cr); - - cairo_translate (cr, .5, .5); - cairo_rectangle (cr, - 1.0, 1.0, - width - 2, height - 2); - cairo_rectangle (cr, - 2.0, 2.0, - width - 4, height - 4); - cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); - cairo_set_source_rgb (cr, 0, 1, 0); /* green */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -box_outline_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "box-outline", NULL); -} - -void -box_outline (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "box-outline-stroke", box_outline_stroke, NULL); - cairo_perf_run (perf, "box-outline-fill", box_outline_fill, NULL); - - cairo_perf_run (perf, "box-outline-alpha-stroke", box_outline_alpha_stroke, NULL); - cairo_perf_run (perf, "box-outline-alpha-fill", box_outline_alpha_fill, NULL); - - cairo_perf_run (perf, "box-outline-aa-stroke", box_outline_aa_stroke, NULL); - cairo_perf_run (perf, "box-outline-aa-fill", box_outline_aa_fill, NULL); -} diff --git a/perf/micro/cairo-perf-cover.c b/perf/micro/cairo-perf-cover.c deleted file mode 100644 index c2499021f..000000000 --- a/perf/micro/cairo-perf-cover.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Red Hat, Inc. not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Red Hat, Inc. makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - */ - -#include "cairo-perf.h" - -static void -init_and_set_source_surface (cairo_t *cr, - cairo_surface_t *source, - int width, - int height) -{ - cairo_t *cr2; - - /* Fill it with something known */ - cr2 = cairo_create (source); - cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgb (cr2, 0, 0, 1); /* blue */ - cairo_paint (cr2); - - cairo_set_source_rgba (cr2, 1, 0, 0, 0.5); /* 50% red */ - cairo_new_path (cr2); - cairo_rectangle (cr2, 0, 0, width/2.0, height/2.0); - cairo_rectangle (cr2, width/2.0, height/2.0, width/2.0, height/2.0); - cairo_fill (cr2); - - cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); - cairo_destroy (cr2); -} - -static void -set_source_solid_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_set_source_rgb (cr, 0.2, 0.6, 0.9); -} - -static void -set_source_solid_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_set_source_rgba (cr, 0.2, 0.6, 0.9, 0.7); -} - -static void -set_source_image_surface_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_image_surface_create (CAIRO_FORMAT_RGB24, - width, height); - init_and_set_source_surface (cr, source, width, height); - - cairo_surface_destroy (source); -} - -static void -set_source_image_surface_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - width, height); - init_and_set_source_surface (cr, source, width, height); - - cairo_surface_destroy (source); -} - -static void -set_source_image_surface_rgba_mag (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - width/2, height/2); - cairo_scale(cr, 2.1, 2.1); - init_and_set_source_surface (cr, source, width/2, height/2); - cairo_scale(cr, 1/2.1, 1/2.1); - - cairo_surface_destroy (source); -} - -static void -set_source_image_surface_rgba_min (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - width*2, height*2); - cairo_scale(cr, 1/1.9, 1/1.9); - init_and_set_source_surface (cr, source, width*2, height*2); - cairo_scale(cr, 1.9, 1.9); - - cairo_surface_destroy (source); -} - -static void -set_source_similar_surface_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_COLOR, - width, height); - init_and_set_source_surface (cr, source, width, height); - - cairo_surface_destroy (source); -} - -static void -set_source_similar_surface_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_COLOR_ALPHA, - width, height); - init_and_set_source_surface (cr, source, width, height); - - cairo_surface_destroy (source); -} - -static void -set_source_similar_surface_rgba_mag (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_COLOR_ALPHA, - width/2, height/2); - cairo_scale(cr, 2.1, 2.1); - init_and_set_source_surface (cr, source, width/2, height/2); - cairo_scale(cr, 1/2.1, 1/2.1); - - cairo_surface_destroy (source); -} - -static void -set_source_similar_surface_rgba_min (cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *source; - - source = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_COLOR_ALPHA, - width*2, height*2); - cairo_scale(cr, 1/1.9, 1/1.9); - init_and_set_source_surface (cr, source, width*2, height*2); - cairo_scale(cr, 1.9, 1.9); - - cairo_surface_destroy (source); -} - -static void -set_source_linear_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *linear; - - linear = cairo_pattern_create_linear (0.0, 0.0, width, height); - cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */ - cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */ - - cairo_set_source (cr, linear); - - cairo_pattern_destroy (linear); -} - -static void -set_source_linear_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *linear; - - linear = cairo_pattern_create_linear (0.0, 0.0, width, height); - cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */ - cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.0); /* 0% blue */ - - cairo_set_source (cr, linear); - - cairo_pattern_destroy (linear); -} - -static void -set_source_linear3_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *linear; - - linear = cairo_pattern_create_linear (0.0, 0.0, width, height); - cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */ - cairo_pattern_add_color_stop_rgb (linear, 0.5, 0, 1, 0); /* green */ - cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */ - - cairo_set_source (cr, linear); - - cairo_pattern_destroy (linear); -} - -static void -set_source_linear3_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *linear; - - linear = cairo_pattern_create_linear (0.0, 0.0, width, height); - cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */ - cairo_pattern_add_color_stop_rgba (linear, 0.5, 0, 1, 0, 0.0); /* 0% green */ - cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.5); /* 50% blue */ - - cairo_set_source (cr, linear); - - cairo_pattern_destroy (linear); -} - -static void -set_source_radial_rgb (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *radial; - - radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, - width/2.0, height/2.0, width/2.0); - cairo_pattern_add_color_stop_rgb (radial, 0.0, 1, 0, 0); /* red */ - cairo_pattern_add_color_stop_rgb (radial, 1.0, 0, 0, 1); /* blue */ - - cairo_set_source (cr, radial); - - cairo_pattern_destroy (radial); -} - -static void -set_source_radial_rgba (cairo_t *cr, - int width, - int height) -{ - cairo_pattern_t *radial; - - radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, - width/2.0, height/2.0, width/2.0); - cairo_pattern_add_color_stop_rgba (radial, 0.0, 1, 0, 0, 0.5); /* 50% red */ - cairo_pattern_add_color_stop_rgba (radial, 1.0, 0, 0, 1, 0.0); /* 0% blue */ - - cairo_set_source (cr, radial); - - cairo_pattern_destroy (radial); -} - -typedef void (*set_source_func_t) (cairo_t *cr, int width, int height); - -void -cairo_perf_cover_sources_and_operators (cairo_perf_t *perf, - const char *name, - cairo_perf_func_t perf_func, - cairo_count_func_t count_func) -{ - unsigned int i, j; - char *expanded_name; - - struct { set_source_func_t set_source; const char *name; } sources[] = { - { set_source_solid_rgb, "solid-rgb" }, - { set_source_solid_rgba, "solid-rgba" }, - { set_source_image_surface_rgb, "image-rgb" }, - { set_source_image_surface_rgba, "image-rgba" }, - { set_source_image_surface_rgba_mag, "image-rgba-mag" }, - { set_source_image_surface_rgba_min, "image-rgba-min" }, - { set_source_similar_surface_rgb, "similar-rgb" }, - { set_source_similar_surface_rgba, "similar-rgba" }, - { set_source_similar_surface_rgba_mag, "similar-rgba-mag" }, - { set_source_similar_surface_rgba_min, "similar-rgba-min" }, - { set_source_linear_rgb, "linear-rgb" }, - { set_source_linear_rgba, "linear-rgba" }, - { set_source_linear3_rgb, "linear3-rgb" }, - { set_source_linear3_rgba, "linear3-rgba" }, - { set_source_radial_rgb, "radial-rgb" }, - { set_source_radial_rgba, "radial-rgba" } - }; - - struct { cairo_operator_t op; const char *name; } operators[] = { - { CAIRO_OPERATOR_OVER, "over" }, - { CAIRO_OPERATOR_SOURCE, "source" } - }; - - for (i = 0; i < ARRAY_LENGTH (sources); i++) { - (sources[i].set_source) (perf->cr, perf->size, perf->size); - - for (j = 0; j < ARRAY_LENGTH (operators); j++) { - cairo_set_operator (perf->cr, operators[j].op); - - xasprintf (&expanded_name, "%s_%s_%s", - name, sources[i].name, operators[j].name); - cairo_perf_run (perf, expanded_name, perf_func, count_func); - free (expanded_name); - } - } -} diff --git a/perf/micro/composite-checker.c b/perf/micro/composite-checker.c deleted file mode 100644 index d6d17ab63..000000000 --- a/perf/micro/composite-checker.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright © 2007 Björn Lindqvist - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Björn Lindqvist <bjourne@gmail.com> - */ - -#include "cairo-perf.h" - -/* This test case measures how much time cairo takes to render the - * equivalent of the following gdk-pixbuf operation: - * - * gdk_pixbuf_composite_color(dest, - * 0, 0, DST_SIZE, DST_SIZE, - * 0, 0, - * SCALE, SCALE, - * gdk.INTERP_NEAREST, - * 255, - * 0, 0, - * 8, 0x33333333, 0x88888888); - * - * Cairo is (at the time of writing) about 2-3 times as slow as - * gdk-pixbuf. - */ -#define PAT_SIZE 16 -#define SRC_SIZE 64 - -static cairo_pattern_t *checkerboard = NULL; -static cairo_pattern_t *src_pattern = NULL; - -static cairo_time_t -do_composite_checker (cairo_t *cr, - int width, - int height, - int loops) -{ - /* Compute zoom so that the src_pattern covers the whole output image. */ - double xscale = width / (double) SRC_SIZE; - double yscale = height / (double) SRC_SIZE; - - cairo_perf_timer_start (); - - while (loops--) { - /* Fill the surface with our background. */ - cairo_identity_matrix (cr); - cairo_set_source (cr, checkerboard); - cairo_paint (cr); - - /* Draw the scaled image on top. */ - cairo_scale (cr, xscale, yscale); - cairo_set_source (cr, src_pattern); - cairo_paint (cr); - } - - cairo_perf_timer_stop (); - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -composite_checker_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "composite-checker", NULL); -} - -void -composite_checker (cairo_perf_t *perf, - cairo_t *cr, - int width, - int height) -{ - cairo_surface_t *image; - - /* Create the checker pattern. We don't actually need to draw - * anything on it since that wouldn't affect performance. - */ - image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - PAT_SIZE, - PAT_SIZE); - checkerboard = cairo_pattern_create_for_surface (image); - cairo_pattern_set_filter (checkerboard, CAIRO_FILTER_NEAREST); - cairo_pattern_set_extend (checkerboard, CAIRO_EXTEND_REPEAT); - cairo_surface_destroy (image); - - /* Create the image source pattern. Again we use the NEAREST - * filtering which should be fastest. - */ - image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - SRC_SIZE, - SRC_SIZE); - src_pattern = cairo_pattern_create_for_surface (image); - cairo_pattern_set_filter (src_pattern, CAIRO_FILTER_NEAREST); - cairo_surface_destroy (image); - - cairo_perf_run (perf, "composite-checker", do_composite_checker, NULL); - - cairo_pattern_destroy (checkerboard); - cairo_pattern_destroy (src_pattern); -} diff --git a/perf/micro/curve.c b/perf/micro/curve.c deleted file mode 100644 index 3b5a16342..000000000 --- a/perf/micro/curve.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static uint32_t state; - -static double -uniform_random (double minval, double maxval) -{ - static uint32_t const poly = 0x9a795537U; - uint32_t n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -do_curve_stroke (cairo_t *cr, int width, int height, int loops) -{ - state = 0xc0ffee; - cairo_set_line_width (cr, 2.); - cairo_perf_timer_start (); - - while (loops--) { - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); - cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); - cairo_stroke(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_curve_fill (cairo_t *cr, int width, int height, int loops) -{ - state = 0xc0ffee; - cairo_perf_timer_start (); - - while (loops--) { - double x0 = uniform_random (0, width); - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double xm = uniform_random (0, width); - double xn = uniform_random (0, width); - double y0 = uniform_random (0, height); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - double ym = uniform_random (0, height); - double yn = uniform_random (0, height); - - cairo_move_to (cr, xm, ym); - cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); - cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); - cairo_close_path (cr); - - cairo_fill(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -curve_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "curve", NULL); -} - -void -curve (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - - cairo_perf_run (perf, "curve-stroked", do_curve_stroke, NULL); - cairo_perf_run (perf, "curve-filled", do_curve_fill, NULL); -} diff --git a/perf/micro/disjoint.c b/perf/micro/disjoint.c deleted file mode 100644 index 847860c7e..000000000 --- a/perf/micro/disjoint.c +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -#include "cairo-perf.h" -#include <assert.h> - -#define STEP 5 - -static void path (cairo_t *cr, int width, int height) -{ - int i; - - cairo_rectangle (cr, 0, 0, width, height); - cairo_clip (cr); - - cairo_translate (cr, width/2, height/2); - cairo_rotate (cr, M_PI/4); - cairo_translate (cr, -width/2, -height/2); - - for (i = 0; i < width; i += STEP) { - cairo_rectangle (cr, i, -2, 1, height+4); - cairo_rectangle (cr, -2, i, width+4, 1); - } -} - -static void clip (cairo_t *cr, int width, int height) -{ - int i, j; - - for (j = 0; j < height; j += 2*STEP) { - for (i = 0; i < width; i += 2*STEP) - cairo_rectangle (cr, i, j, STEP, STEP); - - j += 2*STEP; - for (i = 0; i < width; i += 2*STEP) - cairo_rectangle (cr, i+STEP/2, j, STEP, STEP); - } - - cairo_clip (cr); -} - -static cairo_time_t -draw (cairo_t *cr, int width, int height, int loops) -{ - cairo_save (cr); - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_paint (cr); - cairo_set_source_rgb (cr, 1, 0, 0); - - cairo_perf_timer_start (); - while (loops--) { - cairo_save (cr); - clip (cr, width, height); - path (cr, width, height); - cairo_fill (cr); - cairo_restore (cr); - } - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -disjoint_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "disjoint", NULL); -} - -void -disjoint (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - if (! cairo_perf_can_run (perf, "disjoint", NULL)) - return; - - cairo_perf_run (perf, "disjoint", draw, NULL); -} diff --git a/perf/micro/dragon.c b/perf/micro/dragon.c deleted file mode 100644 index aa5daf534..000000000 --- a/perf/micro/dragon.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright © 2007 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Chris Wilson not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Chris Wilson makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - * - * Inspiration (and path!) taken from - * http://labs.trolltech.com/blogs/2007/08/31/rasterizing-dragons/ - */ - -#include "cairo-perf.h" - -static inline int -next_pot (int v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - v++; - return v; -} - -static cairo_bool_t -direction (int i) -{ - int pivot, np2; - - if (i < 2) - return TRUE; - - np2 = next_pot (i + 1); - if (np2 == i + 1) - return TRUE; - - pivot = np2 / 2 - 1; - return ! direction (2 * pivot - i); -} - -static void -path (cairo_t *cr, int step, int dir, int iterations) -{ - double dx, dy; - int i; - - switch (dir) { - default: - case 0: dx = step; dy = 0; break; - case 1: dx = -step; dy = 0; break; - case 2: dx = 0; dy = step; break; - case 3: dx = 0; dy = -step; break; - } - - for (i = 0; i < iterations; i++) { - cairo_rel_line_to (cr, dx, dy); - - if (direction (i)) { - double t = dx; - dx = dy; - dy = -t; - } else { - double t = dx; - dx = -dy; - dy = t; - } - } -} - -static cairo_time_t -do_dragon (cairo_t *cr, int width, int height, int loops) -{ - cairo_pattern_t *pattern; - double cx, cy, r; - - cx = cy = .5 * MAX (width, height); - r = .5 * MIN (width, height); - - cairo_perf_timer_start (); - - while (loops--) { - pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); - cairo_pattern_add_color_stop_rgb (pattern, 0., .0, .0, .0); - cairo_pattern_add_color_stop_rgb (pattern, 0.25, .5, .4, .4); - cairo_pattern_add_color_stop_rgb (pattern, .5, .8, .8, .9); - cairo_pattern_add_color_stop_rgb (pattern, 1., .9, .9, 1.); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - cairo_paint (cr); - - cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); - cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); - cairo_set_line_width (cr, 4.); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 0, 2048); - pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); - cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 1., 1.); - cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 0., 0.); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 1, 2048); - pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); - cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 1., 0.); - cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 0., 0.); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 2, 2048); - pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); - cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 1., 1.); - cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 1., 0.); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 3, 2048); - pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); - cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 0., 1.); - cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 0., 1.); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - cairo_stroke(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_dragon_solid (cairo_t *cr, int width, int height, int loops) -{ - double cx, cy; - - cx = cy = .5 * MAX (width, height); - - cairo_perf_timer_start (); - - while (loops--) { - cairo_set_source_rgb (cr, 0, 0, 0); - cairo_paint (cr); - - cairo_set_line_width (cr, 4.); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 0, 2048); - cairo_set_source_rgb (cr, 1, 0, 0); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 1, 2048); - cairo_set_source_rgb (cr, 0, 1, 0); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 2, 2048); - cairo_set_source_rgb (cr, 0, 0, 1); - cairo_stroke(cr); - - cairo_move_to (cr, cx, cy); - path (cr, 12, 3, 2048); - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_stroke(cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_dragon_solid_unaligned (cairo_t *cr, int width, int height, int loops) -{ - cairo_translate (cr, 0.01, 0.01); - return do_dragon_solid (cr, width, height, loops); -} - -static cairo_time_t -do_dragon_solid_aligned_clip (cairo_t *cr, int width, int height, int loops) -{ - cairo_reset_clip (cr); - cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10); - cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10); - cairo_clip (cr); - - return do_dragon_solid (cr, width, height, loops); -} - -static cairo_time_t -do_dragon_unaligned_solid_aligned_clip (cairo_t *cr, int width, int height, int loops) -{ - cairo_translate (cr, 0.01, 0.01); - cairo_reset_clip (cr); - cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10); - cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10); - cairo_clip (cr); - - return do_dragon_solid (cr, width, height, loops); -} - -static cairo_time_t -do_dragon_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops) -{ - cairo_reset_clip (cr); - cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10); - cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5); - cairo_clip (cr); - - return do_dragon_solid (cr, width, height, loops); -} - -static cairo_time_t -do_dragon_unaligned_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops) -{ - cairo_translate (cr, 0.01, 0.01); - cairo_reset_clip (cr); - cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10); - cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5); - cairo_clip (cr); - - return do_dragon_solid (cr, width, height, loops); -} - -static cairo_time_t -do_dragon_solid_circle_clip (cairo_t *cr, int width, int height, int loops) -{ - cairo_reset_clip (cr); - cairo_arc (cr, width/2., height/2., MIN (width, height)/2. - 10, 0, 2 * M_PI); - cairo_clip (cr); - - return do_dragon_solid (cr, width, height, loops); -} - -cairo_bool_t -dragon_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "dragon", NULL); -} - -void -dragon (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "dragon-solid", do_dragon_solid, NULL); - cairo_perf_run (perf, "dragon-unaligned-solid", do_dragon_solid_unaligned, NULL); - cairo_perf_run (perf, "dragon-solid-aligned-clip", do_dragon_solid_aligned_clip, NULL); - cairo_perf_run (perf, "dragon-unaligned-solid-aligned-clip", do_dragon_unaligned_solid_aligned_clip, NULL); - cairo_perf_run (perf, "dragon-solid-unaligned-clip", do_dragon_solid_unaligned_clip, NULL); - cairo_perf_run (perf, "dragon-unaligned-solid-unaligned-clip", do_dragon_unaligned_solid_unaligned_clip, NULL); - cairo_perf_run (perf, "dragon-solid-circle-clip", do_dragon_solid_circle_clip, NULL); - cairo_perf_run (perf, "dragon", do_dragon, NULL); -} diff --git a/perf/micro/fill-clip.c b/perf/micro/fill-clip.c deleted file mode 100644 index 2d014aca8..000000000 --- a/perf/micro/fill-clip.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -/* Compares the overhead for WebKit's drawRect() */ - -#include "cairo-perf.h" - -#include <pixman.h> - -static cairo_time_t -clip_paint (cairo_t *cr, int width, int height, int loops) -{ - int x = width/4, w = width/2; - int y = height/4, h = height/2; - - cairo_perf_timer_start (); - - while (loops--) { - cairo_reset_clip (cr); - cairo_rectangle (cr, x, y, w, h); - cairo_clip (cr); - cairo_paint (cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -rect_fill (cairo_t *cr, int width, int height, int loops) -{ - int x = width/4, w = width/2; - int y = height/4, h = height/2; - - cairo_perf_timer_start (); - - while (loops--) { - cairo_rectangle (cr, x, y, w, h); - cairo_fill (cr); - } - - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -direct (cairo_t *cr, int width, int height, int loops) -{ - int x = width/4, w = width/2; - int y = height/4, h = height/2; - cairo_surface_t *surface, *image; - uint8_t *data; - int stride, bpp; - - - surface = cairo_get_target (cr); - image = cairo_surface_map_to_image (surface, NULL); - data = cairo_image_surface_get_data (image); - stride = cairo_image_surface_get_stride (image); - - switch (cairo_image_surface_get_format (image)) { - default: - case CAIRO_FORMAT_INVALID: - case CAIRO_FORMAT_A1: bpp = 0; break; - case CAIRO_FORMAT_A8: bpp = 8; break; - case CAIRO_FORMAT_RGB16_565: bpp = 16; break; - case CAIRO_FORMAT_RGB24: - case CAIRO_FORMAT_RGB30: - case CAIRO_FORMAT_ARGB32: bpp = 32; break; - } - - cairo_perf_timer_start (); - - while (loops--) { - pixman_fill ((uint32_t *)data, stride / sizeof(uint32_t), bpp, - x, y, w, h, - -1); - } - - cairo_perf_timer_stop (); - - cairo_surface_unmap_image (surface, image); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -fill_clip_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "fillclip", NULL); -} - -void -fill_clip (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - - cairo_perf_run (perf, "fillclip-clip", clip_paint, NULL); - cairo_perf_run (perf, "fillclip-fill", rect_fill, NULL); - cairo_perf_run (perf, "fillclip-direct", direct, NULL); -} diff --git a/perf/micro/fill.c b/perf/micro/fill.c deleted file mode 100644 index d356c26d5..000000000 --- a/perf/micro/fill.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Red Hat, Inc. not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Red Hat, Inc. makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - */ - -#include "cairo-perf.h" - -static cairo_time_t -do_fill (cairo_t *cr, int width, int height, int loops) -{ - cairo_arc (cr, - width/2.0, height/2.0, - width/3.0, - 0, 2 * M_PI); - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_fill_annuli (cairo_t *cr, int width, int height, int loops) -{ - cairo_new_sub_path (cr); - cairo_arc (cr, - width/2.0, height/2.0, - width/3.0, - 0, 2 * M_PI); - - cairo_new_sub_path (cr); - cairo_arc_negative (cr, - width/2.0, height/2.0, - width/4.0, - 2 * M_PI, 0); - - cairo_new_sub_path (cr); - cairo_arc (cr, - width/2.0, height/2.0, - width/6.0, - 0, 2 * M_PI); - - cairo_new_sub_path (cr); - cairo_arc_negative (cr, - width/2.0, height/2.0, - width/8.0, - 2 * M_PI, 0); - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_fill_eo_noaa (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); - cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); - - cairo_arc (cr, - width/2.0, height/2.0, - width/3.0, - 0, 2 * M_PI); - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -fill_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "fill", NULL); -} - -void -fill (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_cover_sources_and_operators (perf, "fill", do_fill, NULL); - cairo_perf_cover_sources_and_operators (perf, "fill-annuli", do_fill_annuli, NULL); - cairo_perf_cover_sources_and_operators (perf, "fill-eo-noaa", do_fill_eo_noaa, NULL); -} diff --git a/perf/micro/glyphs.c b/perf/micro/glyphs.c deleted file mode 100644 index 5f088b29e..000000000 --- a/perf/micro/glyphs.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Red Hat, Inc. not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Red Hat, Inc. makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static cairo_time_t -do_glyphs (double font_size, - cairo_antialias_t antialias, - cairo_t *cr, int width, int height, int loops) -{ - const char text[] = "the jay, pig, fox, zebra and my wolves quack"; - cairo_scaled_font_t *scaled_font; - cairo_glyph_t *glyphs = NULL, *glyphs_copy; - cairo_text_extents_t extents; - cairo_font_options_t *options; - cairo_status_t status; - double x, y; - int num_glyphs, n; - - options = cairo_font_options_create (); - cairo_font_options_set_antialias (options, antialias); - cairo_set_font_options (cr, options); - cairo_font_options_destroy (options); - - cairo_select_font_face (cr, - "@cairo:", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, font_size); - scaled_font = cairo_get_scaled_font (cr); - status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., - text, -1, - &glyphs, &num_glyphs, - NULL, NULL, - NULL); - if (status) - return 0; - - glyphs_copy = cairo_glyph_allocate (num_glyphs); - if (glyphs_copy == NULL) { - cairo_glyph_free (glyphs); - return 0; - } - - cairo_scaled_font_glyph_extents (scaled_font, - glyphs, num_glyphs, - &extents); - - cairo_perf_timer_start (); - - while (loops--) { - y = 0; - do { - x = 0; - do { - for (n = 0; n < num_glyphs; n++) { - glyphs_copy[n] = glyphs[n]; - glyphs_copy[n].x += x; - glyphs_copy[n].y += y; - } - cairo_show_glyphs (cr, glyphs_copy, num_glyphs); - - x += extents.width; - } while (x < width); - y += extents.height; - } while (y < height); - } - - cairo_perf_timer_stop (); - - cairo_glyph_free (glyphs); - cairo_glyph_free (glyphs_copy); - - return cairo_perf_timer_elapsed (); -} - -static double -count_glyphs (double font_size, - cairo_antialias_t antialias, - cairo_t *cr, int width, int height) -{ - const char text[] = "the jay, pig, fox, zebra and my wolves quack"; - cairo_scaled_font_t *scaled_font; - cairo_glyph_t *glyphs = NULL; - cairo_text_extents_t extents; - cairo_font_options_t *options; - cairo_status_t status; - int num_glyphs; - int glyphs_per_line, lines_per_loop; - - options = cairo_font_options_create (); - cairo_font_options_set_antialias (options, antialias); - cairo_set_font_options (cr, options); - cairo_font_options_destroy (options); - - cairo_select_font_face (cr, - "@cairo:", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, font_size); - scaled_font = cairo_get_scaled_font (cr); - status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., - text, -1, - &glyphs, &num_glyphs, - NULL, NULL, - NULL); - if (status) - return 0; - - cairo_scaled_font_glyph_extents (scaled_font, - glyphs, num_glyphs, - &extents); - cairo_glyph_free (glyphs); - - glyphs_per_line = num_glyphs * width / extents.width + 1; - lines_per_loop = height / extents.height + 1; - return glyphs_per_line * lines_per_loop / 1000.; /* kiloglyphs */ -} - -#define DECL(name,size, aa) \ -static cairo_time_t \ -do_glyphs##name (cairo_t *cr, int width, int height, int loops) \ -{ \ - return do_glyphs (size, aa, cr, width, height, loops); \ -} \ -\ -static double \ -count_glyphs##name (cairo_t *cr, int width, int height) \ -{ \ - return count_glyphs (size, aa, cr, width, height); \ -} - -DECL(8, 8, CAIRO_ANTIALIAS_GRAY) -DECL(10, 10, CAIRO_ANTIALIAS_GRAY) -DECL(12, 12, CAIRO_ANTIALIAS_GRAY) -DECL(16, 16, CAIRO_ANTIALIAS_GRAY) -DECL(20, 20, CAIRO_ANTIALIAS_GRAY) -DECL(24, 24, CAIRO_ANTIALIAS_GRAY) -DECL(32, 32, CAIRO_ANTIALIAS_GRAY) -DECL(40, 40, CAIRO_ANTIALIAS_GRAY) -DECL(48, 48, CAIRO_ANTIALIAS_GRAY) - -DECL(8ca, 8, CAIRO_ANTIALIAS_SUBPIXEL) -DECL(48ca, 48, CAIRO_ANTIALIAS_SUBPIXEL) - -DECL(8mono, 8, CAIRO_ANTIALIAS_NONE) -DECL(48mono, 48, CAIRO_ANTIALIAS_NONE) - -cairo_bool_t -glyphs_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "glyphs", NULL); -} - -void -glyphs (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_cover_sources_and_operators (perf, "glyphs8mono", do_glyphs8mono, count_glyphs8mono); - cairo_perf_cover_sources_and_operators (perf, "glyphs8", do_glyphs8, count_glyphs8); - cairo_perf_cover_sources_and_operators (perf, "glyphs8ca", do_glyphs8ca, count_glyphs8ca); - - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_set_source_rgb (cr, 0, 0, 0); - - cairo_perf_run (perf, "glyphs8", do_glyphs8, count_glyphs8); - cairo_perf_run (perf, "glyphs10", do_glyphs10, count_glyphs10); - cairo_perf_run (perf, "glyphs12", do_glyphs12, count_glyphs12); - cairo_perf_run (perf, "glyphs16", do_glyphs16, count_glyphs16); - cairo_perf_run (perf, "glyphs20", do_glyphs20, count_glyphs20); - cairo_perf_run (perf, "glyphs24", do_glyphs24, count_glyphs24); - cairo_perf_run (perf, "glyphs32", do_glyphs32, count_glyphs32); - cairo_perf_run (perf, "glyphs40", do_glyphs40, count_glyphs40); - cairo_perf_run (perf, "glyphs48", do_glyphs48, count_glyphs48); - - cairo_perf_cover_sources_and_operators (perf, "glyphs48mono", do_glyphs48mono, count_glyphs48mono); - cairo_perf_cover_sources_and_operators (perf, "glyphs48", do_glyphs48, count_glyphs48); - cairo_perf_cover_sources_and_operators (perf, "glyphs48ca", do_glyphs48ca, count_glyphs48ca); -} diff --git a/perf/micro/hash-table.c b/perf/micro/hash-table.c deleted file mode 100644 index d16291770..000000000 --- a/perf/micro/hash-table.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright © 2011 Andrea Canciani - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Red Hat, Inc. not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Red Hat, Inc. makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Andrea Canciani <ranma42@gmail.com> - */ - -#include "cairo-perf.h" - -#define ITER 1000 -#define HOLDOVERS 256 -#define LIVE_ENTRIES 257 -#define ACTIVE_FONTS (LIVE_ENTRIES - HOLDOVERS - 1) - -/* - * The original implementation of hash tables was very inefficient, as - * pointed out in https://bugs.freedesktop.org/show_bug.cgi?id=17399 - * - * This benchmark tries to fill up the scaled_font_map hash table to - * show the O(n) behavior. - */ - -static cairo_time_t -do_hash_table (cairo_t *cr, int width, int height, int loops) -{ - /* - * Microsoft C Compiler complains that: - * error C2466: cannot allocate an array of constant size 0 - * so we add an unused element to make it happy - */ - cairo_scaled_font_t *active_fonts[ACTIVE_FONTS + 1]; - cairo_matrix_t m; - int i; - - cairo_matrix_init_identity (&m); - - /* Touch HOLDOVERS scaled fonts to fill up the holdover list. */ - for (i = 0; i < HOLDOVERS; i++) { - m.yy = m.xx * (i + 1); - cairo_set_font_matrix (cr, &m); - cairo_get_scaled_font (cr); - } - - /* - * Reference some scaled fonts so that they will be kept in the - * scaled fonts map. We want LIVE_ENTRIES elements in the font - * map, but cairo keeps HOLDOVERS recently used fonts in it and we - * will be activating a new font in the cr context, so we just - * keep references to ACTIVE_FONTS fonts. - * - * Note: setting LIVE_ENTRIES == HOLDOVERS+1 means that we keep no - * font in active_fonts and the slowness is caused by the holdover - * fonts only. - */ - for (i = 0; i < ACTIVE_FONTS; i++) { - cairo_scaled_font_t *scaled_font; - - m.yy = m.xx * (i + 1); - cairo_set_font_matrix (cr, &m); - - scaled_font = cairo_get_scaled_font (cr); - active_fonts[i] = cairo_scaled_font_reference (scaled_font); - } - - cairo_perf_timer_start (); - - while (loops--) { - m.xx += 1.0; - - /* Generate ITER new scaled fonts per loop */ - for (i = 0; i < ITER; i++) { - m.yy = m.xx * (i + 1); - cairo_set_font_matrix (cr, &m); - cairo_get_scaled_font (cr); - } - } - - cairo_perf_timer_stop (); - - for (i = 0; i < ACTIVE_FONTS; i++) - cairo_scaled_font_destroy (active_fonts[i]); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -hash_table_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "hash-table", NULL); -} - -void -hash_table (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_cover_sources_and_operators (perf, "hash-table", - do_hash_table, NULL); -} diff --git a/perf/micro/hatching.c b/perf/micro/hatching.c deleted file mode 100644 index d1d9fb8a6..000000000 --- a/perf/micro/hatching.c +++ /dev/null @@ -1,202 +0,0 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -#include "cairo-perf.h" -#include <assert.h> - - -#define STEP 5 -#define WIDTH 100 -#define HEIGHT 100 - -static void path (cairo_t *cr, unsigned int width, unsigned int height) -{ - unsigned int i; - - for (i = 0; i < width+1; i += STEP) { - cairo_rectangle (cr, i-1, -1, 2, height+2); - cairo_rectangle (cr, -1, i-1, width+2, 2); - } -} - -static void aa (cairo_t *cr) -{ - cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); -} - -static void mono (cairo_t *cr) -{ - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); -} - -static void aligned (cairo_t *cr, int width, int height) -{ -} - -static void misaligned (cairo_t *cr, int width, int height) -{ - cairo_translate (cr, 0.25, 0.25); -} - -static void rotated (cairo_t *cr, int width, int height) -{ - cairo_translate (cr, width/2, height/2); - cairo_rotate (cr, M_PI/4); - cairo_translate (cr, -width/2, -height/2); -} - -static void clip (cairo_t *cr) -{ - cairo_clip (cr); - cairo_paint (cr); -} - -static void clip_alpha (cairo_t *cr) -{ - cairo_clip (cr); - cairo_paint_with_alpha (cr, .5); -} - -static cairo_time_t -draw (cairo_t *cr, - void (*prepare) (cairo_t *cr), - void (*transform) (cairo_t *cr, int width, int height), - void (*op) (cairo_t *cr), - int width, int height, int loops) -{ - cairo_save (cr); - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_paint (cr); - cairo_set_source_rgb (cr, 1, 0, 0); - - prepare (cr); - - cairo_perf_timer_start (); - while (loops--) { - cairo_save (cr); - transform (cr, width, height); - path (cr, width, height); - op (cr); - cairo_restore (cr); - } - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -draw_aligned_aa (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, aa, aligned, cairo_fill, - width, height, loops); -} - -static cairo_time_t -draw_misaligned_aa (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, aa, misaligned, cairo_fill, - width, height, loops); -} - -static cairo_time_t -draw_rotated_aa (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, aa, rotated, cairo_fill, - width, height, loops); -} - -static cairo_time_t -draw_aligned_mono (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, mono, aligned, cairo_fill, - width, height, loops); -} - -static cairo_time_t -draw_misaligned_mono (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, mono, misaligned, cairo_fill, - width, height, loops); -} - -static cairo_time_t -draw_rotated_mono (cairo_t *cr, int width, int height, int loops) -{ - return draw(cr, mono, rotated, cairo_fill, - width, height, loops); -} - -#define F(name, op,transform,aa) \ -static cairo_time_t \ -draw_##name (cairo_t *cr, int width, int height, int loops) \ -{ return draw(cr, (aa), (transform), (op), width, height, loops); } - -F(clip_aligned, clip, aligned, aa) -F(clip_misaligned, clip, misaligned, aa) -F(clip_rotated, clip, rotated, aa) -F(clip_aligned_mono, clip, aligned, mono) -F(clip_misaligned_mono, clip, misaligned, mono) -F(clip_rotated_mono, clip, rotated, mono) - -F(clip_alpha_aligned, clip_alpha, aligned, aa) -F(clip_alpha_misaligned, clip_alpha, misaligned, aa) -F(clip_alpha_rotated, clip_alpha, rotated, aa) -F(clip_alpha_aligned_mono, clip_alpha, aligned, mono) -F(clip_alpha_misaligned_mono, clip_alpha, misaligned, mono) -F(clip_alpha_rotated_mono, clip_alpha, rotated, mono) - -cairo_bool_t -hatching_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "hatching", NULL); -} - -void -hatching (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "hatching-aligned-aa", draw_aligned_aa, NULL); - cairo_perf_run (perf, "hatching-misaligned-aa", draw_misaligned_aa, NULL); - cairo_perf_run (perf, "hatching-rotated-aa", draw_rotated_aa, NULL); - cairo_perf_run (perf, "hatching-aligned-mono", draw_aligned_mono, NULL); - cairo_perf_run (perf, "hatching-misaligned-mono", draw_misaligned_mono, NULL); - cairo_perf_run (perf, "hatching-rotated-mono", draw_rotated_mono, NULL); - - cairo_perf_run (perf, "hatching-clip-aligned-aa", draw_clip_aligned, NULL); - cairo_perf_run (perf, "hatching-clip-misaligned-aa", draw_clip_misaligned, NULL); - cairo_perf_run (perf, "hatching-clip-rotated-aa", draw_clip_rotated, NULL); - cairo_perf_run (perf, "hatching-clip-aligned-mono", draw_clip_aligned_mono, NULL); - cairo_perf_run (perf, "hatching-clip-misaligned-mono", draw_clip_misaligned_mono, NULL); - cairo_perf_run (perf, "hatching-clip-rotated-mono", draw_clip_rotated_mono, NULL); - - cairo_perf_run (perf, "hatching-clip-alpha-aligned-aa", draw_clip_alpha_aligned, NULL); - cairo_perf_run (perf, "hatching-clip-alpha-misaligned-aa", draw_clip_alpha_misaligned, NULL); - cairo_perf_run (perf, "hatching-clip-alpha-rotated-aa", draw_clip_alpha_rotated, NULL); - cairo_perf_run (perf, "hatching-clip-alpha-aligned-mono", draw_clip_alpha_aligned_mono, NULL); - cairo_perf_run (perf, "hatching-clip-alpha-misaligned-mono", draw_clip_alpha_misaligned_mono, NULL); - cairo_perf_run (perf, "hatching-clip-alpha-rotated-mono", draw_clip_alpha_rotated_mono, NULL); -} diff --git a/perf/micro/intersections.c b/perf/micro/intersections.c deleted file mode 100644 index 57931faf8..000000000 --- a/perf/micro/intersections.c +++ /dev/null @@ -1,160 +0,0 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* cairo - a vector graphics library with display and print output - * - * Copyright (c) 2008 M Joonas Pihlaja - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -#include "cairo-perf.h" - -#define NUM_SEGMENTS 256 - -static unsigned state; -static double -uniform_random (double minval, double maxval) -{ - static unsigned const poly = 0x9a795537U; - unsigned n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -draw_random (cairo_t *cr, cairo_fill_rule_t fill_rule, - int width, int height, int loops) -{ - double x[NUM_SEGMENTS]; - double y[NUM_SEGMENTS]; - int i; - - cairo_save (cr); - cairo_set_source_rgb (cr, 0, 0, 0); - cairo_paint (cr); - - for (i = 0; i < NUM_SEGMENTS; i++) { - x[i] = uniform_random (0, width); - y[i] = uniform_random (0, height); - } - - state = 0x12345678; - cairo_translate (cr, 1, 1); - cairo_set_fill_rule (cr, fill_rule); - cairo_set_source_rgb (cr, 1, 0, 0); - - cairo_new_path (cr); - cairo_move_to (cr, 0, 0); - for (i = 0; i < NUM_SEGMENTS; i++) - cairo_line_to (cr, x[i], y[i]); - cairo_close_path (cr); - - cairo_perf_timer_start (); - while (loops--) - cairo_fill_preserve (cr); - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -draw_random_curve (cairo_t *cr, cairo_fill_rule_t fill_rule, - int width, int height, int loops) -{ - double x[3*NUM_SEGMENTS]; - double y[3*NUM_SEGMENTS]; - int i; - - cairo_save (cr); - cairo_set_source_rgb (cr, 0, 0, 0); - cairo_paint (cr); - - for (i = 0; i < 3*NUM_SEGMENTS; i++) { - x[i] = uniform_random (0, width); - y[i] = uniform_random (0, height); - } - - state = 0x12345678; - cairo_translate (cr, 1, 1); - cairo_set_fill_rule (cr, fill_rule); - cairo_set_source_rgb (cr, 1, 0, 0); - - cairo_new_path (cr); - cairo_move_to (cr, 0, 0); - for (i = 0; i < NUM_SEGMENTS; i++) { - cairo_curve_to (cr, - x[3*i+0], y[3*i+0], - x[3*i+1], y[3*i+1], - x[3*i+2], y[3*i+2]); - } - cairo_close_path (cr); - - cairo_perf_timer_start (); - while (loops--) - cairo_fill_preserve (cr); - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -random_eo (cairo_t *cr, int width, int height, int loops) -{ - return draw_random (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops); -} - -static cairo_time_t -random_nz (cairo_t *cr, int width, int height, int loops) -{ - return draw_random (cr, CAIRO_FILL_RULE_WINDING, width, height, loops); -} - -static cairo_time_t -random_curve_eo (cairo_t *cr, int width, int height, int loops) -{ - return draw_random_curve (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops); -} - -static cairo_time_t -random_curve_nz (cairo_t *cr, int width, int height, int loops) -{ - return draw_random_curve (cr, CAIRO_FILL_RULE_WINDING, width, height, loops); -} - -cairo_bool_t -intersections_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "intersections", NULL); -} - -void -intersections (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "intersections-nz-fill", random_nz, NULL); - cairo_perf_run (perf, "intersections-eo-fill", random_eo, NULL); - - cairo_perf_run (perf, "intersections-nz-curve-fill", random_curve_nz, NULL); - cairo_perf_run (perf, "intersections-eo-curve-fill", random_curve_eo, NULL); -} diff --git a/perf/micro/line.c b/perf/micro/line.c deleted file mode 100644 index 3ed5f8dac..000000000 --- a/perf/micro/line.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static cairo_time_t -horizontal (cairo_t *cr, int width, int height, int loops) -{ - double h = height/2 + .5; - - cairo_move_to (cr, 0, h); - cairo_line_to (cr, width, h); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -horizontal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return horizontal (cr, width, height, loops); -} - -static cairo_time_t -horizontal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return horizontal (cr, width, height, loops); -} - -static cairo_time_t -nearly_horizontal (cairo_t *cr, int width, int height, int loops) -{ - double h = height/2; - - cairo_move_to (cr, 0, h); - cairo_line_to (cr, width, h+1); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return nearly_horizontal (cr, width, height, loops); -} - -static cairo_time_t -nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return nearly_horizontal (cr, width, height, loops); -} - - -static cairo_time_t -vertical (cairo_t *cr, int width, int height, int loops) -{ - double w = width/2 + .5; - - cairo_move_to (cr, w, 0); - cairo_line_to (cr, w, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -vertical_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return vertical (cr, width, height, loops); -} - -static cairo_time_t -vertical_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return vertical (cr, width, height, loops); -} - -static cairo_time_t -nearly_vertical (cairo_t *cr, int width, int height, int loops) -{ - double w = width/2; - - cairo_move_to (cr, w, 0); - cairo_line_to (cr, w+1, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -nearly_vertical_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return nearly_vertical (cr, width, height, loops); -} - -static cairo_time_t -nearly_vertical_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return nearly_vertical (cr, width, height, loops); -} - - -static cairo_time_t -diagonal (cairo_t *cr, int width, int height, int loops) -{ - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, width, height); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -diagonal_hair (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return diagonal (cr, width, height, loops); -} - -static cairo_time_t -diagonal_wide (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return diagonal (cr, width, height, loops); -} - -cairo_bool_t -line_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "line", NULL); -} - -void -line (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - - cairo_perf_run (perf, "line-hh", horizontal_hair, NULL); - cairo_perf_run (perf, "line-hw", horizontal_wide, NULL); - cairo_perf_run (perf, "line-nhh", nearly_horizontal_hair, NULL); - cairo_perf_run (perf, "line-nhw", nearly_horizontal_wide, NULL); - - cairo_perf_run (perf, "line-vh", vertical_hair, NULL); - cairo_perf_run (perf, "line-vw", vertical_wide, NULL); - cairo_perf_run (perf, "line-nvh", nearly_vertical_hair, NULL); - cairo_perf_run (perf, "line-nvw", nearly_vertical_wide, NULL); - - cairo_perf_run (perf, "line-dh", diagonal_hair, NULL); - cairo_perf_run (perf, "line-dw", diagonal_wide, NULL); -} diff --git a/perf/micro/long-dashed-lines.c b/perf/micro/long-dashed-lines.c deleted file mode 100644 index ba66a4af4..000000000 --- a/perf/micro/long-dashed-lines.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ -/* - * Copyright © 2007 Mozilla Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Vladimir Vukicevic <vladimir@pobox.com> - */ - -#include "cairo-perf.h" - -static cairo_time_t -do_long_dashed_lines (cairo_t *cr, int width, int height, int loops) -{ - double dash[2] = { 2.0, 2.0 }; - int i; - - cairo_save (cr); - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); - cairo_paint (cr); - - cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); - cairo_set_dash (cr, dash, 2, 0.0); - - cairo_new_path (cr); - cairo_set_line_width (cr, 1.0); - - for (i = 0; i < height-1; i++) { - double y0 = (double) i + 0.5; - cairo_move_to (cr, 0.0, y0); - cairo_line_to (cr, width, y0); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -long_dashed_lines_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "long-dashed-lines", NULL); -} - -void -long_dashed_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "long-dashed-lines", do_long_dashed_lines, NULL); -} diff --git a/perf/micro/long-lines.c b/perf/micro/long-lines.c deleted file mode 100644 index a0d134c2d..000000000 --- a/perf/micro/long-lines.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - */ - -#include "cairo-perf.h" - -/* This test case is designed to illustrate a performance bug in - * drawing very long lines, where most of the line is out of bounds of - * the destination surface, (but some portion of the line is - * visibile). These results are in the "long-lines-uncropped" report. - * - * For comparison, this test also renders the visible portions of the - * same lines, (this is the "long-lines-cropped" report). - */ - -typedef enum { - LONG_LINES_CROPPED = 0x1, - LONG_LINES_ONCE = 0x2, -} long_lines_crop_t; -#define NUM_LINES 20 -#define LONG_FACTOR 50.0 - -static cairo_time_t -do_long_lines (cairo_t *cr, int width, int height, int loops, long_lines_crop_t crop) -{ - int i; - double x, y, dx, dy, min_x, min_y, max_x, max_y; - double outer_width, outer_height; - - cairo_save (cr); - - cairo_translate (cr, width / 2, height / 2); - - if (crop & LONG_LINES_CROPPED) { - outer_width = width; - outer_height = height; - cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); /* green */ - } else { - outer_width = LONG_FACTOR * width; - outer_height = LONG_FACTOR * height; - cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* red */ - } - - min_x = x = - outer_width / 2.0; - min_y = y = - outer_height / 2.0; - max_x = outer_width / 2.0; - max_y = outer_height / 2.0; - dx = outer_width / NUM_LINES; - dy = outer_height / NUM_LINES; - - cairo_perf_timer_start (); - - while (loops--) { - for (i = 0; i <= NUM_LINES; i++) { - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, x, min_y); - if ((crop & LONG_LINES_ONCE) == 0) - cairo_stroke (cr); - - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, x, max_y); - if ((crop & LONG_LINES_ONCE) == 0) - cairo_stroke (cr); - - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, min_x, y); - if ((crop & LONG_LINES_ONCE) == 0) - cairo_stroke (cr); - - cairo_move_to (cr, 0, 0); - cairo_line_to (cr, max_x, y); - if ((crop & LONG_LINES_ONCE) == 0) - cairo_stroke (cr); - - x += dx; - y += dy; - } - if (crop & LONG_LINES_ONCE) - cairo_stroke (cr); - } - - cairo_perf_timer_stop (); - - cairo_restore (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -long_lines_uncropped (cairo_t *cr, int width, int height, int loops) -{ - return do_long_lines (cr, width, height, loops, 0); -} - -static cairo_time_t -long_lines_uncropped_once (cairo_t *cr, int width, int height, int loops) -{ - return do_long_lines (cr, width, height, loops, LONG_LINES_ONCE); -} - -static cairo_time_t -long_lines_cropped (cairo_t *cr, int width, int height, int loops) -{ - return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED); -} - -static cairo_time_t -long_lines_cropped_once (cairo_t *cr, int width, int height, int loops) -{ - return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED | LONG_LINES_ONCE); -} - -cairo_bool_t -long_lines_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "long-lines", NULL); -} - -void -long_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "long-lines-uncropped", long_lines_uncropped, NULL); - cairo_perf_run (perf, "long-lines-uncropped-once", long_lines_uncropped_once, NULL); - cairo_perf_run (perf, "long-lines-cropped", long_lines_cropped, NULL); - cairo_perf_run (perf, "long-lines-cropped-once", long_lines_cropped_once, NULL); -} diff --git a/perf/micro/many-curves.c b/perf/micro/many-curves.c deleted file mode 100644 index f985d349a..000000000 --- a/perf/micro/many-curves.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static uint32_t state; - -static double -uniform_random (double minval, double maxval) -{ - static uint32_t const poly = 0x9a795537U; - uint32_t n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -do_many_curves_stroked (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); - for (count = 0; count < 1000; count++) { - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_curves_hair_stroked (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 1.); - return do_many_curves_stroked (cr, width, height, loops); -} - -static cairo_time_t -do_many_curves_wide_stroked (cairo_t *cr, int width, int height, int loops) -{ - cairo_set_line_width (cr, 5.); - return do_many_curves_stroked (cr, width, height, loops); -} - -static cairo_time_t -do_many_curves_filled (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double x0 = uniform_random (0, width); - double x1 = uniform_random (0, width); - double x2 = uniform_random (0, width); - double x3 = uniform_random (0, width); - double xm = uniform_random (0, width); - double xn = uniform_random (0, width); - double y0 = uniform_random (0, height); - double y1 = uniform_random (0, height); - double y2 = uniform_random (0, height); - double y3 = uniform_random (0, height); - double ym = uniform_random (0, height); - double yn = uniform_random (0, height); - cairo_move_to (cr, xm, ym); - cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); - cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); - cairo_close_path (cr); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -many_curves_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "many-curves", NULL); -} - -void -many_curves (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_set_source_rgb (cr, 1., 1., 1.); - - cairo_perf_run (perf, "many-curves-hair-stroked", do_many_curves_hair_stroked, NULL); - cairo_perf_run (perf, "many-curves-wide-stroked", do_many_curves_wide_stroked, NULL); - cairo_perf_run (perf, "many-curves-filled", do_many_curves_filled, NULL); -} diff --git a/perf/micro/many-fills.c b/perf/micro/many-fills.c deleted file mode 100644 index 9d3fd6435..000000000 --- a/perf/micro/many-fills.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - - -/* This is a variant on many strokes where we precompute - * a simplified stroke-to-path. - * When we have a real stroke-to-path, it would useful to compare the cost - * of stroking vs filling the "identical" paths. - */ - -#include "cairo-perf.h" - -static uint32_t state; - -static double -uniform_random (double minval, double maxval) -{ - static uint32_t const poly = 0x9a795537U; - uint32_t n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -do_many_fills_ha (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double y = floor (uniform_random (0, height)); - double x = floor (uniform_random (0, width)); - cairo_rectangle (cr, x, y, ceil (uniform_random (0, width)) - x, 1); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_fills_h (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double y = uniform_random (0, height); - double x = uniform_random (0, width); - cairo_rectangle (cr, x, y, uniform_random (0, width) - x, 1); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_fills_va (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double x = floor (uniform_random (0, width)); - double y = floor (uniform_random (0, height)); - cairo_rectangle (cr, x, y, 1, ceil (uniform_random (0, height) - y)); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_fills_v (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double x = uniform_random (0, width); - double y = uniform_random (0, height); - cairo_rectangle (cr, x, y, 1, uniform_random (0, height) - y); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_fills (cairo_t *cr, int width, int height, int loops) -{ - int count; - - /* lots and lots of overlapping stroke-like fills */ - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - cairo_save (cr); - cairo_translate (cr, - uniform_random (0, width), - uniform_random (0, height)); - cairo_rotate (cr, uniform_random (-M_PI,M_PI)); - cairo_rectangle (cr, 0, 0, uniform_random (0, width), 1); - cairo_restore (cr); - } - - cairo_perf_timer_start (); - - while (loops--) - cairo_fill_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -many_fills_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "many-fills", NULL); -} - -void -many_fills (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "many-fills-halign", do_many_fills_ha, NULL); - cairo_perf_run (perf, "many-fills-valign", do_many_fills_va, NULL); - cairo_perf_run (perf, "many-fills-horizontal", do_many_fills_h, NULL); - cairo_perf_run (perf, "many-fills-vertical", do_many_fills_v, NULL); - cairo_perf_run (perf, "many-fills-random", do_many_fills, NULL); -} diff --git a/perf/micro/many-strokes.c b/perf/micro/many-strokes.c deleted file mode 100644 index 9aeb393de..000000000 --- a/perf/micro/many-strokes.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static uint32_t state; - -static double -uniform_random (double minval, double maxval) -{ - static uint32_t const poly = 0x9a795537U; - uint32_t n = 32; - while (n-->0) - state = 2*state < state ? (2*state ^ poly) : 2*state; - return minval + state * (maxval - minval) / 4294967296.0; -} - -static cairo_time_t -do_many_strokes_ha (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double h = floor (uniform_random (0, height)) + .5; - cairo_move_to (cr, floor (uniform_random (0, width)), h); - cairo_line_to (cr, ceil (uniform_random (0, width)), h); - } - - cairo_set_line_width (cr, 1.); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_strokes_h (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double h = uniform_random (0, height); - cairo_move_to (cr, uniform_random (0, width), h); - cairo_line_to (cr, uniform_random (0, width), h); - } - - cairo_set_line_width (cr, 1.); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_strokes_va (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double v = floor (uniform_random (0, width)) + .5; - cairo_move_to (cr, v, floor (uniform_random (0, height))); - cairo_line_to (cr, v, ceil (uniform_random (0, height))); - } - - cairo_set_line_width (cr, 1.); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_strokes_v (cairo_t *cr, int width, int height, int loops) -{ - int count; - - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - double v = uniform_random (0, width); - cairo_move_to (cr, v, uniform_random (0, height)); - cairo_line_to (cr, v, uniform_random (0, height)); - } - - cairo_set_line_width (cr, 1.); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_many_strokes (cairo_t *cr, int width, int height, int loops) -{ - int count; - - /* lots and lots of overlapping strokes */ - state = 0xc0ffee; - for (count = 0; count < 1000; count++) { - cairo_line_to (cr, - uniform_random (0, width), - uniform_random (0, height)); - } - - cairo_set_line_width (cr, 1.); - - cairo_perf_timer_start (); - - while (loops--) - cairo_stroke_preserve (cr); - - cairo_perf_timer_stop (); - - cairo_new_path (cr); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -many_strokes_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "many-strokes", NULL); -} - -void -many_strokes (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "many-strokes-halign", do_many_strokes_ha, NULL); - cairo_perf_run (perf, "many-strokes-valign", do_many_strokes_va, NULL); - cairo_perf_run (perf, "many-strokes-horizontal", do_many_strokes_h, NULL); - cairo_perf_run (perf, "many-strokes-vertical", do_many_strokes_v, NULL); - cairo_perf_run (perf, "many-strokes-random", do_many_strokes, NULL); -} diff --git a/perf/micro/mask.c b/perf/micro/mask.c deleted file mode 100644 index 11a3ba730..000000000 --- a/perf/micro/mask.c +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright © 2006 Red Hat, Inc. - * Copyright © 2009 Chris Wilson - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of - * Red Hat, Inc. not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Red Hat, Inc. makes no representations about the - * suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -#include "cairo-perf.h" - -static cairo_time_t -do_mask_solid (cairo_t *cr, int width, int height, int loops) -{ - cairo_pattern_t *mask; - - mask = cairo_pattern_create_rgba (0, 0, 0, .5); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_surface_t * -init_surface (cairo_surface_t *surface, int width, int height) -{ - cairo_t *cr; - - cr = cairo_create (surface); - cairo_surface_destroy (surface); - - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgb (cr, 0, 0, 0); /* back */ - cairo_paint (cr); - - cairo_set_source_rgba (cr, 1, 1, 1, 0.5); /* 50% */ - cairo_new_path (cr); - cairo_rectangle (cr, 0, 0, width/2.0, height/2.0); - cairo_rectangle (cr, width/2.0, height/2.0, width/2.0, height/2.0); - cairo_fill (cr); - - surface = cairo_surface_reference (cairo_get_target (cr)); - cairo_destroy (cr); - - return surface; -} - -static cairo_time_t -do_mask_image (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - - surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_image_half (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - cairo_matrix_t matrix; - - surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - cairo_matrix_init_scale (&matrix, .5, .5); - cairo_pattern_set_matrix (mask, &matrix); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_image_double (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - cairo_matrix_t matrix; - - surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - cairo_matrix_init_scale (&matrix, 2., 2.); - cairo_pattern_set_matrix (mask, &matrix); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_similar (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - - surface = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_ALPHA, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_similar_half (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - cairo_matrix_t matrix; - - surface = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_ALPHA, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - cairo_matrix_init_scale (&matrix, .5, .5); - cairo_pattern_set_matrix (mask, &matrix); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_similar_double (cairo_t *cr, int width, int height, int loops) -{ - cairo_surface_t *surface; - cairo_pattern_t *mask; - cairo_matrix_t matrix; - - surface = cairo_surface_create_similar (cairo_get_group_target (cr), - CAIRO_CONTENT_ALPHA, width, height); - mask = cairo_pattern_create_for_surface (init_surface (surface, - width, - height)); - cairo_surface_destroy (surface); - cairo_matrix_init_scale (&matrix, 2., 2.); - cairo_pattern_set_matrix (mask, &matrix); - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_linear (cairo_t *cr, int width, int height, int loops) -{ - cairo_pattern_t *mask; - - mask = cairo_pattern_create_linear (0.0, 0.0, width, height); - cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */ - cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -do_mask_radial (cairo_t *cr, int width, int height, int loops) -{ - cairo_pattern_t *mask; - - mask = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, - width/2.0, height/2.0, width/2.0); - cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */ - cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */ - - cairo_perf_timer_start (); - - while (loops--) - cairo_mask (cr, mask); - - cairo_perf_timer_stop (); - - cairo_pattern_destroy (mask); - - return cairo_perf_timer_elapsed (); -} - -cairo_bool_t -mask_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "mask", NULL); -} - -void -mask (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - if (! cairo_perf_can_run (perf, "mask", NULL)) - return; - - cairo_perf_cover_sources_and_operators (perf, "mask-solid", - do_mask_solid, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-image", - do_mask_image, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-image-half", - do_mask_image_half, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-image-double", - do_mask_image_double, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-similar", - do_mask_similar, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-similar-half", - do_mask_similar_half, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-similar-double", - do_mask_similar_double, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-linear", - do_mask_linear, NULL); - cairo_perf_cover_sources_and_operators (perf, "mask-radial", - do_mask_radial, NULL); -} diff --git a/perf/micro/mosaic.c b/perf/micro/mosaic.c deleted file mode 100644 index ed30ae555..000000000 --- a/perf/micro/mosaic.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright © 2006 Joonas Pihlaja - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> - */ -#include "cairo-perf.h" - -/* Options passed in flags to mosaic_perform(): */ -#define MOSAIC_FILL 1 /* do rasterise */ -#define MOSAIC_TESSELLATE 0 /* just tessellate */ -#define MOSAIC_CURVE_TO 2 /* use curve bounded regions */ -#define MOSAIC_LINE_TO 0 /* use line bounded regions */ - -struct mosaic_region { - unsigned rgb; /* colour of this region in 0xRRGGBB format */ - unsigned ncurves; /* number of boundary curves. */ -}; - -struct mosaic_region_iter { - int do_curves; - struct mosaic_region const *region; - double const *points; -}; - -#include "mosaic.h" - -static void -mosaic_region_iter_init (struct mosaic_region_iter *iter, int do_curves) -{ - iter->region = mosaic_regions; - iter->points = mosaic_curve_points; - iter->do_curves = do_curves; -} - -/* Create the next closed region as a path. */ -static int -mosaic_next_path (cairo_t *cr, struct mosaic_region_iter *iter) -{ - double const *points = iter->points; - unsigned i; - unsigned ncurves = iter->region->ncurves; - if (0 == ncurves) { - return 0; - } - - cairo_new_path (cr); - cairo_move_to (cr, points[0], points[1]); - points += 2; - for (i=0; i < ncurves; i++, points += 6) { - if (iter->do_curves) { - cairo_curve_to (cr, - points[0], points[1], - points[2], points[3], - points[4], points[5]); - } - else { - cairo_line_to (cr, - points[4], points[5]); - } - } - cairo_close_path (cr); - { - unsigned rgb = iter->region->rgb; - double r = ((rgb >> 16) & 255) / 255.0; - double g = ((rgb >> 8) & 255) / 255.0; - double b = ((rgb >> 0) & 255) / 255.0; - cairo_set_source_rgb (cr, r, g, b); - } - - iter->points = iter->points + 2*(1 + 3*iter->region->ncurves); - iter->region++; - return 1; -} - -static cairo_time_t -mosaic_perform(cairo_t *cr, unsigned flags, int width, int height, int loops) -{ - struct mosaic_region_iter iter; - - /* Scale to fit the window.*/ - double minx = -40.7; - double maxx = 955.1; - double miny = -88.4; - double maxy = 884.5; - - cairo_identity_matrix (cr); - - if (flags & MOSAIC_FILL) { - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_rectangle (cr, 0, 0, width, height); - cairo_fill (cr); - } - - cairo_scale (cr, width / (maxx - minx) , height / (maxy - miny)); - cairo_translate (cr, -minx, -miny); - - /* Iterate over all closed regions in the mosaic filling or - * tessellating them as dictated by the flags. */ - - cairo_perf_timer_start (); - while (loops--) { - mosaic_region_iter_init (&iter, flags & MOSAIC_CURVE_TO); - while (mosaic_next_path (cr, &iter)) { - if (flags & MOSAIC_FILL) { - cairo_fill (cr); - } - else { - double x, y; - cairo_get_current_point (cr, &x, &y); - cairo_in_fill (cr, x, y); - } - } - } - cairo_perf_timer_stop (); - - return cairo_perf_timer_elapsed (); -} - -static cairo_time_t -mosaic_fill_curves (cairo_t *cr, int width, int height, int loops) -{ - return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_CURVE_TO, width, height, loops); -} - -static cairo_time_t -mosaic_fill_lines (cairo_t *cr, int width, int height, int loops) -{ - return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_LINE_TO, width, height, loops); -} - -static cairo_time_t -mosaic_tessellate_lines (cairo_t *cr, int width, int height, int loops) -{ - return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_LINE_TO, width, height, loops); -} - -static cairo_time_t -mosaic_tessellate_curves (cairo_t *cr, int width, int height, int loops) -{ - return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_CURVE_TO, width, height, loops); -} - -cairo_bool_t -mosaic_enabled (cairo_perf_t *perf) -{ - return cairo_perf_can_run (perf, "mosaic", NULL); -} - -void -mosaic (cairo_perf_t *perf, cairo_t *cr, int width, int height) -{ - cairo_perf_run (perf, "mosaic-fill-curves", mosaic_fill_curves, NULL); - cairo_perf_run (perf, "mosaic-fill-lines", mosaic_fill_lines, NULL); - cairo_perf_run (perf, "mosaic-tessellate-curves", mosaic_tessellate_curves, NULL); - cairo_perf_run (perf, "mosaic-tessellate-lines", mosaic_tessellate_lines, NULL); -} diff --git a/perf/micro/mosaic.h b/perf/micro/mosaic.h deleted file mode 100644 index e106864a3..000000000 --- a/perf/micro/mosaic.h +++ /dev/null @@ -1,4387 +0,0 @@ -/* Synthesised data. */ -static struct mosaic_region const mosaic_regions[] = { -{0xef55b4,7},{0xf93bc6,11},{0xf28085,5},{0x92acbc,7}, -{0x85c3b1,7},{0xc3bc79,5},{0xd09d8d,5},{0xa788cb,8}, -{0xeff90f,14},{0x976ef2,4},{0xf230d8,5},{0xe226ef,6}, -{0xf49571,9},{0xcb6cc1,4},{0xc8af80,5},{0xf71ce7,8}, -{0xd38b9a,6},{0xf70ff2,8},{0xec907e,4},{0xf44abc,5}, -{0xf42bd8,7},{0xcbbc71,5},{0xf7a45f,5},{0xb15aec,3}, -{0xfc6995,9},{0x42bef9,7},{0x83afc6,5},{0xbe9f9a,6}, -{0x95ef76,6},{0xfcc33b,20},{0xbc5ae2,5},{0x69f997,7}, -{0x9f69f2,7},{0x79bec3,7},{0xda3de2,6},{0x76dda7,6}, -{0xc888aa,7},{0xd871b1,9},{0xda29f7,14},{0xe03dda,9}, -{0xec29e2,5},{0xd82bf4,6},{0x8b8de2,6},{0xf7af52,3}, -{0x9f69f2,7},{0xf46c9a,9},{0xf74fb1,5},{0x21eaef,9}, -{0xea769a,8},{0x0feffc,5},{0xdada45,8},{0xafce7b,6}, -{0x48bef4,6},{0x9a79e5,3},{0xe2fc1c,7},{0xc3be76,9}, -{0xb9c37e,5},{0xc6b183,10},{0xa2acac,3},{0xc395a2,4}, -{0xbc88b4,7},{0xeaf41c,5},{0xea24ea,4},{0xd038f2,5}, -{0x5ae2bc,9},{0xdac15f,8},{0x5fe5b4,6},{0xce5ad3,15}, -{0xf419ec,4},{0xa7bc97,11},{0xea4ac3,6},{0xd02ef9,5}, -{0xb995aa,5},{0xef808b,6},{0xe22bea,34},{0xe24fc6,4}, -{0xef12f9,7},{0x7b9de0,8},{0x85ec85,4},{0xfc7e80,12}, -{0x9a85d8,5},{0xfc00fc,7},{0x9d90ce,5},{0xf4be45,9}, -{0xe5e52e,3},{0xfc0cef,7},{0xd83be5,8},{0x4dc6e5,5}, -{0xacda73,9},{0x4fc8e0,6},{0xbc88b6,4},{0xb4bc8b,6}, -{0xec45c6,8},{0x71d3b6,4},{0xe73dd5,5},{0x21fcda,4}, -{0xe055c6,9},{0x3becd0,8},{0x57e0c1,5},{0x71bec8,9}, -{0x8be28b,4},{0x4dddd0,9},{0xda9a85,6},{0xaa6ce2,4}, -{0x5ad5cb,9},{0x67f49d,12},{0xfc07f7,9},{0x42c8ec,16}, -{0xefc148,4},{0xda6eb1,7},{0x55bee7,4},{0xd33bea,6}, -{0x809fd8,14},{0xd82ef2,4},{0x21ddfc,5},{0x83e097,7}, -{0x8bcba2,9},{0xd864bc,8},{0xa7d87b,6},{0xc3a78d,6}, -{0xb9a79a,8},{0xd59590,3},{0xfc0af2,6},{0xe52be7,7}, -{0xce52d8,5},{0xe22bea,4},{0xe719f7,5},{0x909fcb,3}, -{0xa7da76,6},{0xdd38e5,4},{0xfc55aa,6},{0x19f2ef,6}, -{0x83da9d,5},{0x9fc892,6},{0xe51ef4,9},{0xce3dec,5}, -{0xea3dd0,7},{0x4ad3dd,6},{0x6ea2e7,5},{0xf92bd3,4}, -{0xc34aea,8},{0x2eddef,4},{0xe7799a,8},{0xe5799a,11}, -{0xe224f2,3},{0xf90af7,6},{0x61a2f4,6},{0xb67ec6,13}, -{0xe75cb4,7},{0xfcb945,16},{0xd3b173,7},{0xfc00fc,6}, -{0xd5ef33,5},{0x699df4,9},{0xf707f9,4},{0xdaea33,6}, -{0xe2dd38,3},{0xf2d036,5},{0xf248c1,6},{0xeaf21c,5}, -{0xec40cb,7},{0xf24abc,5},{0xf42bd8,4},{0xa757f9,5}, -{0xd02ef9,6},{0xfc0cf2,7},{0xb16cda,5},{0xea36d8,8}, -{0xd036f4,7},{0xb648fc,3},{0xea4dc1,4},{0x64c8cb,7}, -{0xfc05f7,3},{0xfc00fc,4},{0xf4a75f,6},{0xc85ad5,5}, -{0xd873ac,5},{0xd5a77b,11},{0xe7c84a,4},{0xec19f4,7}, -{0xc864ce,7},{0xcece5c,5},{0xe08b8d,5},{0xd84dd3,3}, -{0x07f9f7,9},{0x5cefac,3},{0xfc02f9,4},{0xd048e0,8}, -{0xef55b6,4},{0xa269ec,7},{0xec12f9,3},{0xd380a4,11}, -{0x5fcbd0,6},{0x90c1a7,5},{0x95dd85,5},{0xceda4f,9}, -{0x4fb9f2,14},{0xb65aea,7},{0xea838d,5},{0xf917ea,4}, -{0xc833fc,9},{0xe252c3,9},{0xef0ffc,7},{0x1cf2ec,9}, -{0x9f6cef,4},{0xf73dc6,12},{0x90b6b4,5},{0xb44ff7,7}, -{0xea2be2,12},{0xd02efc,17},{0xa276e2,4},{0x79c1c1,3}, -{0xc855dd,9},{0xb1d571,8},{0xb645fc,6},{0xd03bef,6}, -{0x42eccb,9},{0xea67aa,5},{0x9079ef,6},{0x9de773,7}, -{0xe55abc,6},{0xf421e5,3},{0x5cf9a4,6},{0xc373c1,5}, -{0x5fe2b6,4},{0xea24ec,6},{0x9af967,4},{0xf7be45,5}, -{0xd333f4,5},{0xc6d061,8},{0xb96cd3,8},{0xda64b9,6}, -{0xe79779,4},{0xac67e7,6},{0xcb67c8,4},{0xa45cf7,3}, -{0xd3859f,3},{0xd857c8,4},{0x42c1f7,8},{0xaf61e7,6}, -{0xea14fc,6},{0xda33ea,10},{0x5af2af,5},{0xbe40f9,3}, -{0x9de773,3},{0xe72be5,4},{0x4ae7c6,5},{0xaa88c8,8}, -{0x36f9cb,3},{0xc1a790,8},{0xf905fc,5},{0xbcaa95,6}, -{0x839dda,3},{0xfc00fc,6},{0xb6d86c,3},{0xdd40da,6}, -{0xb46cda,7},{0x839fd5,4},{0xc167d3,13},{0xf20ff7,9}, -{0xe024f4,9},{0xf41ee5,4},{0x909ad0,10},{0xb1d376,8}, -{0xce2efc,5},{0x29d5f9,7},{0xd0b96e,6},{0xdd69b4,5}, -{0xfc05f7,5},{0xdd26f7,4},{0xea1eef,6},{0xb64df7,9}, -{0x21e5f2,3},{0x4fd8d0,6},{0xd345e0,7},{0xfc00fc,3}, -{0xe569ac,5},{0xecb655,11},{0xfc5aa2,9},{0xb4d571,7}, -{0xaa57f7,6},{0xfc00fc,7},{0xe729ea,10},{0xea24ea,11}, -{0xb14df9,5},{0xf707fc,7},{0x5cd8c3,5},{0xea17f9,9}, -{0xc3d364,6},{0xa77ed3,4},{0x9569f9,8},{0x0ff4f4,4}, -{0xbc9aa4,7},{0xc140f7,10},{0xf705fc,8},{0xb44df9,4}, -{0xa479dd,5},{0xf705fc,5},{0xce8d9d,5},{0xf905f9,5}, -{0xdd2bef,7},{0xea14f9,5},{0xddbc61,5},{0xc13dfc,8}, -{0x79c8b6,10},{0xf79a67,6},{0xb4a79f,12},{0x97a7bc,7}, -{0xb9c17e,4},{0xf430d5,3},{0x2ee0ea,7},{0xf919e7,4}, -{0xeada33,9},{0xa2da7e,7},{0x8bec80,6},{0xf412f4,5}, -{0xa767ec,3},{0xd824fc,7},{0xe224f2,3},{0xfc07f7,4}, -{0xfc00fc,3},{0xe55cb6,8},{0xf9768b,7},{0xe5b45f,3}, -{0xd5978b,4},{0xf917e7,5},{0xf70ff4,7},{0x95e283,6}, -{0xb4b98d,5},{0xc83bf4,8},{0x9f88d3,7},{0xa473e0,9}, -{0x9569fc,10},{0x926cf9,7},{0xef14f4,7},{0xf7679a,4}, -{0xaa80ce,9},{0x45f9b9,5},{0xb4a2a2,10},{0xac88c6,5}, -{0xe75ab6,6},{0xa2fc5a,3},{0xc65cd8,7},{0x64e0b6,5}, -{0xfc6992,7},{0xf717ec,4},{0xf438ce,10},{0xf755ac,4}, -{0xf7aa57,6},{0xb9b688,3},{0xcb4de2,4},{0xf9f70a,9}, -{0x92d392,8},{0xef2be0,7},{0x92a7be,4},{0xa276e2,4}, -{0xc34fe5,5},{0xd5c164,9},{0xf219ec,4},{0xef5aaf,8}, -{0xa7c68d,6},{0xd369bc,7},{0xf912ef,4},{0xb9b48b,6}, -{0x3bc6f9,6},{0xe54ac8,5},{0xf71ce7,9},{0xbc4def,8}, -{0xe271a7,3},{0xcbc16e,5},{0x3dfcc1,3},{0x97bea2,7}, -{0xaaa4aa,13},{0x73ef95,5},{0xf74fb1,4},{0xc148ef,17}, -{0xfc26d8,4},{0xfc02fc,6},{0xb1da6c,6},{0xd5d84d,7}, -{0xf96c95,5},{0xf90fef,3},{0xea7b92,7},{0xbc4def,4}, -{0xf2a264,8},{0x40dadd,12},{0xf214f4,4},{0x38c3fc,3}, -{0xf705fc,7},{0xa29db9,3},{0xaaf25f,4},{0xdd9a83,12}, -{0xc188b1,6},{0xa27bda,9},{0x36dde5,4},{0x85bcb9,7}, -{0xfc00fc,5},{0xe76ca4,4},{0x95b6ac,6},{0xb6d071,7}, -{0xc857d8,3},{0xfc2bd3,4},{0xfc5aa4,4},{0xf417ec,5}, -{0xb471d3,7},{0x92b1b6,4},{0x6c90fc,7},{0x5abce2,7}, -{0xcb55d8,3},{0xce30f9,5},{0xea7b95,3},{0xec17f7,6}, -{0xf70ff4,3},{0xaa73dd,9},{0x9d69f4,3},{0xb457ef,6}, -{0xf236d0,6},{0x64e0b4,7},{0xddcb52,4},{0xd0d355,7}, -{0x5fd5c3,6},{0xf42bd8,12},{0x55e2c1,4},{0xb1b492,4}, -{0xdd4dd0,4},{0xbc88b6,3},{0xea21ec,4},{0xf7649d,8}, -{0xb16cda,3},{0x9fa4b6,8},{0xea17f9,4},{0x1efce0,3}, -{0xbec179,7},{0xbeb18b,6},{0x9da4b6,6},{0x48b4fc,4}, -{0x7bfc83,14},{0xacf25c,10},{0xe0d842,4},{0xf9768b,5}, -{0xf90ff2,7},{0xfc00fc,8},{0xf20ff7,5},{0xec7e90,7}, -{0xbc42f9,3},{0xf712ef,5},{0xf902fc,6},{0xf77e83,7}, -{0xb1b197,5},{0xda6cb4,7},{0xf4a264,7},{0xa78dc6,6}, -{0xf21cea,4},{0xa48dc8,6},{0x6997f9,5},{0x67d3be,5}, -{0x4ad0e0,6},{0xcbbe6e,6},{0xcb76b6,10},{0xd030f9,6}, -{0xa29fb6,6},{0xda24fc,5},{0xf4bc48,3},{0xd0909a,6}, -{0xf252b6,8},{0x6cb4da,4},{0xdd40dd,11},{0x8b71fc,9}, -{0x80c8af,7},{0xb15fe7,4},{0x79ef90,6},{0x71b1d8,7}, -{0x61a4f2,9},{0x42dadd,6},{0xaf4ffc,3},{0x9a79e7,5}, -{0xea17f7,6},{0xc89f92,4},{0xb6d869,12},{0xda2eef,4}, -{0xf72ed5,6},{0xe057c3,6},{0xb6b190,6},{0xda48d5,5}, -{0xe0a476,3},{0xfce01c,6},{0x9dbe9f,13},{0xafce7e,4}, -{0xf905fc,6},{0xfc0cef,5},{0x9facaf,6},{0xb6af95,6}, -{0x52ced8,6},{0xd373b4,3},{0xce5cd0,8},{0xe752c1,5}, -{0xf7ac55,8},{0x7bbec1,6},{0xb4d571,4},{0xf90af7,5}, -{0xc833fc,7},{0xbe4dec,8},{0x92beaa,8},{0xfcb945,7}, -{0xc1d067,3},{0xdd45d8,7},{0xceb971,3},{0xf44ab9,4}, -{0xbeac8d,4},{0xf2af5a,15},{0xe05ac1,11},{0xd38b9d,4}, -{0xec0ffc,4},{0x80ec8d,7},{0xd0af7b,6},{0xef5cac,5}, -{0xdaa776,4},{0xd052d8,5},{0xb461e5,8},{0xef8388,7}, -{0xbea297,8},{0xce83a7,5},{0xda2ef2,3},{0x73b6ce,5}, -{0x83ec8b,9},{0xc840f2,7},{0xfc4faf,8},{0xfc14e7,4}, -{0xe742d0,9},{0x52aff7,4},{0xf214f4,4},{0x26f7da,5}, -{0xf2b94d,6},{0xe02eea,6},{0x76fc85,3},{0x858de7,4}, -{0xbc97a4,6},{0xd8aa79,4},{0x9d73ea,4},{0xdda279,5}, -{0xafc385,7},{0x33dde7,6},{0x64acea,8},{0xacce80,7}, -{0xef26e2,7},{0xb957e7,4},{0xdad548,4},{0xaf57f4,5}, -{0x9f73e5,3},{0xeae02e,7},{0xf70af7,8},{0xfc00fc,4}, -{0xea6ca4,6},{0x8885ec,3},{0xe23dda,4},{0xb461e5,10}, -{0xdd928b,6},{0x76cbb6,7},{0xfc00fc,5},{0xce8d9d,8}, -{0xafb692,12},{0xe79083,7},{0xfc0af2,3},{0xf926d8,8}, -{0xe219fc,5},{0xe7bc55,5},{0xcebc6e,3},{0xda73aa,4}, -{0xfc00fc,4},{0x52dace,5},{0xbcd864,6},{0x67e7ac,4}, -{0x33f9cb,3},{0x8bafc1,11},{0xd871af,6},{0xe78390,10}, -{0xb688bc,8},{0x5addc1,6},{0xf2d036,4},{0xf70ff2,9}, -{0xf4ea19,9},{0xfc02f9,6},{0x839fd8,3},{0xdd4dce,5}, -{0xec3dce,6},{0xcea783,6},{0xcbe745,5},{0xc1b483,7}, -{0x799fe0,5},{0xd340e7,7},{0x29ddf2,3},{0x73daac,6}, -{0xea33da,5},{0xe224f2,3},{0xd34fd5,5},{0xe245d3,8}, -{0xfc1edd,10},{0x3bf2cb,4},{0xdd9f7e,26},{0xe02eec,5}, -{0xf47195,4},{0xa461f4,5},{0x3ddae0,3},{0xaf5fea,6}, -{0xbccb73,6},{0xea26ea,8},{0xd82bf7,6},{0xac6ce0,7}, -{0xe524ef,4},{0xb6da69,6},{0xf224e2,5},{0xb95ce5,7}, -{0x73a4e0,7},{0xa4e076,7},{0xfc02f9,8},{0xec1eec,4}, -{0xf7da29,6},{0xc369ce,6},{0xd5c65c,9},{0xe51ef4,4}, -{0xf2a264,4},{0x809ddd,5},{0xd045e2,7},{0xaac888,6}, -{0xb44af9,3},{0xd84ad8,7},{0xf4ef14,5},{0x3bf7c8,5}, -{0xe730e0,4},{0x97b6ac,7},{0x8bda95,5},{0x88ec83,8}, -{0xece529,8},{0x9a80dd,10},{0xf412f4,7},{0x36efd5,6}, -{0xf95ca4,9},{0xd838e7,6},{0x9a69f7,7},{0xf730d3,4}, -{0xd526fc,5},{0x9f76e2,6},{0xe28395,8},{0xecaa61,6}, -{0x4ff4b4,7},{0xd079af,7},{0xa469ea,10},{0xfc21da,7}, -{0xb471d5,6},{0x7b88f7,4},{0xfc6797,4},{0x9daab4,5}, -{0x29f2dd,7},{0x8388ec,7},{0x4df9b1,4},{0xeaf21e,5}, -{0xf4c340,10},{0xf212f7,3},{0xf407fc,5},{0x4fb9ef,9}, -{0xd3b471,6},{0xef4dbe,12},{0x4af4bc,7},{0xe224f2,6}, -{0x36d0f2,8},{0xf707fc,4},{0xfc8d71,9},{0x95bea4,6}, -{0x90ef7b,4},{0x5adac6,5},{0x97b9a7,4},{0xc3c671,6}, -{0xfc12ec,5},{0xea1ef2,5},{0x8dd09d,4},{0xd82bf7,7}, -{0xb18dbc,7},{0xbc64da,6},{0xf28d7b,4},{0xef19ef,5}, -{0xc1e555,6},{0xfc3bc3,6},{0x9f88d3,5},{0xc3ec48,9}, -{0xc8979a,5},{0x5cc6d8,4},{0xf78080,6},{0xb17bcb,8}, -{0xea12fc,6},{0xc195a2,7},{0xef33d8,3},{0xa783ce,3}, -{0xf40af9,5},{0xa288d0,6},{0xf248be,4},{0x14e7fc,5}, -{0x83d3a4,8},{0xb4cb79,6},{0xbc7ebe,3},{0xfc8873,6}, -{0xe038e0,6},{0xc3ef48,6},{0xa25afc,10},{0xc1a792,6}, -{0x8d90dd,9},{0xc1be7b,5},{0x8bec80,5},{0xa4ef64,5}, -{0x38f7c8,11},{0xaf6eda,4},{0xd073b4,5},{0x79ceb4,7}, -{0xd5e540,6},{0xfc0fec,5},{0xf917ea,7},{0x64c8cb,4}, -{0x69e7a7,6},{0xa77ed3,5},{0xe52be7,6},{0x5aaaf4,7}, -{0xcb85a7,5},{0x8392e2,4},{0x5cb4ea,6},{0xe729e7,6}, -{0xc873bc,5},{0xeabc52,7},{0xf438ce,7},{0xea48c8,5}, -{0xef17f4,4},{0xfc00fc,6},{0xf97b85,14},{0x67ace7,3}, -{0xf452b1,7},{0xe2e038,4},{0xa4a7af,5},{0xddb469,3}, -{0xf21cec,7},{0x7bbec1,3},{0xda38e5,8},{0xc6a292,9}, -{0x6ecebc,9},{0x8dda90,4},{0xf921e0,8},{0xc88da4,5}, -{0x92aabc,4},{0x9a9dc3,5},{0x8dd895,4},{0x64d3c3,9}, -{0xa2f95f,7},{0xdd36e5,8},{0x83e790,11},{0xef26e2,5}, -{0xef55b4,9},{0x5fc3d8,6},{0xfc57a4,7},{0x9785dd,5}, -{0x809ddd,4},{0xc66cc8,8},{0xf236d3,5},{0xd338ef,6}, -{0xd8839f,4},{0xef30d8,3},{0x9a9ac6,5},{0xfc05f9,11}, -{0x958bda,11},{0xf902fc,8},{0xbe42f9,4},{0xbce557,6}, -{0xef4fb9,6},{0xf9af52,5},{0x97d38d,5},{0xf902fc,7}, -{0xf4a261,4},{0xd88897,7},{0x92e77e,7},{0x6c9df2,6}, -{0xce85a4,4},{0x9ae07e,8},{0xb1f255,8},{0xc6929f,6}, -{0xf2af5a,10},{0xe2977e,5},{0xe5cb4a,5},{0xfc14e7,3}, -{0xc14aef,3},{0xaff257,3},{0xe21cf9,11},{0xd05ccb,5}, -{0xf2ec1c,8},{0xb4b98b,9},{0xc183b6,3},{0xb455f2,7}, -{0x83aace,4},{0xe51cf9,4},{0xdd4fce,4},{0xb47ec8,3}, -{0x92da8b,4},{0xecb952,4},{0xf70af7,6},{0x7bbcc1,6}, -{0xf40cf9,5},{0xe2ce48,5},{0xf7b14f,5},{0xdd40da,4}, -{0x4fb9f2,7},{0x6eb1da,5},{0x9d90ce,6},{0xcb55d8,5}, -{0xd02efc,8},{0xd36eb9,6},{0xfc0cef,5},{0xe071aa,9}, -{0xe7ac67,3},{0xf4f40f,6},{0xe267af,4},{0xc3da5c,5}, -{0xb945fc,4},{0xeada33,6},{0x7197f2,7},{0xfc00fc,8}, -{0xd09d8d,5},{0x6e9fea,8},{0xd3a77e,4},{0xaa5ff2,6}, -{0xe269ac,5},{0xf426e0,6},{0xfc00fc,5},{0xec6ca2,10}, -{0xc638fc,7},{0xe54fc6,5},{0x5ac6da,3},{0xce67c6,6}, -{0xbe42f9,5},{0xce38f2,5},{0xbe5ae2,3},{0xd3ec38,8}, -{0x8b76f7,8},{0xb180c8,4},{0xd538ec,4},{0xddef2b,9}, -{0xf9c838,5},{0xf457ac,4},{0xf95aa7,7},{0xaf69e0,9}, -{0x67efa2,5},{0xa280d8,4},{0xa7d57b,7},{0xcbaf7e,4}, -{0x837bf9,4},{0xddc15c,6},{0xe221f4,3},{0xc6b480,5}, -{0xbc90af,10},{0x4dd3da,4},{0xbcb983,4},{0xe77997,7}, -{0xe05fb9,9},{0xc1b980,8},{0xdd55c6,7},{0xaf97b1,9}, -{0xec838b,4},{0xc39d9a,9},{0x6c97f7,5},{0xf7b44f,3}, -{0xb69fa4,7},{0x90ea7e,7},{0xe067b1,5},{0xd5cb5a,4}, -{0xc19a9f,8},{0xac67e7,8},{0xcee745,4},{0xf436d0,4}, -{0x73b1d5,7},{0xd3d84f,5},{0xdd42d8,5},{0xea907e,6}, -{0xc83bf4,7},{0xd84fd3,6},{0xe28890,3},{0x38e2e0,8}, -{0xec67a7,6},{0xcbc16e,8},{0x4ab1fc,7},{0x92d590,3}, -{0xaad876,4},{0xb683c1,4},{0xaa55f9,5},{0xea24ea,6}, -{0xf90fef,6},{0xf738c8,3},{0xcb5ad5,7},{0xec21ec,5}, -{0xce61c8,3},{0xa76ce7,3},{0xf41ee5,7},{0xcebe6c,3}, -{0x57dac6,9},{0xf46e97,3},{0x8be08d,7},{0xc148ef,9}, -{0xf926da,8},{0xe029ef,6},{0xfc00fc,5},{0x3dcbf2,4}, -{0xef0ffc,5},{0x95b6ac,9},{0x7be59a,5},{0xda2ef2,8}, -{0xda30ef,5},{0xfc24d8,3},{0x73d3b4,3},{0xddf229,4}, -{0x8883ef,5},{0x5aefaf,6},{0x9797cb,6},{0xcbc16c,5}, -{0xef19f2,5},{0xd3bc6c,3},{0xda5cc3,8},{0x52f9ac,7}, -{0xa7c888,4},{0x69d8b6,7},{0xbc45f7,7},{0xfc02fc,4}, -{0xb4b195,6},{0xe58d85,4},{0x9776ea,6},{0xf255b1,6}, -{0x76dda7,3},{0xe55ab9,8},{0xe230e7,5},{0x3bd0ec,5}, -{0xe219fc,6},{0xcbac83,5},{0xe548ce,7},{0xdd5cbe,3}, -{0xf412f4,5},{0xf9738d,9},{0xdd40da,4},{0x90c6a2,10}, -{0xe038e2,4},{0x6eddaf,8},{0xf23dcb,12},{0xec4fbc,6}, -{0xc8d35c,6},{0xf238d0,6},{0x90cb9f,6},{0xa46ee5,5}, -{0xaf8bbe,5},{0xc1a495,5},{0xc679b9,4},{0xec29e2,6}, -{0xf9649d,6},{0xf924da,6},{0xe224f2,5},{0x8d71f9,7}, -{0xf2cb3d,5},{0xb6cb79,4},{0xa4dd76,6},{0xe52ee5,3}, -{0xaa8bc3,3},{0x838dea,7},{0xf9ea17,5},{0x88c8aa,6}, -{0x73e0a7,5},{0xd09595,6},{0xf7d82b,10},{0xec7397,4}, -{0xfc02fc,7},{0xf72ed3,5},{0xd03dec,4},{0x80cbaf,5}, -{0xf921dd,7},{0x9fcb90,8},{0xbe95a7,4},{0x69eaa4,8}, -{0xf20ff7,5},{0x69e7a7,9},{0xf924da,3},{0xecdd30,6}, -{0xc1d861,4},{0xb967d8,5},{0xb157ef,6},{0xb9bc85,5}, -{0xb192b4,8},{0xda38e5,3},{0xea1eef,6},{0x12f7ef,4}, -{0x6e90f9,6},{0xd573b1,6},{0xdd24f7,5},{0xd5d055,7}, -{0xc86ec1,4},{0xf21ee7,7},{0xa261f4,6},{0xe555c1,4}, -{0xf78b79,6},{0xf78080,5},{0x80b4c3,7},{0xf414ef,4}, -{0xf70ff2,6},{0xea52bc,6},{0xd04ddd,7},{0xf90af4,5}, -{0xe78b88,4},{0xf29f67,6},{0x79b6c8,4},{0xa48dc8,5}, -{0x5fa4f4,4},{0xea14fc,3},{0xf23bcb,7},{0xf738cb,5}, -{0x4fb1f9,3},{0x5ae2bc,7},{0xfcac4f,5},{0xa283d3,7}, -{0xef24e7,7},{0xe5e52e,4},{0x929ace,4},{0xcb36f9,8}, -{0xea21ef,5},{0xf2d038,6},{0x48d8d8,4},{0xec40ce,6}, -{0xf90af7,5},{0xf921dd,7},{0xd8e042,5},{0x21ddf9,4}, -{0x5fb9e2,8},{0xf72ed3,4},{0xfc2ed0,5},{0xf712ef,6}, -{0x57d8cb,5},{0x19fce2,9},{0xe7f71c,9},{0x7be59a,4}, -{0x6cfc90,5},{0xec3bd0,5},{0xea26e7,8},{0x36d5ec,5}, -{0xac76d8,3},{0xa4a4b1,3},{0xef12f7,4},{0x6eb9d3,6}, -{0xe714fc,5},{0xe224f2,5},{0x3bead5,4},{0x8de783,9}, -{0x40d5e2,8},{0x9764fc,7},{0xf705fc,3},{0x8d88e2,8}, -{0xe269ac,6},{0xda33ec,7},{0xd03bec,3},{0xbe6cd0,6}, -{0x8bf479,5},{0xf912ec,8},{0xe5b461,7},{0xaf5aef,6}, -{0xc34fe5,7},{0xd038ef,6},{0x38f9c8,7},{0xf43dc6,3}, -{0xceb973,5},{0xe526ec,4},{0xf902fc,7},{0xbc48f7,4}, -{0,0} -}; - -static double const mosaic_curve_points[] = { -20.3, 216.5, 27.0, 209.8, 17.4, 200.0, 14.5, 183.5, 14.2, 181.8, -13.5, 181.6, 13.9, 180.0, 28.3, 126.1, 29.2, 126.3, 44.2, 72.5, -44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 44.2, 70.8, 44.4, 71.7, -44.2, 72.5, 36.1, 121.4, 36.0, 121.3, 27.9, 170.2, 24.1, 193.3, -33.8, 203.1, 20.3, 216.5, 82.6, 583.9, 82.5, 583.6, 84.3, 583.3, -84.2, 583.1, 88.1, 600.0, 87.2, 600.2, 90.2, 617.3, 92.4, 630.1, -92.4, 630.1, 94.7, 642.9, 96.8, 655.3, 96.8, 655.3, 99.0, 667.8, -100.0, 673.7, 100.1, 673.7, 101.1, 679.7, 107.4, 716.3, 107.3, 716.3, -113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4, 117.1, 771.4, -115.3, 762.1, 113.7, 752.9, 108.9, 726.8, 108.9, 726.8, 104.1, 700.7, -97.1, 662.7, 97.1, 662.7, 90.1, 624.8, 86.3, 604.3, 85.5, 604.5, -82.6, 583.9, 37.6, 265.6, 38.8, 286.4, 41.0, 287.6, 36.1, 307.5, -38.5, 298.0, 34.3, 297.0, 32.5, 286.5, 26.4, 251.5, 21.6, 251.7, -20.3, 216.5, 33.8, 203.1, 24.1, 193.3, 27.9, 170.2, 43.4, 214.1, -34.7, 217.8, 37.6, 265.6, 27.9, 170.2, 36.0, 121.3, 36.1, 121.4, -44.2, 72.5, 43.5, 76.1, 44.0, 76.2, 43.9, 79.8, 43.7, 85.4, -43.7, 85.4, 43.5, 91.0, 41.9, 137.6, 41.9, 137.6, 40.3, 184.2, -39.2, 217.8, 39.2, 217.8, 38.1, 251.5, 37.8, 258.5, 36.7, 258.7, -37.6, 265.6, 34.7, 217.8, 43.4, 214.1, 27.9, 170.2, -16.2, 299.0, --16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5, --5.1, 253.1, -1.7, 238.6, -1.9, 238.6, 1.6, 224.2, 2.5, 220.5, -2.8, 220.6, 3.6, 216.9, -0.6, 235.0, -0.7, 235.0, -5.1, 253.1, --10.2, 274.5, -10.3, 274.5, -15.4, 295.8, -15.8, 297.4, -16.2, 299.0, --16.2, 299.0, 242.4, -11.8, 258.9, -17.0, 261.0, -11.0, 277.2, -16.9, -183.6, 17.7, 182.4, 14.3, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5, -87.1, 45.6, 71.7, 49.5, 71.2, 48.0, 56.4, 53.5, 148.8, 19.4, -148.5, 18.2, 242.4, -11.8, 56.4, 53.5, 52.5, 54.8, 51.1, 57.0, -48.5, 55.6, 47.9, 55.2, 48.4, 50.6, 50.0, 50.0, 134.7, 18.5, -135.0, 19.0, 221.1, -8.6, 231.2, -11.9, 232.5, -8.1, 242.4, -11.8, -148.5, 18.2, 148.8, 19.4, 56.4, 53.5, 194.7, 17.8, 158.4, 27.2, -158.4, 27.2, 122.0, 36.6, 117.5, 37.7, 117.5, 37.7, 112.9, 38.9, -100.2, 42.2, 100.2, 42.2, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5, -87.1, 45.6, 182.1, 14.3, 181.1, 10.8, 277.2, -16.9, 303.4, -24.5, -307.1, -14.6, 331.7, -25.0, 266.4, 2.6, 263.7, -3.7, 195.7, 17.5, -195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 331.7, -25.0, 364.2, -33.4, -365.0, -31.6, 398.6, -34.9, 387.8, -33.8, 388.0, -32.1, 377.4, -29.4, -370.0, -27.5, 370.0, -27.5, 362.6, -25.6, 362.3, -25.5, 362.3, -25.5, -362.0, -25.4, 355.9, -23.9, 355.9, -23.9, 349.8, -22.3, 341.8, -20.2, -341.8, -20.2, 333.7, -18.1, 318.3, -14.2, 318.3, -14.2, 303.0, -10.2, -300.6, -9.6, 300.6, -9.6, 298.2, -9.0, 281.5, -4.7, 281.5, -4.7, -264.9, -0.3, 254.1, 2.4, 254.1, 2.4, 243.2, 5.2, 227.9, 9.2, -227.9, 9.2, 212.6, 13.1, 204.2, 15.3, 204.2, 15.3, 195.7, 17.5, -195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 263.2, -3.6, 262.3, -7.1, -331.7, -25.0, -5.1, 253.1, -0.7, 235.0, -0.6, 235.0, 3.6, 216.9, -7.2, 203.0, 5.7, 202.2, 11.4, 189.1, 6.4, 200.6, 8.2, 201.4, -5.0, 213.7, -0.0, 233.4, 2.9, 234.7, -5.1, 253.1, 0.7, 536.2, -13.6, 573.8, 15.5, 574.7, 18.7, 614.1, 18.8, 616.3, 7.9, 620.2, -7.3, 619.4, -4.6, 602.1, -1.2, 599.1, -6.2, 577.9, -16.0, 536.4, --28.8, 533.6, -22.2, 494.1, -25.4, 512.7, -6.9, 513.8, 0.7, 536.2, --22.2, 494.1, -26.0, 485.6, -28.6, 477.0, -25.8, 475.4, -22.7, 473.6, --14.7, 479.5, -10.5, 487.2, -3.6, 500.3, -7.1, 502.1, -3.7, 517.0, --2.5, 522.1, -2.5, 522.1, -1.4, 527.1, -0.3, 531.7, -1.6, 532.5, -0.7, 536.2, -6.9, 513.8, -25.4, 512.7, -22.2, 494.1, 19.0, 510.1, -21.7, 515.4, 24.2, 514.1, 29.4, 518.2, 30.9, 519.3, 30.9, 519.3, -32.3, 520.4, 56.0, 538.7, 58.2, 536.4, 79.7, 557.1, 82.9, 560.1, -80.6, 562.5, 81.6, 567.8, 82.9, 575.5, 83.7, 575.4, 84.2, 583.1, -84.3, 583.3, 82.5, 583.6, 82.6, 583.9, 75.0, 587.4, 75.2, 587.9, -67.4, 591.0, 67.4, 591.1, 67.2, 590.6, 66.9, 590.2, 42.9, 550.1, -40.5, 551.4, 19.0, 510.1, 121.8, 800.9, 121.7, 801.1, 122.3, 801.2, -122.4, 801.6, 123.7, 808.3, 126.5, 809.3, 124.7, 815.1, 125.1, 813.8, -120.1, 813.3, 119.5, 810.6, 118.6, 806.2, 120.3, 805.6, 121.8, 800.9, -0.7, 495.9, 3.7, 500.5, 5.2, 499.5, 9.8, 503.0, 14.4, 506.5, -15.9, 505.5, 19.0, 510.1, 40.5, 551.4, 42.9, 550.1, 66.9, 590.2, -63.6, 584.5, 63.1, 584.8, 59.4, 579.4, 30.0, 537.7, 28.5, 538.7, -0.7, 495.9, 113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4, -117.4, 773.4, 117.4, 773.4, 117.8, 775.3, 120.1, 788.5, 120.3, 788.4, -122.4, 801.6, 122.3, 801.2, 121.7, 801.1, 121.8, 800.9, 121.4, 800.4, -121.4, 800.4, 121.0, 799.9, 120.6, 799.4, 120.6, 799.4, 120.3, 798.9, -95.0, 767.1, 74.8, 770.0, 69.8, 735.3, 71.5, 747.0, 95.6, 739.1, -113.7, 752.9, 69.8, 735.3, 69.0, 734.9, 68.4, 733.7, 68.5, 733.6, -75.3, 725.8, 76.1, 726.5, 83.8, 719.4, 89.1, 714.5, 89.1, 714.5, -94.4, 709.6, 99.2, 705.1, 104.9, 702.6, 104.1, 700.7, 108.9, 726.8, -108.9, 726.8, 113.7, 752.9, 95.6, 739.1, 71.5, 747.0, 69.8, 735.3, -19.0, 613.9, 22.4, 604.2, 32.4, 607.6, 45.7, 601.3, 56.0, 596.4, -56.0, 596.4, 66.3, 591.6, 66.9, 591.3, 66.9, 591.3, 67.4, 591.0, -75.2, 587.9, 75.0, 587.4, 82.6, 583.9, 85.5, 604.5, 86.3, 604.3, -90.1, 624.8, 90.1, 624.5, 88.9, 624.6, 87.8, 624.5, 64.0, 620.8, -64.0, 620.8, 40.2, 617.2, 29.6, 615.5, 19.7, 612.1, 19.0, 613.9, -121.0, 799.9, 121.4, 800.4, 121.4, 800.4, 121.8, 800.9, 120.3, 805.6, -118.6, 806.2, 119.5, 810.6, 108.1, 806.7, 98.9, 800.6, 99.9, 793.4, -99.6, 795.2, 110.5, 796.3, 121.0, 799.9, 191.6, 801.6, 213.6, 817.8, -197.0, 840.4, 202.3, 879.2, 202.4, 880.2, 203.0, 880.7, 202.6, 881.2, -202.1, 881.7, 201.1, 881.7, 200.4, 881.1, 187.5, 870.7, 176.8, 871.5, -175.5, 859.3, 172.4, 831.7, 200.2, 807.9, 191.6, 801.6, 32.3, 520.4, -30.9, 519.3, 30.9, 519.3, 29.4, 518.2, 27.6, 505.3, 28.9, 505.1, -28.3, 492.1, 26.0, 440.3, 25.5, 440.3, 23.7, 388.5, 24.2, 405.2, -24.7, 405.2, 25.8, 421.8, 27.0, 439.3, 27.0, 439.3, 28.1, 456.8, -29.1, 470.9, 29.1, 470.9, 30.0, 485.1, 31.1, 502.7, 32.6, 502.7, -32.3, 520.4, -3.7, 517.0, -7.1, 502.1, -3.6, 500.3, -10.5, 487.2, --10.8, 490.3, -6.1, 490.7, -1.6, 494.1, -0.5, 495.0, -0.1, 494.8, -0.7, 495.9, 28.5, 538.7, 30.0, 537.7, 59.4, 579.4, 64.3, 555.8, -22.9, 552.0, -3.7, 517.0, 83.8, 719.4, 76.1, 726.5, 75.3, 725.8, -68.5, 733.6, 49.9, 724.3, 45.1, 717.9, 40.0, 697.6, 42.0, 705.5, -51.1, 703.2, 62.2, 708.7, 69.0, 712.1, 69.0, 712.1, 75.8, 715.5, -79.8, 717.4, 83.9, 719.1, 83.8, 719.4, 69.7, 767.2, 66.2, 756.5, -57.4, 760.4, 50.0, 750.0, 44.4, 742.1, 50.3, 736.4, 43.7, 730.7, -60.1, 745.0, 63.1, 746.8, 69.7, 767.2, 943.6, 608.8, 941.3, 609.3, -947.5, 623.9, 942.6, 627.8, 892.0, 668.3, 889.0, 665.2, 832.4, 697.7, -848.6, 688.4, 847.2, 685.9, 861.9, 674.1, 867.3, 669.8, 867.3, 669.8, -872.6, 665.6, 875.3, 663.4, 875.3, 663.4, 878.0, 661.2, 891.5, 650.5, -891.5, 650.5, 904.9, 639.8, 906.2, 638.7, 906.2, 638.7, 907.5, 637.7, -909.8, 635.8, 909.8, 635.8, 912.2, 633.9, 927.9, 621.4, 926.1, 612.3, -943.6, 608.8, 743.8, 661.6, 749.6, 670.9, 741.5, 681.2, 747.9, 684.8, -733.2, 676.6, 737.6, 668.6, 727.2, 652.4, 722.1, 644.3, 722.1, 644.3, -716.9, 636.3, 711.2, 627.4, 711.2, 627.4, 705.5, 618.5, 701.1, 611.6, -695.6, 610.5, 696.7, 604.7, 695.8, 609.3, 701.3, 610.3, 706.0, 615.9, -724.9, 638.7, 728.6, 636.5, 743.8, 661.6, 947.6, 328.1, 940.6, 361.9, -953.7, 364.0, 954.4, 400.0, 955.1, 438.8, 952.6, 438.9, 950.4, 477.7, -950.5, 475.0, 950.3, 475.0, 950.3, 472.2, 949.8, 448.4, 949.8, 448.4, -949.4, 424.6, 948.5, 376.3, 938.1, 374.2, 947.6, 328.1, 846.3, 117.0, -890.0, 147.0, 890.5, 146.4, 933.3, 177.7, 934.1, 178.3, 932.8, 180.3, -933.6, 180.8, 919.3, 171.9, 920.0, 170.9, 906.3, 160.9, 890.8, 149.6, -890.8, 149.6, 875.3, 138.2, 872.0, 135.8, 872.0, 135.8, 868.7, 133.4, -857.5, 125.2, 857.7, 124.9, 846.3, 117.0, 408.1, 154.0, 408.9, 154.9, -409.6, 155.6, 409.4, 156.0, 393.6, 178.5, 392.8, 177.9, 376.1, 199.9, -371.9, 205.6, 372.2, 205.9, 367.6, 211.2, 370.8, 207.5, 370.5, 207.2, -373.3, 203.2, 390.6, 178.7, 390.6, 178.7, 407.9, 154.3, 408.0, 154.2, -408.2, 154.1, 408.1, 154.0, 142.2, 652.8, 141.2, 609.9, 142.1, 609.9, -142.0, 567.0, 142.0, 543.5, 142.0, 543.5, 141.9, 520.0, 141.9, 517.7, -141.9, 517.7, 141.9, 515.4, 141.9, 494.5, 141.9, 494.5, 141.9, 473.6, -141.9, 472.3, 141.9, 472.3, 141.9, 471.0, 141.8, 468.7, 141.8, 468.7, -141.8, 466.3, 141.8, 452.9, 141.5, 452.9, 141.8, 439.5, 141.8, 441.3, -142.0, 441.3, 142.3, 443.2, 144.2, 457.2, 144.2, 457.2, 146.2, 471.3, -146.6, 474.8, 146.6, 474.8, 147.1, 478.3, 147.4, 480.0, 147.4, 480.0, -147.6, 481.7, 148.8, 490.4, 148.8, 490.4, 150.0, 499.1, 150.2, 500.3, -150.2, 500.3, 150.3, 501.5, 153.2, 522.1, 153.2, 522.1, 156.0, 542.8, -156.8, 548.2, 156.8, 548.2, 157.5, 553.7, 157.8, 556.1, 158.5, 556.2, -158.2, 558.4, 155.4, 578.7, 154.7, 578.6, 151.3, 598.8, 147.6, 620.7, -147.6, 620.7, 143.9, 642.6, 143.9, 642.7, 143.9, 642.7, 143.9, 642.7, -143.1, 647.7, 142.1, 647.8, 142.2, 652.8, -1.6, 494.1, -6.1, 490.7, --10.8, 490.3, -10.5, 487.2, -14.7, 479.5, -22.7, 473.6, -25.8, 475.4, --37.3, 443.0, -39.2, 441.2, -38.9, 407.2, -39.0, 422.7, -32.2, 422.8, --25.5, 438.4, -13.6, 466.3, -10.5, 465.3, -1.6, 494.1, 15.1, 196.4, -24.9, 282.2, 18.9, 282.9, 22.8, 369.5, 22.8, 369.5, 22.8, 369.6, -22.8, 369.6, 19.8, 367.5, 17.9, 368.2, 16.8, 365.3, 14.8, 360.0, -16.8, 359.2, 16.7, 353.2, 16.6, 347.1, 16.6, 347.1, 16.6, 341.0, -16.4, 326.7, 16.4, 326.7, 16.3, 312.3, 15.7, 254.3, 21.6, 253.7, -15.1, 196.4, -1.4, 527.1, -2.5, 522.1, -2.5, 522.1, -3.7, 517.0, -22.9, 552.0, 64.3, 555.8, 59.4, 579.4, 63.1, 584.8, 63.6, 584.5, -66.9, 590.2, 67.2, 590.6, 67.4, 591.1, 67.4, 591.0, 66.9, 591.3, -66.9, 591.3, 66.3, 591.6, 44.0, 571.1, 44.3, 570.7, 22.4, 549.7, -10.5, 538.4, 8.8, 539.8, -1.4, 527.1, 87.8, 624.5, 88.9, 624.6, -90.1, 624.5, 90.1, 624.8, 97.1, 662.7, 97.1, 662.7, 104.1, 700.7, -104.9, 702.6, 99.2, 705.1, 94.4, 709.6, 91.2, 708.1, 93.8, 702.6, -93.3, 695.5, 92.9, 690.2, 92.9, 690.2, 92.5, 684.9, 91.2, 668.6, -91.2, 668.6, 89.9, 652.3, 88.9, 638.4, 87.7, 638.4, 87.8, 624.5, -120.3, 798.9, 120.6, 799.4, 120.6, 799.4, 121.0, 799.9, 110.5, 796.3, -99.6, 795.2, 99.9, 793.4, 83.2, 782.8, 82.9, 782.0, 69.7, 767.2, -63.1, 746.8, 60.1, 745.0, 43.7, 730.7, 42.4, 728.8, 43.7, 727.6, -42.2, 726.3, 82.0, 761.7, 81.3, 762.5, 120.3, 798.9, 42.2, 726.3, -28.8, 709.3, 29.6, 704.7, 27.9, 682.3, 28.5, 690.4, 33.9, 690.0, -40.0, 697.6, 45.1, 717.9, 49.9, 724.3, 68.5, 733.6, 68.4, 733.7, -69.0, 734.9, 69.8, 735.3, 74.8, 770.0, 95.0, 767.1, 120.3, 798.9, -81.3, 762.5, 82.0, 761.7, 42.2, 726.3, 703.4, 562.7, 701.7, 552.1, -711.8, 549.5, 722.0, 537.9, 721.3, 538.6, 722.2, 539.4, 722.5, 540.9, -723.8, 548.1, 723.8, 548.1, 725.0, 555.3, 730.5, 586.1, 730.5, 586.1, -735.9, 616.8, 737.4, 625.4, 738.6, 625.3, 739.0, 634.0, 738.8, 631.5, -737.7, 631.5, 736.5, 629.0, 719.9, 595.9, 708.9, 597.6, 703.4, 562.7, -539.8, 359.6, 539.7, 358.7, 539.2, 358.7, 538.6, 357.9, 519.1, 327.4, -519.1, 327.4, 499.6, 296.9, 492.6, 286.0, 492.4, 286.2, 485.7, 275.1, -486.0, 275.6, 486.2, 275.5, 486.8, 275.9, 488.5, 277.1, 488.5, 277.1, -490.3, 278.3, 512.4, 293.3, 515.9, 289.9, 534.6, 308.4, 538.8, 312.6, -535.4, 316.0, 536.1, 323.7, 536.4, 326.7, 536.4, 326.7, 536.7, 329.8, -538.3, 344.7, 538.8, 344.7, 539.8, 359.6, 672.2, 402.1, 674.0, 400.5, -680.5, 407.7, 688.8, 413.4, 692.6, 416.0, 692.6, 416.0, 696.4, 418.5, -698.9, 420.3, 700.7, 419.7, 701.5, 422.0, 705.6, 434.7, 703.8, 435.3, -706.2, 448.6, 706.9, 452.6, 706.9, 452.6, 707.6, 456.6, 710.3, 471.8, -713.6, 472.0, 713.0, 487.0, 713.1, 483.1, 709.8, 483.0, 706.7, 478.9, -704.9, 476.6, 704.9, 476.6, 703.1, 474.3, 701.9, 472.8, 701.9, 472.8, -700.8, 471.3, 696.3, 465.5, 696.3, 465.5, 691.8, 459.8, 689.2, 456.4, -689.2, 456.4, 686.6, 453.1, 678.3, 442.4, 678.3, 442.4, 669.9, 431.6, -669.6, 431.2, 669.3, 431.2, 669.3, 430.8, 670.4, 416.4, 664.2, 409.2, -672.2, 402.1, 669.3, 430.8, 662.6, 432.2, 659.8, 418.7, 650.4, 406.5, -639.5, 392.5, 639.5, 392.5, 628.6, 378.5, 623.6, 372.1, 625.2, 368.3, -618.6, 365.6, 636.3, 372.9, 634.8, 376.6, 650.9, 387.6, 657.0, 391.8, -657.0, 391.8, 663.1, 395.9, 666.5, 398.2, 666.5, 398.2, 669.9, 400.6, -670.3, 400.8, 670.3, 400.8, 670.6, 401.0, 671.4, 401.6, 672.2, 401.6, -672.2, 402.1, 664.2, 409.2, 670.4, 416.4, 669.3, 430.8, 150.3, 501.5, -150.2, 500.3, 150.2, 500.3, 150.0, 499.1, 164.5, 478.5, 165.2, 479.0, -180.4, 458.9, 203.0, 428.9, 200.5, 426.6, 225.7, 398.9, 203.9, 422.9, -206.4, 425.2, 187.1, 451.5, 168.7, 476.5, 169.4, 477.1, 150.3, 501.5, -198.1, 70.3, 213.7, 72.4, 227.1, 73.6, 228.3, 81.5, 229.1, 86.3, -215.3, 88.6, 202.2, 95.7, 194.5, 100.0, 194.5, 100.0, 186.7, 104.2, -177.5, 109.3, 170.2, 107.4, 168.4, 114.3, 173.7, 93.6, 181.1, 95.5, -193.8, 76.7, 195.9, 73.5, 196.4, 70.1, 198.1, 70.3, 140.7, 133.4, -137.8, 135.0, 133.7, 132.2, 133.2, 133.5, 134.7, 129.7, 137.9, 130.9, -142.6, 128.4, 147.4, 125.8, 147.4, 125.8, 152.1, 123.1, 160.3, 118.7, -160.3, 118.7, 168.4, 114.3, 170.2, 107.4, 177.5, 109.3, 186.7, 104.2, -164.3, 119.7, 164.5, 120.3, 140.7, 133.4, 134.9, 228.4, 136.6, 240.3, -129.2, 247.8, 116.4, 255.3, 118.9, 253.8, 111.2, 244.9, 114.4, 240.4, -120.5, 231.5, 135.5, 232.9, 134.9, 228.4, 151.3, 598.8, 154.7, 578.6, -155.4, 578.7, 158.2, 558.4, 157.7, 560.5, 158.5, 560.6, 158.8, 562.8, -161.6, 583.3, 161.6, 583.3, 164.4, 603.8, 165.1, 609.2, 165.1, 609.2, -165.9, 614.5, 169.9, 643.5, 169.9, 643.5, 173.9, 672.6, 174.5, 677.0, -173.8, 677.2, 175.1, 681.5, 162.5, 640.3, 157.1, 641.0, 151.3, 598.8, -141.4, 568.5, 141.4, 567.7, 142.1, 567.7, 142.0, 567.0, 142.1, 609.9, -141.2, 609.9, 142.2, 652.8, 142.4, 726.7, 142.4, 726.7, 142.5, 800.7, -142.5, 811.8, 142.5, 811.8, 142.6, 822.9, 142.6, 826.8, 142.7, 830.7, -142.6, 830.7, 138.4, 830.8, 134.1, 827.1, 133.9, 823.2, 131.5, 765.1, -135.6, 765.0, 137.3, 706.8, 137.6, 699.6, 137.6, 699.6, 137.8, 692.5, -139.6, 630.5, 139.3, 630.5, 141.4, 568.5, 94.7, 642.9, 92.4, 630.1, -92.4, 630.1, 90.2, 617.3, 90.6, 608.0, 93.4, 608.1, 96.7, 598.9, -98.3, 594.2, 99.8, 594.3, 100.0, 589.5, 98.9, 614.8, 97.5, 614.8, -95.0, 640.0, 94.8, 641.5, 94.4, 641.6, 94.7, 642.9, 118.9, 272.9, -120.5, 292.1, 121.5, 292.0, 124.1, 311.0, 126.7, 329.9, 126.7, 329.9, -129.3, 348.8, 135.5, 394.1, 136.9, 394.0, 141.8, 439.5, 141.5, 452.9, -141.8, 452.9, 141.8, 466.3, 142.0, 464.7, 139.8, 464.7, 139.2, 462.7, -138.1, 459.0, 138.8, 458.8, 138.4, 454.9, 135.2, 425.6, 135.2, 425.6, -132.1, 396.2, 130.6, 382.7, 130.6, 382.7, 129.2, 369.3, 124.0, 321.1, -123.1, 321.2, 118.9, 272.9, 44.2, 353.6, 40.0, 349.1, 42.9, 346.4, -41.7, 339.3, 40.6, 332.9, 43.2, 329.6, 39.5, 326.5, 51.9, 336.6, -49.3, 339.9, 59.1, 353.3, 60.0, 354.6, 60.0, 354.6, 60.9, 355.8, -66.5, 363.4, 66.5, 363.4, 72.1, 371.0, 73.1, 372.4, 73.1, 372.4, -74.1, 373.8, 74.2, 373.9, 74.1, 374.0, 74.3, 374.1, 59.2, 363.9, -56.3, 366.5, 44.2, 353.6, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5, --5.1, 253.1, 2.9, 234.7, -0.0, 233.4, 5.0, 213.7, 2.7, 222.5, -2.8, 222.5, 0.6, 231.3, -3.2, 247.1, -3.2, 247.2, -7.1, 263.0, --11.2, 279.4, -12.0, 279.2, -15.4, 295.8, 22.8, 369.5, 18.9, 282.9, -24.9, 282.2, 15.1, 196.4, 14.8, 189.9, 16.1, 189.6, 14.5, 183.5, -17.4, 200.0, 27.0, 209.8, 20.3, 216.5, 21.6, 251.7, 26.4, 251.5, -32.5, 286.5, 33.4, 293.8, 31.6, 294.0, 30.7, 301.5, 30.7, 301.8, -30.7, 301.8, 30.7, 302.0, 29.9, 308.7, 29.9, 308.7, 29.1, 315.3, -26.0, 342.4, 19.7, 343.1, 22.8, 369.5, 78.4, 549.9, 78.8, 550.4, -78.6, 550.6, 78.7, 551.4, 79.2, 554.2, 78.0, 556.0, 79.7, 557.1, -58.2, 536.4, 56.0, 538.7, 32.3, 520.4, 32.6, 502.7, 31.1, 502.7, -30.0, 485.1, 30.0, 486.7, 31.2, 486.7, 32.4, 488.3, 55.4, 519.1, -55.7, 518.9, 78.4, 549.9, 45.7, 601.3, 32.4, 607.6, 22.4, 604.2, -19.0, 613.9, 18.8, 614.0, 18.6, 614.0, 18.7, 614.1, 15.5, 574.7, -13.6, 573.8, 0.7, 536.2, -1.6, 532.5, -0.3, 531.7, -1.4, 527.1, -8.8, 539.8, 10.5, 538.4, 22.4, 549.7, 37.4, 573.4, 47.0, 576.2, -45.7, 601.3, 22.4, 549.7, 44.3, 570.7, 44.0, 571.1, 66.3, 591.6, -56.0, 596.4, 56.0, 596.4, 45.7, 601.3, 47.0, 576.2, 37.4, 573.4, -22.4, 549.7, 62.2, 708.7, 51.1, 703.2, 42.0, 705.5, 40.0, 697.6, -33.9, 690.0, 28.5, 690.4, 27.9, 682.3, 21.2, 668.6, 25.2, 654.1, -18.3, 653.0, 32.9, 655.3, 30.8, 668.9, 43.3, 684.7, 49.6, 692.7, -49.6, 692.7, 55.9, 700.7, 56.1, 701.0, 56.1, 701.0, 56.3, 701.2, -59.3, 705.0, 58.6, 707.9, 62.2, 708.7, 773.1, 619.7, 757.0, 625.1, -754.8, 618.3, 736.4, 616.8, 736.2, 616.8, 735.9, 616.9, 735.9, 616.8, -730.5, 586.1, 730.5, 586.1, 725.0, 555.3, 725.3, 557.0, 726.8, 556.9, -728.5, 558.4, 734.7, 564.0, 734.7, 564.0, 741.0, 569.6, 750.7, 578.2, -750.7, 578.2, 760.4, 586.8, 768.9, 594.4, 768.9, 594.4, 777.5, 602.0, -778.0, 602.4, 778.5, 602.6, 778.4, 602.8, 776.3, 611.4, 778.0, 618.1, -773.1, 619.7, 778.4, 602.8, 780.2, 601.8, 783.2, 607.1, 787.9, 611.3, -791.7, 614.6, 792.8, 613.9, 795.5, 618.0, 796.2, 619.0, 795.2, 621.3, -794.7, 621.4, 784.0, 622.2, 778.2, 625.5, 773.1, 619.7, 778.0, 618.1, -776.3, 611.4, 778.4, 602.8, 767.2, 714.9, 766.5, 712.4, 765.7, 712.6, -764.3, 710.3, 759.7, 703.1, 759.7, 703.1, 755.2, 696.0, 751.5, 690.4, -750.0, 690.9, 747.9, 684.8, 741.5, 681.2, 749.6, 670.9, 743.8, 661.6, -741.7, 649.6, 741.7, 649.6, 739.6, 637.7, 739.3, 635.8, 739.3, 635.8, -739.0, 634.0, 738.6, 625.3, 737.4, 625.4, 735.9, 616.8, 735.9, 616.9, -736.2, 616.8, 736.4, 616.8, 741.7, 632.9, 741.5, 633.0, 746.6, 649.2, -756.9, 682.0, 757.7, 681.8, 767.2, 714.9, 787.2, 480.4, 785.4, 487.8, -809.3, 488.9, 823.0, 504.7, 825.6, 507.8, 817.7, 516.8, 819.7, 518.2, -799.8, 504.6, 783.7, 494.5, 787.2, 480.4, 760.1, 584.4, 760.7, 585.0, -759.7, 586.2, 760.4, 586.8, 750.7, 578.2, 750.7, 578.2, 741.0, 569.6, -744.4, 572.8, 744.8, 572.5, 748.5, 575.4, 754.3, 579.9, 754.8, 579.3, -760.1, 584.4, 781.1, 677.4, 781.0, 677.3, 781.2, 676.2, 781.4, 676.2, -796.6, 675.2, 796.6, 675.8, 811.9, 675.4, 814.5, 675.3, 814.5, 675.3, -817.1, 675.3, 839.5, 674.7, 855.1, 664.1, 861.9, 674.1, 847.2, 685.9, -848.6, 688.4, 832.4, 697.7, 829.2, 700.2, 827.7, 703.0, 825.4, 702.1, -802.0, 692.9, 803.0, 690.2, 781.1, 677.4, 825.4, 702.1, 824.6, 718.3, -804.0, 723.6, 778.2, 732.1, 776.6, 732.6, 771.7, 726.6, 770.7, 720.3, -769.6, 713.9, 772.4, 713.4, 774.0, 706.6, 777.6, 692.0, 776.3, 677.8, -781.1, 677.4, 803.0, 690.2, 802.0, 692.9, 825.4, 702.1, 736.5, 629.0, -737.7, 631.5, 738.8, 631.5, 739.0, 634.0, 739.3, 635.8, 739.3, 635.8, -739.6, 637.7, 737.6, 633.7, 738.1, 633.5, 736.6, 629.3, 736.5, 629.2, -736.6, 629.2, 736.5, 629.0, 939.3, 263.2, 939.2, 262.7, 941.3, 262.5, -941.3, 262.2, 945.5, 295.0, 945.9, 295.1, 947.6, 328.1, 938.1, 374.2, -948.5, 376.3, 949.4, 424.6, 949.3, 413.7, 948.7, 413.7, 948.0, 402.8, -943.6, 333.0, 942.6, 333.0, 939.3, 263.2, 933.8, 398.2, 945.1, 423.2, -939.9, 425.5, 945.9, 452.8, 948.1, 462.5, 948.5, 462.5, 950.3, 472.2, -950.3, 475.0, 950.5, 475.0, 950.4, 477.7, 949.9, 489.9, 944.7, 492.2, -949.1, 502.2, 932.5, 464.7, 937.5, 462.4, 926.0, 422.7, 923.8, 415.2, -923.8, 415.2, 921.6, 407.7, 920.4, 403.4, 920.4, 403.4, 919.1, 399.2, -916.7, 390.9, 916.1, 382.5, 914.3, 382.6, 923.5, 382.0, 929.2, 388.1, -933.8, 398.2, 924.1, 500.9, 935.4, 520.1, 931.7, 522.3, 939.4, 543.8, -942.7, 553.0, 944.8, 552.8, 946.0, 562.3, 947.5, 574.7, 945.5, 574.9, -944.7, 587.6, 944.7, 587.5, 944.5, 587.5, 944.3, 587.3, 934.6, 580.7, -934.6, 580.7, 924.9, 574.1, 919.9, 570.7, 915.1, 570.9, 915.0, 567.3, -913.8, 541.2, 918.6, 541.0, 922.2, 514.6, 923.1, 507.7, 926.8, 505.5, -924.1, 500.9, 926.0, 422.7, 937.5, 462.4, 932.5, 464.7, 949.1, 502.2, -953.3, 531.4, 952.7, 533.4, 946.0, 562.3, 944.8, 552.8, 942.7, 553.0, -939.4, 543.8, 934.7, 516.5, 936.3, 516.2, 933.3, 488.7, 932.5, 482.0, -932.5, 482.0, 931.8, 475.4, 928.9, 449.0, 938.8, 442.6, 926.0, 422.7, -669.9, 400.6, 666.5, 398.2, 666.5, 398.2, 663.1, 395.9, 663.0, 395.4, -665.6, 394.7, 668.1, 393.5, 684.8, 385.5, 684.8, 385.5, 701.4, 377.5, -711.7, 372.6, 711.7, 372.6, 722.0, 367.6, 725.4, 366.0, 725.4, 366.0, -728.7, 364.4, 730.3, 363.7, 730.3, 363.7, 731.8, 362.9, 732.7, 362.5, -732.7, 362.5, 733.6, 362.1, 740.2, 358.9, 740.2, 358.9, 746.8, 355.7, -750.9, 353.7, 750.9, 353.7, 755.0, 351.7, 767.9, 345.5, 767.9, 345.5, -780.8, 339.3, 815.8, 322.6, 815.8, 322.7, 850.7, 305.9, 851.2, 305.7, -851.6, 305.3, 851.6, 305.3, 851.6, 305.3, 851.2, 305.7, 850.7, 305.9, -805.7, 329.5, 805.7, 329.5, 760.6, 353.1, 715.3, 376.8, 716.7, 380.0, -669.9, 400.6, 676.7, 19.0, 678.1, 20.5, 689.6, 2.0, 699.1, 3.6, -713.8, 6.3, 713.2, 14.6, 725.3, 27.5, 724.0, 26.2, 723.0, 27.1, -720.8, 26.7, 698.7, 22.8, 689.0, 32.0, 676.7, 19.0, 446.7, 132.3, -433.1, 136.8, 432.6, 135.3, 418.6, 138.4, 413.9, 139.4, 413.9, 139.4, -409.3, 140.3, 408.6, 140.5, 408.6, 140.5, 408.0, 140.6, 404.3, 141.4, -404.3, 142.2, 400.6, 142.2, 400.0, 142.2, 399.3, 141.0, 399.5, 140.5, -401.5, 136.3, 401.3, 134.8, 405.1, 132.7, 408.4, 130.9, 409.4, 132.7, -413.7, 132.6, 414.0, 132.6, 414.0, 132.6, 414.2, 132.6, 424.1, 132.5, -424.1, 132.5, 434.0, 132.5, 435.4, 132.4, 435.4, 132.4, 436.8, 132.4, -441.7, 132.4, 442.2, 133.8, 446.7, 132.3, 359.9, 57.9, 372.4, 77.4, -383.0, 94.8, 375.4, 102.9, 379.1, 99.0, 363.7, 84.6, 352.0, 66.3, -345.7, 56.6, 345.7, 56.6, 339.5, 46.8, 338.4, 45.2, 338.4, 45.2, -337.4, 43.5, 327.7, 28.4, 331.8, 22.0, 318.0, 13.2, 343.0, 29.2, -343.7, 32.5, 359.9, 57.9, 318.0, 13.2, 309.1, 2.6, 299.8, -3.8, -303.0, -10.2, 318.3, -14.2, 318.3, -14.2, 333.7, -18.1, 336.3, -17.9, -335.7, -12.3, 337.7, -6.6, 348.8, 25.7, 370.5, 47.3, 359.9, 57.9, -343.7, 32.5, 343.0, 29.2, 318.0, 13.2, 393.4, 131.0, 382.3, 118.8, -382.3, 117.9, 375.4, 102.9, 383.0, 94.8, 372.4, 77.4, 359.9, 57.9, -370.5, 47.3, 348.8, 25.7, 337.7, -6.6, 365.8, 53.1, 362.5, 54.7, -387.3, 116.0, 390.3, 123.5, 388.3, 125.4, 393.4, 131.0, 290.4, 2.4, -289.0, 0.5, 293.4, -4.2, 298.2, -9.0, 300.6, -9.6, 300.6, -9.6, -303.0, -10.2, 299.8, -3.8, 309.1, 2.6, 318.0, 13.2, 331.8, 22.0, -327.7, 28.4, 337.4, 43.5, 336.2, 41.4, 335.5, 41.8, 333.5, 40.1, -311.9, 21.3, 306.7, 25.1, 290.4, 2.4, 432.1, 236.3, 431.1, 225.7, -431.2, 225.7, 430.8, 215.1, 431.0, 219.5, 431.2, 219.5, 431.6, 223.8, -431.8, 226.0, 431.8, 226.0, 432.0, 228.2, 435.6, 267.5, 435.6, 267.5, -439.3, 306.7, 441.3, 329.1, 441.3, 329.1, 443.4, 351.4, 443.9, 357.8, -443.9, 357.8, 444.5, 364.1, 444.8, 366.7, 444.8, 366.7, 445.0, 369.4, -446.9, 389.4, 446.9, 389.4, 448.7, 409.5, 452.1, 447.0, 452.1, 447.0, -455.6, 484.5, 456.5, 494.1, 456.5, 494.1, 457.3, 503.6, 461.1, 544.5, -461.1, 544.5, 464.8, 585.3, 466.5, 603.5, 466.6, 603.5, 468.2, 621.6, -469.3, 634.5, 469.2, 634.5, 470.3, 647.3, 471.5, 660.3, 471.7, 660.3, -472.9, 673.2, 473.3, 677.4, 473.3, 677.4, 473.7, 681.5, 473.9, 684.3, -474.0, 684.3, 474.2, 687.1, 474.9, 695.0, 474.8, 695.0, 475.5, 702.9, -476.7, 715.9, 476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5, -482.0, 772.1, 482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3, -485.3, 808.6, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3, 482.5, 778.1, -482.3, 775.1, 482.3, 775.1, 482.0, 772.1, 480.0, 750.5, 480.1, 750.5, -478.0, 728.9, 476.8, 715.9, 476.7, 715.9, 475.5, 702.9, 472.9, 675.1, -472.9, 675.1, 470.3, 647.3, 469.3, 635.9, 469.4, 635.9, 468.4, 624.5, -468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5, -464.8, 585.3, 461.1, 544.5, 461.1, 544.5, 457.3, 503.6, 456.5, 494.1, -456.5, 494.1, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0, 448.7, 409.5, -446.9, 389.4, 446.9, 389.4, 445.0, 369.4, 438.6, 302.8, 438.2, 302.9, -432.1, 236.3, 431.6, 223.8, 431.2, 219.5, 431.0, 219.5, 430.8, 215.1, -429.9, 201.0, 423.5, 197.5, 429.1, 186.9, 427.2, 190.5, 437.8, 193.7, -438.3, 201.1, 439.0, 212.2, 437.1, 213.6, 431.6, 223.8, 94.7, 97.2, -96.3, 96.3, 94.0, 92.2, 93.3, 87.3, 91.4, 73.5, 91.4, 73.5, -89.5, 59.8, 88.5, 52.6, 84.6, 48.1, 87.6, 45.5, 100.2, 42.2, -100.2, 42.2, 112.9, 38.9, 122.8, 39.1, 132.9, 43.7, 132.6, 46.2, -130.6, 63.5, 120.5, 62.4, 108.5, 78.6, 101.6, 87.9, 103.9, 91.9, -94.7, 97.2, 236.1, 70.1, 237.2, 70.5, 237.2, 74.9, 235.3, 77.7, -233.3, 80.6, 231.3, 82.1, 228.3, 81.5, 227.1, 73.6, 213.7, 72.4, -198.1, 70.3, 187.3, 66.3, 178.2, 59.9, 176.5, 62.4, 179.9, 57.6, -189.0, 64.0, 201.4, 65.6, 203.1, 65.8, 203.1, 65.8, 204.7, 66.0, -207.8, 66.4, 207.8, 66.4, 210.8, 66.8, 223.5, 68.4, 225.0, 65.1, -236.1, 70.1, 239.1, 42.7, 241.4, 39.6, 239.6, 38.3, 240.1, 33.8, -241.7, 19.5, 235.9, 15.3, 243.2, 5.2, 254.1, 2.4, 254.1, 2.4, -264.9, -0.3, 262.4, 22.3, 253.8, 22.5, 239.1, 42.7, 264.9, -0.3, -281.5, -4.7, 281.5, -4.7, 298.2, -9.0, 293.4, -4.2, 289.0, 0.5, -290.4, 2.4, 281.5, 15.3, 281.5, 15.3, 272.6, 28.3, 271.6, 29.7, -271.6, 29.7, 270.6, 31.1, 270.6, 31.2, 270.6, 31.2, 270.6, 31.2, -267.6, 35.6, 267.6, 35.6, 264.6, 39.9, 257.8, 49.7, 257.8, 49.7, -251.1, 59.5, 245.9, 67.1, 246.6, 67.8, 240.6, 74.8, 238.8, 76.9, -235.8, 78.2, 235.3, 77.7, 237.2, 74.9, 237.2, 70.5, 236.1, 70.1, -237.6, 56.4, 234.1, 55.0, 239.1, 42.7, 253.8, 22.5, 262.4, 22.3, -264.9, -0.3, 202.2, 95.7, 215.3, 88.6, 229.1, 86.3, 228.3, 81.5, -231.3, 82.1, 233.3, 80.6, 235.3, 77.7, 235.8, 78.2, 238.8, 76.9, -240.6, 74.8, 223.0, 102.9, 229.0, 115.3, 202.9, 129.5, 209.8, 125.8, -195.3, 108.8, 202.2, 95.7, 202.9, 129.5, 202.9, 131.1, 202.0, 132.5, -200.8, 132.6, 185.0, 134.2, 184.8, 132.8, 168.8, 133.0, 156.7, 133.2, -156.7, 133.2, 144.7, 133.3, 142.7, 133.4, 142.0, 132.4, 140.7, 133.4, -164.5, 120.3, 164.3, 119.7, 186.7, 104.2, 194.5, 100.0, 194.5, 100.0, -202.2, 95.7, 195.3, 108.8, 209.8, 125.8, 202.9, 129.5, 167.7, 180.7, -147.7, 192.0, 153.2, 201.8, 138.8, 222.8, 136.8, 225.6, 137.5, 226.5, -134.9, 228.4, 135.5, 232.9, 120.5, 231.5, 114.4, 240.4, 114.8, 240.2, -113.1, 237.7, 113.9, 236.9, 139.8, 207.9, 135.3, 199.1, 167.7, 180.7, -143.9, 642.6, 147.6, 620.7, 147.6, 620.7, 151.3, 598.8, 157.1, 641.0, -162.5, 640.3, 175.1, 681.5, 177.5, 690.6, 176.4, 690.9, 177.7, 700.4, -179.3, 711.9, 179.3, 711.9, 180.9, 723.4, 182.7, 737.0, 182.7, 737.0, -184.6, 750.6, 184.7, 751.0, 184.6, 751.1, 184.7, 751.5, 171.2, 715.6, -171.3, 715.6, 157.8, 679.7, 156.0, 674.9, 156.0, 674.9, 154.3, 670.2, -149.1, 656.4, 144.5, 656.6, 143.9, 642.6, 125.1, 606.5, 125.7, 587.3, -144.0, 585.9, 141.4, 568.5, 139.3, 630.5, 139.6, 630.5, 137.8, 692.5, -152.3, 658.4, 123.9, 649.3, 125.1, 606.5, 95.0, 640.0, 97.5, 614.8, -98.9, 614.8, 100.0, 589.5, 104.7, 567.6, 107.5, 568.2, 115.1, 546.9, -120.5, 531.4, 124.2, 531.8, 126.0, 515.9, 122.8, 543.6, 119.2, 543.2, -112.4, 570.4, 108.5, 585.7, 108.5, 585.7, 104.7, 601.1, 102.4, 610.2, -102.4, 610.2, 100.1, 619.4, 97.5, 629.7, 94.9, 629.7, 95.0, 640.0, -10.6, 447.0, 22.3, 456.0, 16.9, 463.2, 23.2, 479.3, 25.8, 485.7, -27.2, 485.5, 28.3, 492.1, 28.9, 505.1, 27.6, 505.3, 29.4, 518.2, -24.2, 514.1, 21.7, 515.4, 19.0, 510.1, 15.9, 505.5, 14.4, 506.5, -9.8, 503.0, 7.7, 499.0, 9.9, 497.9, 9.9, 492.8, 10.1, 481.1, -10.1, 481.1, 10.2, 469.4, 10.4, 458.2, 15.8, 451.1, 10.6, 447.0, --22.1, 363.9, -22.7, 362.5, -22.7, 362.5, -23.3, 361.1, -25.7, 355.0, --26.1, 355.1, -28.1, 348.9, -28.3, 348.1, -27.4, 347.8, -27.6, 347.1, --24.5, 355.0, -25.0, 355.2, -22.3, 363.3, -22.2, 363.6, -22.2, 363.6, --22.1, 363.9, -24.7, 334.6, -20.5, 316.8, -20.4, 316.8, -16.2, 299.0, --16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -12.0, 279.2, -11.2, 279.4, --7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, -3.2, 247.1, --3.2, 247.2, -7.1, 263.0, -11.2, 279.4, -12.0, 279.2, -15.4, 295.8, --15.8, 297.4, -16.2, 299.0, -16.2, 299.0, -19.1, 311.6, -19.1, 311.6, --22.1, 324.1, -23.3, 329.4, -23.4, 329.3, -24.7, 334.6, 30.7, 301.5, -31.6, 294.0, 33.4, 293.8, 32.5, 286.5, 34.3, 297.0, 38.5, 298.0, -36.1, 307.5, 37.1, 313.2, 37.1, 313.2, 38.1, 318.9, 38.5, 321.0, -38.5, 321.0, 38.9, 323.2, 39.0, 324.0, 38.9, 324.0, 39.1, 324.7, -34.8, 313.2, 32.8, 313.5, 30.7, 301.5, 77.0, 541.9, 79.2, 544.8, -76.2, 547.2, 78.4, 549.9, 55.7, 518.9, 55.4, 519.1, 32.4, 488.3, -38.9, 497.4, 39.6, 496.9, 46.7, 505.5, 61.9, 523.7, 63.3, 522.7, -77.0, 541.9, 774.0, 706.6, 772.4, 713.4, 769.6, 713.9, 770.7, 720.3, -770.8, 720.0, 770.4, 719.9, 770.2, 719.5, 768.7, 717.2, 768.1, 717.4, -767.2, 714.9, 757.7, 681.8, 756.9, 682.0, 746.6, 649.2, 747.7, 652.9, -748.3, 652.7, 750.0, 656.2, 762.0, 681.4, 765.5, 680.3, 774.0, 706.6, -745.8, 465.5, 745.6, 465.3, 745.7, 465.1, 745.7, 464.8, 744.9, 457.9, -747.0, 452.1, 744.0, 451.0, 767.8, 459.9, 767.8, 463.2, 787.2, 480.4, -783.7, 494.5, 799.8, 504.6, 819.7, 518.2, 820.2, 518.7, 819.5, 519.3, -819.2, 520.3, 818.8, 522.1, 819.5, 522.9, 818.4, 523.8, 818.2, 523.9, -817.5, 523.1, 816.7, 522.4, 781.2, 494.0, 781.1, 494.2, 745.8, 465.5, -728.5, 558.4, 726.8, 556.9, 725.3, 557.0, 725.0, 555.3, 723.8, 548.1, -723.8, 548.1, 722.5, 540.9, 722.7, 542.5, 723.0, 542.4, 723.5, 543.9, -726.0, 551.2, 727.5, 551.0, 728.5, 558.4, 811.9, 675.4, 796.6, 675.8, -796.6, 675.2, 781.4, 676.2, 776.8, 671.7, 782.5, 663.2, 787.3, 651.6, -787.0, 652.4, 788.9, 653.1, 790.4, 654.6, 797.3, 661.3, 797.3, 661.3, -804.3, 668.0, 808.1, 671.7, 809.7, 676.2, 811.9, 675.4, 736.6, 629.3, -738.1, 633.5, 737.6, 633.7, 739.6, 637.7, 741.7, 649.6, 741.7, 649.6, -743.8, 661.6, 728.6, 636.5, 724.9, 638.7, 706.0, 615.9, 708.2, 625.6, -722.7, 620.4, 736.6, 629.3, 706.0, 615.9, 701.3, 610.3, 695.8, 609.3, -696.7, 604.7, 696.3, 604.2, 696.3, 604.1, 696.0, 603.6, 690.6, 595.2, -687.4, 596.0, 685.3, 586.9, 684.6, 584.2, 687.8, 583.4, 690.4, 580.0, -694.8, 574.1, 694.8, 574.1, 699.3, 568.1, 701.3, 565.4, 704.0, 563.8, -703.4, 562.7, 708.9, 597.6, 719.9, 595.9, 736.5, 629.0, 736.6, 629.2, -736.5, 629.2, 736.6, 629.3, 722.7, 620.4, 708.2, 625.6, 706.0, 615.9, -628.6, 378.5, 639.5, 392.5, 639.5, 392.5, 650.4, 406.5, 654.9, 441.5, -646.0, 442.7, 641.6, 478.9, 641.5, 479.0, 641.5, 479.0, 641.5, 479.0, -641.1, 482.9, 641.1, 482.9, 640.6, 486.8, 639.5, 496.1, 635.1, 498.0, -638.3, 505.4, 632.9, 492.8, 637.2, 490.9, 636.1, 476.4, 634.1, 450.4, -634.1, 450.4, 632.1, 424.4, 630.4, 401.5, 618.0, 388.9, 628.6, 378.5, -641.6, 478.9, 646.0, 442.7, 654.9, 441.5, 650.4, 406.5, 659.8, 418.7, -662.6, 432.2, 669.3, 430.8, 669.3, 431.2, 669.6, 431.2, 669.9, 431.6, -665.0, 440.8, 664.6, 440.6, 659.2, 449.5, 650.4, 464.2, 639.0, 466.5, -641.6, 478.9, 914.0, 381.7, 920.2, 370.0, 908.9, 364.0, 903.7, 346.4, -903.5, 345.5, 903.5, 345.5, 903.2, 344.7, 896.6, 321.9, 896.6, 321.9, -890.0, 299.2, 888.4, 293.8, 888.2, 293.8, 886.8, 288.4, 886.8, 288.3, -887.1, 288.3, 887.3, 288.2, 895.2, 284.4, 895.2, 284.4, 903.1, 280.6, -905.1, 279.6, 907.3, 278.8, 907.2, 278.6, 914.2, 299.5, 915.4, 300.0, -916.8, 321.8, 918.8, 351.5, 926.7, 357.7, 914.0, 381.7, 916.8, 321.8, -940.6, 341.7, 935.4, 360.4, 933.8, 398.2, 929.2, 388.1, 923.5, 382.0, -914.3, 382.6, 914.0, 382.4, 914.0, 382.1, 914.0, 381.7, 926.7, 357.7, -918.8, 351.5, 916.8, 321.8, 869.9, 395.5, 869.6, 395.5, 869.6, 393.4, -869.3, 391.2, 866.2, 370.9, 866.2, 370.9, 863.2, 350.6, 862.8, 348.1, -862.8, 348.1, 862.4, 345.6, 861.4, 338.7, 861.4, 338.7, 860.4, 331.9, -859.2, 323.7, 857.8, 323.7, 858.0, 315.5, 857.9, 319.1, 859.2, 319.2, -860.5, 322.8, 865.3, 336.2, 868.2, 335.8, 870.1, 349.6, 872.9, 370.0, -870.0, 370.4, 869.9, 391.2, 869.9, 393.4, 869.9, 395.5, 869.9, 395.5, -860.5, 322.8, 859.2, 319.2, 857.9, 319.1, 858.0, 315.5, 856.6, 309.4, -853.5, 305.6, 856.1, 303.1, 867.9, 292.0, 870.8, 290.2, 886.8, 288.4, -888.2, 293.8, 888.4, 293.8, 890.0, 299.2, 887.6, 305.1, 884.3, 303.7, -878.7, 308.3, 869.6, 315.5, 870.9, 319.1, 860.5, 322.8, 694.7, 409.5, -693.6, 408.7, 690.9, 414.1, 688.8, 413.4, 680.5, 407.7, 674.0, 400.5, -672.2, 402.1, 672.2, 401.6, 671.4, 401.6, 670.6, 401.0, 682.8, 405.0, -684.5, 402.5, 694.7, 409.5, 860.4, 331.9, 861.4, 338.7, 861.4, 338.7, -862.4, 345.6, 858.9, 351.0, 855.0, 348.4, 847.6, 351.2, 844.2, 352.5, -844.2, 352.5, 840.8, 353.8, 820.4, 361.5, 820.4, 361.5, 799.9, 369.3, -792.1, 372.2, 792.1, 372.2, 784.2, 375.2, 782.6, 375.8, 782.5, 375.6, -781.0, 376.4, 805.0, 362.6, 805.1, 362.9, 829.3, 349.3, 835.8, 345.6, -835.8, 345.6, 842.4, 342.0, 851.4, 336.9, 852.6, 330.4, 860.4, 331.9, -625.4, 361.6, 634.8, 368.9, 633.8, 370.2, 642.2, 378.7, 646.5, 383.2, -645.7, 384.7, 650.9, 387.6, 634.8, 376.6, 636.3, 372.9, 618.6, 365.6, -607.2, 357.8, 607.2, 357.8, 595.7, 350.0, 591.1, 346.9, 591.1, 346.9, -586.5, 343.8, 560.5, 326.1, 560.5, 326.1, 534.6, 308.4, 515.9, 289.9, -512.4, 293.3, 490.3, 278.3, 494.6, 281.3, 494.8, 281.0, 499.3, 283.8, -500.2, 284.4, 500.2, 284.4, 501.2, 285.0, 543.6, 311.2, 543.6, 311.2, -586.0, 337.3, 592.2, 341.2, 592.2, 341.2, 598.4, 345.0, 611.9, 353.3, -612.9, 352.0, 625.4, 361.6, 251.1, 59.5, 257.8, 49.7, 257.8, 49.7, -264.6, 39.9, 245.2, 81.7, 243.4, 80.9, 222.1, 121.8, 201.5, 161.7, -201.5, 161.7, 180.9, 201.5, 171.0, 220.5, 170.9, 220.4, 161.1, 239.4, -158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.5, 248.6, 158.7, 243.9, -161.1, 239.4, 180.0, 201.5, 180.0, 201.5, 199.0, 163.7, 219.1, 123.5, -219.1, 123.5, 239.2, 83.3, 245.2, 71.4, 244.4, 70.9, 251.1, 59.5, -474.9, 881.8, 473.8, 882.9, 470.8, 882.1, 470.7, 882.0, 466.7, 848.4, -468.7, 848.1, 466.7, 814.3, 465.8, 799.3, 465.8, 799.3, 464.9, 784.3, -463.3, 759.1, 463.2, 759.1, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3, -458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3, -455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9, -452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7, -451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2, 454.4, 587.2, -454.0, 587.3, 459.7, 667.4, 462.4, 705.5, 462.4, 705.5, 465.1, 743.6, -468.5, 791.8, 468.5, 791.8, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1, -474.7, 878.3, 474.8, 880.1, 475.7, 881.1, 474.9, 881.8, 140.0, 48.9, -137.3, 46.4, 136.3, 47.5, 132.6, 46.2, 132.9, 43.7, 122.8, 39.1, -112.9, 38.9, 117.5, 37.7, 117.5, 37.7, 122.0, 36.6, 132.0, 40.2, -132.1, 41.6, 140.0, 48.9, 168.8, 133.0, 184.8, 132.8, 185.0, 134.2, -200.8, 132.6, 200.1, 132.2, 196.4, 139.0, 192.0, 145.4, 182.2, 159.7, -183.0, 160.3, 172.4, 174.0, 173.0, 173.1, 172.2, 172.5, 172.1, 171.1, -171.0, 158.5, 171.0, 158.5, 169.9, 145.9, 169.7, 143.6, 169.7, 143.6, -169.5, 141.3, 169.2, 137.2, 168.1, 133.2, 168.8, 133.0, 142.5, 800.7, -142.4, 726.7, 142.4, 726.7, 142.2, 652.8, 142.1, 647.8, 143.1, 647.7, -143.9, 642.7, 144.9, 660.2, 143.8, 660.2, 143.6, 677.7, 143.1, 739.2, -139.1, 739.4, 142.5, 800.7, 112.4, 570.4, 119.2, 543.2, 122.8, 543.6, -126.0, 515.9, 127.1, 511.9, 127.4, 512.0, 128.8, 508.0, 135.1, 490.1, -135.1, 490.1, 141.5, 472.1, 141.7, 471.6, 142.0, 471.5, 141.9, 471.0, -141.9, 472.3, 141.9, 472.3, 141.9, 473.6, 127.5, 522.1, 130.1, 523.1, -112.4, 570.4, 132.1, 396.2, 135.2, 425.6, 135.2, 425.6, 138.4, 454.9, -109.9, 423.8, 122.8, 412.0, 107.3, 369.1, 106.3, 366.5, 106.3, 366.5, -105.4, 363.9, 98.1, 343.8, 98.1, 343.8, 90.8, 323.7, 84.3, 305.5, -84.3, 305.5, 77.7, 287.3, 72.4, 272.6, 72.4, 272.6, 67.0, 257.9, -64.0, 249.4, 64.0, 249.4, 60.9, 240.9, 58.1, 233.2, 58.4, 225.5, -55.3, 225.4, 59.1, 225.6, 58.8, 233.2, 62.3, 240.9, 63.3, 243.2, -63.3, 243.2, 64.3, 245.5, 70.8, 259.9, 70.8, 259.9, 77.2, 274.3, -90.8, 304.5, 90.8, 304.5, 104.4, 334.7, 106.6, 339.6, 106.6, 339.6, -108.8, 344.5, 120.5, 370.3, 124.8, 369.2, 132.1, 396.2, 73.9, 510.3, -74.7, 516.4, 72.5, 516.8, 73.7, 522.7, 63.8, 473.9, 62.6, 474.0, -56.6, 424.6, 60.5, 456.8, 63.0, 456.5, 69.5, 488.4, 71.7, 499.4, -72.6, 499.3, 73.9, 510.3, -25.5, 438.4, -32.2, 422.8, -39.0, 422.7, --38.9, 407.2, -40.1, 403.8, -40.7, 403.4, -40.2, 400.0, -38.5, 387.8, --34.0, 376.1, -34.5, 375.9, -29.2, 377.4, -32.6, 389.3, -30.6, 402.7, --28.1, 420.5, -20.0, 435.3, -25.5, 438.4, 22.8, 369.7, 23.3, 379.1, -23.2, 379.1, 23.7, 388.5, 25.5, 440.3, 26.0, 440.3, 28.3, 492.1, -27.2, 485.5, 25.8, 485.7, 23.2, 479.3, 22.2, 474.7, 23.2, 474.4, -23.2, 469.6, 23.1, 435.6, 23.1, 435.6, 22.9, 401.7, 22.9, 387.5, -22.9, 387.5, 22.8, 373.4, 22.8, 371.5, 22.9, 371.5, 22.8, 369.7, --7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, 2.8, 222.5, -2.7, 222.5, 5.0, 213.7, 8.2, 201.4, 6.4, 200.6, 11.4, 189.1, -12.6, 184.6, 11.6, 184.0, 13.9, 180.0, 13.5, 181.6, 14.2, 181.8, -14.5, 183.5, 16.1, 189.6, 14.8, 189.9, 15.1, 196.4, 21.6, 253.7, -15.7, 254.3, 16.3, 312.3, 18.3, 298.8, 9.2, 297.5, 2.2, 282.6, --2.5, 272.8, -6.8, 272.9, -7.1, 263.0, 25.8, 421.8, 24.7, 405.2, -24.2, 405.2, 23.7, 388.5, 23.2, 379.1, 23.3, 379.1, 22.8, 369.7, -22.8, 369.7, 22.8, 369.7, 22.8, 369.6, 22.8, 369.6, 22.8, 369.5, -22.8, 369.5, 19.7, 343.1, 26.0, 342.4, 29.1, 315.3, 35.6, 352.4, -27.9, 353.7, 26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2, -26.2, 408.0, 20.2, 411.2, 25.8, 421.8, 55.5, 418.2, 55.0, 421.2, -56.0, 421.4, 56.6, 424.6, 62.6, 474.0, 63.8, 473.9, 73.7, 522.7, -75.4, 532.3, 71.5, 538.3, 77.0, 541.9, 63.3, 522.7, 61.9, 523.7, -46.7, 505.5, 40.6, 486.7, 48.9, 484.0, 51.0, 462.5, 53.2, 440.3, -52.2, 440.2, 55.5, 418.2, 40.2, 617.2, 64.0, 620.8, 64.0, 620.8, -87.8, 624.5, 87.7, 638.4, 88.9, 638.4, 89.9, 652.3, 89.9, 652.3, -89.7, 652.3, 89.4, 652.2, 80.8, 650.5, 80.8, 650.5, 72.2, 648.9, -62.8, 647.0, 59.0, 650.8, 53.4, 645.1, 43.1, 634.9, 38.9, 618.0, -40.2, 617.2, 53.4, 645.1, 53.2, 643.6, 47.9, 644.1, 42.5, 643.0, -35.6, 641.6, 35.6, 641.6, 28.8, 640.3, 21.0, 638.8, 17.9, 641.9, -13.1, 637.2, 7.2, 631.4, 5.5, 627.2, 7.3, 619.4, 7.9, 620.2, -18.8, 616.3, 18.7, 614.1, 18.6, 614.0, 18.8, 614.0, 19.0, 613.9, -19.7, 612.1, 29.6, 615.5, 40.2, 617.2, 38.9, 618.0, 43.1, 634.9, -53.4, 645.1, 75.8, 715.5, 69.0, 712.1, 69.0, 712.1, 62.2, 708.7, -58.6, 707.9, 59.3, 705.0, 56.3, 701.2, 67.0, 706.5, 68.6, 706.3, -75.8, 715.5, 789.1, 644.2, 787.8, 644.4, 788.2, 647.9, 787.3, 651.6, -782.5, 663.2, 776.8, 671.7, 781.4, 676.2, 781.2, 676.2, 781.0, 677.3, -781.1, 677.4, 776.3, 677.8, 777.6, 692.0, 774.0, 706.6, 765.5, 680.3, -762.0, 681.4, 750.0, 656.2, 752.4, 646.1, 769.1, 646.7, 789.1, 644.2, -750.0, 656.2, 748.3, 652.7, 747.7, 652.9, 746.6, 649.2, 741.5, 633.0, -741.7, 632.9, 736.4, 616.8, 754.8, 618.3, 757.0, 625.1, 773.1, 619.7, -778.2, 625.5, 784.0, 622.2, 794.7, 621.4, 794.7, 621.4, 794.2, 623.3, -793.8, 625.1, 791.5, 634.7, 795.2, 639.9, 789.1, 644.2, 769.1, 646.7, -752.4, 646.1, 750.0, 656.2, 748.1, 484.6, 742.7, 479.3, 750.7, 468.2, -745.8, 465.5, 781.1, 494.2, 781.2, 494.0, 816.7, 522.4, 809.9, 516.5, -808.6, 518.0, 800.5, 513.5, 793.3, 509.5, 793.3, 509.5, 786.1, 505.6, -767.1, 495.1, 762.9, 499.3, 748.1, 484.6, 907.8, 630.0, 907.7, 629.7, -907.1, 629.8, 907.1, 629.4, 904.8, 615.5, 904.2, 615.5, 903.1, 601.5, -903.9, 612.2, 904.8, 612.1, 906.6, 622.8, 907.2, 626.4, 907.5, 626.4, -907.8, 630.0, 595.7, 350.0, 607.2, 357.8, 607.2, 357.8, 618.6, 365.6, -625.2, 368.3, 623.6, 372.1, 628.6, 378.5, 618.0, 388.9, 630.4, 401.5, -632.1, 424.4, 604.2, 402.0, 614.7, 388.9, 597.3, 353.4, 596.5, 351.7, -597.0, 350.8, 595.7, 350.0, 659.2, 449.5, 664.6, 440.6, 665.0, 440.8, -669.9, 431.6, 678.3, 442.4, 678.3, 442.4, 686.6, 453.1, 683.8, 457.8, -665.3, 457.3, 659.2, 449.5, 948.0, 402.8, 948.7, 413.7, 949.3, 413.7, -949.4, 424.6, 949.8, 448.4, 949.8, 448.4, 950.3, 472.2, 948.5, 462.5, -948.1, 462.5, 945.9, 452.8, 942.7, 430.1, 943.4, 430.0, 940.8, 407.3, -937.7, 379.2, 924.2, 357.6, 934.6, 351.1, 927.8, 355.4, 942.7, 376.7, -948.0, 402.8, 934.6, 351.1, 927.7, 310.9, 923.3, 310.1, 925.5, 269.8, -925.6, 266.1, 939.6, 265.2, 939.3, 263.2, 942.6, 333.0, 943.6, 333.0, -948.0, 402.8, 942.7, 376.7, 927.8, 355.4, 934.6, 351.1, 914.7, 275.0, -914.5, 273.9, 918.0, 273.4, 921.4, 271.7, 923.2, 270.9, 923.2, 270.9, -925.0, 270.0, 925.2, 269.9, 925.5, 269.9, 925.5, 269.8, 923.3, 310.1, -927.7, 310.9, 934.6, 351.1, 924.2, 357.6, 937.7, 379.2, 940.8, 407.3, -923.8, 342.2, 924.2, 341.6, 914.7, 275.0, 940.8, 407.3, 943.4, 430.0, -942.7, 430.1, 945.9, 452.8, 939.9, 425.5, 945.1, 423.2, 933.8, 398.2, -935.4, 360.4, 940.6, 341.7, 916.8, 321.8, 915.4, 300.0, 914.2, 299.5, -907.2, 278.6, 907.1, 277.0, 914.9, 275.8, 914.7, 275.0, 924.2, 341.6, -923.8, 342.2, 940.8, 407.3, 760.6, 353.1, 805.7, 329.5, 805.7, 329.5, -850.7, 305.9, 823.3, 315.5, 825.7, 322.5, 800.7, 339.1, 776.8, 355.0, -776.8, 355.0, 752.8, 370.9, 744.0, 376.7, 738.7, 374.4, 735.2, 382.6, -742.6, 365.5, 745.0, 363.5, 760.6, 353.1, 735.2, 382.6, 717.6, 397.7, -715.7, 395.5, 696.2, 408.5, 695.5, 409.0, 695.3, 409.6, 694.7, 409.5, -684.5, 402.5, 682.8, 405.0, 670.6, 401.0, 670.3, 400.8, 670.3, 400.8, -669.9, 400.6, 716.7, 380.0, 715.3, 376.8, 760.6, 353.1, 745.0, 363.5, -742.6, 365.5, 735.2, 382.6, 829.3, 349.3, 805.1, 362.9, 805.0, 362.6, -781.0, 376.4, 775.0, 379.5, 774.6, 378.8, 768.3, 381.2, 766.2, 382.0, -766.2, 382.0, 764.0, 382.8, 751.7, 387.5, 751.7, 387.5, 739.4, 392.2, -727.0, 396.9, 727.0, 396.9, 714.5, 401.6, 705.4, 405.0, 702.9, 402.3, -696.2, 408.5, 715.7, 395.5, 717.6, 397.7, 735.2, 382.6, 738.7, 374.4, -744.0, 376.7, 752.8, 370.9, 790.2, 357.7, 794.5, 342.5, 829.3, 349.3, -823.9, 404.0, 808.4, 391.3, 812.1, 386.9, 800.2, 369.8, 800.1, 369.5, -800.0, 369.2, 799.9, 369.3, 820.4, 361.5, 820.4, 361.5, 840.8, 353.8, -846.5, 358.5, 834.3, 373.1, 827.8, 392.5, 825.8, 398.3, 822.2, 402.7, -823.9, 404.0, 520.2, 128.3, 522.8, 135.7, 526.6, 134.1, 530.8, 141.2, -541.2, 158.9, 540.1, 159.5, 549.5, 177.8, 563.9, 205.9, 566.4, 204.8, -578.3, 234.0, 576.1, 228.6, 572.1, 230.5, 569.0, 225.3, 554.9, 201.4, -556.5, 200.5, 544.1, 175.8, 542.3, 172.2, 542.3, 172.2, 540.5, 168.7, -530.3, 148.5, 527.6, 149.4, 520.2, 128.3, 649.0, 299.7, 641.0, 276.2, -628.3, 280.5, 607.6, 261.2, 603.6, 257.5, 603.6, 257.5, 599.6, 253.8, -588.9, 243.9, 586.1, 245.8, 578.3, 234.0, 566.4, 204.8, 563.9, 205.9, -549.5, 177.8, 581.3, 186.8, 575.0, 209.0, 600.5, 240.3, 624.8, 270.0, -637.5, 265.7, 649.0, 299.7, 621.3, 242.7, 629.3, 253.2, 624.4, 257.5, -633.4, 266.7, 601.5, 234.1, 604.4, 231.3, 575.4, 195.8, 570.5, 189.8, -571.2, 189.2, 565.6, 183.9, 578.8, 196.4, 578.2, 197.1, 590.7, 210.4, -606.0, 226.5, 607.9, 225.1, 621.3, 242.7, 607.6, 261.2, 628.3, 280.5, -641.0, 276.2, 649.0, 299.7, 666.4, 315.9, 667.6, 314.8, 683.8, 332.1, -680.1, 328.1, 678.1, 330.1, 674.0, 326.3, 640.0, 294.7, 639.4, 295.1, -607.6, 261.2, 538.5, 273.3, 548.2, 283.1, 548.2, 283.1, 557.8, 293.0, -582.8, 318.3, 582.8, 318.3, 607.8, 343.7, 616.6, 352.7, 617.9, 362.6, -625.4, 361.6, 612.9, 352.0, 611.9, 353.3, 598.4, 345.0, 568.0, 314.6, -570.6, 312.1, 542.8, 279.0, 542.2, 278.3, 542.2, 278.2, 541.6, 277.4, -540.5, 275.8, 540.5, 275.8, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7, -538.5, 273.3, 671.6, 22.5, 673.6, 20.2, 674.3, 18.8, 676.7, 19.0, -689.0, 32.0, 698.7, 22.8, 720.8, 26.7, 691.3, 60.0, 674.9, 71.6, -633.3, 68.0, 650.3, 69.5, 651.8, 44.7, 671.6, 22.5, 633.3, 68.0, -619.2, 79.9, 616.0, 76.2, 598.7, 84.3, 570.9, 97.4, 571.6, 99.2, -543.0, 110.6, 550.9, 107.4, 550.2, 105.6, 557.4, 100.7, 560.1, 98.9, -560.1, 98.9, 562.7, 97.1, 566.7, 94.4, 566.7, 94.4, 570.6, 91.6, -605.0, 68.1, 605.0, 68.1, 639.3, 44.6, 655.4, 33.6, 667.9, 36.8, -671.6, 22.5, 651.8, 44.7, 650.3, 69.5, 633.3, 68.0, 623.1, 94.6, -622.0, 94.0, 621.5, 95.0, 619.9, 95.3, 615.1, 96.3, 615.1, 96.3, -610.4, 97.3, 600.3, 99.5, 600.3, 99.5, 590.2, 101.6, 580.0, 103.8, -580.0, 103.8, 569.8, 106.0, 569.2, 106.1, 569.2, 106.1, 568.7, 106.2, -561.4, 107.8, 561.4, 107.8, 554.1, 109.4, 547.3, 110.8, 547.4, 111.5, -540.5, 112.3, 541.8, 112.1, 541.7, 111.2, 543.0, 110.6, 571.6, 99.2, -570.9, 97.4, 598.7, 84.3, 599.2, 84.1, 599.4, 84.6, 600.1, 84.9, -611.6, 89.7, 612.1, 88.8, 623.1, 94.6, 528.8, -39.2, 527.3, -47.3, -543.8, -57.6, 542.7, -58.6, 554.3, -47.9, 557.9, -30.8, 549.9, -19.7, -550.9, -21.1, 530.9, -27.9, 528.8, -39.2, 686.9, -7.4, 688.8, -8.6, -700.2, 0.9, 699.1, 3.6, 689.6, 2.0, 678.1, 20.5, 676.7, 19.0, -674.3, 18.8, 673.6, 20.2, 671.6, 22.5, 667.9, 36.8, 655.4, 33.6, -639.3, 44.6, 643.9, 42.0, 643.1, 40.5, 646.9, 36.3, 666.9, 14.4, -662.7, 7.7, 686.9, -7.4, 432.7, -43.8, 494.1, -60.9, 493.9, -61.6, -555.8, -76.8, 554.4, -76.4, 555.1, -74.3, 553.5, -73.6, 548.9, -71.4, -548.5, -72.3, 543.4, -71.1, 508.4, -62.5, 508.4, -62.5, 473.5, -53.9, -471.6, -53.4, 471.6, -53.4, 469.8, -53.0, 451.2, -48.4, 451.1, -48.9, -432.7, -43.8, 223.1, 199.1, 223.1, 199.1, 232.3, 166.6, 241.5, 134.0, -245.6, 119.3, 245.6, 119.3, 249.8, 104.6, 253.8, 90.4, 253.9, 90.4, -257.9, 76.1, 260.2, 67.8, 260.2, 67.8, 262.6, 59.6, 266.1, 47.2, -266.1, 47.2, 269.6, 34.9, 270.1, 33.1, 270.0, 33.1, 270.6, 31.2, -270.6, 31.2, 270.6, 31.2, 270.6, 31.1, 270.1, 33.0, 270.1, 33.0, -269.6, 34.9, 266.1, 47.2, 266.1, 47.2, 262.6, 59.6, 260.2, 67.8, -260.2, 67.8, 257.9, 76.1, 253.9, 90.4, 253.8, 90.4, 249.8, 104.6, -245.6, 119.3, 245.6, 119.3, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1, -223.1, 199.1, 149.0, 461.3, 149.0, 461.3, 149.7, 458.6, 150.5, 455.9, -178.7, 356.3, 175.0, 355.1, 206.8, 256.7, 206.6, 257.2, 214.0, 259.0, -213.8, 260.1, 210.0, 283.9, 206.3, 283.4, 198.8, 306.6, 194.5, 320.1, -194.5, 320.1, 190.1, 333.6, 170.3, 394.7, 170.2, 394.7, 150.5, 455.9, -149.7, 458.6, 149.0, 461.3, 149.0, 461.3, 238.0, 140.7, 239.4, 137.2, -240.6, 137.6, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1, 223.1, 199.1, -215.0, 227.9, 215.1, 227.9, 206.8, 256.7, 194.4, 299.9, 194.2, 299.8, -181.8, 343.0, 179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 165.4, 402.3, -165.4, 402.3, 154.3, 442.2, 152.4, 449.0, 150.5, 455.9, 150.5, 455.9, -150.5, 455.9, 152.4, 449.0, 154.3, 442.2, 165.4, 402.3, 165.4, 402.3, -176.4, 362.5, 179.1, 352.8, 179.0, 352.7, 181.8, 343.0, 189.6, 315.0, -189.6, 315.0, 197.4, 286.9, 200.1, 277.3, 200.1, 277.3, 202.7, 267.7, -214.8, 224.2, 214.8, 224.2, 226.9, 180.6, 231.1, 165.6, 231.1, 165.6, -235.3, 150.5, 235.5, 149.5, 235.5, 149.5, 235.8, 148.5, 236.9, 144.6, -236.5, 144.5, 238.0, 140.7, 222.1, 121.8, 243.4, 80.9, 245.2, 81.7, -264.6, 39.9, 267.6, 35.6, 267.6, 35.6, 270.6, 31.2, 269.1, 45.7, -266.6, 45.4, 262.6, 59.6, 260.2, 67.8, 260.2, 67.8, 257.9, 76.1, -253.9, 90.4, 253.8, 90.4, 249.8, 104.6, 247.0, 109.7, 244.2, 108.1, -238.5, 111.6, 230.3, 116.7, 224.7, 114.7, 222.1, 121.8, 161.1, 239.4, -158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.0, 249.5, 156.0, 249.5, -155.5, 250.4, 147.2, 266.5, 138.9, 282.6, 138.9, 282.6, 138.9, 282.6, -147.2, 266.5, 155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6, -156.5, 248.6, 158.7, 243.9, 161.1, 239.4, 464.8, 585.3, 461.1, 544.5, -461.1, 544.5, 457.3, 503.6, 457.3, 502.5, 458.0, 502.4, 458.7, 501.2, -460.2, 498.5, 460.2, 498.5, 461.7, 495.7, 462.7, 493.9, 463.8, 493.9, -463.8, 492.1, 465.4, 538.7, 484.5, 550.0, 464.8, 585.3, 209.1, 647.2, -209.1, 646.8, 209.3, 646.8, 209.5, 646.5, 212.6, 641.2, 212.6, 641.2, -215.7, 636.0, 218.1, 631.9, 217.3, 628.6, 220.5, 627.8, 219.5, 628.1, -220.3, 631.4, 220.0, 634.9, 219.1, 648.1, 219.1, 648.1, 218.1, 661.3, -214.3, 713.1, 225.7, 716.7, 210.6, 764.9, 221.5, 730.2, 210.1, 726.6, -209.6, 688.4, 209.5, 676.0, 209.5, 676.0, 209.3, 663.7, 209.2, 655.4, -209.0, 655.4, 209.1, 647.2, 466.7, 814.3, 468.7, 848.1, 466.7, 848.4, -470.7, 882.0, 470.1, 884.5, 460.2, 884.2, 450.3, 882.5, 450.5, 882.6, -450.8, 880.6, 451.3, 878.7, 459.0, 846.5, 464.5, 813.9, 466.7, 814.3, -131.9, 102.5, 132.2, 103.4, 132.6, 103.2, 133.3, 103.9, 134.2, 104.8, -134.2, 104.8, 135.1, 105.7, 136.0, 106.7, 136.0, 106.7, 136.9, 107.6, -144.5, 115.4, 149.7, 114.0, 152.1, 123.1, 147.4, 125.8, 147.4, 125.8, -142.6, 128.4, 133.5, 119.1, 136.9, 115.6, 131.9, 102.5, 172.1, 171.1, -172.2, 172.5, 173.0, 173.1, 172.4, 174.0, 172.0, 175.3, 170.6, 175.3, -170.7, 176.4, 170.5, 173.8, 170.6, 173.2, 172.1, 171.1, 188.5, 778.9, -183.6, 784.8, 193.4, 790.8, 191.6, 801.6, 200.2, 807.9, 172.4, 831.7, -175.5, 859.3, 176.2, 858.1, 164.7, 854.8, 164.5, 849.8, 163.8, 836.8, -169.0, 836.5, 173.5, 823.2, 181.0, 801.1, 174.5, 795.6, 188.5, 778.9, -124.4, 697.1, 123.6, 699.9, 136.9, 701.5, 137.3, 706.8, 135.6, 765.0, -131.5, 765.1, 133.9, 823.2, 134.3, 819.7, 127.4, 820.2, 124.7, 815.1, -126.5, 809.3, 123.7, 808.3, 122.4, 801.6, 120.3, 788.4, 120.1, 788.5, -117.8, 775.3, 118.5, 736.2, 113.8, 734.1, 124.4, 697.1, 117.8, 775.3, -117.4, 773.4, 117.4, 773.4, 117.1, 771.4, 109.1, 725.5, 98.5, 724.9, -101.1, 679.7, 100.7, 686.7, 111.3, 687.3, 121.5, 694.9, 123.0, 696.0, -124.5, 696.1, 124.4, 697.1, 113.8, 734.1, 118.5, 736.2, 117.8, 775.3, -113.5, 633.8, 113.4, 625.4, 117.1, 625.4, 120.7, 617.0, 122.9, 611.8, -126.2, 611.0, 125.1, 606.5, 123.9, 649.3, 152.3, 658.4, 137.8, 692.5, -137.6, 699.6, 137.6, 699.6, 137.3, 706.8, 136.9, 701.5, 123.6, 699.9, -124.4, 697.1, 124.5, 696.1, 123.0, 696.0, 121.5, 694.9, 116.3, 664.6, -113.8, 664.4, 113.5, 633.8, 121.5, 694.9, 111.3, 687.3, 100.7, 686.7, -101.1, 679.7, 100.1, 673.7, 100.0, 673.7, 99.0, 667.8, 98.9, 666.1, -99.7, 666.1, 100.4, 664.5, 107.0, 649.1, 118.6, 641.1, 113.5, 633.8, -113.8, 664.4, 116.3, 664.6, 121.5, 694.9, 104.7, 601.1, 108.5, 585.7, -108.5, 585.7, 112.4, 570.4, 130.1, 523.1, 127.5, 522.1, 141.9, 473.6, -141.9, 494.5, 141.9, 494.5, 141.9, 515.4, 129.0, 559.9, 126.7, 560.0, -104.7, 601.1, 74.1, 373.8, 73.1, 372.4, 73.1, 372.4, 72.1, 371.0, -72.8, 344.1, 73.9, 344.1, 75.7, 317.2, 75.8, 314.6, 76.0, 314.7, -76.0, 312.1, 75.6, 328.2, 75.5, 328.2, 75.0, 344.2, 74.5, 359.0, -75.7, 359.1, 74.1, 373.8, 38.1, 251.5, 39.2, 217.8, 39.2, 217.8, -40.3, 184.2, 38.1, 193.9, 44.4, 195.3, 48.4, 206.4, 49.9, 210.5, -49.9, 210.5, 51.4, 214.6, 53.3, 220.0, 53.3, 220.0, 55.3, 225.4, -58.4, 225.5, 58.1, 233.2, 60.9, 240.9, 55.0, 249.8, 37.7, 250.5, -38.1, 251.5, 69.5, 488.4, 63.0, 456.5, 60.5, 456.8, 56.6, 424.6, -56.0, 421.4, 55.0, 421.2, 55.5, 418.2, 52.4, 400.5, 52.4, 400.5, -49.3, 382.8, 48.7, 379.6, 48.7, 379.6, 48.2, 376.4, 46.4, 366.3, -46.6, 366.3, 44.6, 356.3, 49.8, 382.7, 49.6, 382.7, 54.6, 409.2, -62.0, 448.8, 64.4, 448.5, 69.5, 488.4, 104.4, 482.2, 105.1, 470.7, -92.8, 469.9, 81.3, 457.6, 78.2, 454.3, 75.5, 454.7, 75.1, 451.0, -72.7, 430.8, 69.3, 428.3, 75.8, 409.9, 73.3, 416.9, 79.5, 419.1, -83.1, 428.3, 93.7, 455.2, 106.0, 456.0, 104.4, 482.2, 9.9, 492.8, -9.9, 497.9, 7.7, 499.0, 9.8, 503.0, 5.2, 499.5, 3.7, 500.5, -0.7, 495.9, -0.1, 494.8, -0.5, 495.0, -1.6, 494.1, -10.5, 465.3, --13.6, 466.3, -25.5, 438.4, -20.0, 435.3, -28.1, 420.5, -30.6, 402.7, --30.4, 406.9, -28.8, 406.8, -27.0, 410.9, -26.2, 412.5, -26.2, 412.5, --25.5, 414.1, -7.8, 453.5, -6.0, 452.8, 9.9, 492.8, 23.2, 469.6, -23.2, 474.4, 22.2, 474.7, 23.2, 479.3, 16.9, 463.2, 22.3, 456.0, -10.6, 447.0, -2.7, 413.2, -2.5, 413.1, -15.8, 379.3, -17.1, 376.1, --18.6, 372.9, -18.6, 372.9, -18.6, 372.9, -17.1, 376.1, -15.8, 379.3, --10.6, 391.4, -10.6, 391.4, -5.3, 403.6, 8.9, 436.6, 10.5, 436.0, -23.2, 469.6, 16.7, 353.2, 16.8, 359.2, 14.8, 360.0, 16.8, 365.3, -9.7, 365.8, 1.8, 359.9, 1.7, 354.3, 1.7, 353.8, 12.1, 349.8, -16.7, 353.2, 26.7, 394.2, 27.9, 354.8, 27.4, 354.7, 29.1, 315.3, -29.9, 308.7, 29.9, 308.7, 30.7, 302.0, 29.3, 347.1, 28.7, 347.1, -26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2, 51.0, 462.5, -48.9, 484.0, 40.6, 486.7, 46.7, 505.5, 39.6, 496.9, 38.9, 497.4, -32.4, 488.3, 31.2, 486.7, 30.0, 486.7, 30.0, 485.1, 29.1, 470.9, -29.1, 470.9, 28.1, 456.8, 34.9, 416.1, 36.8, 416.2, 48.2, 376.4, -48.7, 379.6, 48.7, 379.6, 49.3, 382.8, 50.6, 422.6, 51.9, 422.7, -51.0, 462.5, 49.3, 382.8, 52.4, 400.5, 52.4, 400.5, 55.5, 418.2, -52.2, 440.2, 53.2, 440.3, 51.0, 462.5, 51.9, 422.7, 50.6, 422.6, -49.3, 382.8, 43.3, 684.7, 30.8, 668.9, 32.9, 655.3, 18.3, 653.0, -14.0, 646.2, 10.3, 640.7, 13.1, 637.2, 17.9, 641.9, 21.0, 638.8, -28.8, 640.3, 40.9, 659.4, 51.2, 675.0, 43.3, 684.7, 713.3, 489.1, -712.7, 488.6, 713.1, 488.1, 713.0, 487.0, 713.6, 472.0, 710.3, 471.8, -707.6, 456.6, 726.2, 469.7, 719.9, 478.6, 732.3, 500.6, 732.8, 501.5, -732.5, 501.9, 733.3, 502.3, 728.0, 499.4, 728.2, 499.0, 723.2, 495.6, -718.2, 492.3, 717.8, 492.9, 713.3, 489.1, 752.2, 518.9, 756.0, 528.8, -751.3, 539.8, 754.8, 540.6, 745.8, 538.6, 748.0, 528.5, 741.2, 516.5, -739.2, 512.8, 736.7, 509.4, 737.1, 509.1, 738.4, 508.1, 740.9, 511.5, -744.7, 514.0, 748.4, 516.4, 750.9, 515.5, 752.2, 518.9, 839.3, 624.0, -867.6, 630.5, 867.6, 630.8, 895.8, 637.6, 900.4, 638.7, 903.8, 641.2, -904.9, 639.8, 891.5, 650.5, 891.5, 650.5, 878.0, 661.2, 856.0, 656.1, -859.1, 643.0, 840.1, 624.8, 839.7, 624.4, 839.8, 624.1, 839.3, 624.0, -835.3, 566.8, 835.3, 566.8, 836.0, 567.4, 836.7, 568.0, 857.1, 585.8, -857.1, 585.8, 877.5, 603.6, 892.3, 616.5, 892.3, 616.5, 907.1, 629.4, -907.1, 629.8, 907.7, 629.7, 907.8, 630.0, 910.0, 632.0, 912.3, 632.1, -912.2, 633.9, 909.8, 635.8, 909.8, 635.8, 907.5, 637.7, 884.6, 619.5, -886.4, 617.2, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8, -852.2, 583.3, 852.1, 583.4, 839.5, 570.9, 838.1, 569.5, 838.2, 569.5, -836.7, 568.0, 836.0, 567.4, 835.3, 566.8, 835.3, 566.8, 845.9, 561.2, -855.0, 547.1, 858.7, 547.4, 874.5, 539.8, 876.3, 539.0, 881.2, 544.2, -881.1, 544.3, 877.6, 549.8, 874.2, 547.6, 867.3, 550.9, 856.6, 556.1, -851.4, 552.7, 845.9, 561.2, 819.2, 520.3, 819.5, 519.3, 820.2, 518.7, -819.7, 518.2, 817.7, 516.8, 825.6, 507.8, 823.0, 504.7, 839.9, 508.5, -838.4, 515.2, 853.8, 525.7, 864.1, 532.8, 875.5, 535.3, 874.5, 539.8, -858.7, 547.4, 855.0, 547.1, 845.9, 561.2, 842.7, 563.6, 839.5, 565.7, -839.6, 565.9, 826.2, 545.2, 828.8, 543.4, 819.2, 520.3, 839.6, 565.9, -839.8, 566.4, 838.3, 567.7, 836.7, 568.0, 836.0, 567.4, 835.3, 566.8, -835.3, 566.8, 824.6, 557.5, 824.6, 557.5, 813.9, 548.1, 813.3, 547.6, -812.6, 547.5, 812.7, 547.1, 814.9, 535.3, 815.5, 535.4, 818.4, 523.8, -819.5, 522.9, 818.8, 522.1, 819.2, 520.3, 828.8, 543.4, 826.2, 545.2, -839.6, 565.9, 906.6, 622.8, 904.8, 612.1, 903.9, 612.2, 903.1, 601.5, -900.4, 583.4, 900.5, 583.4, 897.9, 565.3, 897.9, 565.1, 897.9, 565.1, -897.9, 564.9, 899.5, 575.6, 899.5, 575.6, 901.1, 586.3, 903.8, 604.5, -904.2, 604.5, 906.6, 622.8, 597.3, 353.4, 614.7, 388.9, 604.2, 402.0, -632.1, 424.4, 634.1, 450.4, 634.1, 450.4, 636.1, 476.4, 636.0, 474.9, -635.6, 474.9, 635.2, 473.4, 630.7, 459.4, 630.7, 459.4, 626.3, 445.3, -611.8, 399.4, 586.5, 392.3, 597.3, 353.4, 690.4, 580.0, 687.8, 583.4, -684.6, 584.2, 685.3, 586.9, 684.2, 587.1, 681.3, 582.6, 682.0, 581.7, -683.9, 579.2, 689.6, 578.7, 690.4, 580.0, 911.3, 564.9, 903.7, 560.0, -903.9, 559.8, 896.4, 554.7, 894.9, 553.7, 894.4, 554.0, 893.3, 552.6, -892.7, 551.8, 893.2, 551.5, 893.0, 550.3, 892.0, 543.8, 892.0, 543.8, -891.0, 537.3, 890.9, 536.6, 891.2, 536.4, 890.9, 536.0, 895.6, 542.1, -895.3, 542.3, 899.8, 548.7, 905.1, 556.1, 905.1, 556.1, 910.3, 563.5, -910.4, 563.6, 910.4, 563.6, 910.5, 563.7, 910.9, 564.3, 910.8, 564.5, -911.3, 564.9, 881.4, 472.9, 881.6, 434.2, 875.4, 434.2, 869.9, 395.5, -869.9, 395.5, 869.9, 393.4, 869.9, 391.2, 876.0, 432.0, 881.6, 432.1, -881.4, 472.9, 921.6, 407.7, 923.8, 415.2, 923.8, 415.2, 926.0, 422.7, -938.8, 442.6, 928.9, 449.0, 931.8, 475.4, 930.9, 463.2, 930.0, 463.3, -928.2, 451.2, 924.9, 429.4, 923.3, 429.6, 921.6, 407.7, 903.7, 346.4, -908.9, 364.0, 920.2, 370.0, 914.0, 381.7, 914.0, 382.1, 914.0, 382.4, -914.3, 382.6, 916.1, 382.5, 916.7, 390.9, 919.1, 399.2, 917.7, 404.6, -913.4, 403.5, 907.7, 407.8, 901.1, 412.8, 896.0, 419.1, 894.4, 417.8, -884.3, 409.7, 889.3, 403.4, 884.2, 389.0, 883.6, 387.4, 882.6, 387.0, -883.1, 385.9, 892.3, 365.7, 890.9, 348.1, 903.7, 346.4, 842.4, 342.0, -835.8, 345.6, 835.8, 345.6, 829.3, 349.3, 794.5, 342.5, 790.2, 357.7, -752.8, 370.9, 776.8, 355.0, 776.8, 355.0, 800.7, 339.1, 819.2, 333.1, -823.5, 335.2, 842.4, 342.0, 800.7, 339.1, 825.7, 322.5, 823.3, 315.5, -850.7, 305.9, 851.2, 305.7, 851.6, 305.3, 851.6, 305.3, 853.8, 304.2, -856.0, 302.9, 856.1, 303.1, 853.5, 305.6, 856.6, 309.4, 858.0, 315.5, -857.8, 323.7, 859.2, 323.7, 860.4, 331.9, 852.6, 330.4, 851.4, 336.9, -842.4, 342.0, 823.5, 335.2, 819.2, 333.1, 800.7, 339.1, 847.6, 351.2, -855.0, 348.4, 858.9, 351.0, 862.4, 345.6, 862.8, 348.1, 862.8, 348.1, -863.2, 350.6, 856.3, 353.2, 847.8, 352.0, 847.6, 351.2, 765.4, 446.9, -783.7, 457.2, 781.5, 461.2, 797.5, 475.5, 815.2, 491.3, 815.2, 491.3, -832.8, 507.0, 837.8, 511.5, 837.8, 511.5, 842.9, 516.0, 848.3, 520.8, -847.5, 522.2, 853.8, 525.7, 838.4, 515.2, 839.9, 508.5, 823.0, 504.7, -809.3, 488.9, 785.4, 487.8, 787.2, 480.4, 767.8, 463.2, 767.8, 459.9, -744.0, 451.0, 728.2, 440.2, 728.2, 440.2, 712.4, 429.4, 706.9, 425.7, -706.9, 425.7, 701.5, 422.0, 700.7, 419.7, 698.9, 420.3, 696.4, 418.5, -731.1, 432.1, 733.1, 428.7, 765.4, 446.9, 696.4, 418.5, 692.6, 416.0, -692.6, 416.0, 688.8, 413.4, 690.9, 414.1, 693.6, 408.7, 694.7, 409.5, -695.3, 409.6, 695.5, 409.0, 696.2, 408.5, 702.9, 402.3, 705.4, 405.0, -714.5, 401.6, 743.6, 417.7, 763.2, 449.1, 765.4, 446.9, 733.1, 428.7, -731.1, 432.1, 696.4, 418.5, 493.2, 122.4, 496.6, 123.8, 497.6, 121.5, -502.0, 120.5, 507.0, 119.4, 507.6, 117.2, 512.1, 118.4, 515.0, 119.1, -517.6, 122.8, 516.9, 124.3, 516.4, 125.4, 513.3, 124.0, 509.6, 123.7, -501.4, 123.1, 500.4, 125.4, 493.2, 122.4, 600.5, 240.3, 575.0, 209.0, -581.3, 186.8, 549.5, 177.8, 540.1, 159.5, 541.2, 158.9, 530.8, 141.2, -553.1, 149.7, 548.2, 162.6, 565.6, 183.9, 571.2, 189.2, 570.5, 189.8, -575.4, 195.8, 588.8, 217.5, 581.6, 227.2, 600.5, 240.3, 575.4, 195.8, -604.4, 231.3, 601.5, 234.1, 633.4, 266.7, 639.4, 274.1, 639.4, 274.1, -645.4, 281.4, 659.5, 298.6, 659.5, 298.6, 673.5, 315.8, 673.6, 315.8, -673.6, 315.8, 673.6, 315.9, 685.1, 330.0, 687.0, 328.8, 696.7, 344.0, -692.1, 336.9, 690.2, 338.1, 683.8, 332.1, 667.6, 314.8, 666.4, 315.9, -649.0, 299.7, 637.5, 265.7, 624.8, 270.0, 600.5, 240.3, 581.6, 227.2, -588.8, 217.5, 575.4, 195.8, 903.1, 280.6, 895.2, 284.4, 895.2, 284.4, -887.3, 288.2, 883.2, 288.4, 883.0, 285.2, 878.8, 282.3, 854.6, 265.6, -854.6, 265.6, 830.4, 249.0, 825.3, 245.5, 825.3, 245.5, 820.2, 241.9, -794.8, 224.5, 794.8, 224.5, 769.5, 207.0, 768.4, 206.2, 768.4, 206.2, -767.2, 205.4, 760.5, 200.8, 761.2, 199.3, 753.8, 196.2, 766.9, 201.7, -766.2, 203.2, 778.7, 210.2, 792.9, 218.3, 792.9, 218.3, 807.2, 226.4, -812.6, 229.4, 812.6, 229.4, 817.9, 232.4, 842.6, 246.4, 842.6, 246.4, -867.2, 260.3, 875.7, 265.1, 875.7, 265.1, 884.2, 269.9, 892.2, 274.4, -892.2, 274.4, 900.1, 278.9, 901.6, 279.7, 902.5, 281.0, 903.1, 280.6, -517.7, 117.1, 520.7, 121.1, 529.1, 114.7, 540.5, 112.3, 547.4, 111.5, -547.3, 110.8, 554.1, 109.4, 555.5, 109.5, 555.2, 111.7, 556.4, 114.1, -567.2, 135.5, 567.2, 135.5, 578.0, 156.8, 579.1, 158.9, 579.1, 158.9, -580.1, 161.0, 582.9, 166.5, 581.2, 168.9, 585.7, 172.0, 550.0, 147.0, -543.3, 151.0, 517.7, 117.1, 599.6, 253.8, 603.6, 257.5, 603.6, 257.5, -607.6, 261.2, 639.4, 295.1, 640.0, 294.7, 674.0, 326.3, 671.5, 323.8, -670.3, 325.0, 667.7, 322.6, 653.1, 308.9, 653.6, 308.4, 639.5, 294.1, -619.6, 274.0, 619.4, 274.2, 599.6, 253.8, 701.4, 377.5, 684.8, 385.5, -684.8, 385.5, 668.1, 393.5, 665.9, 393.6, 665.6, 386.2, 663.1, 378.8, -655.2, 355.4, 654.4, 331.7, 647.2, 331.9, 673.6, 331.1, 691.7, 348.8, -701.4, 377.5, 439.9, 203.6, 440.2, 203.0, 439.1, 202.4, 438.3, 201.1, -437.8, 193.7, 427.2, 190.5, 429.1, 186.9, 422.4, 176.3, 422.4, 176.3, -415.7, 165.8, 412.5, 160.9, 412.5, 160.9, 409.4, 156.0, 409.6, 155.6, -408.9, 154.9, 408.1, 154.0, 404.3, 148.1, 400.6, 148.2, 400.6, 142.2, -404.3, 142.2, 404.3, 141.4, 408.0, 140.6, 430.6, 159.3, 436.6, 157.6, -449.3, 182.6, 452.6, 189.1, 445.7, 193.8, 439.9, 203.6, 600.1, 84.9, -599.4, 84.6, 599.2, 84.1, 598.7, 84.3, 616.0, 76.2, 619.2, 79.9, -633.3, 68.0, 674.9, 71.6, 691.3, 60.0, 720.8, 26.7, 723.0, 27.1, -724.0, 26.2, 725.3, 27.5, 726.3, 27.9, 726.7, 29.3, 727.1, 29.1, -715.7, 35.3, 715.2, 34.3, 703.4, 39.5, 701.1, 40.5, 701.1, 40.5, -698.9, 41.5, 662.7, 57.4, 662.7, 57.4, 626.5, 73.3, 613.3, 79.1, -613.5, 79.6, 600.1, 84.9, 557.4, 100.7, 550.2, 105.6, 550.9, 107.4, -543.0, 110.6, 541.7, 111.2, 541.8, 112.1, 540.5, 112.3, 529.1, 114.7, -520.7, 121.1, 517.7, 117.1, 514.9, 117.8, 514.9, 117.8, 512.1, 118.4, -507.6, 117.2, 507.0, 119.4, 502.0, 120.5, 503.0, 121.8, 506.6, 118.9, -511.2, 117.2, 534.3, 109.0, 533.6, 105.7, 557.4, 100.7, 387.3, 116.0, -362.5, 54.7, 365.8, 53.1, 337.7, -6.6, 335.7, -12.3, 336.3, -17.9, -333.7, -18.1, 341.8, -20.2, 341.8, -20.2, 349.8, -22.3, 351.7, -22.3, -352.8, -20.5, 353.5, -18.0, 364.2, 19.6, 363.0, 19.9, 372.6, 57.9, -374.7, 66.1, 374.7, 66.1, 376.8, 74.3, 379.0, 83.0, 379.0, 83.0, -381.2, 91.7, 383.3, 100.2, 383.3, 100.2, 385.5, 108.7, 386.4, 112.4, -385.9, 112.6, 387.3, 116.0, 428.6, -42.8, 428.6, -42.8, 430.6, -43.3, -432.7, -43.8, 451.1, -48.9, 451.2, -48.4, 469.8, -53.0, 451.2, -48.4, -451.1, -48.9, 432.7, -43.8, 430.6, -43.3, 428.6, -42.8, 428.6, -42.8, -215.0, 260.7, 214.8, 260.9, 214.4, 260.4, 213.8, 260.1, 214.0, 259.0, -206.6, 257.2, 206.8, 256.7, 215.1, 227.9, 215.0, 227.9, 223.1, 199.1, -223.1, 199.1, 232.3, 166.6, 241.5, 134.0, 245.6, 119.3, 245.6, 119.3, -249.8, 104.6, 253.8, 90.4, 253.9, 90.4, 257.9, 76.1, 257.0, 79.3, -257.2, 79.3, 256.4, 82.5, 248.0, 118.7, 248.0, 118.7, 239.6, 154.9, -232.4, 185.6, 232.4, 185.6, 225.3, 216.3, 225.1, 217.0, 225.1, 217.0, -225.0, 217.7, 220.2, 238.1, 220.2, 238.1, 215.5, 258.6, 215.2, 259.7, -215.6, 260.1, 215.0, 260.7, 142.3, 443.2, 142.0, 441.3, 141.8, 441.3, -141.8, 439.5, 136.9, 394.0, 135.5, 394.1, 129.3, 348.8, 129.9, 332.1, -133.8, 320.3, 146.4, 316.0, 141.9, 317.5, 146.0, 329.6, 145.6, 343.2, -143.9, 393.2, 144.3, 393.2, 142.3, 443.2, 192.0, 145.4, 196.4, 139.0, -200.1, 132.2, 200.8, 132.6, 202.0, 132.5, 202.9, 131.1, 202.9, 129.5, -229.0, 115.3, 223.0, 102.9, 240.6, 74.8, 246.6, 67.8, 245.9, 67.1, -251.1, 59.5, 244.4, 70.9, 245.2, 71.4, 239.2, 83.3, 236.4, 88.2, -235.7, 87.8, 232.3, 92.4, 212.1, 118.9, 212.5, 119.2, 192.0, 145.4, -470.3, 647.3, 471.5, 660.3, 471.7, 660.3, 472.9, 673.2, 473.3, 677.4, -473.3, 677.4, 473.7, 681.5, 473.9, 684.3, 474.0, 684.3, 474.2, 687.1, -474.9, 695.0, 474.8, 695.0, 475.5, 702.9, 468.6, 699.9, 471.3, 693.5, -467.1, 684.1, 466.6, 682.9, 466.6, 682.9, 466.1, 681.7, 464.4, 678.0, -464.4, 678.0, 462.8, 674.3, 461.2, 670.9, 460.0, 671.0, 459.7, 667.4, -454.0, 587.3, 454.4, 587.2, 448.3, 507.2, 447.9, 501.2, 448.0, 501.2, -447.6, 495.3, 446.7, 480.6, 448.0, 480.4, 445.8, 465.9, 459.4, 556.4, -458.5, 556.6, 470.3, 647.3, 445.8, 465.9, 444.2, 452.7, 445.1, 452.6, -444.3, 439.3, 443.4, 424.6, 443.4, 424.6, 442.5, 409.9, 442.2, 404.5, -442.2, 404.5, 441.8, 399.1, 440.9, 383.7, 440.9, 383.7, 440.0, 368.4, -440.0, 367.4, 440.0, 367.4, 439.9, 366.4, 436.0, 301.4, 432.8, 301.4, -432.1, 236.3, 432.5, 271.5, 435.8, 271.5, 439.3, 306.7, 441.3, 329.1, -441.3, 329.1, 443.4, 351.4, 443.9, 357.8, 443.9, 357.8, 444.5, 364.1, -444.8, 366.7, 444.8, 366.7, 445.0, 369.4, 446.9, 389.4, 446.9, 389.4, -448.7, 409.5, 452.1, 447.0, 452.1, 447.0, 455.6, 484.5, 456.5, 494.1, -456.5, 494.1, 457.3, 503.6, 461.1, 544.5, 461.1, 544.5, 464.8, 585.3, -466.5, 603.5, 466.6, 603.5, 468.2, 621.6, 469.3, 634.5, 469.2, 634.5, -470.3, 647.3, 458.5, 556.6, 459.4, 556.4, 445.8, 465.9, 465.1, 743.6, -462.4, 705.5, 462.4, 705.5, 459.7, 667.4, 460.0, 671.0, 461.2, 670.9, -462.8, 674.3, 463.8, 680.1, 463.0, 680.2, 463.2, 686.2, 464.1, 714.9, -459.9, 715.7, 465.1, 743.6, 519.2, 392.8, 519.8, 404.6, 512.4, 405.1, -505.5, 417.3, 505.6, 417.1, 505.4, 417.0, 505.5, 416.9, 512.2, 404.8, -519.7, 404.5, 519.2, 392.8, 210.2, 770.6, 213.3, 782.9, 209.2, 783.9, -208.2, 797.2, 205.3, 838.2, 215.2, 875.8, 202.3, 879.2, 197.0, 840.4, -213.6, 817.8, 191.6, 801.6, 193.4, 790.8, 183.6, 784.8, 188.5, 778.9, -187.3, 770.3, 187.3, 770.3, 186.1, 761.7, 185.4, 756.6, 185.4, 756.6, -184.7, 751.5, 184.6, 751.1, 184.7, 751.0, 184.6, 750.6, 192.1, 756.1, -191.9, 756.3, 199.2, 762.1, 204.7, 766.3, 208.8, 765.3, 210.2, 770.6, -156.0, 542.8, 153.2, 522.1, 153.2, 522.1, 150.3, 501.5, 169.4, 477.1, -168.7, 476.5, 187.1, 451.5, 174.1, 457.5, 180.4, 471.0, 173.8, 490.6, -173.3, 491.8, 173.3, 491.8, 172.9, 493.1, 172.9, 493.2, 172.9, 493.2, -172.8, 493.4, 170.6, 500.0, 170.6, 500.0, 168.3, 506.7, 165.8, 514.0, -165.8, 514.0, 163.3, 521.4, 159.6, 532.1, 152.2, 536.9, 156.0, 542.8, -224.3, 529.2, 225.0, 523.0, 227.6, 517.0, 228.5, 517.2, 229.2, 517.3, -228.1, 523.5, 227.6, 529.8, 227.1, 537.3, 227.1, 537.3, 226.5, 544.9, -223.5, 586.4, 225.4, 586.6, 220.5, 627.8, 217.3, 628.6, 218.1, 631.9, -215.7, 636.0, 217.8, 582.5, 218.6, 582.4, 224.3, 529.2, 348.9, 883.3, -337.1, 885.5, 330.9, 889.1, 324.4, 882.9, 320.9, 879.5, 326.7, 873.5, -329.0, 864.1, 329.5, 862.2, 329.5, 862.2, 329.9, 860.4, 336.9, 831.8, -354.5, 813.4, 343.8, 803.1, 363.8, 822.4, 346.2, 840.7, 348.6, 878.3, -348.7, 880.8, 349.2, 883.2, 348.9, 883.3, 415.7, 165.8, 422.4, 176.3, -422.4, 176.3, 429.1, 186.9, 423.5, 197.5, 429.9, 201.0, 430.8, 215.1, -431.2, 225.7, 431.1, 225.7, 432.1, 236.3, 432.8, 301.4, 436.0, 301.4, -439.9, 366.4, 439.3, 344.4, 437.2, 344.4, 434.6, 322.4, 429.7, 281.8, -429.7, 281.8, 424.8, 241.2, 422.1, 218.7, 422.1, 218.7, 419.4, 196.3, -417.8, 183.6, 417.8, 183.6, 416.3, 171.0, 416.0, 168.4, 417.1, 167.5, -415.7, 165.8, 101.2, 144.6, 99.2, 144.7, 92.1, 120.2, 94.7, 97.2, -103.9, 91.9, 101.6, 87.9, 108.5, 78.6, 110.8, 77.7, 113.0, 83.2, -117.6, 87.9, 121.3, 91.7, 125.8, 93.0, 125.1, 95.6, 117.7, 121.4, -114.4, 143.8, 101.2, 144.6, 125.1, 95.6, 124.6, 96.2, 129.7, 98.4, -131.9, 102.5, 136.9, 115.6, 133.5, 119.1, 142.6, 128.4, 137.9, 130.9, -134.7, 129.7, 133.2, 133.5, 117.6, 142.0, 118.6, 144.8, 102.0, 150.6, -102.6, 150.4, 100.2, 147.0, 101.2, 144.6, 114.4, 143.8, 117.7, 121.4, -125.1, 95.6, 117.6, 87.9, 113.0, 83.2, 110.8, 77.7, 108.5, 78.6, -120.5, 62.4, 130.6, 63.5, 132.6, 46.2, 136.3, 47.5, 137.3, 46.4, -140.0, 48.9, 141.8, 49.5, 141.8, 49.5, 143.5, 50.2, 158.4, 55.7, -158.7, 55.1, 173.3, 61.2, 173.1, 61.1, 172.9, 61.9, 172.3, 62.2, -145.1, 75.3, 146.4, 80.5, 117.6, 87.9, 172.3, 62.2, 164.6, 64.4, -165.9, 69.1, 159.4, 76.0, 146.4, 90.0, 147.1, 90.7, 133.3, 103.9, -132.6, 103.2, 132.2, 103.4, 131.9, 102.5, 129.7, 98.4, 124.6, 96.2, -125.1, 95.6, 125.8, 93.0, 121.3, 91.7, 117.6, 87.9, 146.4, 80.5, -145.1, 75.3, 172.3, 62.2, 135.1, 105.7, 134.2, 104.8, 134.2, 104.8, -133.3, 103.9, 147.1, 90.7, 146.4, 90.0, 159.4, 76.0, 160.9, 77.5, -148.2, 91.7, 135.1, 105.7, 143.5, 50.2, 141.8, 49.5, 141.8, 49.5, -140.0, 48.9, 132.1, 41.6, 132.0, 40.2, 122.0, 36.6, 158.4, 27.2, -158.4, 27.2, 194.7, 17.8, 195.2, 17.7, 195.2, 17.7, 195.7, 17.5, -195.6, 18.0, 195.1, 17.9, 194.6, 18.2, 169.0, 34.2, 169.7, 35.4, -143.5, 50.2, 210.8, 66.8, 207.8, 66.4, 207.8, 66.4, 204.7, 66.0, -205.6, 39.5, 199.5, 33.8, 212.6, 13.1, 227.9, 9.2, 227.9, 9.2, -243.2, 5.2, 235.9, 15.3, 241.7, 19.5, 240.1, 33.8, 230.1, 52.8, -227.1, 52.1, 210.8, 66.8, 240.1, 33.8, 239.6, 38.3, 241.4, 39.6, -239.1, 42.7, 234.1, 55.0, 237.6, 56.4, 236.1, 70.1, 225.0, 65.1, -223.5, 68.4, 210.8, 66.8, 227.1, 52.1, 230.1, 52.8, 240.1, 33.8, -169.9, 145.9, 171.0, 158.5, 171.0, 158.5, 172.1, 171.1, 170.6, 173.2, -170.5, 173.8, 170.7, 176.4, 169.6, 178.8, 169.5, 178.8, 167.7, 180.7, -135.3, 199.1, 139.8, 207.9, 113.9, 236.9, 114.0, 236.7, 113.7, 236.5, -113.8, 236.3, 141.7, 191.0, 135.0, 185.0, 169.9, 145.9, 142.6, 822.9, -142.5, 811.8, 142.5, 811.8, 142.5, 800.7, 139.1, 739.4, 143.1, 739.2, -143.6, 677.7, 143.1, 739.2, 139.1, 739.4, 142.5, 800.7, 142.5, 811.8, -142.5, 811.8, 142.6, 822.9, 100.4, 664.5, 99.7, 666.1, 98.9, 666.1, -99.0, 667.8, 96.8, 655.3, 96.8, 655.3, 94.7, 642.9, 94.4, 641.6, -94.8, 641.5, 95.0, 640.0, 94.9, 629.7, 97.5, 629.7, 100.1, 619.4, -104.9, 640.9, 100.9, 641.9, 100.4, 664.5, 107.3, 369.1, 122.8, 412.0, -109.9, 423.8, 138.4, 454.9, 138.8, 458.8, 138.1, 459.0, 139.2, 462.7, -139.3, 461.7, 138.0, 461.7, 137.6, 460.5, 133.2, 448.6, 133.6, 448.4, -129.6, 436.3, 118.4, 402.7, 122.3, 400.9, 107.3, 369.1, 38.1, 318.9, -37.1, 313.2, 37.1, 313.2, 36.1, 307.5, 41.0, 287.6, 38.8, 286.4, -37.6, 265.6, 36.7, 258.7, 37.8, 258.5, 38.1, 251.5, 37.7, 250.5, -55.0, 249.8, 60.9, 240.9, 64.0, 249.4, 64.0, 249.4, 67.0, 257.9, -67.4, 260.4, 65.7, 260.7, 64.4, 263.4, 62.8, 266.8, 62.8, 266.8, -61.2, 270.1, 49.7, 294.5, 53.0, 296.7, 38.1, 318.9, 75.3, 375.5, -75.1, 375.7, 76.4, 376.3, 76.5, 377.0, 76.7, 393.4, 76.1, 393.5, -75.8, 409.9, 69.3, 428.3, 72.7, 430.8, 75.1, 451.0, 74.5, 479.7, -74.5, 479.7, 74.0, 508.4, 74.0, 509.4, 73.7, 509.4, 73.9, 510.3, -72.6, 499.3, 71.7, 499.4, 69.5, 488.4, 64.4, 448.5, 62.0, 448.8, -54.6, 409.2, 55.5, 391.8, 64.2, 391.8, 75.3, 375.5, 54.6, 409.2, -49.6, 382.7, 49.8, 382.7, 44.6, 356.3, 44.4, 354.9, 44.9, 354.0, -44.2, 353.6, 59.7, 362.8, 59.2, 363.6, 74.1, 373.8, 74.2, 373.9, -74.1, 374.0, 74.3, 374.1, 74.8, 374.8, 75.5, 375.2, 75.3, 375.5, -64.2, 391.8, 55.5, 391.8, 54.6, 409.2, 124.4, 503.4, 112.1, 498.8, -111.2, 494.5, 104.4, 482.2, 106.0, 456.0, 93.7, 455.2, 83.1, 428.3, -106.5, 437.0, 99.0, 457.2, 114.9, 486.1, 119.6, 494.7, 117.4, 500.8, -124.4, 503.4, 81.3, 457.6, 92.8, 469.9, 105.1, 470.7, 104.4, 482.2, -111.2, 494.5, 112.1, 498.8, 124.4, 503.4, 124.6, 503.6, 124.8, 503.8, -124.8, 503.8, 118.5, 510.7, 114.8, 518.5, 111.8, 517.1, 102.1, 512.9, -105.6, 505.0, 99.3, 492.8, 90.3, 475.2, 76.1, 468.4, 81.3, 457.6, -96.7, 598.9, 93.4, 608.1, 90.6, 608.0, 90.2, 617.3, 87.2, 600.2, -88.1, 600.0, 84.2, 583.1, 83.7, 575.4, 82.9, 575.5, 81.6, 567.8, -92.0, 581.1, 93.8, 582.6, 96.7, 598.9, 10.2, 469.4, 10.1, 481.1, -10.1, 481.1, 9.9, 492.8, -6.0, 452.8, -7.8, 453.5, -25.5, 414.1, --25.9, 441.5, -3.1, 439.7, 10.2, 469.4, 22.9, 401.7, 23.1, 435.6, -23.1, 435.6, 23.2, 469.6, 10.5, 436.0, 8.9, 436.6, -5.3, 403.6, --5.3, 402.7, 21.1, 397.3, 22.9, 401.7, 16.6, 341.0, 16.6, 347.1, -16.6, 347.1, 16.7, 353.2, 12.1, 349.8, 1.7, 353.8, 1.7, 354.3, --2.9, 353.3, -5.9, 347.4, -6.7, 348.2, 1.5, 340.8, 6.2, 338.8, -16.6, 341.0, 41.7, 339.3, 42.9, 346.4, 40.0, 349.1, 44.2, 353.6, -44.9, 354.0, 44.4, 354.9, 44.6, 356.3, 46.6, 366.3, 46.4, 366.3, -48.2, 376.4, 36.8, 416.2, 34.9, 416.1, 28.1, 456.8, 27.0, 439.3, -27.0, 439.3, 25.8, 421.8, 20.2, 411.2, 26.2, 408.0, 26.7, 394.2, -26.7, 393.2, 26.7, 393.2, 26.8, 392.2, 34.0, 365.7, 30.5, 364.1, -41.7, 339.3, 26.8, 392.2, 28.7, 347.1, 29.3, 347.1, 30.7, 302.0, -30.7, 301.8, 30.7, 301.8, 30.7, 301.5, 32.8, 313.5, 34.8, 313.2, -39.1, 324.7, 39.4, 325.6, 39.3, 325.6, 39.5, 326.5, 43.2, 329.6, -40.6, 332.9, 41.7, 339.3, 30.5, 364.1, 34.0, 365.7, 26.8, 392.2, -55.9, 700.7, 49.6, 692.7, 49.6, 692.7, 43.3, 684.7, 51.2, 675.0, -40.9, 659.4, 28.8, 640.3, 35.6, 641.6, 35.6, 641.6, 42.5, 643.0, -49.8, 654.0, 45.7, 656.7, 48.9, 670.5, 49.3, 672.3, 49.3, 672.3, -49.7, 674.1, 52.8, 687.4, 61.0, 692.4, 55.9, 700.7, 782.5, 583.1, -784.1, 591.8, 781.5, 601.4, 777.5, 602.0, 768.9, 594.4, 768.9, 594.4, -760.4, 586.8, 759.7, 586.2, 760.7, 585.0, 760.1, 584.4, 759.3, 578.0, -759.3, 578.0, 758.5, 571.7, 756.7, 556.1, 756.7, 556.1, 754.8, 540.6, -751.3, 539.8, 756.0, 528.8, 752.2, 518.9, 751.4, 512.5, 751.4, 512.5, -750.7, 506.1, 750.4, 503.8, 751.0, 503.5, 750.1, 501.5, 758.6, 521.0, -758.0, 521.3, 765.8, 541.1, 774.1, 562.1, 778.3, 561.3, 782.5, 583.1, -797.6, 609.5, 797.4, 609.5, 797.2, 611.1, 796.8, 612.7, 796.7, 613.2, -796.7, 613.2, 796.5, 613.7, 796.0, 615.9, 795.4, 618.0, 795.5, 618.0, -792.8, 613.9, 791.7, 614.6, 787.9, 611.3, 788.4, 609.3, 793.0, 608.8, -797.6, 609.5, 741.2, 516.5, 748.0, 528.5, 745.8, 538.6, 754.8, 540.6, -756.7, 556.1, 756.7, 556.1, 758.5, 571.7, 744.7, 547.0, 744.6, 544.7, -741.2, 516.5, 712.4, 429.4, 728.2, 440.2, 728.2, 440.2, 744.0, 451.0, -747.0, 452.1, 744.9, 457.9, 745.7, 464.8, 726.1, 451.4, 714.7, 448.8, -712.4, 429.4, 790.4, 654.6, 788.9, 653.1, 787.0, 652.4, 787.3, 651.6, -788.2, 647.9, 787.8, 644.4, 789.1, 644.2, 795.2, 639.9, 791.5, 634.7, -793.8, 625.1, 795.5, 639.4, 793.9, 640.3, 790.4, 654.6, 864.8, 595.8, -886.2, 616.7, 887.3, 615.6, 907.5, 637.7, 906.2, 638.7, 906.2, 638.7, -904.9, 639.8, 903.8, 641.2, 900.4, 638.7, 895.8, 637.6, 878.7, 618.8, -880.6, 617.1, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8, -867.3, 550.9, 874.2, 547.6, 877.6, 549.8, 881.1, 544.3, 882.5, 544.0, -882.9, 545.5, 884.7, 546.7, 889.0, 549.7, 889.0, 549.7, 893.3, 552.6, -894.4, 554.0, 894.9, 553.7, 896.4, 554.7, 898.2, 559.5, 897.2, 559.8, -897.9, 564.9, 897.9, 565.1, 897.9, 565.1, 897.9, 565.3, 887.3, 560.5, -887.4, 560.3, 876.8, 555.4, 872.1, 553.1, 867.2, 551.2, 867.3, 550.9, -944.3, 587.3, 944.5, 587.5, 944.7, 587.5, 944.7, 587.6, 944.5, 594.2, -941.1, 599.0, 944.0, 600.9, 941.0, 598.8, 944.0, 594.1, 944.3, 587.3, -699.3, 568.1, 694.8, 574.1, 694.8, 574.1, 690.4, 580.0, 689.6, 578.7, -683.9, 579.2, 682.0, 581.7, 676.7, 578.5, 678.1, 576.1, 674.6, 570.2, -674.6, 570.3, 674.8, 570.2, 675.1, 570.2, 678.1, 569.9, 678.1, 569.9, -681.0, 569.7, 683.3, 569.5, 683.3, 569.5, 685.5, 569.3, 689.4, 569.0, -689.4, 569.0, 693.3, 568.6, 696.3, 568.4, 699.0, 569.1, 699.3, 568.1, -902.2, 454.4, 901.6, 452.4, 906.3, 450.0, 905.6, 449.0, 911.4, 456.8, -909.0, 458.6, 912.4, 468.1, 913.8, 472.2, 916.2, 472.8, 915.3, 476.2, -915.9, 473.9, 913.5, 473.3, 911.8, 470.4, 907.0, 462.4, 904.7, 463.1, -902.2, 454.4, 904.5, 446.0, 904.0, 446.7, 905.9, 447.7, 905.6, 449.0, -906.3, 450.0, 901.6, 452.4, 902.2, 454.4, 895.7, 464.8, 895.7, 464.8, -889.2, 475.3, 886.7, 479.4, 886.2, 479.1, 884.2, 483.4, 888.4, 474.4, -888.9, 474.6, 893.7, 465.8, 899.1, 455.9, 898.0, 455.1, 904.5, 446.0, -928.2, 451.2, 930.0, 463.3, 930.9, 463.2, 931.8, 475.4, 932.5, 482.0, -932.5, 482.0, 933.3, 488.7, 930.5, 470.0, 930.2, 470.0, 928.2, 451.2, -903.2, 344.7, 903.5, 345.5, 903.5, 345.5, 903.7, 346.4, 890.9, 348.1, -892.3, 365.7, 883.1, 385.9, 878.4, 386.3, 876.6, 367.7, 870.1, 349.6, -868.2, 335.8, 865.3, 336.2, 860.5, 322.8, 870.9, 319.1, 869.6, 315.5, -878.7, 308.3, 895.8, 317.0, 891.2, 326.3, 903.2, 344.7, 878.7, 308.3, -884.3, 303.7, 887.6, 305.1, 890.0, 299.2, 896.6, 321.9, 896.6, 321.9, -903.2, 344.7, 891.2, 326.3, 895.8, 317.0, 878.7, 308.3, 881.9, 476.0, -884.0, 479.6, 882.6, 480.5, 883.2, 484.9, 883.7, 488.2, 882.5, 489.1, -884.2, 491.5, 852.8, 448.7, 850.1, 450.0, 823.9, 404.0, 822.2, 402.7, -825.8, 398.3, 827.8, 392.5, 836.4, 396.3, 833.9, 401.9, 840.0, 411.3, -860.9, 443.7, 862.4, 442.8, 881.9, 476.0, 818.3, 452.4, 792.2, 417.7, -787.3, 419.8, 768.3, 381.2, 774.6, 378.8, 775.0, 379.5, 781.0, 376.4, -782.5, 375.6, 782.6, 375.8, 784.2, 375.2, 788.2, 380.2, 786.9, 381.2, -789.5, 387.2, 790.0, 388.3, 790.0, 388.3, 790.5, 389.3, 801.8, 415.0, -801.8, 415.0, 813.2, 440.7, 815.7, 446.5, 814.6, 447.4, 818.3, 452.4, -466.5, 128.1, 478.5, 122.4, 479.7, 123.8, 493.2, 122.4, 500.4, 125.4, -501.4, 123.1, 509.6, 123.7, 499.2, 128.7, 497.4, 124.9, 485.3, 126.2, -475.9, 127.1, 474.5, 124.3, 466.5, 128.1, 585.0, 128.1, 613.5, 142.1, -613.5, 142.1, 641.9, 156.2, 676.6, 173.2, 676.6, 173.2, 711.3, 190.3, -757.7, 213.1, 757.7, 213.1, 804.0, 236.0, 817.2, 242.5, 818.0, 241.3, -830.4, 249.0, 854.6, 265.6, 854.6, 265.6, 878.8, 282.3, 875.3, 279.8, -874.9, 280.3, 871.1, 278.3, 836.2, 260.0, 836.2, 260.0, 801.3, 241.7, -762.4, 221.2, 762.4, 221.2, 723.5, 200.8, 706.2, 191.7, 706.2, 191.7, -689.0, 182.7, 673.1, 174.3, 673.1, 174.3, 657.2, 166.0, 632.0, 152.8, -632.0, 152.8, 606.8, 139.6, 596.9, 134.4, 596.9, 134.4, 587.0, 129.2, -586.0, 128.7, 586.0, 128.6, 585.0, 128.1, 641.9, 156.2, 613.0, 150.9, -614.5, 142.7, 587.0, 129.2, 586.0, 128.7, 586.0, 128.6, 585.0, 128.1, -580.8, 126.0, 580.8, 126.0, 576.5, 124.0, 566.5, 119.0, 565.8, 120.1, -556.4, 114.1, 555.2, 111.7, 555.5, 109.5, 554.1, 109.4, 561.4, 107.8, -561.4, 107.8, 568.7, 106.2, 569.6, 106.1, 569.7, 106.9, 570.7, 107.6, -589.3, 120.3, 589.3, 120.3, 607.9, 133.0, 624.9, 144.6, 623.4, 152.8, -641.9, 156.2, 590.7, 210.4, 578.2, 197.1, 578.8, 196.4, 565.6, 183.9, -548.2, 162.6, 553.1, 149.7, 530.8, 141.2, 526.6, 134.1, 522.8, 135.7, -520.2, 128.3, 518.5, 126.3, 518.5, 126.3, 516.9, 124.3, 517.6, 122.8, -515.0, 119.1, 512.1, 118.4, 514.9, 117.8, 514.9, 117.8, 517.7, 117.1, -543.3, 151.0, 550.0, 147.0, 585.7, 172.0, 592.1, 178.0, 592.9, 180.0, -594.1, 188.7, 595.5, 199.2, 590.6, 210.4, 590.7, 210.4, 594.1, 188.7, -611.0, 203.2, 605.0, 210.3, 615.8, 231.9, 618.6, 237.3, 617.0, 239.1, -621.3, 242.7, 607.9, 225.1, 606.0, 226.5, 590.7, 210.4, 590.6, 210.4, -595.5, 199.2, 594.1, 188.7, 639.5, 294.1, 653.6, 308.4, 653.1, 308.9, -667.7, 322.6, 668.5, 315.8, 652.9, 313.9, 638.2, 305.2, 631.6, 301.3, -631.6, 301.3, 625.1, 297.5, 617.2, 292.8, 617.2, 292.8, 609.4, 288.2, -606.9, 286.8, 606.9, 286.8, 604.4, 285.3, 563.4, 261.1, 563.4, 261.1, -522.4, 236.9, 515.1, 232.6, 515.4, 231.9, 507.7, 228.3, 542.5, 244.8, -542.1, 245.5, 576.5, 262.7, 583.2, 266.0, 583.2, 266.0, 589.9, 269.3, -614.7, 281.7, 616.9, 278.6, 639.5, 294.1, 645.5, 326.8, 643.2, 325.5, -644.4, 323.5, 643.3, 320.2, 640.7, 312.7, 641.4, 305.5, 638.2, 305.2, -652.9, 313.9, 668.5, 315.8, 667.7, 322.6, 670.3, 325.0, 671.5, 323.8, -674.0, 326.3, 678.1, 330.1, 680.1, 328.1, 683.8, 332.1, 690.2, 338.1, -692.1, 336.9, 696.7, 344.0, 707.9, 354.5, 705.9, 360.5, 719.2, 365.0, -680.3, 351.9, 681.2, 347.8, 645.5, 326.8, 719.2, 365.0, 720.8, 365.9, -721.7, 367.9, 722.0, 367.6, 711.7, 372.6, 711.7, 372.6, 701.4, 377.5, -691.7, 348.8, 673.6, 331.1, 647.2, 331.9, 645.5, 330.3, 647.2, 327.6, -645.5, 326.8, 681.2, 347.8, 680.3, 351.9, 719.2, 365.0, 557.8, 293.0, -554.0, 281.8, 548.5, 283.7, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7, -538.5, 273.3, 507.0, 241.3, 500.5, 245.8, 475.5, 209.3, 485.1, 223.3, -491.6, 218.8, 507.7, 228.3, 515.4, 231.9, 515.1, 232.6, 522.4, 236.9, -528.3, 242.6, 526.9, 244.1, 531.4, 251.2, 544.6, 272.1, 550.1, 270.2, -557.8, 293.0, 642.2, 378.7, 633.8, 370.2, 634.8, 368.9, 625.4, 361.6, -617.9, 362.6, 616.6, 352.7, 607.8, 343.7, 603.3, 334.3, 607.1, 332.5, -606.5, 321.3, 605.9, 310.6, 602.1, 301.3, 605.3, 300.0, 605.8, 299.8, -609.5, 309.1, 613.8, 318.3, 628.0, 348.5, 633.7, 347.0, 642.2, 378.7, -539.3, 274.3, 568.9, 309.5, 571.0, 308.0, 598.4, 345.0, 592.2, 341.2, -592.2, 341.2, 586.0, 337.3, 562.7, 309.6, 564.4, 308.2, 542.8, 279.0, -542.2, 278.3, 542.2, 278.2, 541.6, 277.4, 540.5, 275.8, 540.5, 275.8, -539.3, 274.3, 752.7, 51.9, 761.8, 53.9, 768.8, 63.8, 769.2, 63.4, -761.8, 72.8, 753.9, 66.6, 738.7, 69.9, 734.5, 70.8, 731.7, 69.2, -730.2, 71.7, 735.2, 63.3, 738.0, 64.9, 745.7, 58.1, 749.2, 55.0, -750.0, 51.3, 752.7, 51.9, 646.9, 36.3, 643.1, 40.5, 643.9, 42.0, -639.3, 44.6, 605.0, 68.1, 605.0, 68.1, 570.6, 91.6, 571.5, 91.2, -568.6, 86.9, 569.6, 86.2, 606.8, 59.2, 607.4, 59.9, 646.9, 36.3, -570.6, -20.1, 571.5, -18.3, 569.8, -17.4, 568.9, -14.7, 563.3, 3.6, -558.4, 22.2, 557.7, 22.0, 548.9, 19.7, 553.8, 1.1, 549.9, -19.7, -557.9, -30.8, 554.3, -47.9, 542.7, -58.6, 542.5, -60.0, 545.4, -61.3, -545.1, -61.8, 559.4, -42.1, 559.6, -41.9, 570.6, -20.1, 545.1, -61.8, -544.5, -62.9, 546.5, -63.9, 548.0, -65.9, 548.5, -66.6, 548.5, -66.6, -549.1, -67.4, 551.3, -70.5, 551.3, -70.5, 553.5, -73.6, 555.1, -74.3, -554.4, -76.4, 555.8, -76.8, 573.0, -82.6, 573.8, -87.4, 590.9, -86.2, -589.5, -86.3, 589.1, -80.4, 587.3, -74.6, 582.2, -57.8, 582.2, -57.8, -577.0, -41.0, 573.8, -30.5, 568.1, -21.8, 570.6, -20.1, 559.6, -41.9, -559.4, -42.1, 545.1, -61.8, 372.6, 57.9, 363.0, 19.9, 364.2, 19.6, -353.5, -18.0, 364.4, -22.7, 397.1, 8.3, 406.0, 43.4, 406.7, 46.2, -376.1, 61.9, 372.6, 57.9, 413.0, -8.1, 406.0, -8.8, 406.1, -14.5, -400.1, -21.7, 400.6, -21.2, 401.0, -21.6, 402.0, -21.5, 407.8, -20.9, -407.8, -20.9, 413.6, -20.3, 432.0, -18.4, 432.0, -18.4, 450.5, -16.5, -460.8, -15.4, 461.5, -12.2, 471.0, -14.3, 442.7, -8.0, 441.4, -5.2, -413.0, -8.1, 376.9, -24.1, 383.0, -17.7, 390.0, -26.2, 400.1, -21.7, -406.1, -14.5, 406.0, -8.8, 413.0, -8.1, 426.1, 5.7, 426.1, 5.7, -439.2, 19.5, 452.4, 33.4, 452.6, 33.3, 465.6, 47.3, 464.7, 46.3, -464.5, 46.4, 463.4, 45.6, 462.7, 45.0, 462.7, 45.0, 462.0, 44.4, -419.5, 10.2, 413.9, 15.4, 376.9, -24.1, 543.4, -71.1, 548.5, -72.3, -548.9, -71.4, 553.5, -73.6, 551.3, -70.5, 551.3, -70.5, 549.1, -67.4, -546.8, -66.8, 543.5, -71.2, 543.4, -71.1, 198.8, 306.6, 206.3, 283.4, -210.0, 283.9, 213.8, 260.1, 214.4, 260.4, 214.8, 260.9, 215.0, 260.7, -220.4, 263.4, 226.1, 264.6, 225.8, 266.0, 222.7, 280.5, 217.0, 279.3, -208.2, 292.5, 203.5, 299.5, 200.1, 299.0, 198.8, 306.6, 147.1, 478.3, -146.6, 474.8, 146.6, 474.8, 146.2, 471.3, 146.7, 466.2, 147.4, 466.2, -149.0, 461.3, 169.4, 397.4, 166.0, 396.1, 190.1, 333.6, 191.7, 329.4, -197.8, 326.4, 200.5, 328.0, 201.3, 328.4, 198.8, 332.8, 197.1, 337.6, -193.8, 346.9, 193.8, 346.9, 190.4, 356.3, 186.4, 367.7, 186.4, 367.7, -182.4, 379.0, 167.7, 420.4, 167.8, 420.5, 153.1, 461.8, 153.0, 462.3, -152.8, 462.2, 152.7, 462.6, 150.9, 467.6, 150.9, 467.6, 149.2, 472.6, -148.1, 475.5, 146.9, 478.2, 147.1, 478.3, 154.3, 442.2, 152.4, 449.0, -150.5, 455.9, 150.5, 455.9, 149.7, 458.6, 149.0, 461.3, 149.0, 461.3, -147.4, 466.2, 146.7, 466.2, 146.2, 471.3, 144.2, 457.2, 144.2, 457.2, -142.3, 443.2, 144.3, 393.2, 143.9, 393.2, 145.6, 343.2, 145.5, 345.7, -145.8, 345.7, 146.0, 348.1, 147.8, 368.2, 147.8, 368.2, 149.5, 388.3, -149.9, 392.5, 149.9, 392.5, 150.3, 396.7, 152.3, 419.4, 154.2, 419.4, -154.3, 442.2, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5, -176.7, 258.1, 176.2, 259.8, 175.9, 259.7, 165.2, 256.7, 165.2, 255.9, -155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6, 168.7, 225.0, -162.9, 207.3, 180.9, 201.5, 174.6, 203.5, 180.4, 221.2, 179.9, 241.0, -179.8, 246.7, 180.5, 246.8, 179.6, 252.5, 158.1, 293.8, 157.1, 294.1, -157.4, 294.9, 156.8, 296.1, 151.6, 306.0, 151.6, 306.0, 146.4, 316.0, -133.8, 320.3, 129.9, 332.1, 129.3, 348.8, 126.7, 329.9, 126.7, 329.9, -124.1, 311.0, 124.0, 309.1, 124.5, 307.9, 126.2, 307.0, 141.5, 299.2, -141.8, 299.5, 158.1, 293.8, 126.2, 307.0, 128.3, 307.6, 131.2, 297.3, -136.3, 287.5, 137.6, 285.0, 137.6, 285.0, 138.9, 282.6, 138.9, 282.6, -147.2, 266.5, 155.5, 250.4, 165.2, 255.9, 165.2, 256.7, 175.9, 259.7, -178.1, 263.9, 172.0, 267.1, 168.1, 274.5, 163.1, 284.1, 165.8, 287.7, -158.1, 293.8, 141.8, 299.5, 141.5, 299.2, 126.2, 307.0, 136.3, 287.5, -131.2, 297.3, 128.3, 307.6, 126.2, 307.0, 124.5, 307.9, 124.0, 309.1, -124.1, 311.0, 121.5, 292.0, 120.5, 292.1, 118.9, 272.9, 118.7, 271.9, -118.7, 271.9, 118.6, 270.9, 117.5, 263.1, 114.0, 261.7, 116.4, 255.3, -129.2, 247.8, 136.6, 240.3, 134.9, 228.4, 137.5, 226.5, 136.8, 225.6, -138.8, 222.8, 141.1, 225.7, 138.6, 227.7, 138.4, 232.7, 137.5, 255.7, -137.5, 255.7, 136.6, 278.7, 136.5, 283.1, 137.7, 283.6, 136.3, 287.5, -467.1, 684.1, 471.3, 693.5, 468.6, 699.9, 475.5, 702.9, 476.7, 715.9, -476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5, 482.0, 772.1, -482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3, 485.3, 808.6, -485.3, 808.6, 486.4, 819.9, 486.4, 819.9, 487.4, 831.1, 488.3, 840.2, -487.8, 840.3, 489.1, 849.3, 483.2, 808.5, 483.6, 808.5, 478.2, 767.6, -477.9, 765.3, 477.9, 765.2, 477.6, 762.9, 474.2, 737.2, 474.2, 737.2, -470.8, 711.5, 469.0, 697.8, 461.8, 693.8, 467.1, 684.1, 537.5, 359.8, -537.4, 359.8, 528.4, 376.3, 519.2, 392.8, 519.7, 404.5, 512.2, 404.8, -505.5, 416.9, 507.3, 414.7, 505.3, 413.0, 505.1, 409.1, 504.5, 396.8, -498.4, 392.8, 503.9, 384.4, 514.7, 368.1, 529.8, 355.6, 537.5, 359.8, -503.9, 384.4, 505.6, 383.9, 503.6, 377.8, 503.3, 371.1, 503.1, 368.1, -503.1, 368.1, 503.0, 365.1, 501.6, 337.8, 501.6, 337.8, 500.3, 310.6, -500.0, 303.7, 503.1, 301.2, 499.6, 296.9, 519.1, 327.4, 519.1, 327.4, -538.6, 357.9, 538.9, 358.3, 538.4, 359.2, 537.5, 359.8, 529.8, 355.6, -514.7, 368.1, 503.9, 384.4, 481.0, 448.9, 480.0, 450.8, 484.4, 452.5, -484.1, 455.6, 483.6, 460.0, 481.8, 459.8, 479.4, 464.0, 471.6, 478.1, -471.6, 478.1, 463.8, 492.1, 463.8, 493.9, 462.7, 493.9, 461.7, 495.7, -471.1, 472.2, 468.8, 470.9, 481.0, 448.9, 505.1, 409.1, 505.3, 413.0, -507.3, 414.7, 505.5, 416.9, 505.4, 417.0, 505.6, 417.1, 505.5, 417.3, -495.2, 435.9, 495.2, 435.8, 484.8, 454.4, 484.4, 455.0, 483.9, 455.4, -484.1, 455.6, 484.4, 452.5, 480.0, 450.8, 481.0, 448.9, 480.5, 447.8, -480.5, 447.8, 480.0, 446.7, 467.1, 418.0, 463.1, 419.2, 454.1, 389.4, -455.0, 392.5, 459.0, 391.3, 463.9, 393.2, 484.5, 401.1, 486.1, 398.3, -505.1, 409.1, 180.9, 723.4, 179.3, 711.9, 179.3, 711.9, 177.7, 700.4, -188.2, 671.9, 189.3, 670.2, 209.1, 647.2, 209.0, 655.4, 209.2, 655.4, -209.3, 663.7, 208.7, 667.8, 207.4, 667.6, 205.6, 671.5, 199.2, 685.0, -199.2, 685.0, 192.8, 698.4, 186.8, 710.9, 188.3, 722.5, 180.9, 723.4, -157.5, 553.7, 156.8, 548.2, 156.8, 548.2, 156.0, 542.8, 152.2, 536.9, -159.6, 532.1, 163.3, 521.4, 165.9, 522.6, 161.2, 532.8, 159.2, 544.2, -158.4, 549.0, 156.4, 553.2, 157.5, 553.7, 209.5, 646.5, 209.3, 646.8, -209.1, 646.8, 209.1, 647.2, 189.3, 670.2, 188.2, 671.9, 177.7, 700.4, -176.4, 690.9, 177.5, 690.6, 175.1, 681.5, 173.8, 677.2, 174.5, 677.0, -173.9, 672.6, 177.4, 657.8, 178.9, 658.2, 184.0, 643.8, 187.0, 635.3, -187.0, 635.3, 189.9, 626.9, 194.9, 612.9, 204.3, 603.4, 199.8, 598.9, -214.1, 613.2, 204.9, 622.6, 209.5, 646.5, 199.8, 598.9, 204.3, 563.1, -235.1, 554.2, 224.3, 529.2, 218.6, 582.4, 217.8, 582.5, 215.7, 636.0, -212.6, 641.2, 212.6, 641.2, 209.5, 646.5, 204.9, 622.6, 214.1, 613.2, -199.8, 598.9, 464.9, 784.3, 465.8, 799.3, 465.8, 799.3, 466.7, 814.3, -464.5, 813.9, 459.0, 846.5, 451.3, 878.7, 452.4, 874.2, 451.9, 874.1, -452.6, 869.4, 453.3, 865.0, 453.3, 865.0, 453.9, 860.5, 457.1, 838.5, -457.1, 838.5, 460.2, 816.6, 462.5, 801.0, 462.5, 801.0, 464.7, 785.5, -464.8, 784.9, 464.9, 784.9, 464.9, 784.3, 387.9, 282.3, 363.9, 266.8, -367.7, 256.8, 355.0, 227.9, 354.1, 225.8, 357.9, 224.1, 360.7, 220.3, -361.3, 219.5, 361.3, 219.5, 361.9, 218.8, 364.7, 215.0, 364.7, 215.0, -367.6, 211.2, 372.2, 205.9, 371.9, 205.6, 376.1, 199.9, 376.0, 199.9, -376.8, 204.7, 377.5, 209.4, 377.6, 210.3, 377.6, 210.3, 377.8, 211.3, -380.0, 227.2, 380.0, 227.2, 382.3, 243.1, 382.5, 244.4, 382.5, 244.4, -382.7, 245.8, 385.3, 264.0, 377.8, 275.8, 387.9, 282.3, 136.9, 107.6, -136.0, 106.7, 136.0, 106.7, 135.1, 105.7, 148.2, 91.7, 160.9, 77.5, -159.4, 76.0, 165.9, 69.1, 164.6, 64.4, 172.3, 62.2, 172.9, 61.9, -173.1, 61.1, 173.3, 61.2, 174.9, 61.2, 174.9, 61.8, 176.5, 62.4, -178.2, 59.9, 187.3, 66.3, 198.1, 70.3, 196.4, 70.1, 195.9, 73.5, -193.8, 76.7, 166.2, 93.6, 165.9, 93.3, 136.9, 107.6, 193.8, 76.7, -181.1, 95.5, 173.7, 93.6, 168.4, 114.3, 160.3, 118.7, 160.3, 118.7, -152.1, 123.1, 149.7, 114.0, 144.5, 115.4, 136.9, 107.6, 165.9, 93.3, -166.2, 93.6, 193.8, 76.7, 194.6, 18.2, 195.1, 17.9, 195.6, 18.0, -195.7, 17.5, 204.2, 15.3, 204.2, 15.3, 212.6, 13.1, 199.5, 33.8, -205.6, 39.5, 204.7, 66.0, 203.1, 65.8, 203.1, 65.8, 201.4, 65.6, -196.5, 42.2, 197.4, 42.0, 194.6, 18.2, 201.4, 65.6, 189.0, 64.0, -179.9, 57.6, 176.5, 62.4, 174.9, 61.8, 174.9, 61.2, 173.3, 61.2, -158.7, 55.1, 158.4, 55.7, 143.5, 50.2, 169.7, 35.4, 169.0, 34.2, -194.6, 18.2, 197.4, 42.0, 196.5, 42.2, 201.4, 65.6, 169.5, 141.3, -169.7, 143.6, 169.7, 143.6, 169.9, 145.9, 135.0, 185.0, 141.7, 191.0, -113.8, 236.3, 122.6, 230.0, 103.4, 212.0, 107.5, 190.5, 109.2, 182.0, -116.5, 183.4, 125.4, 176.3, 147.5, 158.8, 146.3, 157.1, 169.5, 141.3, -157.8, 679.7, 171.7, 714.9, 171.3, 715.1, 184.6, 750.6, 184.7, 751.0, -184.6, 751.1, 184.7, 751.5, 185.4, 756.6, 185.4, 756.6, 186.1, 761.7, -175.0, 733.1, 176.1, 732.7, 166.1, 703.6, 162.0, 691.7, 162.5, 691.5, -157.8, 679.7, 120.7, 617.0, 117.1, 625.4, 113.4, 625.4, 113.5, 633.8, -118.6, 641.1, 107.0, 649.1, 100.4, 664.5, 100.9, 641.9, 104.9, 640.9, -100.1, 619.4, 102.4, 610.2, 102.4, 610.2, 104.7, 601.1, 126.7, 560.0, -129.0, 559.9, 141.9, 515.4, 141.9, 517.7, 141.9, 517.7, 141.9, 520.0, -131.8, 568.6, 132.7, 568.8, 120.7, 617.0, 141.9, 520.0, 142.0, 543.5, -142.0, 543.5, 142.0, 567.0, 142.1, 567.7, 141.4, 567.7, 141.4, 568.5, -144.0, 585.9, 125.7, 587.3, 125.1, 606.5, 126.2, 611.0, 122.9, 611.8, -120.7, 617.0, 132.7, 568.8, 131.8, 568.6, 141.9, 520.0, 69.2, 152.0, -67.3, 142.3, 67.1, 140.6, 70.8, 131.7, 69.4, 135.0, 72.3, 136.2, -73.9, 140.7, 79.7, 157.5, 83.2, 157.1, 85.5, 174.4, 84.6, 167.9, -81.1, 168.4, 76.7, 162.3, 73.0, 157.2, 70.3, 157.7, 69.2, 152.0, -67.4, 174.6, 67.4, 174.8, 67.4, 174.8, 67.4, 175.0, 67.2, 178.0, -67.2, 178.0, 66.9, 181.0, 64.6, 210.9, 69.8, 212.3, 62.3, 240.9, -58.8, 233.2, 59.1, 225.6, 55.3, 225.4, 53.3, 220.0, 53.3, 220.0, -51.4, 214.6, 54.3, 199.5, 57.2, 200.1, 63.0, 185.6, 63.0, 185.5, -63.0, 185.5, 63.0, 185.5, 65.2, 180.0, 65.2, 180.0, 67.4, 174.6, -55.5, 87.2, 51.3, 86.0, 53.0, 79.9, 50.5, 72.6, 49.1, 68.4, -49.1, 68.4, 47.6, 64.1, 47.2, 62.9, 46.6, 62.8, 46.8, 61.7, -47.1, 58.6, 46.5, 57.3, 48.5, 55.6, 51.1, 57.0, 52.5, 54.8, -56.4, 53.5, 71.2, 48.0, 71.7, 49.5, 87.1, 45.6, 87.3, 45.5, -87.3, 45.5, 87.6, 45.5, 84.6, 48.1, 88.5, 52.6, 89.5, 59.8, -88.8, 71.2, 92.0, 76.9, 85.1, 82.4, 75.0, 90.6, 68.6, 90.9, -55.5, 87.2, 85.1, 82.4, 93.5, 106.7, 82.1, 112.3, 73.9, 140.7, -72.3, 136.2, 69.4, 135.0, 70.8, 131.7, 65.7, 116.8, 65.7, 116.8, -60.6, 101.9, 58.2, 95.1, 58.2, 95.1, 55.9, 88.2, 55.7, 87.7, -55.6, 87.2, 55.5, 87.2, 68.6, 90.9, 75.0, 90.6, 85.1, 82.4, -93.3, 87.3, 94.0, 92.2, 96.3, 96.3, 94.7, 97.2, 92.1, 120.2, -99.2, 144.7, 101.2, 144.6, 100.2, 147.0, 102.6, 150.4, 102.0, 150.6, -104.8, 170.5, 104.8, 170.5, 107.5, 190.5, 103.4, 212.0, 122.6, 230.0, -113.8, 236.3, 113.7, 236.5, 114.0, 236.7, 113.9, 236.9, 113.1, 237.7, -114.8, 240.2, 114.4, 240.4, 111.2, 244.9, 118.9, 253.8, 116.4, 255.3, -114.0, 261.7, 117.5, 263.1, 118.6, 270.9, 119.2, 266.7, 117.0, 266.4, -115.5, 261.9, 104.1, 228.6, 97.0, 229.5, 92.6, 195.2, 85.9, 142.1, -92.2, 141.2, 93.3, 87.3, 92.6, 195.2, 92.7, 191.9, 91.4, 191.9, -90.3, 188.5, 87.9, 181.5, 87.9, 181.5, 85.5, 174.4, 83.2, 157.1, -79.7, 157.5, 73.9, 140.7, 82.1, 112.3, 93.5, 106.7, 85.1, 82.4, -92.0, 76.9, 88.8, 71.2, 89.5, 59.8, 91.4, 73.5, 91.4, 73.5, -93.3, 87.3, 92.2, 141.2, 85.9, 142.1, 92.6, 195.2, 75.0, 344.2, -75.5, 328.2, 75.6, 328.2, 76.0, 312.1, 76.6, 299.7, 83.2, 291.6, -77.7, 287.3, 84.3, 305.5, 84.3, 305.5, 90.8, 323.7, 90.3, 334.3, -75.0, 344.2, 75.0, 344.2, 75.7, 317.2, 73.9, 344.1, 72.8, 344.1, -72.1, 371.0, 66.5, 363.4, 66.5, 363.4, 60.9, 355.8, 62.3, 336.1, -82.3, 326.3, 75.7, 317.2, 114.9, 486.1, 99.0, 457.2, 106.5, 437.0, -83.1, 428.3, 79.5, 419.1, 73.3, 416.9, 75.8, 409.9, 76.1, 393.5, -76.7, 393.4, 76.5, 377.0, 75.7, 380.0, 79.3, 381.0, 82.2, 384.9, -82.6, 385.4, 82.7, 385.3, 82.9, 385.9, 88.9, 404.1, 88.8, 404.2, -94.6, 422.5, 104.7, 454.3, 119.4, 483.8, 114.9, 486.1, 74.0, 508.4, -74.5, 479.7, 74.5, 479.7, 75.1, 451.0, 75.5, 454.7, 78.2, 454.3, -81.3, 457.6, 76.1, 468.4, 90.3, 475.2, 99.3, 492.8, 97.9, 502.2, -73.8, 508.0, 74.0, 508.4, 99.3, 492.8, 105.6, 505.0, 102.1, 512.9, -111.8, 517.1, 106.8, 534.3, 97.8, 531.6, 83.8, 546.1, 81.2, 548.7, -81.6, 549.3, 78.7, 551.4, 78.6, 550.6, 78.8, 550.4, 78.4, 549.9, -76.2, 547.2, 79.2, 544.8, 77.0, 541.9, 71.5, 538.3, 75.4, 532.3, -73.7, 522.7, 72.5, 516.8, 74.7, 516.4, 73.9, 510.3, 73.7, 509.4, -74.0, 509.4, 74.0, 508.4, 73.8, 508.0, 97.9, 502.2, 99.3, 492.8, -115.1, 546.9, 107.5, 568.2, 104.7, 567.6, 100.0, 589.5, 99.8, 594.3, -98.3, 594.2, 96.7, 598.9, 93.8, 582.6, 92.0, 581.1, 81.6, 567.8, -80.6, 562.5, 82.9, 560.1, 79.7, 557.1, 78.0, 556.0, 79.2, 554.2, -78.7, 551.4, 81.6, 549.3, 81.2, 548.7, 83.8, 546.1, 99.1, 544.2, -113.0, 541.4, 115.1, 546.9, 83.8, 546.1, 97.8, 531.6, 106.8, 534.3, -111.8, 517.1, 114.8, 518.5, 118.5, 510.7, 124.8, 503.8, 125.4, 503.4, -128.5, 505.7, 128.8, 508.0, 127.4, 512.0, 127.1, 511.9, 126.0, 515.9, -124.2, 531.8, 120.5, 531.4, 115.1, 546.9, 113.0, 541.4, 99.1, 544.2, -83.8, 546.1, -27.0, 410.9, -28.8, 406.8, -30.4, 406.9, -30.6, 402.7, --32.6, 389.3, -29.2, 377.4, -34.5, 375.9, -34.7, 373.3, -32.7, 373.0, --33.2, 370.6, -29.2, 388.7, -30.4, 389.0, -27.5, 407.4, -27.2, 409.2, --27.8, 409.6, -27.0, 410.9, -22.3, 363.3, -25.0, 355.2, -24.5, 355.0, --27.6, 347.1, -27.8, 346.5, -27.1, 346.3, -27.3, 345.7, -24.5, 354.4, --20.5, 355.6, -22.3, 363.3, 2.2, 282.6, 9.2, 297.5, 18.3, 298.8, -16.3, 312.3, 16.4, 326.7, 16.4, 326.7, 16.6, 341.0, 6.2, 338.8, -1.5, 340.8, -6.7, 348.2, -16.5, 346.7, -15.9, 341.8, -24.8, 335.0, --24.8, 335.0, -24.7, 334.8, -24.7, 334.6, -23.4, 329.3, -23.3, 329.4, --22.1, 324.1, -11.1, 302.8, -14.7, 287.8, 2.2, 282.6, -22.1, 324.1, --32.6, 302.0, -22.3, 289.0, -7.1, 263.0, -6.8, 272.9, -2.5, 272.8, -2.2, 282.6, -14.7, 287.8, -11.1, 302.8, -22.1, 324.1, 48.9, 670.5, -45.7, 656.7, 49.8, 654.0, 42.5, 643.0, 47.9, 644.1, 53.2, 643.6, -53.4, 645.1, 59.0, 650.8, 62.8, 647.0, 72.2, 648.9, 70.0, 661.3, -58.1, 672.3, 48.9, 670.5, 749.0, 492.6, 747.0, 491.5, 749.8, 485.2, -748.1, 484.6, 762.9, 499.3, 767.1, 495.1, 786.1, 505.6, 785.1, 497.0, -766.0, 502.0, 749.0, 492.6, 804.0, 583.1, 804.0, 596.3, 804.0, 598.2, -797.6, 609.5, 793.0, 608.8, 788.4, 609.3, 787.9, 611.3, 783.2, 607.1, -780.2, 601.8, 778.4, 602.8, 778.5, 602.6, 778.0, 602.4, 777.5, 602.0, -781.5, 601.4, 784.1, 591.8, 782.5, 583.1, 787.8, 562.4, 787.8, 562.4, -793.2, 541.7, 795.3, 533.5, 799.3, 532.4, 797.4, 525.2, 804.7, 553.1, -803.9, 554.2, 804.0, 583.1, 797.4, 525.2, 797.1, 519.5, 798.1, 513.8, -800.5, 513.5, 808.6, 518.0, 809.9, 516.5, 816.7, 522.4, 817.5, 523.1, -818.2, 523.9, 818.4, 523.8, 815.5, 535.4, 814.9, 535.3, 812.7, 547.1, -810.7, 555.2, 810.7, 555.2, 808.8, 563.4, 806.4, 573.2, 801.5, 574.7, -804.0, 583.1, 803.9, 554.2, 804.7, 553.1, 797.4, 525.2, 713.5, 490.2, -713.2, 490.0, 713.6, 489.3, 713.3, 489.1, 717.8, 492.9, 718.2, 492.3, -723.2, 495.6, 722.6, 492.1, 718.1, 493.2, 713.5, 490.2, 744.7, 514.0, -740.9, 511.5, 738.4, 508.1, 737.1, 509.1, 734.5, 506.4, 735.2, 505.7, -733.3, 502.3, 732.5, 501.9, 732.8, 501.5, 732.3, 500.6, 738.7, 507.1, -740.3, 506.3, 744.7, 514.0, 840.1, 624.8, 859.1, 643.0, 856.0, 656.1, -878.0, 661.2, 875.3, 663.4, 875.3, 663.4, 872.6, 665.6, 862.1, 657.6, -864.1, 655.0, 855.7, 644.3, 849.0, 635.9, 849.0, 635.9, 842.2, 627.4, -841.2, 626.1, 841.3, 625.9, 840.1, 624.8, 839.5, 570.9, 839.5, 570.9, -847.4, 578.7, 855.2, 586.5, 855.4, 586.6, 855.4, 586.6, 855.5, 586.8, -860.1, 591.3, 860.2, 591.2, 864.8, 595.8, 865.1, 596.1, 865.0, 596.2, -865.4, 596.6, 860.4, 591.7, 860.4, 591.7, 855.5, 586.8, 855.4, 586.6, -855.4, 586.6, 855.2, 586.5, 847.4, 578.7, 839.5, 570.9, 839.5, 570.9, -877.5, 603.6, 857.1, 585.8, 857.1, 585.8, 836.7, 568.0, 838.3, 567.7, -839.8, 566.4, 839.6, 565.9, 839.5, 565.7, 842.7, 563.6, 845.9, 561.2, -851.4, 552.7, 856.6, 556.1, 867.3, 550.9, 867.2, 551.2, 872.1, 553.1, -876.8, 555.4, 881.3, 578.7, 884.1, 601.5, 877.5, 603.6, 876.8, 555.4, -887.4, 560.3, 887.3, 560.5, 897.9, 565.3, 900.5, 583.4, 900.4, 583.4, -903.1, 601.5, 904.2, 615.5, 904.8, 615.5, 907.1, 629.4, 892.3, 616.5, -892.3, 616.5, 877.5, 603.6, 884.1, 601.5, 881.3, 578.7, 876.8, 555.4, -924.9, 574.1, 934.6, 580.7, 934.6, 580.7, 944.3, 587.3, 944.0, 594.1, -941.0, 598.8, 944.0, 600.9, 943.8, 604.9, 945.7, 606.7, 943.6, 608.8, -926.1, 612.3, 927.9, 621.4, 912.2, 633.9, 912.3, 632.1, 910.0, 632.0, -907.8, 630.0, 907.5, 626.4, 907.2, 626.4, 906.6, 622.8, 904.2, 604.5, -903.8, 604.5, 901.1, 586.3, 904.6, 577.0, 913.1, 573.8, 924.9, 574.1, -901.1, 586.3, 896.6, 584.8, 899.5, 575.8, 897.9, 565.3, 897.9, 565.1, -897.9, 565.1, 897.9, 564.9, 897.2, 559.8, 898.2, 559.5, 896.4, 554.7, -903.9, 559.8, 903.7, 560.0, 911.3, 564.9, 913.1, 566.1, 913.1, 566.1, -915.0, 567.3, 915.1, 570.9, 919.9, 570.7, 924.9, 574.1, 913.1, 573.8, -904.6, 577.0, 901.1, 586.3, 556.4, 358.5, 563.7, 373.2, 565.8, 372.2, -575.2, 385.9, 582.9, 397.1, 582.9, 397.1, 590.6, 408.4, 612.9, 440.9, -613.2, 440.7, 635.2, 473.4, 635.6, 474.9, 636.0, 474.9, 636.1, 476.4, -637.2, 490.9, 632.9, 492.8, 638.3, 505.4, 638.4, 507.7, 638.1, 507.7, -637.8, 510.0, 637.6, 511.1, 638.0, 511.3, 637.5, 512.3, 637.6, 512.1, -637.2, 511.8, 636.9, 511.4, 596.6, 435.0, 594.5, 436.0, 556.4, 358.5, -636.9, 511.4, 631.2, 500.0, 630.0, 500.6, 623.1, 489.8, 602.2, 457.1, -602.2, 457.1, 581.3, 424.5, 580.7, 423.6, 580.7, 423.6, 580.1, 422.7, -576.4, 416.8, 576.4, 416.8, 572.6, 410.9, 568.0, 403.6, 568.0, 403.6, -563.3, 396.4, 554.4, 382.5, 554.4, 382.5, 545.5, 368.5, 542.6, 364.1, -540.9, 364.5, 539.8, 359.6, 538.8, 344.7, 538.3, 344.7, 536.7, 329.8, -545.6, 329.2, 548.0, 343.3, 556.4, 358.5, 594.5, 436.0, 596.6, 435.0, -636.9, 511.4, 675.1, 570.2, 674.8, 570.2, 674.6, 570.3, 674.6, 570.2, -665.5, 556.2, 665.7, 556.0, 656.7, 541.9, 653.1, 536.2, 653.0, 536.3, -649.4, 530.7, 645.6, 524.9, 641.9, 519.1, 641.9, 519.1, 641.9, 519.1, -645.6, 524.9, 649.4, 530.7, 653.0, 536.3, 653.1, 536.2, 656.7, 541.9, -665.9, 556.0, 666.1, 555.9, 675.1, 570.2, 899.8, 548.7, 895.3, 542.3, -895.6, 542.1, 890.9, 536.0, 885.0, 514.4, 887.5, 513.7, 884.2, 491.5, -882.5, 489.1, 883.7, 488.2, 883.2, 484.9, 883.2, 484.2, 883.7, 484.2, -884.2, 483.4, 886.2, 479.1, 886.7, 479.4, 889.2, 475.3, 894.8, 486.7, -891.1, 488.4, 893.0, 501.6, 896.4, 525.1, 901.3, 525.5, 899.8, 548.7, -884.2, 389.0, 889.3, 403.4, 884.3, 409.7, 894.4, 417.8, 899.5, 431.9, -904.7, 432.0, 904.5, 446.0, 898.0, 455.1, 899.1, 455.9, 893.7, 465.8, -881.0, 430.2, 883.6, 427.3, 884.2, 389.0, 893.7, 465.8, 888.9, 474.6, -888.4, 474.4, 884.2, 483.4, 883.7, 484.2, 883.2, 484.2, 883.2, 484.9, -882.6, 480.5, 884.0, 479.6, 881.9, 476.0, 881.7, 474.5, 881.7, 474.5, -881.4, 472.9, 881.6, 432.1, 876.0, 432.0, 869.9, 391.2, 870.0, 370.4, -872.9, 370.0, 870.1, 349.6, 876.6, 367.7, 878.4, 386.3, 883.1, 385.9, -882.6, 387.0, 883.6, 387.4, 884.2, 389.0, 883.6, 427.3, 881.0, 430.2, -893.7, 465.8, 912.4, 468.1, 909.0, 458.6, 911.4, 456.8, 905.6, 449.0, -905.9, 447.7, 904.0, 446.7, 904.5, 446.0, 904.7, 432.0, 899.5, 431.9, -894.4, 417.8, 896.0, 419.1, 901.1, 412.8, 907.7, 407.8, 917.5, 435.3, -913.9, 438.2, 912.4, 468.1, 907.7, 407.8, 913.4, 403.5, 917.7, 404.6, -919.1, 399.2, 920.4, 403.4, 920.4, 403.4, 921.6, 407.7, 923.3, 429.6, -924.9, 429.4, 928.2, 451.2, 930.2, 470.0, 930.5, 470.0, 933.3, 488.7, -936.3, 516.2, 934.7, 516.5, 939.4, 543.8, 931.7, 522.3, 935.4, 520.1, -924.1, 500.9, 921.1, 492.4, 921.1, 492.4, 918.1, 484.0, 916.7, 480.1, -916.7, 480.1, 915.3, 476.2, 916.2, 472.8, 913.8, 472.2, 912.4, 468.1, -913.9, 438.2, 917.5, 435.3, 907.7, 407.8, 869.3, 391.2, 869.6, 393.4, -869.6, 395.5, 869.9, 395.5, 875.4, 434.2, 881.6, 434.2, 881.4, 472.9, -881.7, 474.5, 881.7, 474.5, 881.9, 476.0, 862.4, 442.8, 860.9, 443.7, -840.0, 411.3, 838.8, 403.6, 853.7, 399.5, 869.3, 391.2, 840.0, 411.3, -833.9, 401.9, 836.4, 396.3, 827.8, 392.5, 834.3, 373.1, 846.5, 358.5, -840.8, 353.8, 844.2, 352.5, 844.2, 352.5, 847.6, 351.2, 847.8, 352.0, -856.3, 353.2, 863.2, 350.6, 866.2, 370.9, 866.2, 370.9, 869.3, 391.2, -853.7, 399.5, 838.8, 403.6, 840.0, 411.3, 797.4, 463.4, 818.1, 481.9, -832.6, 485.1, 832.8, 507.0, 815.2, 491.3, 815.2, 491.3, 797.5, 475.5, -794.5, 471.9, 800.4, 466.1, 797.4, 463.4, 797.5, 475.5, 781.5, 461.2, -783.7, 457.2, 765.4, 446.9, 763.2, 449.1, 743.6, 417.7, 714.5, 401.6, -727.0, 396.9, 727.0, 396.9, 739.4, 392.2, 746.0, 393.0, 745.1, 399.2, -750.9, 406.3, 764.3, 422.8, 764.3, 422.8, 777.8, 439.4, 787.6, 451.4, -790.1, 450.1, 797.4, 463.4, 800.4, 466.1, 794.5, 471.9, 797.5, 475.5, -764.0, 382.8, 766.2, 382.0, 766.2, 382.0, 768.3, 381.2, 787.3, 419.8, -792.2, 417.7, 818.3, 452.4, 839.0, 481.8, 837.6, 483.0, 859.8, 511.3, -811.2, 449.2, 812.7, 448.1, 765.5, 384.9, 764.8, 383.9, 763.8, 383.1, -764.0, 382.8, 875.4, 533.5, 871.8, 528.1, 871.7, 528.3, 868.0, 523.0, -863.9, 517.2, 863.9, 517.2, 859.8, 511.3, 837.6, 483.0, 839.0, 481.8, -818.3, 452.4, 814.6, 447.4, 815.7, 446.5, 813.2, 440.7, 831.1, 465.0, -830.0, 465.8, 846.8, 490.9, 848.1, 492.9, 848.1, 492.9, 849.5, 494.8, -862.4, 514.2, 862.6, 514.1, 875.4, 533.5, 544.1, 175.8, 556.5, 200.5, -554.9, 201.4, 569.0, 225.3, 561.9, 229.4, 547.8, 205.6, 526.7, 186.0, -525.3, 184.7, 524.4, 183.1, 523.9, 183.4, 533.0, 178.0, 540.5, 172.5, -544.1, 175.8, 526.7, 186.0, 547.8, 205.6, 561.9, 229.4, 569.0, 225.3, -572.1, 230.5, 576.1, 228.6, 578.3, 234.0, 586.1, 245.8, 588.9, 243.9, -599.6, 253.8, 619.4, 274.2, 619.6, 274.0, 639.5, 294.1, 616.9, 278.6, -614.7, 281.7, 589.9, 269.3, 577.6, 260.4, 580.3, 256.7, 570.7, 244.0, -560.1, 230.0, 560.1, 230.0, 549.5, 216.0, 544.8, 209.8, 544.8, 209.8, -540.0, 203.6, 538.5, 201.6, 538.5, 201.6, 537.0, 199.6, 531.9, 192.8, -533.2, 191.2, 526.7, 186.0, 606.5, 321.3, 607.1, 332.5, 603.3, 334.3, -607.8, 343.7, 582.8, 318.3, 582.8, 318.3, 557.8, 293.0, 550.1, 270.2, -544.6, 272.1, 531.4, 251.2, 574.7, 276.3, 574.1, 282.0, 606.5, 321.3, -531.4, 251.2, 526.9, 244.1, 528.3, 242.6, 522.4, 236.9, 563.4, 261.1, -563.4, 261.1, 604.4, 285.3, 606.6, 286.8, 604.7, 289.6, 604.9, 294.0, -605.1, 297.0, 605.1, 297.0, 605.3, 300.0, 602.1, 301.3, 605.9, 310.6, -606.5, 321.3, 574.1, 282.0, 574.7, 276.3, 531.4, 251.2, 604.9, 294.0, -604.7, 289.6, 606.6, 286.8, 604.4, 285.3, 606.9, 286.8, 606.9, 286.8, -609.4, 288.2, 609.6, 291.0, 605.3, 294.2, 604.9, 294.0, 542.8, 279.0, -564.4, 308.2, 562.7, 309.6, 586.0, 337.3, 543.6, 311.2, 543.6, 311.2, -501.2, 285.0, 505.9, 288.8, 510.0, 283.7, 518.8, 282.5, 530.8, 280.7, -536.5, 273.8, 542.8, 279.0, 567.3, 73.7, 569.0, 78.4, 568.2, 78.7, -569.1, 83.6, 569.4, 84.9, 569.4, 84.9, 569.6, 86.2, 568.6, 86.9, -571.5, 91.2, 570.6, 91.6, 566.7, 94.4, 566.7, 94.4, 562.7, 97.1, -561.8, 97.0, 561.9, 94.1, 561.1, 91.2, 553.1, 61.2, 553.1, 61.2, -545.1, 31.1, 543.1, 23.6, 543.1, 23.6, 541.1, 16.0, 535.7, -4.2, -538.8, -5.6, 530.3, -24.4, 551.9, 23.2, 549.6, 24.4, 567.3, 73.7, -530.3, -24.4, 529.7, -26.0, 529.8, -26.1, 529.4, -27.8, 528.2, -32.2, -527.2, -32.2, 527.0, -36.7, 526.9, -37.9, 528.8, -39.2, 528.8, -39.2, -530.9, -27.9, 550.9, -21.1, 549.9, -19.7, 553.8, 1.1, 548.9, 19.7, -557.7, 22.0, 560.4, 36.7, 560.4, 36.7, 563.1, 51.4, 565.2, 62.6, -562.9, 63.6, 567.3, 73.7, 549.6, 24.4, 551.9, 23.2, 530.3, -24.4, -682.2, -11.8, 682.8, -12.2, 687.1, -7.7, 686.9, -7.4, 662.7, 7.7, -666.9, 14.4, 646.9, 36.3, 607.4, 59.9, 606.8, 59.2, 569.6, 86.2, -569.4, 84.9, 569.4, 84.9, 569.1, 83.6, 588.0, 66.3, 588.8, 67.1, -608.4, 50.5, 624.1, 37.2, 624.1, 37.2, 639.9, 23.9, 661.0, 6.1, -659.3, 3.5, 682.2, -11.8, 376.8, 74.3, 374.7, 66.1, 374.7, 66.1, -372.6, 57.9, 376.1, 61.9, 406.7, 46.2, 406.0, 43.4, 413.5, 43.8, -421.0, 59.2, 420.2, 60.1, 406.4, 74.7, 398.1, 75.3, 376.8, 74.3, -439.2, 19.5, 426.1, 5.7, 426.1, 5.7, 413.0, -8.1, 441.4, -5.2, -442.7, -8.0, 471.0, -14.3, 488.5, -14.8, 498.8, -2.9, 506.1, -10.7, -482.9, 14.0, 473.1, 18.6, 439.2, 19.5, 506.1, -10.7, 506.9, -11.0, -507.9, -10.1, 508.1, -10.5, 487.9, 19.2, 487.4, 18.9, 466.1, 47.9, -466.2, 47.8, 465.9, 47.6, 465.6, 47.3, 452.6, 33.3, 452.4, 33.4, -439.2, 19.5, 473.1, 18.6, 482.9, 14.0, 506.1, -10.7, 424.5, 65.0, -422.7, 62.3, 422.4, 62.5, 420.2, 60.1, 421.0, 59.2, 413.5, 43.8, -406.0, 43.4, 397.1, 8.3, 364.4, -22.7, 353.5, -18.0, 352.8, -20.5, -351.7, -22.3, 349.8, -22.3, 355.9, -23.9, 355.9, -23.9, 362.0, -25.4, -371.9, -18.7, 369.3, -14.8, 376.6, -4.2, 383.0, 5.0, 383.0, 5.0, -389.3, 14.2, 396.6, 24.7, 396.6, 24.7, 403.8, 35.1, 414.2, 50.1, -414.5, 49.8, 424.5, 65.0, 414.0, -38.8, 421.4, -40.7, 421.3, -40.9, -428.6, -42.8, 449.2, -48.0, 449.2, -47.9, 469.8, -53.0, 471.6, -53.4, -471.6, -53.4, 473.5, -53.9, 443.7, -46.3, 443.8, -46.2, 414.0, -38.8, -208.2, 292.5, 217.0, 279.3, 222.7, 280.5, 225.8, 266.0, 239.8, 263.1, -242.0, 274.1, 258.3, 282.1, 260.9, 283.4, 260.9, 283.4, 263.4, 284.6, -267.9, 286.8, 272.4, 286.8, 272.4, 289.1, 272.4, 291.5, 267.9, 291.5, -263.4, 293.9, 252.2, 300.0, 252.2, 300.0, 241.0, 306.0, 240.2, 306.5, -239.9, 307.2, 239.3, 307.0, 223.5, 300.4, 211.9, 303.7, 208.2, 292.5, -239.3, 307.0, 240.1, 309.9, 227.5, 313.4, 215.6, 319.8, 208.1, 323.9, -208.1, 323.9, 200.5, 328.0, 197.8, 326.4, 191.7, 329.4, 190.1, 333.6, -194.5, 320.1, 194.5, 320.1, 198.8, 306.6, 200.1, 299.0, 203.5, 299.5, -208.2, 292.5, 211.9, 303.7, 223.5, 300.4, 239.3, 307.0, 238.5, 111.6, -244.2, 108.1, 247.0, 109.7, 249.8, 104.6, 245.6, 119.3, 245.6, 119.3, -241.5, 134.0, 240.6, 137.6, 239.4, 137.2, 238.0, 140.7, 230.1, 155.8, -230.1, 155.8, 222.2, 171.0, 200.9, 211.7, 203.3, 213.2, 179.6, 252.5, -180.5, 246.8, 179.8, 246.7, 179.9, 241.0, 207.3, 175.5, 206.2, 174.7, -238.5, 111.6, 179.9, 241.0, 180.4, 221.2, 174.6, 203.5, 180.9, 201.5, -201.5, 161.7, 201.5, 161.7, 222.1, 121.8, 224.7, 114.7, 230.3, 116.7, -238.5, 111.6, 206.2, 174.7, 207.3, 175.5, 179.9, 241.0, 199.0, 163.7, -180.0, 201.5, 180.0, 201.5, 161.1, 239.4, 150.1, 261.1, 150.0, 261.0, -138.9, 282.6, 137.6, 285.0, 137.6, 285.0, 136.3, 287.5, 137.7, 283.6, -136.5, 283.1, 136.6, 278.7, 146.3, 257.4, 147.8, 258.1, 159.0, 237.4, -179.0, 200.6, 206.9, 171.3, 199.0, 163.7, 477.6, 762.9, 483.4, 806.1, -483.5, 806.0, 489.1, 849.3, 489.8, 854.9, 489.6, 854.9, 490.1, 860.6, -490.8, 868.4, 490.2, 868.5, 491.6, 876.2, 489.4, 864.4, 490.1, 864.3, -488.6, 852.4, 483.4, 810.0, 483.4, 810.0, 478.2, 767.6, 477.9, 765.3, -477.9, 765.2, 477.6, 762.9, 491.9, 847.9, 491.7, 854.3, 493.4, 859.1, -490.1, 860.6, 489.6, 854.9, 489.8, 854.9, 489.1, 849.3, 487.8, 840.3, -488.3, 840.2, 487.4, 831.1, 485.8, 836.4, 489.1, 837.4, 490.8, 843.6, -491.4, 845.8, 492.0, 845.8, 491.9, 847.9, 501.5, 451.5, 496.1, 456.3, -485.1, 452.0, 484.8, 454.4, 495.2, 435.8, 495.2, 435.9, 505.5, 417.3, -512.4, 405.1, 519.8, 404.6, 519.2, 392.8, 528.4, 376.3, 537.4, 359.8, -537.5, 359.8, 538.4, 359.2, 538.9, 358.3, 538.6, 357.9, 539.2, 358.7, -539.7, 358.7, 539.8, 359.6, 540.9, 364.5, 542.6, 364.1, 545.5, 368.5, -533.3, 400.4, 529.4, 398.9, 513.3, 429.3, 507.4, 440.4, 510.3, 443.7, -501.5, 451.5, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5, 464.8, 585.3, -484.5, 550.0, 465.4, 538.7, 463.8, 492.1, 471.6, 478.1, 471.6, 478.1, -479.4, 464.0, 488.2, 493.2, 477.1, 496.5, 474.8, 529.0, 474.7, 530.5, -474.7, 530.5, 474.6, 531.9, 472.3, 563.6, 472.3, 563.6, 470.1, 595.2, -469.2, 607.8, 469.2, 607.8, 468.3, 620.3, 468.2, 621.0, 468.1, 621.0, -468.2, 621.6, 458.7, 501.2, 458.0, 502.4, 457.3, 502.5, 457.3, 503.6, -456.5, 494.1, 456.5, 494.1, 455.6, 484.5, 452.4, 490.2, 457.9, 492.8, -458.7, 501.2, 480.2, 266.5, 481.8, 271.2, 482.9, 270.8, 485.7, 275.1, -492.4, 286.2, 492.6, 286.0, 499.6, 296.9, 503.1, 301.2, 500.0, 303.7, -500.3, 310.6, 492.2, 303.8, 495.4, 300.0, 490.6, 289.4, 485.4, 277.9, -484.3, 278.3, 480.2, 266.5, 205.6, 671.5, 207.4, 667.6, 208.7, 667.8, -209.3, 663.7, 209.5, 676.0, 209.5, 676.0, 209.6, 688.4, 212.5, 682.3, -205.7, 680.0, 205.6, 671.5, 173.8, 490.6, 180.4, 471.0, 174.1, 457.5, -187.1, 451.5, 206.4, 425.2, 203.9, 422.9, 225.7, 398.9, 231.9, 390.5, -230.2, 388.0, 238.3, 382.2, 236.2, 383.7, 239.4, 387.0, 237.7, 390.2, -229.6, 406.0, 228.1, 405.3, 218.5, 420.3, 211.9, 430.8, 211.9, 430.8, -205.2, 441.3, 189.5, 466.0, 196.2, 478.0, 173.8, 490.6, 434.6, 322.4, -437.2, 344.4, 439.3, 344.4, 439.9, 366.4, 440.0, 367.4, 440.0, 367.4, -440.0, 368.4, 432.0, 356.0, 432.4, 355.7, 424.7, 343.1, 424.2, 342.3, -424.2, 342.3, 423.8, 341.6, 419.6, 334.6, 419.6, 334.6, 415.3, 327.6, -405.7, 311.6, 405.7, 311.6, 396.0, 295.6, 392.0, 289.0, 389.9, 289.5, -387.9, 282.3, 377.8, 275.8, 385.3, 264.0, 382.7, 245.8, 379.9, 250.3, -390.0, 256.5, 397.3, 267.3, 407.0, 281.7, 407.0, 281.7, 416.8, 296.1, -417.2, 296.7, 417.2, 296.7, 417.5, 297.2, 420.5, 301.6, 420.5, 301.6, -423.4, 305.9, 429.0, 314.1, 432.1, 313.3, 434.6, 322.4, 209.1, 881.3, -209.0, 881.8, 205.6, 882.1, 202.6, 881.2, 203.0, 880.7, 202.4, 880.2, -202.3, 879.2, 215.2, 875.8, 205.3, 838.2, 208.2, 797.2, 203.1, 821.6, -208.5, 822.8, 208.8, 848.4, 209.0, 864.8, 212.1, 865.4, 209.1, 881.3, -322.4, 303.2, 317.5, 312.0, 320.3, 313.4, 316.6, 322.9, 314.1, 329.5, -313.2, 329.1, 309.8, 335.3, 309.5, 336.0, 309.4, 336.0, 309.1, 336.7, -315.6, 319.9, 313.8, 318.9, 322.4, 303.2, 309.8, 335.3, 313.2, 329.1, -314.1, 329.5, 316.6, 322.9, 311.6, 347.8, 309.5, 347.3, 302.4, 371.7, -301.0, 376.6, 301.0, 376.6, 299.6, 381.6, 296.0, 393.7, 296.0, 393.7, -292.5, 405.8, 292.3, 406.5, 292.3, 406.5, 292.1, 407.2, 291.4, 409.5, -291.4, 409.5, 290.7, 411.9, 283.9, 435.5, 283.9, 435.5, 277.0, 459.0, -274.5, 467.6, 274.5, 467.6, 272.0, 476.1, 270.8, 480.4, 270.8, 480.4, -269.5, 484.6, 256.2, 529.7, 256.2, 529.6, 242.9, 574.7, 241.7, 578.5, -241.8, 578.5, 240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0, -231.9, 614.0, 236.3, 598.2, 240.7, 582.4, 241.8, 578.5, 241.7, 578.5, -242.9, 574.7, 267.7, 486.1, 267.8, 486.1, 292.4, 397.5, 300.9, 367.2, -300.6, 367.1, 309.1, 336.7, 309.4, 336.0, 309.5, 336.0, 309.8, 335.3, -144.7, 133.3, 156.7, 133.2, 156.7, 133.2, 168.8, 133.0, 168.1, 133.2, -169.2, 137.2, 169.5, 141.3, 146.3, 157.1, 147.5, 158.8, 125.4, 176.3, -127.9, 177.1, 129.1, 148.9, 144.7, 133.3, 125.4, 176.3, 116.5, 183.4, -109.2, 182.0, 107.5, 190.5, 104.8, 170.5, 104.8, 170.5, 102.0, 150.6, -118.6, 144.8, 117.6, 142.0, 133.2, 133.5, 133.7, 132.2, 137.8, 135.0, -140.7, 133.4, 142.0, 132.4, 142.7, 133.4, 144.7, 133.3, 129.1, 148.9, -127.9, 177.1, 125.4, 176.3, 115.5, 261.9, 117.0, 266.4, 119.2, 266.7, -118.6, 270.9, 118.7, 271.9, 118.7, 271.9, 118.9, 272.9, 123.6, 317.8, -123.5, 317.8, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3, 129.2, 369.3, -129.2, 369.3, 128.7, 366.0, 128.3, 362.6, 121.9, 312.3, 120.9, 312.4, -115.5, 261.9, 60.6, 101.9, 65.7, 116.8, 65.7, 116.8, 70.8, 131.7, -67.1, 140.6, 67.3, 142.3, 69.2, 152.0, 68.3, 163.3, 69.5, 163.5, -67.4, 174.6, 65.2, 180.0, 65.2, 180.0, 63.0, 185.5, 63.2, 185.1, -63.0, 185.0, 63.0, 184.6, 62.5, 168.3, 62.5, 168.3, 62.1, 152.1, -61.3, 127.0, 51.6, 122.9, 60.6, 101.9, 129.6, 436.3, 133.6, 448.4, -133.2, 448.6, 137.6, 460.5, 122.5, 453.7, 126.3, 445.1, 115.1, 429.8, -105.8, 417.1, 108.9, 409.5, 96.5, 404.4, 115.6, 412.2, 112.5, 419.8, -128.4, 435.2, 129.0, 435.8, 129.3, 435.7, 129.6, 436.3, 38.9, 323.2, -38.5, 321.0, 38.5, 321.0, 38.1, 318.9, 53.0, 296.7, 49.7, 294.5, -61.2, 270.1, 65.4, 294.0, 51.2, 297.2, 38.9, 323.2, 115.1, 429.8, -126.3, 445.1, 122.5, 453.7, 137.6, 460.5, 138.0, 461.7, 139.3, 461.7, -139.2, 462.7, 139.8, 464.7, 142.0, 464.7, 141.8, 466.3, 141.8, 468.7, -141.8, 468.7, 141.9, 471.0, 142.0, 471.5, 141.7, 471.6, 141.5, 472.1, -130.0, 454.6, 130.4, 454.3, 119.3, 436.5, 117.2, 433.1, 117.5, 432.9, -115.1, 429.8, -27.5, 407.4, -30.4, 389.0, -29.2, 388.7, -33.2, 370.6, --33.3, 359.7, -34.8, 355.3, -28.1, 348.9, -26.1, 355.1, -25.7, 355.0, --23.3, 361.1, -23.0, 384.2, -14.8, 395.3, -27.5, 407.4, -23.3, 361.1, --22.7, 362.5, -22.7, 362.5, -22.1, 363.9, -20.4, 368.4, -20.4, 368.4, --18.6, 372.9, -4.0, 410.0, -0.8, 409.0, 10.6, 447.0, 15.8, 451.1, -10.4, 458.2, 10.2, 469.4, -3.1, 439.7, -25.9, 441.5, -25.5, 414.1, --26.2, 412.5, -26.2, 412.5, -27.0, 410.9, -27.8, 409.6, -27.2, 409.2, --27.5, 407.4, -14.8, 395.3, -23.0, 384.2, -23.3, 361.1, -15.8, 379.3, --17.1, 376.1, -18.6, 372.9, -18.6, 372.9, -20.4, 368.4, -20.4, 368.4, --22.1, 363.9, -22.2, 363.6, -22.2, 363.6, -22.3, 363.3, -20.5, 355.6, --24.5, 354.4, -27.3, 345.7, -27.8, 340.5, -25.4, 335.0, -24.8, 335.0, --15.9, 341.8, -16.5, 346.7, -6.7, 348.2, -5.9, 347.4, -2.9, 353.3, -1.7, 354.3, 1.8, 359.9, 9.7, 365.8, 16.8, 365.3, 17.9, 368.2, -19.8, 367.5, 22.8, 369.6, 22.8, 369.7, 22.8, 369.7, 22.8, 369.7, -22.9, 371.5, 22.8, 371.5, 22.8, 373.4, 3.9, 378.1, 3.5, 379.5, --15.8, 379.3, 22.8, 373.4, 22.9, 387.5, 22.9, 387.5, 22.9, 401.7, -21.1, 397.3, -5.3, 402.7, -5.3, 403.6, -10.6, 391.4, -10.6, 391.4, --15.8, 379.3, 3.5, 379.5, 3.9, 378.1, 22.8, 373.4, 89.4, 652.2, -89.7, 652.3, 89.9, 652.3, 89.9, 652.3, 91.2, 668.6, 91.2, 668.6, -92.5, 684.9, 87.9, 684.0, 90.7, 668.6, 89.4, 652.2, 765.8, 541.1, -758.0, 521.3, 758.6, 521.0, 750.1, 501.5, 748.7, 497.4, 750.1, 492.7, -749.0, 492.6, 766.0, 502.0, 785.1, 497.0, 786.1, 505.6, 793.3, 509.5, -793.3, 509.5, 800.5, 513.5, 798.1, 513.8, 797.1, 519.5, 797.4, 525.2, -799.3, 532.4, 795.3, 533.5, 793.2, 541.7, 782.4, 547.1, 773.3, 548.1, -765.8, 541.1, 793.2, 541.7, 787.8, 562.4, 787.8, 562.4, 782.5, 583.1, -778.3, 561.3, 774.1, 562.1, 765.8, 541.1, 773.3, 548.1, 782.4, 547.1, -793.2, 541.7, 748.5, 575.4, 744.8, 572.5, 744.4, 572.8, 741.0, 569.6, -734.7, 564.0, 734.7, 564.0, 728.5, 558.4, 727.5, 551.0, 726.0, 551.2, -723.5, 543.9, 738.5, 556.7, 737.2, 558.8, 748.5, 575.4, 723.5, 543.9, -723.0, 542.4, 722.7, 542.5, 722.5, 540.9, 722.2, 539.4, 721.3, 538.6, -722.0, 537.9, 720.3, 528.5, 720.3, 528.5, 718.6, 519.2, 716.1, 504.7, -710.9, 503.7, 713.5, 490.2, 718.1, 493.2, 722.6, 492.1, 723.2, 495.6, -728.2, 499.0, 728.0, 499.4, 733.3, 502.3, 735.2, 505.7, 734.5, 506.4, -737.1, 509.1, 736.7, 509.4, 739.2, 512.8, 741.2, 516.5, 744.6, 544.7, -744.7, 547.0, 758.5, 571.7, 759.3, 578.0, 759.3, 578.0, 760.1, 584.4, -754.8, 579.3, 754.3, 579.9, 748.5, 575.4, 737.2, 558.8, 738.5, 556.7, -723.5, 543.9, 750.7, 506.1, 751.4, 512.5, 751.4, 512.5, 752.2, 518.9, -750.9, 515.5, 748.4, 516.4, 744.7, 514.0, 740.3, 506.3, 738.7, 507.1, -732.3, 500.6, 719.9, 478.6, 726.2, 469.7, 707.6, 456.6, 706.9, 452.6, -706.9, 452.6, 706.2, 448.6, 730.0, 476.0, 730.8, 475.8, 750.7, 506.1, -706.2, 448.6, 703.8, 435.3, 705.6, 434.7, 701.5, 422.0, 706.9, 425.7, -706.9, 425.7, 712.4, 429.4, 714.7, 448.8, 726.1, 451.4, 745.7, 464.8, -745.7, 465.1, 745.6, 465.3, 745.8, 465.5, 750.7, 468.2, 742.7, 479.3, -748.1, 484.6, 749.8, 485.2, 747.0, 491.5, 749.0, 492.6, 750.1, 492.7, -748.7, 497.4, 750.1, 501.5, 751.0, 503.5, 750.4, 503.8, 750.7, 506.1, -730.8, 475.8, 730.0, 476.0, 706.2, 448.6, 835.7, 623.1, 836.7, 624.3, -837.6, 623.4, 839.3, 624.0, 839.8, 624.1, 839.7, 624.4, 840.1, 624.8, -841.3, 625.9, 841.2, 626.1, 842.2, 627.4, 838.6, 626.1, 838.1, 626.0, -835.7, 623.1, 855.5, 586.8, 860.4, 591.7, 860.4, 591.7, 865.4, 596.6, -880.6, 617.1, 878.7, 618.8, 895.8, 637.6, 867.6, 630.8, 867.6, 630.5, -839.3, 624.0, 837.6, 623.4, 836.7, 624.3, 835.7, 623.1, 831.7, 622.2, -828.2, 620.5, 827.8, 621.3, 835.7, 605.4, 839.2, 607.1, 850.6, 593.0, -853.0, 589.9, 853.9, 586.4, 855.5, 586.8, 575.2, 385.9, 565.8, 372.2, -563.7, 373.2, 556.4, 358.5, 548.0, 343.3, 545.6, 329.2, 536.7, 329.8, -536.4, 326.7, 536.4, 326.7, 536.1, 323.7, 544.7, 334.1, 543.4, 335.2, -550.6, 346.8, 562.9, 366.3, 565.0, 365.3, 575.2, 385.9, 626.3, 445.3, -630.7, 459.4, 630.7, 459.4, 635.2, 473.4, 613.2, 440.7, 612.9, 440.9, -590.6, 408.4, 585.9, 399.5, 595.0, 392.5, 589.2, 386.5, 612.9, 411.0, -610.1, 414.7, 626.3, 445.3, 589.2, 386.5, 586.2, 380.6, 588.8, 379.2, -588.3, 372.0, 587.4, 357.9, 582.3, 356.2, 586.5, 343.8, 591.1, 346.9, -591.1, 346.9, 595.7, 350.0, 597.0, 350.8, 596.5, 351.7, 597.3, 353.4, -586.5, 392.3, 611.8, 399.4, 626.3, 445.3, 610.1, 414.7, 612.9, 411.0, -589.2, 386.5, 718.6, 519.2, 720.3, 528.5, 720.3, 528.5, 722.0, 537.9, -711.8, 549.5, 701.7, 552.1, 703.4, 562.7, 704.0, 563.8, 701.3, 565.4, -699.3, 568.1, 699.0, 569.1, 696.3, 568.4, 693.3, 568.6, 692.5, 565.5, -695.3, 564.7, 697.3, 560.8, 700.6, 554.3, 700.6, 554.3, 704.0, 547.8, -711.3, 533.5, 707.0, 525.6, 718.6, 519.2, 910.3, 563.5, 905.1, 556.1, -905.1, 556.1, 899.8, 548.7, 901.3, 525.5, 896.4, 525.1, 893.0, 501.6, -910.5, 526.3, 905.8, 531.9, 910.3, 563.5, 842.9, 516.0, 837.8, 511.5, -837.8, 511.5, 832.8, 507.0, 832.6, 485.1, 818.1, 481.9, 797.4, 463.4, -790.1, 450.1, 787.6, 451.4, 777.8, 439.4, 810.7, 477.4, 811.2, 477.0, -842.9, 516.0, 846.8, 490.9, 830.0, 465.8, 831.1, 465.0, 813.2, 440.7, -801.8, 415.0, 801.8, 415.0, 790.5, 389.3, 819.3, 429.5, 814.6, 432.8, -838.7, 476.3, 842.8, 483.6, 842.0, 484.2, 846.8, 490.9, 485.3, 126.2, -497.4, 124.9, 499.2, 128.7, 509.6, 123.7, 513.3, 124.0, 516.4, 125.4, -516.9, 124.3, 518.5, 126.3, 518.5, 126.3, 520.2, 128.3, 527.6, 149.4, -530.3, 148.5, 540.5, 168.7, 511.7, 166.9, 504.0, 153.5, 485.3, 126.2, -540.5, 168.7, 542.3, 172.2, 542.3, 172.2, 544.1, 175.8, 540.5, 172.5, -533.0, 178.0, 523.9, 183.4, 497.6, 169.5, 501.3, 162.4, 478.7, 141.4, -471.8, 134.9, 471.2, 135.4, 464.8, 128.5, 465.1, 128.8, 465.7, 128.2, -466.5, 128.1, 474.5, 124.3, 475.9, 127.1, 485.3, 126.2, 504.0, 153.5, -511.7, 166.9, 540.5, 168.7, 804.5, 87.9, 824.8, 103.2, 825.5, 102.3, -846.3, 117.0, 857.7, 124.9, 857.5, 125.2, 868.7, 133.4, 863.2, 129.3, -863.1, 129.5, 857.5, 125.5, 831.0, 106.7, 830.4, 107.5, 804.5, 87.9, -936.1, 245.9, 931.1, 239.5, 929.4, 240.9, 922.7, 235.8, 918.0, 232.3, -918.1, 232.3, 913.4, 228.8, 876.6, 201.0, 876.6, 201.0, 839.8, 173.3, -834.8, 169.5, 834.0, 165.0, 829.8, 165.7, 840.9, 163.7, 841.7, 168.3, -853.6, 170.8, 864.6, 173.1, 868.4, 168.9, 875.6, 175.5, 909.7, 206.5, -907.6, 209.3, 936.1, 245.9, 686.0, 149.5, 684.1, 135.7, 669.1, 137.8, -652.1, 126.1, 638.8, 117.0, 638.8, 117.0, 625.6, 107.8, 618.0, 102.6, -613.6, 104.6, 610.4, 97.3, 615.1, 96.3, 615.1, 96.3, 619.9, 95.3, -629.9, 99.9, 628.7, 102.5, 637.5, 109.8, 644.5, 115.4, 644.5, 115.4, -651.4, 121.1, 668.7, 135.3, 683.8, 133.2, 686.0, 149.5, 576.5, 124.0, -580.8, 126.0, 580.8, 126.0, 585.0, 128.1, 586.0, 128.6, 586.0, 128.7, -587.0, 129.2, 581.8, 126.6, 581.7, 126.7, 576.5, 124.0, 795.1, 271.6, -794.1, 271.2, 796.8, 263.4, 798.5, 255.3, 799.9, 248.5, 802.0, 241.9, -801.3, 241.7, 836.2, 260.0, 836.2, 260.0, 871.1, 278.3, 867.9, 276.4, -867.0, 277.9, 862.9, 277.6, 829.0, 274.6, 826.3, 282.4, 795.1, 271.6, -820.2, 241.9, 825.3, 245.5, 825.3, 245.5, 830.4, 249.0, 818.0, 241.3, -817.2, 242.5, 804.0, 236.0, 810.9, 240.7, 812.5, 238.1, 820.2, 241.9, -707.8, 186.5, 709.9, 187.9, 709.2, 189.3, 711.3, 190.3, 676.6, 173.2, -676.6, 173.2, 641.9, 156.2, 623.4, 152.8, 624.9, 144.6, 607.9, 133.0, -634.7, 139.2, 633.0, 146.5, 658.2, 159.9, 674.4, 168.6, 674.4, 168.6, -690.7, 177.3, 699.2, 181.9, 699.6, 181.4, 707.8, 186.5, 625.1, 297.5, -631.6, 301.3, 631.6, 301.3, 638.2, 305.2, 641.4, 305.5, 640.7, 312.7, -643.3, 320.2, 631.5, 313.3, 629.5, 310.4, 625.1, 297.5, 444.3, 210.5, -441.2, 208.2, 439.3, 206.5, 439.9, 203.6, 441.9, 192.6, 444.6, 193.1, -449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6, -449.3, 182.6, 449.3, 182.6, 462.4, 196.0, 462.4, 196.0, 475.5, 209.3, -500.5, 245.8, 507.0, 241.3, 538.5, 273.3, 538.9, 273.7, 538.9, 273.8, -539.3, 274.3, 540.5, 275.8, 540.5, 275.8, 541.6, 277.4, 492.6, 244.5, -492.1, 245.1, 444.3, 210.5, 626.5, 73.3, 662.7, 57.4, 662.7, 57.4, -698.9, 41.5, 692.2, 43.1, 696.0, 54.8, 688.7, 58.0, 659.8, 70.7, -638.4, 53.9, 626.5, 73.3, 688.7, 58.0, 684.0, 56.9, 681.7, 71.7, -672.7, 84.0, 671.9, 85.1, 670.9, 84.4, 669.1, 84.8, 646.1, 89.7, -646.1, 94.6, 623.1, 94.6, 612.1, 88.8, 611.6, 89.7, 600.1, 84.9, -613.5, 79.6, 613.3, 79.1, 626.5, 73.3, 638.4, 53.9, 659.8, 70.7, -688.7, 58.0, 682.9, 81.8, 678.3, 83.9, 673.3, 81.8, 672.7, 84.0, -681.7, 71.7, 684.0, 56.9, 688.7, 58.0, 696.0, 54.8, 692.2, 43.1, -698.9, 41.5, 701.1, 40.5, 701.1, 40.5, 703.4, 39.5, 695.5, 59.7, -693.9, 59.1, 684.5, 78.6, 683.7, 80.2, 684.2, 81.2, 682.9, 81.8, -438.1, 128.0, 441.8, 124.7, 441.4, 124.4, 444.8, 120.8, 470.4, 92.8, -470.4, 92.8, 496.1, 64.9, 506.3, 53.8, 506.3, 53.8, 516.5, 42.7, -528.8, 29.4, 525.8, 22.1, 541.1, 16.0, 543.1, 23.6, 543.1, 23.6, -545.1, 31.1, 545.2, 32.4, 543.6, 32.5, 542.1, 33.9, 490.1, 80.9, -490.4, 81.3, 438.1, 128.0, 444.8, 120.8, 441.4, 124.4, 441.8, 124.7, -438.1, 128.0, 436.1, 130.2, 436.4, 132.0, 434.0, 132.5, 424.1, 132.5, -424.1, 132.5, 414.2, 132.6, 424.2, 121.8, 428.9, 123.9, 444.8, 120.8, -428.3, 100.5, 430.0, 102.1, 417.9, 114.9, 407.5, 129.4, 406.3, 131.1, -406.3, 131.1, 405.1, 132.7, 401.3, 134.8, 401.5, 136.3, 399.5, 140.5, -395.8, 140.0, 395.9, 136.0, 393.4, 131.0, 388.3, 125.4, 390.3, 123.5, -387.3, 116.0, 385.9, 112.6, 386.4, 112.4, 385.5, 108.7, 405.6, 101.1, -419.0, 91.7, 428.3, 100.5, 376.6, -4.2, 369.3, -14.8, 371.9, -18.7, -362.0, -25.4, 362.3, -25.5, 362.3, -25.5, 362.6, -25.6, 369.8, -25.0, -371.8, -27.7, 376.9, -24.1, 413.9, 15.4, 419.5, 10.2, 462.0, 44.4, -443.6, 22.3, 435.3, 29.2, 408.7, 14.0, 392.6, 4.9, 390.5, 7.5, -376.6, -4.2, 354.9, 111.6, 352.6, 104.8, 354.4, 104.1, 353.9, 96.6, -353.5, 89.0, 353.5, 89.0, 353.0, 81.4, 352.5, 73.8, 356.0, 70.2, -352.0, 66.3, 363.7, 84.6, 379.1, 99.0, 375.4, 102.9, 382.3, 117.9, -382.3, 118.8, 393.4, 131.0, 395.9, 136.0, 395.8, 140.0, 399.5, 140.5, -399.3, 141.0, 400.0, 142.2, 400.6, 142.2, 400.6, 148.2, 404.3, 148.1, -408.1, 154.0, 408.2, 154.1, 408.0, 154.2, 407.9, 154.3, 404.6, 151.9, -404.7, 151.7, 401.4, 149.1, 381.1, 132.7, 381.1, 132.7, 360.7, 116.3, -357.8, 114.0, 355.9, 114.6, 354.9, 111.6, 354.1, 229.1, 355.0, 230.2, -349.9, 234.6, 345.7, 240.1, 343.2, 243.5, 340.1, 246.3, 340.6, 246.9, -334.1, 239.5, 330.2, 231.4, 333.8, 226.6, 336.9, 222.5, 349.0, 223.4, -354.1, 229.1, 180.4, 458.9, 165.2, 479.0, 164.5, 478.5, 150.0, 499.1, -148.8, 490.4, 148.8, 490.4, 147.6, 481.7, 151.1, 474.2, 155.4, 476.2, -163.2, 470.8, 171.8, 464.8, 176.5, 467.1, 180.4, 458.9, 215.6, 319.8, -227.5, 313.4, 240.1, 309.9, 239.3, 307.0, 239.9, 307.2, 240.2, 306.5, -241.0, 306.0, 240.7, 308.1, 240.5, 309.0, 238.9, 309.9, 227.8, 315.9, -216.7, 313.2, 215.6, 319.8, 222.2, 171.0, 230.1, 155.8, 230.1, 155.8, -238.0, 140.7, 236.5, 144.5, 236.9, 144.6, 235.8, 148.5, 229.8, 160.1, -225.6, 158.8, 222.2, 171.0, 176.4, 362.5, 165.4, 402.3, 165.4, 402.3, -154.3, 442.2, 154.2, 419.4, 152.3, 419.4, 150.3, 396.7, 150.3, 396.6, -150.3, 396.6, 150.4, 396.6, 163.4, 379.5, 177.8, 378.3, 176.4, 362.5, -138.4, 232.7, 138.6, 227.7, 141.1, 225.7, 138.8, 222.8, 153.2, 201.8, -147.7, 192.0, 167.7, 180.7, 169.5, 178.8, 169.6, 178.8, 170.7, 176.4, -170.6, 175.3, 172.0, 175.3, 172.4, 174.0, 183.0, 160.3, 182.2, 159.7, -192.0, 145.4, 212.5, 119.2, 212.1, 118.9, 232.3, 92.4, 204.5, 142.4, -200.4, 140.1, 168.4, 187.8, 153.4, 210.2, 155.7, 212.2, 138.4, 232.7, -470.8, 711.5, 474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2, -477.9, 765.3, 478.2, 767.6, 474.5, 739.6, 474.2, 739.6, 470.8, 711.5, -498.0, 805.1, 500.3, 782.9, 501.2, 783.0, 504.3, 760.8, 504.4, 760.3, -504.4, 760.3, 504.4, 759.9, 513.1, 698.6, 512.1, 698.4, 521.8, 637.3, -523.2, 628.6, 524.2, 628.7, 526.6, 620.2, 535.0, 590.1, 535.0, 590.1, -543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6, 524.2, 668.1, -523.8, 668.0, 501.9, 784.4, 500.0, 794.8, 499.1, 794.7, 498.0, 805.1, -504.3, 760.8, 501.2, 783.0, 500.3, 782.9, 498.0, 805.1, 495.0, 826.5, -495.9, 826.7, 491.9, 847.9, 492.0, 845.8, 491.4, 845.8, 490.8, 843.6, -496.7, 802.1, 496.6, 802.0, 504.3, 760.8, 580.1, 422.7, 580.7, 423.6, -580.7, 423.6, 581.3, 424.5, 581.4, 425.1, 580.6, 425.6, 580.8, 426.0, -580.0, 424.7, 579.7, 424.1, 580.1, 422.7, 448.7, 409.5, 446.9, 389.4, -446.9, 389.4, 445.0, 369.4, 445.1, 370.9, 445.7, 370.9, 446.4, 372.4, -447.4, 374.6, 447.4, 374.6, 448.4, 376.8, 449.8, 380.1, 449.8, 380.1, -451.3, 383.3, 452.7, 386.4, 452.7, 386.4, 454.1, 389.4, 463.1, 419.2, -467.1, 418.0, 480.0, 446.7, 483.6, 433.2, 458.4, 430.8, 448.7, 409.5, -480.0, 446.7, 480.5, 447.8, 480.5, 447.8, 481.0, 448.9, 468.8, 470.9, -471.1, 472.2, 461.7, 495.7, 460.2, 498.5, 460.2, 498.5, 458.7, 501.2, -457.9, 492.8, 452.4, 490.2, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0, -448.7, 409.5, 458.4, 430.8, 483.6, 433.2, 480.0, 446.7, 192.8, 698.4, -199.2, 685.0, 199.2, 685.0, 205.6, 671.5, 205.7, 680.0, 212.5, 682.3, -209.6, 688.4, 210.1, 726.6, 221.5, 730.2, 210.6, 764.9, 210.6, 767.8, -209.7, 770.5, 210.2, 770.6, 208.8, 765.3, 204.7, 766.3, 199.2, 762.1, -191.8, 731.2, 190.6, 729.9, 192.8, 698.4, 199.2, 762.1, 191.9, 756.3, -192.1, 756.1, 184.6, 750.6, 182.7, 737.0, 182.7, 737.0, 180.9, 723.4, -188.3, 722.5, 186.8, 710.9, 192.8, 698.4, 190.6, 729.9, 191.8, 731.2, -199.2, 762.1, 236.2, 411.3, 233.8, 419.9, 235.6, 420.4, 234.9, 429.5, -234.5, 434.5, 234.5, 434.5, 234.2, 439.5, 233.2, 453.4, 233.2, 453.4, -232.2, 467.3, 231.7, 473.0, 231.7, 473.0, 231.3, 478.7, 229.9, 497.9, -231.2, 498.1, 228.5, 517.2, 227.6, 517.0, 225.0, 523.0, 224.3, 529.2, -235.1, 554.2, 204.3, 563.1, 199.8, 598.9, 204.3, 603.4, 194.9, 612.9, -189.9, 626.9, 193.1, 620.6, 191.5, 619.8, 193.0, 612.6, 197.7, 591.0, -197.7, 591.0, 202.3, 569.3, 204.0, 561.3, 204.0, 561.3, 205.8, 553.2, -209.1, 537.8, 209.1, 537.8, 212.4, 522.3, 218.1, 495.7, 218.1, 495.7, -223.8, 469.2, 230.0, 440.3, 228.3, 439.8, 236.2, 411.3, 348.6, 878.3, -346.2, 840.7, 363.8, 822.4, 343.8, 803.1, 345.5, 776.0, 350.3, 776.3, -356.8, 749.4, 361.1, 731.7, 358.3, 730.5, 365.4, 714.0, 361.6, 722.8, -364.4, 724.0, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8, 361.4, 753.6, -360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1, 360.0, 767.1, -359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4, 354.5, 820.5, -354.5, 820.5, 350.4, 860.7, 349.5, 869.5, 347.6, 869.7, 348.6, 878.3, -424.8, 241.2, 429.7, 281.8, 429.7, 281.8, 434.6, 322.4, 432.1, 313.3, -429.0, 314.1, 423.4, 305.9, 419.6, 275.8, 424.1, 275.2, 424.7, 244.6, -424.8, 242.9, 425.0, 242.8, 424.8, 241.2, 278.9, 391.8, 258.1, 432.7, -256.9, 432.0, 234.8, 472.2, 233.1, 475.5, 230.4, 476.9, 231.3, 478.7, -231.7, 473.0, 231.7, 473.0, 232.2, 467.3, 244.9, 442.6, 246.9, 443.6, -261.6, 419.8, 270.2, 405.8, 271.4, 406.4, 278.9, 391.8, 142.6, 812.3, -142.0, 745.0, 143.1, 745.0, 143.6, 677.7, 143.8, 660.2, 144.9, 660.2, -143.9, 642.7, 143.9, 642.7, 143.9, 642.7, 143.9, 642.6, 144.5, 656.6, -149.1, 656.4, 154.3, 670.2, 155.2, 672.8, 155.2, 673.1, 155.0, 675.9, -150.4, 732.9, 149.8, 732.8, 144.7, 789.8, 143.7, 801.1, 142.5, 801.1, -142.6, 812.3, 166.1, 703.6, 176.1, 732.7, 175.0, 733.1, 186.1, 761.7, -187.3, 770.3, 187.3, 770.3, 188.5, 778.9, 183.8, 801.5, 180.9, 800.9, -173.4, 823.0, 173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 173.5, 823.2, -173.4, 823.1, 173.4, 823.0, 171.5, 807.5, 171.5, 807.5, 169.5, 791.9, -165.2, 757.5, 162.3, 757.6, 160.9, 723.1, 160.5, 713.5, 169.8, 709.3, -166.1, 703.6, 160.9, 723.1, 152.3, 701.7, 157.9, 699.5, 155.0, 675.9, -155.2, 673.1, 155.2, 672.8, 154.3, 670.2, 156.0, 674.9, 156.0, 674.9, -157.8, 679.7, 162.5, 691.5, 162.0, 691.7, 166.1, 703.6, 169.8, 709.3, -160.5, 713.5, 160.9, 723.1, 90.3, 188.5, 91.4, 191.9, 92.7, 191.9, -92.6, 195.2, 97.0, 229.5, 104.1, 228.6, 115.5, 261.9, 120.9, 312.4, -121.9, 312.3, 128.3, 362.6, 127.0, 342.9, 124.1, 343.2, 119.8, 323.7, -119.2, 321.0, 119.2, 321.0, 118.7, 318.3, 114.6, 299.8, 114.6, 299.8, -110.6, 281.3, 100.4, 234.9, 100.0, 235.0, 90.3, 188.5, 55.9, 88.2, -58.2, 95.1, 58.2, 95.1, 60.6, 101.9, 51.6, 122.9, 61.3, 127.0, -62.1, 152.1, 51.9, 122.6, 56.8, 120.2, 55.9, 88.2, 128.4, 435.2, -112.5, 419.8, 115.6, 412.2, 96.5, 404.4, 88.8, 396.0, 89.7, 395.1, -82.9, 385.9, 82.7, 385.3, 82.6, 385.4, 82.2, 384.9, 88.2, 391.3, -88.1, 391.4, 94.0, 397.8, 111.2, 416.5, 120.2, 413.2, 128.4, 435.2, -59.1, 353.3, 49.3, 339.9, 51.9, 336.6, 39.5, 326.5, 39.3, 325.6, -39.4, 325.6, 39.1, 324.7, 38.9, 324.0, 39.0, 324.0, 38.9, 323.2, -51.2, 297.2, 65.4, 294.0, 61.2, 270.1, 62.8, 266.8, 62.8, 266.8, -64.4, 263.4, 63.2, 308.4, 74.8, 313.5, 59.1, 353.3, 64.4, 263.4, -65.7, 260.7, 67.4, 260.4, 67.0, 257.9, 72.4, 272.6, 72.4, 272.6, -77.7, 287.3, 83.2, 291.6, 76.6, 299.7, 76.0, 312.1, 76.0, 314.7, -75.8, 314.6, 75.7, 317.2, 82.3, 326.3, 62.3, 336.1, 60.9, 355.8, -60.0, 354.6, 60.0, 354.6, 59.1, 353.3, 74.8, 313.5, 63.2, 308.4, -64.4, 263.4, 94.6, 422.5, 88.8, 404.2, 88.9, 404.1, 82.9, 385.9, -89.7, 395.1, 88.8, 396.0, 96.5, 404.4, 108.9, 409.5, 105.8, 417.1, -115.1, 429.8, 117.5, 432.9, 117.2, 433.1, 119.3, 436.5, 106.1, 431.9, -102.1, 433.0, 94.6, 422.5, 119.3, 436.5, 130.4, 454.3, 130.0, 454.6, -141.5, 472.1, 135.1, 490.1, 135.1, 490.1, 128.8, 508.0, 128.5, 505.7, -125.4, 503.4, 124.8, 503.8, 124.8, 503.8, 124.6, 503.6, 124.4, 503.4, -117.4, 500.8, 119.6, 494.7, 114.9, 486.1, 119.4, 483.8, 104.7, 454.3, -94.6, 422.5, 102.1, 433.0, 106.1, 431.9, 119.3, 436.5, 93.3, 695.5, -93.8, 702.6, 91.2, 708.1, 94.4, 709.6, 89.1, 714.5, 89.1, 714.5, -83.8, 719.4, 83.9, 719.1, 79.8, 717.4, 75.8, 715.5, 68.6, 706.3, -67.0, 706.5, 56.3, 701.2, 56.1, 701.0, 56.1, 701.0, 55.9, 700.7, -61.0, 692.4, 52.8, 687.4, 49.7, 674.1, 69.7, 671.4, 74.7, 680.8, -93.3, 695.5, 49.7, 674.1, 49.3, 672.3, 49.3, 672.3, 48.9, 670.5, -58.1, 672.3, 70.0, 661.3, 72.2, 648.9, 80.8, 650.5, 80.8, 650.5, -89.4, 652.2, 90.7, 668.6, 87.9, 684.0, 92.5, 684.9, 92.9, 690.2, -92.9, 690.2, 93.3, 695.5, 74.7, 680.8, 69.7, 671.4, 49.7, 674.1, -855.7, 644.3, 864.1, 655.0, 862.1, 657.6, 872.6, 665.6, 867.3, 669.8, -867.3, 669.8, 861.9, 674.1, 855.1, 664.1, 839.5, 674.7, 817.1, 675.3, -814.8, 664.3, 834.4, 648.1, 855.7, 644.3, 850.6, 593.0, 839.2, 607.1, -835.7, 605.4, 827.8, 621.3, 824.4, 623.7, 821.5, 619.7, 815.2, 618.2, -805.9, 616.0, 805.7, 616.5, 796.5, 613.7, 796.7, 613.2, 796.7, 613.2, -796.8, 612.7, 806.7, 608.6, 806.9, 609.0, 817.0, 605.3, 833.8, 599.1, -848.1, 589.4, 850.6, 593.0, 550.6, 346.8, 543.4, 335.2, 544.7, 334.1, -536.1, 323.7, 535.4, 316.0, 538.8, 312.6, 534.6, 308.4, 560.5, 326.1, -560.5, 326.1, 586.5, 343.8, 582.3, 356.2, 587.4, 357.9, 588.3, 372.0, -570.6, 373.5, 567.0, 362.0, 550.6, 346.8, 588.3, 372.0, 588.8, 379.2, -586.2, 380.6, 589.2, 386.5, 595.0, 392.5, 585.9, 399.5, 590.6, 408.4, -582.9, 397.1, 582.9, 397.1, 575.2, 385.9, 565.0, 365.3, 562.9, 366.3, -550.6, 346.8, 567.0, 362.0, 570.6, 373.5, 588.3, 372.0, 706.7, 478.9, -709.8, 483.0, 713.1, 483.1, 713.0, 487.0, 713.1, 488.1, 712.7, 488.6, -713.3, 489.1, 713.6, 489.3, 713.2, 490.0, 713.5, 490.2, 710.9, 503.7, -716.1, 504.7, 718.6, 519.2, 707.0, 525.6, 711.3, 533.5, 704.0, 547.8, -694.7, 516.5, 701.7, 512.8, 706.7, 478.9, 922.2, 514.6, 918.6, 541.0, -913.8, 541.2, 915.0, 567.3, 913.1, 566.1, 913.1, 566.1, 911.3, 564.9, -910.8, 564.5, 910.9, 564.3, 910.5, 563.7, 912.9, 551.4, 913.4, 551.5, -916.3, 539.2, 916.9, 536.7, 916.9, 536.7, 917.5, 534.2, 919.9, 524.4, -921.4, 524.5, 922.2, 514.6, 868.0, 523.0, 871.7, 528.3, 871.8, 528.1, -875.4, 533.5, 880.0, 540.1, 880.9, 539.6, 884.7, 546.7, 882.9, 545.5, -882.5, 544.0, 881.1, 544.3, 881.2, 544.2, 876.3, 539.0, 874.5, 539.8, -875.5, 535.3, 864.1, 532.8, 853.8, 525.7, 847.5, 522.2, 848.3, 520.8, -842.9, 516.0, 811.2, 477.0, 810.7, 477.4, 777.8, 439.4, 764.3, 422.8, -764.3, 422.8, 750.9, 406.3, 794.4, 444.7, 792.0, 447.3, 833.2, 488.3, -850.6, 505.7, 851.2, 505.1, 868.0, 523.0, 800.2, 369.8, 812.1, 386.9, -808.4, 391.3, 823.9, 404.0, 850.1, 450.0, 852.8, 448.7, 884.2, 491.5, -887.5, 513.7, 885.0, 514.4, 890.9, 536.0, 891.2, 536.4, 890.9, 536.6, -891.0, 537.3, 856.2, 473.4, 856.3, 473.3, 821.7, 409.3, 810.9, 389.5, -794.8, 382.7, 800.2, 369.8, 906.3, 160.9, 920.0, 170.9, 919.3, 171.9, -933.6, 180.8, 935.5, 182.7, 933.6, 187.9, 934.2, 187.9, 907.8, 185.9, -908.1, 182.4, 882.0, 176.8, 878.8, 176.1, 878.8, 176.1, 875.6, 175.5, -868.4, 168.9, 864.6, 173.1, 853.6, 170.8, 877.1, 159.7, 881.0, 157.7, -906.3, 160.9, 938.0, 227.0, 943.7, 234.1, 941.1, 238.1, 940.0, 248.8, -940.2, 247.6, 937.7, 247.7, 936.1, 245.9, 907.6, 209.3, 909.7, 206.5, -875.6, 175.5, 878.8, 176.1, 878.8, 176.1, 882.0, 176.8, 910.9, 200.7, -914.7, 198.1, 938.0, 227.0, 882.0, 176.8, 908.1, 182.4, 907.8, 185.9, -934.2, 187.9, 945.0, 197.5, 932.2, 225.8, 938.0, 227.0, 914.7, 198.1, -910.9, 200.7, 882.0, 176.8, 913.4, 228.8, 924.8, 237.3, 924.8, 237.3, -936.1, 245.9, 937.7, 247.7, 940.2, 247.6, 940.0, 248.8, 940.1, 248.9, -940.0, 249.0, 940.1, 249.1, 934.5, 244.9, 934.5, 244.9, 929.0, 240.6, -925.8, 238.2, 925.8, 238.2, 922.7, 235.8, 918.0, 232.3, 918.1, 232.3, -913.4, 228.8, 681.9, 99.4, 674.2, 94.0, 674.0, 93.0, 669.1, 84.8, -670.9, 84.4, 671.9, 85.1, 672.7, 84.0, 673.3, 81.8, 678.3, 83.9, -682.9, 81.8, 696.7, 78.9, 697.8, 73.4, 710.6, 75.9, 721.9, 78.2, -720.8, 83.6, 731.1, 91.4, 735.2, 94.5, 735.9, 98.2, 739.3, 97.6, -715.3, 102.1, 714.6, 98.4, 689.9, 99.1, 685.9, 99.3, 684.6, 101.2, -681.9, 99.4, 767.4, 197.3, 774.3, 201.8, 772.5, 209.7, 778.7, 210.2, -766.2, 203.2, 766.9, 201.7, 753.8, 196.2, 720.3, 174.2, 722.5, 153.6, -687.8, 150.7, 729.3, 154.2, 728.8, 172.1, 767.4, 197.3, 862.9, 277.6, -867.0, 277.9, 867.9, 276.4, 871.1, 278.3, 874.9, 280.3, 875.3, 279.8, -878.8, 282.3, 883.0, 285.2, 883.2, 288.4, 887.3, 288.2, 887.1, 288.3, -886.8, 288.3, 886.8, 288.4, 870.8, 290.2, 867.9, 292.0, 856.1, 303.1, -856.0, 302.9, 853.8, 304.2, 851.6, 305.3, 816.2, 322.3, 817.1, 324.5, -780.8, 339.3, 782.3, 338.7, 780.3, 335.4, 782.0, 333.8, 789.5, 326.7, -790.6, 327.8, 799.3, 321.8, 802.4, 319.6, 802.4, 319.6, 805.6, 317.4, -834.2, 297.5, 833.0, 295.4, 862.9, 277.6, 657.9, 132.4, 654.5, 130.0, -655.6, 128.2, 652.1, 126.1, 669.1, 137.8, 684.1, 135.7, 686.0, 149.5, -686.9, 150.1, 686.9, 150.1, 687.8, 150.7, 720.3, 173.2, 720.2, 173.3, -752.8, 195.8, 753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 761.2, 199.3, -760.5, 200.8, 767.2, 205.4, 764.9, 203.8, 764.9, 203.9, 762.5, 202.3, -757.6, 199.0, 757.6, 199.0, 752.8, 195.8, 705.4, 164.1, 704.8, 164.9, -657.9, 132.4, 625.6, 107.8, 638.8, 117.0, 638.8, 117.0, 652.1, 126.1, -655.6, 128.2, 654.5, 130.0, 657.9, 132.4, 661.1, 135.9, 661.1, 135.9, -664.3, 139.4, 666.3, 141.5, 666.0, 142.0, 668.3, 143.7, 662.0, 139.2, -662.4, 138.7, 656.5, 133.7, 646.2, 125.1, 646.2, 125.1, 635.9, 116.5, -630.8, 112.2, 631.3, 111.2, 625.6, 107.8, 529.6, 223.2, 534.4, 238.6, -552.7, 230.3, 570.7, 244.0, 580.3, 256.7, 577.6, 260.4, 589.9, 269.3, -583.2, 266.0, 583.2, 266.0, 576.5, 262.7, 552.2, 244.1, 537.3, 247.9, -529.6, 223.2, 576.5, 262.7, 542.1, 245.5, 542.5, 244.8, 507.7, 228.3, -491.6, 218.8, 485.1, 223.3, 475.5, 209.3, 462.4, 196.0, 462.4, 196.0, -449.3, 182.6, 451.0, 184.5, 451.8, 183.9, 454.2, 185.1, 491.9, 204.2, -494.1, 200.7, 529.6, 223.2, 537.3, 247.9, 552.2, 244.1, 576.5, 262.7, -454.2, 185.1, 451.8, 183.9, 451.0, 184.5, 449.3, 182.6, 449.3, 182.6, -449.3, 182.6, 449.3, 182.6, 436.6, 157.6, 430.6, 159.3, 408.0, 140.6, -408.6, 140.5, 408.6, 140.5, 409.3, 140.3, 415.1, 145.5, 414.8, 145.9, -420.4, 151.4, 434.4, 165.4, 434.4, 165.4, 448.4, 179.4, 451.3, 182.2, -453.2, 181.7, 454.2, 185.1, 613.8, 318.3, 609.5, 309.1, 605.8, 299.8, -605.3, 300.0, 605.1, 297.0, 605.1, 297.0, 604.9, 294.0, 605.3, 294.2, -609.6, 291.0, 609.4, 288.2, 617.2, 292.8, 617.2, 292.8, 625.1, 297.5, -629.5, 310.4, 631.5, 313.3, 643.3, 320.2, 644.4, 323.5, 643.2, 325.5, -645.5, 326.8, 647.2, 327.6, 645.5, 330.3, 647.2, 331.9, 654.4, 331.7, -655.2, 355.4, 663.1, 378.8, 631.4, 365.8, 636.9, 349.7, 613.8, 318.3, -663.1, 378.8, 665.6, 386.2, 665.9, 393.6, 668.1, 393.5, 665.6, 394.7, -663.0, 395.4, 663.1, 395.9, 657.0, 391.8, 657.0, 391.8, 650.9, 387.6, -645.7, 384.7, 646.5, 383.2, 642.2, 378.7, 633.7, 347.0, 628.0, 348.5, -613.8, 318.3, 636.9, 349.7, 631.4, 365.8, 663.1, 378.8, 499.3, 283.8, -494.8, 281.0, 494.6, 281.3, 490.3, 278.3, 488.5, 277.1, 488.5, 277.1, -486.8, 275.9, 493.1, 279.8, 493.2, 279.7, 499.3, 283.8, 745.7, 58.1, -738.0, 64.9, 735.2, 63.3, 730.2, 71.7, 721.6, 76.1, 720.4, 73.8, -710.6, 75.9, 697.8, 73.4, 696.7, 78.9, 682.9, 81.8, 684.2, 81.2, -683.7, 80.2, 684.5, 78.6, 714.6, 67.2, 714.3, 62.8, 745.7, 58.1, -684.5, 78.6, 693.9, 59.1, 695.5, 59.7, 703.4, 39.5, 715.2, 34.3, -715.7, 35.3, 727.1, 29.1, 740.2, 32.1, 738.4, 39.7, 750.0, 50.0, -751.2, 51.1, 752.8, 51.7, 752.7, 51.9, 750.0, 51.3, 749.2, 55.0, -745.7, 58.1, 714.3, 62.8, 714.6, 67.2, 684.5, 78.6, 542.1, 33.9, -543.6, 32.5, 545.2, 32.4, 545.1, 31.1, 553.1, 61.2, 553.1, 61.2, -561.1, 91.2, 561.8, 66.9, 553.0, 66.6, 544.8, 42.1, 543.5, 38.0, -542.0, 37.9, 542.1, 33.9, 407.5, 129.4, 417.9, 114.9, 430.0, 102.1, -428.3, 100.5, 434.4, 92.1, 434.4, 92.1, 440.4, 83.6, 447.0, 74.6, -447.0, 74.6, 453.5, 65.5, 459.8, 56.7, 459.8, 56.7, 466.1, 47.9, -487.4, 18.9, 487.9, 19.2, 508.1, -10.5, 509.0, -11.6, 509.0, -11.6, -509.8, -12.8, 518.4, -24.7, 515.8, -28.1, 527.0, -36.7, 527.2, -32.2, -528.2, -32.2, 529.4, -27.8, 519.7, -10.1, 516.9, -11.6, 504.3, 4.5, -492.4, 20.0, 492.4, 20.0, 480.4, 35.4, 462.3, 58.7, 462.3, 58.7, -444.3, 82.0, 425.9, 105.7, 427.1, 106.7, 407.5, 129.4, 638.1, -51.9, -648.3, -56.7, 681.7, -32.3, 682.2, -11.8, 659.3, 3.5, 661.0, 6.1, -639.9, 23.9, 642.7, 22.6, 639.7, 16.2, 639.5, 8.4, 638.8, -21.7, -627.0, -46.6, 638.1, -51.9, 590.4, 20.7, 590.0, 21.0, 591.9, 23.2, -593.4, 25.8, 600.9, 38.2, 611.7, 42.7, 608.4, 50.5, 588.8, 67.1, -588.0, 66.3, 569.1, 83.6, 568.2, 78.7, 569.0, 78.4, 567.3, 73.7, -562.9, 63.6, 565.2, 62.6, 563.1, 51.4, 570.9, 33.5, 574.9, 33.8, -590.4, 20.7, 563.1, 51.4, 560.4, 36.7, 560.4, 36.7, 557.7, 22.0, -558.4, 22.2, 563.3, 3.6, 568.9, -14.7, 567.4, -13.1, 573.7, -6.8, -578.5, 1.0, 583.6, 9.6, 583.6, 9.6, 588.8, 18.1, 589.6, 19.4, -590.7, 20.3, 590.4, 20.7, 574.9, 33.8, 570.9, 33.5, 563.1, 51.4, -381.2, 91.7, 379.0, 83.0, 379.0, 83.0, 376.8, 74.3, 398.1, 75.3, -406.4, 74.7, 420.2, 60.1, 422.4, 62.5, 422.7, 62.3, 424.5, 65.0, -424.7, 65.3, 424.7, 65.3, 424.9, 65.5, 429.1, 70.4, 432.4, 75.9, -433.3, 75.3, 410.5, 89.0, 407.1, 92.2, 381.2, 91.7, 433.3, 75.3, -436.2, 74.9, 441.1, 80.3, 440.4, 83.6, 434.4, 92.1, 434.4, 92.1, -428.3, 100.5, 419.0, 91.7, 405.6, 101.1, 385.5, 108.7, 383.3, 100.2, -383.3, 100.2, 381.2, 91.7, 407.1, 92.2, 410.5, 89.0, 433.3, 75.3, -389.3, 14.2, 383.0, 5.0, 383.0, 5.0, 376.6, -4.2, 390.5, 7.5, -392.6, 4.9, 408.7, 14.0, 405.6, 9.6, 396.6, 18.3, 389.3, 14.2, -436.9, -32.1, 422.6, -36.7, 419.5, -26.5, 402.0, -21.5, 401.0, -21.6, -400.6, -21.2, 400.1, -21.7, 390.0, -26.2, 383.0, -17.7, 376.9, -24.1, -371.8, -27.7, 369.8, -25.0, 362.6, -25.6, 370.0, -27.5, 370.0, -27.5, -377.4, -29.4, 407.0, -32.0, 410.3, -40.7, 436.9, -32.1, 377.4, -29.4, -388.0, -32.1, 387.8, -33.8, 398.6, -34.9, 399.3, -35.1, 399.3, -34.9, -400.0, -35.1, 407.0, -36.9, 407.0, -37.0, 414.0, -38.8, 441.9, -46.0, -441.9, -45.9, 469.8, -53.0, 471.6, -53.4, 471.6, -53.4, 473.5, -53.9, -508.4, -62.5, 508.4, -62.5, 543.4, -71.1, 543.5, -71.2, 546.8, -66.8, -549.1, -67.4, 548.5, -66.6, 548.5, -66.6, 548.0, -65.9, 523.9, -58.0, -523.8, -58.5, 499.5, -51.2, 493.8, -49.4, 493.8, -49.4, 488.0, -47.7, -474.0, -43.4, 474.0, -43.4, 460.0, -39.1, 448.4, -35.6, 448.7, -33.5, -436.9, -32.1, 410.3, -40.7, 407.0, -32.0, 377.4, -29.4, 413.6, -20.3, -407.8, -20.9, 407.8, -20.9, 402.0, -21.5, 419.5, -26.5, 422.6, -36.7, -436.9, -32.1, 448.7, -33.5, 448.4, -35.6, 460.0, -39.1, 437.7, -27.9, -437.4, -27.6, 413.6, -20.3, 262.6, 59.6, 266.1, 47.2, 266.1, 47.2, -269.6, 34.9, 275.0, 35.4, 273.9, 47.9, 278.3, 61.0, 280.9, 68.7, -282.6, 68.5, 283.5, 76.5, 283.3, 74.8, 281.6, 75.0, 279.7, 73.4, -278.0, 72.0, 278.0, 72.0, 276.3, 70.7, 269.4, 65.1, 263.8, 66.2, -262.6, 59.6, 258.3, 282.1, 242.0, 274.1, 239.8, 263.1, 225.8, 266.0, -226.1, 264.6, 220.4, 263.4, 215.0, 260.7, 215.6, 260.1, 215.2, 259.7, -215.5, 258.6, 231.4, 266.1, 230.9, 267.1, 246.4, 275.6, 252.4, 278.8, -252.2, 279.3, 258.3, 282.1, 328.2, 263.3, 327.4, 271.4, 317.3, 278.9, -316.7, 278.6, 304.2, 270.5, 309.3, 262.4, 302.0, 246.3, 292.6, 225.6, -289.8, 226.5, 283.1, 204.9, 281.7, 200.4, 287.8, 196.8, 285.8, 194.3, -306.2, 219.1, 302.8, 221.9, 319.8, 249.5, 324.0, 256.4, 328.9, 256.9, -328.2, 263.3, 302.0, 246.3, 309.3, 262.4, 304.2, 270.5, 316.7, 278.6, -317.4, 281.6, 313.8, 282.4, 310.9, 286.3, 304.9, 294.2, 305.5, 301.5, -298.9, 302.1, 287.0, 303.2, 286.3, 295.9, 273.8, 289.7, 273.2, 289.5, -272.7, 289.1, 272.7, 289.2, 286.8, 267.4, 283.3, 250.8, 302.0, 246.3, -272.7, 289.2, 272.7, 289.2, 272.6, 289.1, 272.4, 289.1, 272.4, 286.8, -267.9, 286.8, 263.4, 284.6, 262.5, 271.2, 266.8, 270.9, 270.2, 257.1, -276.7, 231.0, 269.4, 209.6, 283.1, 204.9, 289.8, 226.5, 292.6, 225.6, -302.0, 246.3, 283.3, 250.8, 286.8, 267.4, 272.7, 289.2, 355.1, 114.2, -354.4, 113.6, 355.4, 111.8, 354.9, 111.6, 355.9, 114.6, 357.8, 114.0, -360.7, 116.3, 360.6, 115.1, 357.3, 116.0, 355.1, 114.2, 290.3, 313.5, -264.4, 347.9, 264.3, 347.9, 238.3, 382.2, 230.2, 388.0, 231.9, 390.5, -225.7, 398.9, 200.5, 426.6, 203.0, 428.9, 180.4, 458.9, 176.5, 467.1, -171.8, 464.8, 163.2, 470.8, 180.2, 443.2, 183.7, 445.4, 204.3, 420.0, -243.4, 371.5, 243.4, 371.5, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9, -286.0, 318.8, 288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 176.4, 420.6, -168.2, 442.5, 164.8, 441.2, 153.1, 461.8, 153.0, 462.3, 152.8, 462.2, -152.7, 462.6, 167.5, 420.8, 166.8, 420.5, 182.4, 379.0, 181.0, 382.6, -181.8, 382.9, 181.3, 386.7, 178.8, 403.7, 182.3, 404.9, 176.4, 420.6, -177.5, 256.5, 178.6, 254.5, 179.3, 254.6, 179.6, 252.5, 203.3, 213.2, -200.9, 211.7, 222.2, 171.0, 225.6, 158.8, 229.8, 160.1, 235.8, 148.5, -235.5, 149.5, 235.5, 149.5, 235.3, 150.5, 230.0, 160.7, 229.8, 160.6, -224.3, 170.6, 214.9, 187.9, 214.9, 187.9, 205.5, 205.2, 192.6, 228.8, -192.5, 228.8, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5, -146.0, 348.1, 145.8, 345.7, 145.5, 345.7, 145.6, 343.2, 146.0, 329.6, -141.9, 317.5, 146.4, 316.0, 151.6, 306.0, 151.6, 306.0, 156.8, 296.1, -155.4, 298.3, 156.2, 298.9, 155.7, 301.6, 154.8, 305.8, 154.8, 305.8, -154.0, 309.9, 150.0, 329.0, 150.8, 329.2, 146.0, 348.1, 159.0, 237.4, -147.8, 258.1, 146.3, 257.4, 136.6, 278.7, 137.5, 255.7, 137.5, 255.7, -138.4, 232.7, 155.7, 212.2, 153.4, 210.2, 168.4, 187.8, 169.4, 188.0, -167.3, 213.8, 159.0, 237.4, 168.4, 187.8, 200.4, 140.1, 204.5, 142.4, -232.3, 92.4, 235.7, 87.8, 236.4, 88.2, 239.2, 83.3, 219.1, 123.5, -219.1, 123.5, 199.0, 163.7, 206.9, 171.3, 179.0, 200.6, 159.0, 237.4, -167.3, 213.8, 169.4, 188.0, 168.4, 187.8, 471.9, 840.0, 468.5, 791.8, -468.5, 791.8, 465.1, 743.6, 463.7, 718.3, 464.4, 718.2, 463.6, 692.9, -463.5, 690.2, 463.4, 690.2, 463.3, 687.6, 463.2, 686.9, 463.2, 686.2, -463.2, 686.2, 463.2, 686.2, 463.2, 686.9, 463.3, 687.6, 463.4, 690.2, -463.5, 690.2, 463.6, 692.9, 467.8, 766.4, 469.7, 766.4, 471.9, 840.0, -704.6, 772.1, 709.6, 768.3, 709.0, 767.6, 713.4, 763.0, 716.6, 759.7, -716.6, 759.7, 719.8, 756.4, 725.4, 750.5, 725.4, 750.5, 731.1, 744.7, -735.2, 740.4, 735.2, 740.4, 739.3, 736.1, 751.8, 723.2, 750.1, 721.0, -764.3, 710.3, 765.7, 712.6, 766.5, 712.4, 767.2, 714.9, 768.1, 717.4, -768.7, 717.2, 770.2, 719.5, 739.2, 747.8, 738.0, 746.6, 704.6, 772.1, -530.8, 680.6, 529.6, 688.2, 529.9, 688.2, 529.0, 695.8, 526.4, 716.5, -526.4, 716.5, 523.8, 737.3, 519.5, 772.2, 519.5, 772.2, 515.2, 807.1, -512.6, 828.3, 512.6, 828.3, 510.0, 849.6, 508.0, 865.3, 511.1, 866.3, -506.1, 880.9, 505.7, 882.1, 499.2, 880.7, 499.2, 881.1, 505.3, 820.4, -508.7, 820.8, 518.2, 760.4, 524.5, 720.5, 524.2, 720.5, 530.8, 680.6, -504.4, 759.9, 504.4, 760.3, 504.4, 760.3, 504.3, 760.8, 496.6, 802.0, -496.7, 802.1, 490.8, 843.6, 489.1, 837.4, 485.8, 836.4, 487.4, 831.1, -486.4, 819.9, 486.4, 819.9, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3, -482.5, 778.1, 485.1, 756.8, 480.5, 747.8, 494.2, 736.4, 491.4, 738.7, -499.5, 748.0, 504.4, 759.9, 494.2, 736.4, 501.4, 685.9, 537.8, 673.8, -521.8, 637.3, 512.1, 698.4, 513.1, 698.6, 504.4, 759.9, 499.5, 748.0, -491.4, 738.7, 494.2, 736.4, 572.6, 410.9, 576.4, 416.8, 576.4, 416.8, -580.1, 422.7, 579.7, 424.1, 580.0, 424.7, 580.8, 426.0, 580.2, 430.4, -579.6, 430.3, 578.5, 434.6, 577.9, 436.5, 578.4, 438.1, 577.4, 438.4, -563.8, 442.5, 563.3, 440.9, 549.3, 443.3, 545.6, 443.9, 543.5, 442.4, -541.9, 444.6, 555.1, 426.2, 553.8, 421.7, 572.6, 410.9, 482.0, 772.1, -480.0, 750.5, 480.1, 750.5, 478.0, 728.9, 478.3, 721.1, 484.7, 720.8, -484.0, 713.4, 486.7, 742.4, 492.0, 746.3, 482.0, 772.1, 446.9, 345.2, -448.3, 351.9, 446.0, 352.4, 445.1, 359.6, 444.8, 361.9, 444.1, 362.0, -444.5, 364.1, 443.9, 357.8, 443.9, 357.8, 443.4, 351.4, 443.8, 348.2, -447.5, 347.8, 446.9, 345.2, 406.2, 718.4, 412.9, 726.6, 407.7, 747.1, -403.8, 747.8, 396.2, 749.3, 393.5, 735.4, 383.3, 722.9, 376.1, 714.2, -374.3, 704.6, 369.0, 705.6, 385.7, 702.3, 395.6, 705.4, 406.2, 718.4, -451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7, -452.6, 578.7, 452.8, 581.9, 453.1, 588.3, 453.1, 588.3, 453.5, 594.6, -455.3, 625.3, 455.3, 625.3, 457.1, 655.9, 457.9, 669.3, 457.9, 669.3, -458.7, 682.6, 460.2, 708.3, 460.1, 708.3, 461.7, 734.0, 463.2, 759.1, -463.3, 759.1, 464.9, 784.3, 464.9, 784.9, 464.8, 784.9, 464.7, 785.5, -463.1, 759.8, 463.2, 759.7, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3, -458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3, -455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9, -452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7, -451.5, 559.9, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3, 359.7, 770.2, -360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 360.9, 758.8, 360.9, 758.8, -361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1, 364.4, 724.0, -361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5, -364.5, 723.8, 364.5, 723.8, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8, -361.4, 753.6, 360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1, -360.0, 767.1, 359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4, -419.4, 196.3, 422.1, 218.7, 422.1, 218.7, 424.8, 241.2, 425.0, 242.8, -424.8, 242.9, 424.7, 244.6, 423.4, 234.8, 423.6, 234.8, 422.5, 225.0, -421.0, 210.6, 421.3, 210.6, 419.4, 196.3, 356.8, 749.4, 350.3, 776.3, -345.5, 776.0, 343.8, 803.1, 354.5, 813.4, 336.9, 831.8, 329.9, 860.4, -330.6, 857.7, 330.0, 857.6, 330.6, 854.9, 343.4, 802.1, 343.4, 802.1, -356.8, 749.4, 369.0, 519.0, 376.4, 514.0, 386.1, 528.3, 403.2, 537.7, -403.4, 537.8, 403.4, 537.8, 403.6, 538.0, 405.6, 539.1, 407.7, 539.3, -407.6, 540.2, 405.2, 559.0, 409.8, 571.4, 398.6, 577.3, 394.5, 579.5, -387.8, 566.8, 377.0, 556.3, 376.7, 556.1, 376.5, 556.1, 376.5, 555.8, -372.5, 537.4, 363.0, 523.0, 369.0, 519.0, 376.5, 555.8, 376.3, 552.5, -373.2, 552.6, 370.0, 549.5, 362.3, 542.1, 362.3, 542.1, 354.7, 534.6, -341.8, 522.1, 341.8, 522.1, 329.0, 509.6, 314.1, 495.1, 316.5, 484.7, -299.2, 480.6, 336.5, 489.3, 341.5, 492.2, 369.0, 519.0, 363.0, 523.0, -372.5, 537.4, 376.5, 555.8, 403.2, 537.7, 386.1, 528.3, 376.4, 514.0, -369.0, 519.0, 341.5, 492.2, 336.5, 489.3, 299.2, 480.6, 295.0, 478.2, -296.3, 475.1, 292.1, 473.7, 302.0, 476.9, 301.3, 479.0, 310.5, 484.3, -356.8, 511.0, 357.2, 510.5, 403.2, 537.7, 324.0, 409.5, 317.7, 409.2, -311.5, 396.8, 312.2, 396.0, 316.9, 390.7, 323.6, 396.7, 334.9, 397.3, -338.5, 397.5, 340.5, 399.4, 342.0, 397.7, 335.1, 405.5, 332.6, 410.0, -324.0, 409.5, 278.7, 425.6, 285.6, 411.6, 288.9, 412.4, 292.4, 397.5, -267.8, 486.1, 267.7, 486.1, 242.9, 574.7, 250.8, 548.1, 249.4, 547.7, -255.8, 520.7, 267.2, 473.2, 267.2, 473.2, 278.6, 425.7, 278.7, 425.6, -278.7, 425.6, 278.7, 425.6, 278.6, 425.7, 275.1, 429.0, 276.4, 430.3, -274.1, 435.0, 273.4, 436.3, 273.4, 436.3, 272.8, 437.6, 262.3, 459.0, -262.3, 459.0, 251.8, 480.4, 239.7, 505.1, 242.2, 506.7, 227.6, 529.8, -228.1, 523.5, 229.2, 517.3, 228.5, 517.2, 231.2, 498.1, 229.9, 497.9, -231.3, 478.7, 230.4, 476.9, 233.1, 475.5, 234.8, 472.2, 256.1, 448.4, -255.5, 447.6, 278.6, 425.7, 234.8, 472.2, 256.9, 432.0, 258.1, 432.7, -278.9, 391.8, 294.0, 364.3, 294.0, 364.3, 309.1, 336.7, 309.4, 336.0, -309.5, 336.0, 309.8, 335.3, 301.3, 366.5, 302.9, 367.1, 292.4, 397.5, -288.9, 412.4, 285.6, 411.6, 278.7, 425.6, 278.7, 425.6, 278.7, 425.6, -278.6, 425.7, 255.5, 447.6, 256.1, 448.4, 234.8, 472.2, 173.4, 823.0, -173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 169.0, 836.5, 163.8, 836.8, -164.5, 849.8, 156.3, 851.7, 151.6, 841.8, 142.6, 830.7, 142.7, 830.7, -142.6, 826.8, 142.6, 822.9, 142.6, 817.6, 142.3, 817.6, 142.6, 812.3, -142.5, 801.1, 143.7, 801.1, 144.7, 789.8, 143.9, 791.3, 147.5, 793.0, -150.3, 796.2, 161.8, 809.6, 161.9, 809.6, 173.4, 823.0, 119.8, 323.7, -124.1, 343.2, 127.0, 342.9, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3, -129.2, 369.3, 130.6, 382.7, 130.6, 382.7, 132.1, 396.2, 124.8, 369.2, -120.5, 370.3, 108.8, 344.5, 107.3, 335.3, 122.1, 325.8, 119.8, 323.7, -63.0, 185.6, 57.2, 200.1, 54.3, 199.5, 51.4, 214.6, 49.9, 210.5, -49.9, 210.5, 48.4, 206.4, 53.0, 194.9, 65.5, 192.5, 63.0, 185.6, -105.4, 363.9, 106.3, 366.5, 106.3, 366.5, 107.3, 369.1, 122.3, 400.9, -118.4, 402.7, 129.6, 436.3, 129.3, 435.7, 129.0, 435.8, 128.4, 435.2, -120.2, 413.2, 111.2, 416.5, 94.0, 397.8, 89.6, 384.1, 97.9, 380.0, -105.4, 363.9, 94.0, 397.8, 88.1, 391.4, 88.2, 391.3, 82.2, 384.9, -79.3, 381.0, 75.7, 380.0, 76.5, 377.0, 76.4, 376.3, 75.1, 375.7, -75.3, 375.5, 75.5, 375.2, 74.8, 374.8, 74.3, 374.1, 74.1, 374.0, -74.2, 373.9, 74.1, 373.8, 75.7, 359.1, 74.5, 359.0, 75.0, 344.2, -75.0, 344.2, 90.3, 334.3, 90.8, 323.7, 98.1, 343.8, 98.1, 343.8, -105.4, 363.9, 97.9, 380.0, 89.6, 384.1, 94.0, 397.8, 804.3, 668.0, -797.3, 661.3, 797.3, 661.3, 790.4, 654.6, 793.9, 640.3, 795.5, 639.4, -793.8, 625.1, 794.2, 623.3, 794.7, 621.4, 794.7, 621.4, 795.2, 621.3, -796.2, 619.0, 795.5, 618.0, 795.4, 618.0, 796.0, 615.9, 796.5, 613.7, -805.7, 616.5, 805.9, 616.0, 815.2, 618.2, 818.6, 641.9, 817.6, 648.5, -804.3, 668.0, 815.2, 618.2, 821.5, 619.7, 824.4, 623.7, 827.8, 621.3, -828.2, 620.5, 831.7, 622.2, 835.7, 623.1, 838.1, 626.0, 838.6, 626.1, -842.2, 627.4, 849.0, 635.9, 849.0, 635.9, 855.7, 644.3, 834.4, 648.1, -814.8, 664.3, 817.1, 675.3, 814.5, 675.3, 814.5, 675.3, 811.9, 675.4, -809.7, 676.2, 808.1, 671.7, 804.3, 668.0, 817.6, 648.5, 818.6, 641.9, -815.2, 618.2, 813.9, 548.1, 824.6, 557.5, 824.6, 557.5, 835.3, 566.8, -837.5, 568.8, 837.4, 568.9, 839.5, 570.9, 839.5, 570.9, 847.4, 578.7, -855.2, 586.5, 834.2, 567.7, 833.9, 567.9, 813.9, 548.1, 703.1, 474.3, -704.9, 476.6, 704.9, 476.6, 706.7, 478.9, 701.7, 512.8, 694.7, 516.5, -704.0, 547.8, 700.6, 554.3, 700.6, 554.3, 697.3, 560.8, 694.3, 542.7, -698.6, 542.0, 699.8, 523.1, 700.3, 515.6, 700.3, 515.6, 700.8, 508.2, -701.6, 497.2, 701.6, 497.2, 702.3, 486.2, 702.5, 483.1, 702.5, 483.1, -702.7, 480.0, 702.8, 478.7, 702.8, 478.7, 702.9, 477.3, 703.0, 475.8, -703.5, 474.5, 703.1, 474.3, 918.1, 484.0, 921.1, 492.4, 921.1, 492.4, -924.1, 500.9, 926.8, 505.5, 923.1, 507.7, 922.2, 514.6, 921.4, 524.5, -919.9, 524.4, 917.5, 534.2, 914.2, 509.6, 913.3, 508.2, 918.1, 484.0, -765.5, 384.9, 812.7, 448.1, 811.2, 449.2, 859.8, 511.3, 863.9, 517.2, -863.9, 517.2, 868.0, 523.0, 851.2, 505.1, 850.6, 505.7, 833.2, 488.3, -796.5, 438.8, 810.5, 423.8, 765.5, 384.9, 833.2, 488.3, 792.0, 447.3, -794.4, 444.7, 750.9, 406.3, 745.1, 399.2, 746.0, 393.0, 739.4, 392.2, -751.7, 387.5, 751.7, 387.5, 764.0, 382.8, 763.8, 383.1, 764.8, 383.9, -765.5, 384.9, 810.5, 423.8, 796.5, 438.8, 833.2, 488.3, 789.5, 387.2, -786.9, 381.2, 788.2, 380.2, 784.2, 375.2, 792.1, 372.2, 792.1, 372.2, -799.9, 369.3, 800.0, 369.2, 800.1, 369.5, 800.2, 369.8, 794.8, 382.7, -810.9, 389.5, 821.7, 409.3, 820.1, 403.3, 814.9, 404.7, 808.2, 400.0, -798.9, 393.6, 797.2, 395.2, 789.5, 387.2, 875.3, 138.2, 890.8, 149.6, -890.8, 149.6, 906.3, 160.9, 881.0, 157.7, 877.1, 159.7, 853.6, 170.8, -841.7, 168.3, 840.9, 163.7, 829.8, 165.7, 822.6, 162.9, 818.5, 154.8, -816.9, 156.1, 832.1, 143.9, 836.9, 149.9, 857.0, 143.8, 866.1, 141.0, -868.0, 135.7, 875.3, 138.2, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0, -913.4, 228.8, 918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 881.2, 204.6, -881.1, 204.8, 839.8, 173.3, 774.9, 157.7, 800.5, 192.0, 799.6, 193.6, -817.9, 232.4, 812.6, 229.4, 812.6, 229.4, 807.2, 226.4, 799.9, 216.7, -801.9, 215.2, 796.7, 204.0, 785.8, 180.8, 789.9, 177.8, 774.9, 157.7, -742.1, 168.4, 748.6, 172.2, 747.3, 174.3, 752.5, 180.3, 759.9, 188.8, -758.0, 193.0, 767.4, 197.3, 728.8, 172.1, 729.3, 154.2, 687.8, 150.7, -686.9, 150.1, 686.9, 150.1, 686.0, 149.5, 683.8, 133.2, 668.7, 135.3, -651.4, 121.1, 699.3, 137.2, 698.0, 142.6, 742.1, 168.4, 799.3, 321.8, -790.6, 327.8, 789.5, 326.7, 782.0, 333.8, 782.8, 333.4, 782.3, 332.4, -782.6, 330.9, 783.7, 325.5, 781.7, 321.8, 784.9, 320.1, 790.0, 317.2, -799.1, 322.4, 799.3, 321.8, 664.3, 139.4, 661.1, 135.9, 661.1, 135.9, -657.9, 132.4, 704.8, 164.9, 705.4, 164.1, 752.8, 195.8, 716.3, 163.2, -711.0, 169.1, 669.2, 142.5, 666.8, 140.9, 666.5, 141.3, 664.3, 139.4, -658.2, 159.9, 633.0, 146.5, 634.7, 139.2, 607.9, 133.0, 589.3, 120.3, -589.3, 120.3, 570.7, 107.6, 572.4, 108.8, 572.5, 108.7, 574.2, 109.7, -593.2, 121.1, 593.2, 121.1, 612.2, 132.4, 635.2, 146.2, 637.3, 162.6, -658.2, 159.9, 549.5, 216.0, 560.1, 230.0, 560.1, 230.0, 570.7, 244.0, -552.7, 230.3, 534.4, 238.6, 529.6, 223.2, 494.1, 200.7, 491.9, 204.2, -454.2, 185.1, 453.2, 181.7, 451.3, 182.2, 448.4, 179.4, 466.8, 183.8, -466.3, 185.9, 484.2, 192.4, 511.4, 202.2, 511.4, 202.2, 538.5, 212.0, -544.0, 214.0, 545.7, 212.3, 549.5, 216.0, 468.4, 248.2, 463.1, 244.0, -464.6, 242.2, 460.7, 236.1, 452.5, 223.3, 456.0, 216.4, 444.3, 210.5, -492.1, 245.1, 492.6, 244.5, 541.6, 277.4, 542.2, 278.2, 542.2, 278.3, -542.8, 279.0, 536.5, 273.8, 530.8, 280.7, 518.8, 282.5, 491.3, 271.0, -492.2, 267.1, 468.4, 248.2, 518.8, 282.5, 510.0, 283.7, 505.9, 288.8, -501.2, 285.0, 500.2, 284.4, 500.2, 284.4, 499.3, 283.8, 493.2, 279.7, -493.1, 279.8, 486.8, 275.9, 486.2, 275.5, 486.0, 275.6, 485.7, 275.1, -482.9, 270.8, 481.8, 271.2, 480.2, 266.5, 477.7, 262.6, 477.7, 262.6, -475.1, 258.7, 471.8, 253.4, 473.2, 250.8, 468.4, 248.2, 492.2, 267.1, -491.3, 271.0, 518.8, 282.5, 504.3, 4.5, 516.9, -11.6, 519.7, -10.1, -529.4, -27.8, 529.8, -26.1, 529.7, -26.0, 530.3, -24.4, 538.8, -5.6, -535.7, -4.2, 541.1, 16.0, 525.8, 22.1, 528.8, 29.4, 516.5, 42.7, -516.9, 42.3, 516.0, 41.4, 515.6, 40.0, 510.5, 23.9, 510.5, 23.9, -505.4, 7.7, 504.9, 6.1, 503.8, 5.4, 504.3, 4.5, 639.5, 8.4, -639.7, 16.2, 642.7, 22.6, 639.9, 23.9, 624.1, 37.2, 624.1, 37.2, -608.4, 50.5, 611.7, 42.7, 600.9, 38.2, 593.4, 25.8, 593.3, 25.3, -597.4, 24.3, 601.4, 22.8, 610.8, 19.2, 610.8, 19.2, 620.2, 15.7, -624.8, 14.0, 624.8, 14.0, 629.3, 12.3, 634.4, 10.4, 638.2, 7.0, -639.5, 8.4, 453.5, 65.5, 447.0, 74.6, 447.0, 74.6, 440.4, 83.6, -441.1, 80.3, 436.2, 74.9, 433.3, 75.3, 432.4, 75.9, 429.1, 70.4, -424.9, 65.5, 436.5, 59.9, 447.5, 58.4, 453.5, 65.5, 450.5, -16.5, -432.0, -18.4, 432.0, -18.4, 413.6, -20.3, 437.4, -27.6, 437.7, -27.9, -460.0, -39.1, 474.0, -43.4, 474.0, -43.4, 488.0, -47.7, 479.7, -27.7, -472.1, -24.4, 450.5, -16.5, 265.1, 182.1, 248.9, 202.2, 226.0, 217.1, -225.3, 216.3, 232.4, 185.6, 232.4, 185.6, 239.6, 154.9, 239.5, 155.4, -240.3, 155.6, 240.9, 156.3, 249.7, 165.6, 249.7, 165.6, 258.5, 175.0, -261.8, 178.5, 265.5, 181.5, 265.1, 182.1, 286.3, 163.8, 287.4, 159.2, -290.1, 157.2, 295.2, 156.1, 293.8, 156.4, 295.6, 160.6, 293.7, 162.2, -291.1, 164.4, 286.7, 162.2, 286.3, 163.8, 319.8, 249.5, 302.8, 221.9, -306.2, 219.1, 285.8, 194.3, 281.7, 180.7, 289.7, 178.2, 293.7, 162.2, -295.6, 160.6, 293.8, 156.4, 295.2, 156.1, 298.4, 143.3, 298.4, 143.3, -301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.5, 130.3, -301.6, 130.4, 301.6, 130.4, 310.7, 190.0, 333.2, 195.5, 319.8, 249.5, -301.6, 130.4, 302.9, 144.6, 306.2, 144.2, 310.9, 158.1, 320.4, 186.5, -320.4, 186.5, 329.9, 214.9, 331.8, 220.7, 331.8, 220.7, 333.8, 226.6, -330.2, 231.4, 334.1, 239.5, 340.6, 246.9, 340.9, 248.6, 339.1, 248.9, -337.6, 250.9, 332.9, 257.1, 332.4, 263.6, 328.2, 263.3, 328.9, 256.9, -324.0, 256.4, 319.8, 249.5, 333.2, 195.5, 310.7, 190.0, 301.6, 130.4, -356.7, 139.2, 350.2, 134.3, 353.0, 126.2, 355.1, 114.2, 357.3, 116.0, -360.6, 115.1, 360.7, 116.3, 381.1, 132.7, 381.1, 132.7, 401.4, 149.1, -401.6, 148.1, 373.4, 151.7, 356.7, 139.2, 299.7, 125.0, 289.1, 108.1, -282.8, 103.1, 286.7, 86.0, 287.4, 82.9, 297.8, 85.2, 308.9, 84.4, -315.9, 83.9, 321.9, 81.1, 323.0, 83.4, 325.0, 87.7, 319.0, 90.5, -315.0, 97.6, 310.1, 106.4, 310.1, 106.4, 305.2, 115.3, 302.5, 120.1, -298.3, 122.7, 299.7, 125.0, 181.3, 386.7, 181.8, 382.9, 181.0, 382.6, -182.4, 379.0, 186.4, 367.7, 186.4, 367.7, 190.4, 356.3, 188.2, 371.8, -186.6, 371.8, 181.3, 386.7, 224.3, 170.6, 229.8, 160.6, 230.0, 160.7, -235.3, 150.5, 231.1, 165.6, 231.1, 165.6, 226.9, 180.6, 227.0, 180.2, -226.8, 180.1, 226.7, 179.6, 225.5, 175.1, 223.2, 174.4, 224.3, 170.6, -155.7, 301.6, 156.2, 298.9, 155.4, 298.3, 156.8, 296.1, 157.4, 294.9, -157.1, 294.1, 158.1, 293.8, 165.8, 287.7, 163.1, 284.1, 168.1, 274.5, -182.5, 266.1, 189.3, 262.0, 202.7, 267.7, 200.1, 277.3, 200.1, 277.3, -197.4, 286.9, 194.8, 290.7, 192.0, 288.8, 186.7, 290.7, 179.3, 293.3, -179.3, 293.3, 172.0, 295.9, 171.2, 296.2, 171.2, 296.2, 170.5, 296.4, -164.9, 298.4, 164.9, 298.4, 159.2, 300.4, 157.5, 301.0, 155.8, 301.9, -155.7, 301.6, 474.7, 878.3, 473.3, 859.1, 473.3, 859.1, 471.9, 840.0, -469.7, 766.4, 467.8, 766.4, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2, -463.3, 687.6, 463.4, 690.2, 463.5, 690.2, 463.6, 692.9, 467.8, 766.4, -469.7, 766.4, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1, 474.7, 878.3, -703.6, 773.3, 704.1, 772.7, 704.0, 772.6, 704.6, 772.1, 738.0, 746.6, -739.2, 747.8, 770.2, 719.5, 770.4, 719.9, 770.8, 720.0, 770.7, 720.3, -771.7, 726.6, 776.6, 732.6, 778.2, 732.1, 769.4, 744.7, 763.0, 739.6, -750.0, 750.0, 696.0, 793.3, 704.4, 809.3, 644.3, 839.4, 681.2, 820.9, -673.9, 806.3, 703.6, 773.3, 644.3, 839.4, 633.2, 850.9, 632.6, 850.6, -619.8, 860.2, 624.5, 856.6, 623.9, 855.9, 628.1, 851.5, 661.0, 817.4, -661.0, 817.4, 693.8, 783.4, 698.7, 778.3, 698.9, 778.5, 703.6, 773.3, -673.9, 806.3, 681.2, 820.9, 644.3, 839.4, 518.2, 760.4, 508.7, 820.8, -505.3, 820.4, 499.2, 881.1, 499.0, 882.0, 494.5, 882.9, 492.0, 881.3, -490.7, 880.5, 491.8, 878.8, 491.6, 876.2, 490.2, 868.5, 490.8, 868.4, -490.1, 860.6, 493.4, 859.1, 491.7, 854.3, 491.9, 847.9, 495.9, 826.7, -495.0, 826.5, 498.0, 805.1, 499.1, 794.7, 500.0, 794.8, 501.9, 784.4, -507.8, 771.4, 517.9, 772.6, 518.2, 760.4, 501.9, 784.4, 516.1, 671.5, -522.3, 672.2, 543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6, -546.7, 548.5, 546.1, 548.2, 547.5, 545.3, 546.7, 546.9, 547.3, 547.2, -547.1, 549.0, 545.2, 564.5, 545.2, 564.5, 543.2, 580.0, 542.6, 585.6, -542.6, 585.6, 541.9, 591.3, 540.1, 605.1, 540.1, 605.1, 538.4, 619.0, -537.3, 627.8, 537.3, 627.8, 536.3, 636.7, 533.8, 656.3, 533.8, 656.3, -531.4, 675.9, 531.1, 678.3, 531.2, 678.3, 530.8, 680.6, 524.2, 720.5, -524.5, 720.5, 518.2, 760.4, 517.9, 772.6, 507.8, 771.4, 501.9, 784.4, -563.3, 396.4, 568.0, 403.6, 568.0, 403.6, 572.6, 410.9, 553.8, 421.7, -555.1, 426.2, 541.9, 444.6, 541.1, 445.4, 540.4, 444.8, 539.0, 445.1, -528.2, 446.9, 528.2, 446.9, 517.4, 448.8, 509.5, 450.2, 501.5, 451.9, -501.5, 451.5, 510.3, 443.7, 507.4, 440.4, 513.3, 429.3, 535.4, 409.6, -535.8, 404.9, 563.3, 396.4, 513.3, 429.3, 529.4, 398.9, 533.3, 400.4, -545.5, 368.5, 554.4, 382.5, 554.4, 382.5, 563.3, 396.4, 535.8, 404.9, -535.4, 409.6, 513.3, 429.3, 526.6, 620.2, 524.2, 628.7, 523.2, 628.6, -521.8, 637.3, 537.8, 673.8, 501.4, 685.9, 494.2, 736.4, 480.5, 747.8, -485.1, 756.8, 482.5, 778.1, 482.3, 775.1, 482.3, 775.1, 482.0, 772.1, -492.0, 746.3, 486.7, 742.4, 484.0, 713.4, 490.1, 684.0, 495.0, 685.1, -506.0, 656.7, 507.2, 653.4, 506.8, 653.2, 508.5, 650.2, 517.1, 634.9, -514.4, 631.9, 526.6, 620.2, 508.5, 650.2, 506.3, 648.9, 514.9, 633.7, -521.3, 617.1, 524.2, 609.7, 524.2, 609.7, 527.1, 602.3, 535.2, 581.2, -542.9, 581.4, 543.4, 560.1, 535.0, 590.1, 535.0, 590.1, 526.6, 620.2, -514.4, 631.9, 517.1, 634.9, 508.5, 650.2, 451.2, 311.6, 452.2, 312.4, -450.9, 313.9, 450.6, 316.3, 448.7, 330.7, 449.8, 331.0, 446.9, 345.2, -447.5, 347.8, 443.8, 348.2, 443.4, 351.4, 441.3, 329.1, 441.3, 329.1, -439.3, 306.7, 439.0, 307.9, 446.5, 307.6, 451.2, 311.6, 490.6, 289.4, -495.4, 300.0, 492.2, 303.8, 500.3, 310.6, 501.6, 337.8, 501.6, 337.8, -503.0, 365.1, 487.6, 331.4, 492.5, 327.4, 490.6, 289.4, 453.6, 292.6, -451.1, 287.9, 456.2, 280.0, 455.2, 279.7, 461.1, 281.5, 459.3, 287.6, -463.5, 295.5, 465.0, 298.4, 464.4, 300.7, 466.5, 301.3, 459.4, 299.2, -456.8, 298.7, 453.6, 292.6, 184.0, 643.8, 178.9, 658.2, 177.4, 657.8, -173.9, 672.6, 169.9, 643.5, 169.9, 643.5, 165.9, 614.5, 163.2, 624.8, -174.0, 627.6, 182.2, 640.8, 183.1, 642.3, 184.3, 642.6, 184.0, 643.8, -218.5, 420.3, 228.1, 405.3, 229.6, 406.0, 237.7, 390.2, 232.9, 392.7, -238.0, 401.0, 236.2, 411.3, 228.3, 439.8, 230.0, 440.3, 223.8, 469.2, -233.1, 461.9, 221.4, 447.0, 219.0, 424.9, 218.8, 422.6, 217.7, 422.0, -218.5, 420.3, 421.1, 484.6, 422.3, 473.1, 423.9, 473.2, 426.6, 461.9, -427.4, 458.4, 428.0, 458.4, 428.3, 454.9, 425.3, 497.4, 424.7, 497.4, -421.2, 539.9, 420.9, 543.2, 420.6, 543.2, 420.6, 546.5, 420.4, 532.8, -420.7, 532.8, 420.8, 519.2, 421.0, 501.9, 419.4, 501.7, 421.1, 484.6, -422.5, 225.0, 423.6, 234.8, 423.4, 234.8, 424.7, 244.6, 424.1, 275.2, -419.6, 275.8, 423.4, 305.9, 420.5, 301.6, 420.5, 301.6, 417.5, 297.2, -417.2, 261.1, 417.7, 260.8, 422.5, 225.0, 355.0, 647.4, 355.7, 641.6, -358.4, 641.9, 358.8, 636.1, 356.5, 665.5, 360.6, 667.3, 351.3, 694.7, -358.7, 672.9, 352.0, 670.9, 355.0, 647.4, 376.3, 669.4, 377.1, 669.7, -372.0, 686.8, 367.8, 704.1, 366.7, 708.8, 366.7, 708.8, 365.5, 713.5, -365.5, 713.7, 365.5, 713.7, 365.4, 714.0, 358.3, 730.5, 361.1, 731.7, -356.8, 749.4, 343.4, 802.1, 343.4, 802.1, 330.6, 854.9, 337.9, 833.6, -333.6, 832.1, 336.5, 809.4, 337.2, 803.9, 337.2, 803.9, 337.9, 798.5, -338.4, 794.6, 338.4, 794.6, 338.9, 790.7, 339.9, 783.2, 339.9, 783.2, -340.8, 775.8, 345.8, 737.4, 338.7, 735.0, 350.7, 699.0, 356.4, 681.9, -368.6, 667.1, 376.3, 669.4, 292.5, 405.8, 296.0, 393.7, 296.0, 393.7, -299.6, 381.6, 301.7, 380.5, 305.9, 388.8, 312.2, 396.0, 311.5, 396.8, -317.7, 409.2, 324.0, 409.5, 326.5, 412.4, 326.5, 412.4, 329.1, 415.3, -332.3, 419.0, 331.6, 421.7, 335.5, 422.7, 313.3, 417.0, 306.0, 421.3, -292.5, 405.8, 302.4, 371.7, 309.5, 347.3, 311.6, 347.8, 316.6, 322.9, -320.3, 313.4, 317.5, 312.0, 322.4, 303.2, 327.4, 285.8, 327.4, 285.8, -332.5, 268.4, 332.7, 267.9, 333.0, 267.6, 332.8, 267.4, 338.5, 275.2, -344.3, 276.1, 343.5, 283.5, 341.6, 301.3, 335.5, 300.7, 327.5, 317.9, -326.6, 319.9, 326.6, 319.9, 325.6, 322.0, 319.1, 335.8, 319.1, 335.8, -312.7, 349.7, 310.3, 354.7, 310.3, 354.7, 308.0, 359.7, 305.2, 365.7, -303.9, 365.4, 302.4, 371.7, 420.4, 487.6, 421.6, 491.2, 419.3, 491.9, -418.3, 496.3, 418.2, 496.3, 418.2, 496.3, 418.2, 496.4, 416.2, 504.6, -411.6, 510.8, 414.3, 512.8, 385.3, 491.1, 389.9, 484.9, 365.6, 457.1, -362.0, 453.0, 362.0, 453.0, 358.5, 448.9, 350.7, 440.1, 352.6, 437.1, -343.0, 431.2, 380.2, 454.0, 378.3, 457.0, 413.7, 482.7, 417.0, 485.2, -419.3, 484.4, 420.4, 487.6, 303.1, 319.5, 315.6, 292.9, 311.4, 286.3, -332.5, 268.4, 327.4, 285.8, 327.4, 285.8, 322.4, 303.2, 313.8, 318.9, -315.6, 319.9, 309.1, 336.7, 294.0, 364.3, 294.0, 364.3, 278.9, 391.8, -271.4, 406.4, 270.2, 405.8, 261.6, 419.8, 278.8, 368.5, 280.1, 368.6, -303.1, 319.5, 261.6, 419.8, 246.9, 443.6, 244.9, 442.6, 232.2, 467.3, -233.2, 453.4, 233.2, 453.4, 234.2, 439.5, 264.1, 377.3, 252.0, 356.3, -303.1, 319.5, 280.1, 368.6, 278.8, 368.5, 261.6, 419.8, 234.9, 429.5, -235.6, 420.4, 233.8, 419.9, 236.2, 411.3, 238.0, 401.0, 232.9, 392.7, -237.7, 390.2, 239.4, 387.0, 236.2, 383.7, 238.3, 382.2, 258.8, 351.6, -260.3, 352.6, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9, 286.0, 318.8, -288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 294.6, 307.8, 294.6, 307.8, -298.9, 302.1, 305.5, 301.5, 304.9, 294.2, 310.9, 286.3, 274.5, 358.7, -276.4, 360.0, 234.9, 429.5, 310.9, 286.3, 313.8, 282.4, 317.4, 281.6, -316.7, 278.6, 317.3, 278.9, 327.4, 271.4, 328.2, 263.3, 332.4, 263.6, -332.9, 257.1, 337.6, 250.9, 340.4, 253.4, 335.2, 259.1, 332.8, 267.4, -333.0, 267.6, 332.7, 267.9, 332.5, 268.4, 311.4, 286.3, 315.6, 292.9, -303.1, 319.5, 252.0, 356.3, 264.1, 377.3, 234.2, 439.5, 234.5, 434.5, -234.5, 434.5, 234.9, 429.5, 276.4, 360.0, 274.5, 358.7, 310.9, 286.3, -240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0, 226.4, 633.0, -226.3, 633.0, 220.8, 652.1, 219.4, 656.7, 217.9, 656.8, 218.1, 661.3, -219.1, 648.1, 219.1, 648.1, 220.0, 634.9, 225.6, 614.0, 228.0, 614.6, -236.0, 594.4, 238.4, 588.4, 239.4, 588.6, 240.7, 582.4, 169.5, 791.9, -171.5, 807.5, 171.5, 807.5, 173.4, 823.0, 161.9, 809.6, 161.8, 809.6, -150.3, 796.2, 150.1, 795.3, 166.5, 788.4, 169.5, 791.9, 150.3, 796.2, -147.5, 793.0, 143.9, 791.3, 144.7, 789.8, 149.8, 732.8, 150.4, 732.9, -155.0, 675.9, 157.9, 699.5, 152.3, 701.7, 160.9, 723.1, 162.3, 757.6, -165.2, 757.5, 169.5, 791.9, 166.5, 788.4, 150.1, 795.3, 150.3, 796.2, -76.7, 162.3, 81.1, 168.4, 84.6, 167.9, 85.5, 174.4, 87.9, 181.5, -87.9, 181.5, 90.3, 188.5, 100.0, 235.0, 100.4, 234.9, 110.6, 281.3, -108.8, 272.7, 108.2, 272.8, 105.7, 264.3, 104.5, 259.8, 104.5, 259.8, -103.2, 255.3, 89.9, 208.8, 87.0, 209.4, 76.7, 162.3, 50.5, 72.6, -53.0, 79.9, 51.3, 86.0, 55.5, 87.2, 55.6, 87.2, 55.7, 87.7, -55.9, 88.2, 56.8, 120.2, 51.9, 122.6, 62.1, 152.1, 62.5, 168.3, -62.5, 168.3, 63.0, 184.6, 66.0, 173.1, 61.6, 171.9, 60.2, 159.3, -55.4, 116.0, 53.3, 116.1, 50.5, 72.6, 817.0, 605.3, 806.9, 609.0, -806.7, 608.6, 796.8, 612.7, 797.2, 611.1, 797.4, 609.5, 797.6, 609.5, -804.0, 598.2, 804.0, 596.3, 804.0, 583.1, 801.5, 574.7, 806.4, 573.2, -808.8, 563.4, 819.0, 580.8, 821.5, 586.4, 817.0, 605.3, 808.8, 563.4, -810.7, 555.2, 810.7, 555.2, 812.7, 547.1, 812.6, 547.5, 813.3, 547.6, -813.9, 548.1, 833.9, 567.9, 834.2, 567.7, 855.2, 586.5, 855.4, 586.6, -855.4, 586.6, 855.5, 586.8, 853.9, 586.4, 853.0, 589.9, 850.6, 593.0, -848.1, 589.4, 833.8, 599.1, 817.0, 605.3, 821.5, 586.4, 819.0, 580.8, -808.8, 563.4, 911.8, 470.4, 913.5, 473.3, 915.9, 473.9, 915.3, 476.2, -916.7, 480.1, 916.7, 480.1, 918.1, 484.0, 913.3, 508.2, 914.2, 509.6, -917.5, 534.2, 916.9, 536.7, 916.9, 536.7, 916.3, 539.2, 913.2, 504.9, -912.4, 504.8, 911.8, 470.4, 916.3, 539.2, 913.4, 551.5, 912.9, 551.4, -910.5, 563.7, 910.4, 563.6, 910.4, 563.6, 910.3, 563.5, 905.8, 531.9, -910.5, 526.3, 893.0, 501.6, 891.1, 488.4, 894.8, 486.7, 889.2, 475.3, -895.7, 464.8, 895.7, 464.8, 902.2, 454.4, 904.7, 463.1, 907.0, 462.4, -911.8, 470.4, 912.4, 504.8, 913.2, 504.9, 916.3, 539.2, 849.5, 494.8, -848.1, 492.9, 848.1, 492.9, 846.8, 490.9, 842.0, 484.2, 842.8, 483.6, -838.7, 476.3, 844.7, 485.2, 844.3, 485.5, 849.5, 494.8, 738.7, 69.9, -753.9, 66.6, 761.8, 72.8, 769.2, 63.4, 788.7, 68.7, 786.9, 75.6, -804.5, 87.9, 830.4, 107.5, 831.0, 106.7, 857.5, 125.5, 854.9, 123.5, -854.5, 124.1, 851.4, 122.6, 813.2, 104.8, 813.2, 104.8, 775.0, 86.9, -756.8, 78.4, 741.7, 82.2, 738.7, 69.9, 760.7, 133.2, 746.8, 120.3, -752.8, 100.3, 740.9, 98.7, 768.4, 102.3, 766.4, 118.0, 791.8, 137.2, -792.9, 137.9, 792.8, 138.7, 793.9, 138.7, 788.0, 138.5, 788.0, 137.7, -782.2, 136.8, 771.4, 135.0, 767.4, 139.3, 760.7, 133.2, 684.7, 102.6, -683.4, 102.7, 682.1, 99.2, 681.9, 99.4, 684.6, 101.2, 685.9, 99.3, -689.9, 99.1, 689.7, 98.8, 687.4, 102.5, 684.7, 102.6, 705.7, 126.7, -727.5, 138.7, 723.1, 146.6, 740.5, 166.5, 741.3, 167.5, 741.1, 167.9, -742.1, 168.4, 698.0, 142.6, 699.3, 137.2, 651.4, 121.1, 644.5, 115.4, -644.5, 115.4, 637.5, 109.8, 672.1, 113.3, 676.0, 110.3, 705.7, 126.7, -637.5, 109.8, 628.7, 102.5, 629.9, 99.9, 619.9, 95.3, 621.5, 95.0, -622.0, 94.0, 623.1, 94.6, 646.1, 94.6, 646.1, 89.7, 669.1, 84.8, -674.0, 93.0, 674.2, 94.0, 681.9, 99.4, 682.1, 99.2, 683.4, 102.7, -684.7, 102.6, 692.8, 111.8, 692.8, 111.8, 700.8, 121.1, 703.3, 123.9, -702.9, 126.2, 705.7, 126.7, 676.0, 110.3, 672.1, 113.3, 637.5, 109.8, -629.3, 214.7, 629.4, 214.6, 627.9, 213.2, 626.6, 211.7, 620.0, 204.5, -620.0, 204.5, 613.4, 197.3, 608.6, 192.1, 608.6, 192.1, 603.8, 186.8, -591.9, 173.9, 591.5, 174.3, 580.1, 161.0, 579.1, 158.9, 579.1, 158.9, -578.0, 156.8, 578.1, 157.0, 578.3, 156.9, 578.7, 157.1, 580.9, 157.7, -580.9, 157.7, 583.1, 158.4, 618.0, 168.9, 623.6, 160.4, 653.0, 179.5, -652.8, 179.4, 647.2, 188.0, 641.5, 196.5, 635.4, 205.6, 636.9, 207.0, -629.3, 214.7, 689.0, 182.7, 706.2, 191.7, 706.2, 191.7, 723.5, 200.8, -715.9, 194.0, 712.7, 197.5, 701.9, 194.3, 698.4, 193.2, 697.4, 194.4, -695.0, 192.2, 691.0, 188.6, 693.0, 183.9, 689.0, 182.7, 626.8, 212.0, -626.7, 211.8, 626.7, 211.8, 626.6, 211.7, 627.9, 213.2, 629.4, 214.6, -629.3, 214.7, 633.7, 219.4, 633.7, 219.4, 638.0, 224.2, 638.4, 224.6, -638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0, -665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6, -685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2, -688.5, 279.2, 690.7, 281.6, 697.1, 288.6, 697.1, 288.6, 703.6, 295.6, -710.4, 303.0, 710.4, 303.0, 717.1, 310.4, 720.6, 314.2, 720.6, 314.2, -724.0, 317.9, 730.1, 324.6, 736.2, 331.2, 736.2, 331.2, 736.2, 331.2, -730.1, 324.6, 724.0, 317.9, 720.6, 314.2, 720.6, 314.2, 717.1, 310.4, -710.4, 303.0, 710.4, 303.0, 703.6, 295.6, 697.1, 288.6, 697.1, 288.6, -690.7, 281.6, 688.5, 279.2, 688.5, 279.2, 686.3, 276.8, 685.8, 276.2, -685.8, 276.2, 685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5, -665.2, 253.8, 665.2, 253.8, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5, -638.7, 224.9, 638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 633.7, 219.4, -633.7, 219.4, 629.3, 214.7, 628.1, 213.3, 628.0, 213.3, 626.8, 212.0, -626.8, 212.0, 626.8, 212.0, 626.8, 212.0, 645.8, 239.4, 690.1, 300.2, -690.2, 300.2, 731.8, 362.9, 730.3, 363.7, 730.3, 363.7, 728.7, 364.4, -716.2, 348.6, 717.6, 347.6, 706.4, 330.7, 696.0, 315.0, 696.0, 315.0, -685.6, 299.3, 665.7, 269.4, 667.0, 268.4, 645.8, 239.4, 792.6, 283.1, -791.4, 277.9, 793.4, 271.7, 795.1, 271.6, 826.3, 282.4, 829.0, 274.6, -862.9, 277.6, 833.0, 295.4, 834.2, 297.5, 805.6, 317.4, 800.5, 317.8, -796.7, 300.8, 792.6, 283.1, 805.6, 317.4, 802.4, 319.6, 802.4, 319.6, -799.3, 321.8, 799.1, 322.4, 790.0, 317.2, 784.9, 320.1, 784.8, 320.1, -785.1, 318.9, 785.4, 317.7, 789.0, 300.4, 788.8, 283.1, 792.6, 283.1, -796.7, 300.8, 800.5, 317.8, 805.6, 317.4, 669.2, 142.5, 711.0, 169.1, -716.3, 163.2, 752.8, 195.8, 757.6, 199.0, 757.6, 199.0, 762.5, 202.3, -715.8, 172.5, 715.3, 173.2, 669.2, 142.5, 656.5, 133.7, 662.4, 138.7, -662.0, 139.2, 668.3, 143.7, 682.3, 157.8, 681.8, 158.3, 695.4, 173.0, -701.6, 179.8, 707.8, 186.6, 707.8, 186.5, 699.6, 181.4, 699.2, 181.9, -690.7, 177.3, 677.9, 165.3, 679.7, 163.4, 668.8, 149.5, 662.6, 141.6, -657.2, 142.1, 656.5, 133.7, 484.2, 192.4, 466.3, 185.9, 466.8, 183.8, -448.4, 179.4, 434.4, 165.4, 434.4, 165.4, 420.4, 151.4, 423.0, 154.3, -423.8, 153.6, 427.2, 155.8, 427.8, 156.2, 427.8, 156.2, 428.4, 156.5, -441.0, 164.6, 441.0, 164.6, 453.6, 172.7, 468.9, 182.5, 483.2, 193.7, -484.2, 192.4, 511.2, 117.2, 506.6, 118.9, 503.0, 121.8, 502.0, 120.5, -497.6, 121.5, 496.6, 123.8, 493.2, 122.4, 479.7, 123.8, 478.5, 122.4, -466.5, 128.1, 465.7, 128.2, 465.1, 128.8, 464.8, 128.5, 464.3, 128.6, -464.0, 128.4, 463.7, 128.7, 497.3, 92.4, 497.5, 92.6, 531.3, 56.5, -537.7, 49.7, 541.4, 50.9, 544.1, 42.8, 531.4, 81.3, 530.5, 81.6, -511.2, 117.2, 544.1, 42.8, 544.3, 42.4, 544.9, 42.3, 544.8, 42.1, -553.0, 66.6, 561.8, 66.9, 561.1, 91.2, 561.9, 94.1, 561.8, 97.0, -562.7, 97.1, 560.1, 98.9, 560.1, 98.9, 557.4, 100.7, 533.6, 105.7, -534.3, 109.0, 511.2, 117.2, 530.5, 81.6, 531.4, 81.3, 544.1, 42.8, -436.8, 132.4, 435.4, 132.4, 435.4, 132.4, 434.0, 132.5, 436.4, 132.0, -436.1, 130.2, 438.1, 128.0, 490.4, 81.3, 490.1, 80.9, 542.1, 33.9, -542.0, 37.9, 543.5, 38.0, 544.8, 42.1, 544.9, 42.3, 544.3, 42.4, -544.1, 42.8, 541.4, 50.9, 537.7, 49.7, 531.3, 56.5, 484.8, 95.3, -484.6, 95.1, 436.8, 132.4, 531.3, 56.5, 497.5, 92.6, 497.3, 92.4, -463.7, 128.7, 458.1, 133.7, 455.3, 131.1, 446.7, 132.3, 442.2, 133.8, -441.7, 132.4, 436.8, 132.4, 484.6, 95.1, 484.8, 95.3, 531.3, 56.5, -612.3, -75.3, 626.2, -73.9, 633.4, -66.3, 638.1, -51.9, 627.0, -46.6, -638.8, -21.7, 639.5, 8.4, 638.2, 7.0, 634.4, 10.4, 629.3, 12.3, -619.7, -9.4, 624.7, -11.6, 620.1, -35.4, 618.2, -44.7, 618.2, -44.7, -616.4, -54.1, 614.4, -64.7, 615.4, -75.0, 612.3, -75.3, 403.8, 35.1, -396.6, 24.7, 396.6, 24.7, 389.3, 14.2, 396.6, 18.3, 405.6, 9.6, -408.7, 14.0, 435.3, 29.2, 443.6, 22.3, 462.0, 44.4, 462.7, 45.0, -462.7, 45.0, 463.4, 45.6, 433.6, 40.8, 431.0, 46.6, 403.8, 35.1, -463.4, 45.6, 464.5, 46.4, 464.7, 46.3, 465.6, 47.3, 465.9, 47.6, -466.2, 47.8, 466.1, 47.9, 459.8, 56.7, 459.8, 56.7, 453.5, 65.5, -447.5, 58.4, 436.5, 59.9, 424.9, 65.5, 424.7, 65.3, 424.7, 65.3, -424.5, 65.0, 414.5, 49.8, 414.2, 50.1, 403.8, 35.1, 431.0, 46.6, -433.6, 40.8, 463.4, 45.6, 509.8, -12.8, 509.0, -11.6, 509.0, -11.6, -508.1, -10.5, 507.9, -10.1, 506.9, -11.0, 506.1, -10.7, 498.8, -2.9, -488.5, -14.8, 471.0, -14.3, 461.5, -12.2, 460.8, -15.4, 450.5, -16.5, -472.1, -24.4, 479.7, -27.7, 488.0, -47.7, 493.8, -49.4, 493.8, -49.4, -499.5, -51.2, 509.6, -35.0, 505.7, -32.2, 509.8, -12.8, 499.5, -51.2, -523.8, -58.5, 523.9, -58.0, 548.0, -65.9, 546.5, -63.9, 544.5, -62.9, -545.1, -61.8, 545.4, -61.3, 542.5, -60.0, 542.7, -58.6, 543.8, -57.6, -527.3, -47.3, 528.8, -39.2, 528.8, -39.2, 526.9, -37.9, 527.0, -36.7, -515.8, -28.1, 518.4, -24.7, 509.8, -12.8, 505.7, -32.2, 509.6, -35.0, -499.5, -51.2, 284.2, 78.5, 283.5, 81.8, 285.4, 82.2, 286.7, 86.0, -282.8, 103.1, 289.1, 108.1, 299.7, 125.0, 300.6, 127.6, 301.9, 127.8, -301.5, 130.3, 299.6, 143.4, 300.6, 144.3, 295.2, 156.1, 290.1, 157.2, -287.4, 159.2, 286.3, 163.8, 280.3, 169.0, 280.3, 169.0, 274.3, 174.1, -271.1, 176.8, 268.3, 176.5, 268.0, 179.5, 273.3, 128.7, 274.2, 128.6, -284.2, 78.5, 373.3, 203.2, 370.5, 207.2, 370.8, 207.5, 367.6, 211.2, -364.7, 215.0, 364.7, 215.0, 361.9, 218.8, 356.5, 189.2, 344.2, 177.1, -358.0, 158.3, 349.9, 169.3, 369.1, 180.1, 373.3, 203.2, 358.0, 158.3, -356.2, 151.9, 357.5, 151.5, 357.1, 144.7, 356.9, 141.9, 357.2, 139.2, -356.7, 139.2, 373.4, 151.7, 401.6, 148.1, 401.4, 149.1, 404.7, 151.7, -404.6, 151.9, 407.9, 154.3, 390.6, 178.7, 390.6, 178.7, 373.3, 203.2, -369.1, 180.1, 349.9, 169.3, 358.0, 158.3, 308.9, 84.4, 297.8, 85.2, -287.4, 82.9, 286.7, 86.0, 285.4, 82.2, 283.5, 81.8, 284.2, 78.5, -283.8, 77.5, 283.8, 77.5, 283.5, 76.5, 282.6, 68.5, 280.9, 68.7, -278.3, 61.0, 282.4, 55.0, 292.3, 52.8, 297.3, 56.6, 307.6, 64.5, -312.6, 74.0, 308.9, 84.4, 297.3, 56.6, 297.3, 55.1, 303.3, 55.2, -309.4, 53.8, 320.2, 51.3, 320.2, 51.3, 331.0, 48.8, 335.2, 47.8, -337.5, 45.1, 339.5, 46.8, 345.7, 56.6, 345.7, 56.6, 352.0, 66.3, -356.0, 70.2, 352.5, 73.8, 353.0, 81.4, 343.1, 87.8, 339.5, 82.3, -326.0, 83.2, 324.5, 83.3, 324.5, 83.3, 323.0, 83.4, 321.9, 81.1, -315.9, 83.9, 308.9, 84.4, 312.6, 74.0, 307.6, 64.5, 297.3, 56.6, -333.5, 40.1, 335.5, 41.8, 336.2, 41.4, 337.4, 43.5, 338.4, 45.2, -338.4, 45.2, 339.5, 46.8, 337.5, 45.1, 335.2, 47.8, 331.0, 48.8, -329.4, 47.0, 330.6, 42.5, 333.5, 40.1, 273.8, 289.7, 286.3, 295.9, -287.0, 303.2, 298.9, 302.1, 294.6, 307.8, 294.6, 307.8, 290.3, 313.5, -288.2, 316.2, 288.1, 316.1, 286.0, 318.8, 277.3, 306.1, 269.1, 295.9, -273.8, 289.7, 204.3, 420.0, 183.7, 445.4, 180.2, 443.2, 163.2, 470.8, -155.4, 476.2, 151.1, 474.2, 147.6, 481.7, 147.4, 480.0, 147.4, 480.0, -147.1, 478.3, 146.9, 478.2, 148.1, 475.5, 149.2, 472.6, 175.8, 445.4, -173.8, 423.9, 204.3, 420.0, 213.9, 354.1, 211.2, 376.4, 202.0, 375.3, -190.1, 396.4, 185.5, 404.4, 185.5, 404.4, 181.0, 412.4, 178.7, 416.5, -176.4, 416.5, 176.4, 420.6, 182.3, 404.9, 178.8, 403.7, 181.3, 386.7, -186.6, 371.8, 188.2, 371.8, 190.4, 356.3, 193.8, 346.9, 193.8, 346.9, -197.1, 337.6, 204.7, 336.9, 214.8, 347.0, 213.9, 354.1, 197.1, 337.6, -198.8, 332.8, 201.3, 328.4, 200.5, 328.0, 208.1, 323.9, 208.1, 323.9, -215.6, 319.8, 216.7, 313.2, 227.8, 315.9, 238.9, 309.9, 237.8, 332.4, -226.4, 331.9, 214.0, 353.9, 214.0, 354.0, 213.9, 354.1, 213.9, 354.1, -214.8, 347.0, 204.7, 336.9, 197.1, 337.6, 205.5, 205.2, 214.9, 187.9, -214.9, 187.9, 224.3, 170.6, 223.2, 174.4, 225.5, 175.1, 226.7, 179.6, -218.9, 193.9, 203.1, 195.7, 205.5, 205.2, 226.7, 179.6, 226.8, 180.1, -227.0, 180.2, 226.9, 180.6, 214.8, 224.2, 214.8, 224.2, 202.7, 267.7, -189.3, 262.0, 182.5, 266.1, 168.1, 274.5, 172.0, 267.1, 178.1, 263.9, -175.9, 259.7, 176.2, 259.8, 176.7, 258.1, 177.5, 256.5, 191.5, 230.8, -189.8, 229.7, 205.5, 205.2, 203.1, 195.7, 218.9, 193.9, 226.7, 179.6, -186.7, 290.7, 192.0, 288.8, 194.8, 290.7, 197.4, 286.9, 189.6, 315.0, -189.6, 315.0, 181.8, 343.0, 182.1, 342.0, 181.9, 342.0, 182.0, 340.9, -183.7, 322.7, 183.7, 322.7, 185.4, 304.5, 186.1, 297.6, 183.3, 295.7, -186.7, 290.7, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2, 463.3, 687.6, -463.2, 686.9, 463.2, 686.2, 463.2, 686.2, 463.0, 680.2, 463.8, 680.1, -462.8, 674.3, 464.4, 678.0, 464.4, 678.0, 466.1, 681.7, 466.3, 687.2, -466.0, 687.8, 463.6, 692.9, 578.5, 434.6, 579.6, 430.3, 580.2, 430.4, -580.8, 426.0, 580.6, 425.6, 581.4, 425.1, 581.3, 424.5, 602.2, 457.1, -602.2, 457.1, 623.1, 489.8, 628.7, 470.0, 598.0, 464.0, 578.5, 434.6, -673.6, 757.7, 672.3, 759.2, 679.5, 765.3, 685.5, 772.8, 689.7, 778.1, -694.9, 781.9, 693.8, 783.4, 661.0, 817.4, 661.0, 817.4, 628.1, 851.5, -629.8, 849.8, 629.2, 849.3, 630.3, 847.0, 634.0, 839.4, 634.0, 839.4, -637.6, 831.9, 639.3, 828.4, 639.3, 828.4, 641.0, 824.9, 657.3, 791.3, -650.1, 785.2, 673.6, 757.7, 491.4, 532.6, 491.9, 530.4, 503.1, 533.1, -514.8, 533.6, 520.0, 533.8, 525.1, 533.3, 525.2, 534.0, 525.8, 540.2, -520.7, 540.8, 516.3, 547.5, 512.5, 553.3, 509.0, 559.2, 508.7, 559.0, -496.5, 551.7, 488.9, 543.1, 491.4, 532.6, 474.8, 529.0, 477.1, 496.5, -488.2, 493.2, 479.4, 464.0, 481.8, 459.8, 483.6, 460.0, 484.1, 455.6, -483.9, 455.4, 484.4, 455.0, 484.8, 454.4, 485.1, 452.0, 496.1, 456.3, -501.5, 451.5, 501.5, 451.9, 509.5, 450.2, 517.4, 448.8, 517.2, 464.4, -509.2, 464.3, 501.0, 479.8, 499.7, 482.2, 499.7, 482.2, 498.4, 484.5, -486.6, 506.8, 469.2, 522.9, 474.8, 529.0, 527.1, 602.3, 524.2, 609.7, -524.2, 609.7, 521.3, 617.1, 515.0, 592.1, 519.4, 590.9, 517.5, 564.7, -517.0, 557.6, 517.0, 557.6, 516.5, 550.4, 516.4, 549.0, 515.7, 548.6, -516.3, 547.5, 520.7, 540.8, 525.8, 540.2, 525.2, 534.0, 536.3, 517.1, -536.3, 517.1, 547.5, 500.3, 551.2, 494.6, 553.7, 495.1, 555.0, 488.9, -543.5, 546.1, 541.9, 545.8, 527.1, 602.3, 555.0, 488.9, 555.3, 487.8, -555.7, 487.9, 556.3, 486.9, 562.9, 477.0, 563.1, 466.9, 569.4, 467.1, -566.8, 467.0, 566.6, 477.0, 563.8, 487.0, 562.8, 490.6, 562.8, 490.6, -561.8, 494.2, 556.7, 512.6, 556.7, 512.6, 551.5, 531.1, 549.5, 538.2, -549.5, 538.2, 547.5, 545.3, 546.1, 548.2, 546.7, 548.5, 545.8, 551.6, -545.0, 555.9, 544.6, 555.9, 543.4, 560.1, 542.9, 581.4, 535.2, 581.2, -527.1, 602.3, 541.9, 545.8, 543.5, 546.1, 555.0, 488.9, 432.0, 228.2, -431.8, 226.0, 431.8, 226.0, 431.6, 223.8, 437.1, 213.6, 439.0, 212.2, -438.3, 201.1, 439.1, 202.4, 440.2, 203.0, 439.9, 203.6, 439.3, 206.5, -441.2, 208.2, 444.3, 210.5, 456.0, 216.4, 452.5, 223.3, 460.7, 236.1, -464.0, 254.6, 453.1, 274.4, 455.8, 275.1, 438.7, 270.4, 443.2, 252.0, -432.0, 228.2, 455.8, 275.1, 456.6, 276.9, 455.5, 277.4, 455.2, 279.7, -456.2, 280.0, 451.1, 287.9, 453.6, 292.6, 452.4, 302.1, 456.5, 306.3, -451.2, 311.6, 446.5, 307.6, 439.0, 307.9, 439.3, 306.7, 435.6, 267.5, -435.6, 267.5, 432.0, 228.2, 443.2, 252.0, 438.7, 270.4, 455.8, 275.1, -475.1, 258.7, 477.7, 262.6, 477.7, 262.6, 480.2, 266.5, 484.3, 278.3, -485.4, 277.9, 490.6, 289.4, 492.5, 327.4, 487.6, 331.4, 503.0, 365.1, -503.1, 368.1, 503.1, 368.1, 503.3, 371.1, 497.3, 363.5, 498.7, 362.4, -494.1, 353.7, 486.4, 339.0, 486.4, 339.0, 478.6, 324.2, 472.6, 312.8, -472.6, 312.8, 466.5, 301.3, 464.4, 300.7, 465.0, 298.4, 463.5, 295.5, -467.3, 276.7, 465.7, 275.0, 475.1, 258.7, 463.5, 295.5, 459.3, 287.6, -461.1, 281.5, 455.2, 279.7, 455.5, 277.4, 456.6, 276.9, 455.8, 275.1, -453.1, 274.4, 464.0, 254.6, 460.7, 236.1, 464.6, 242.2, 463.1, 244.0, -468.4, 248.2, 473.2, 250.8, 471.8, 253.4, 475.1, 258.7, 465.7, 275.0, -467.3, 276.7, 463.5, 295.5, 494.1, 353.7, 498.7, 362.4, 497.3, 363.5, -503.3, 371.1, 503.6, 377.8, 505.6, 383.9, 503.9, 384.4, 498.4, 392.8, -504.5, 396.8, 505.1, 409.1, 486.1, 398.3, 484.5, 401.1, 463.9, 393.2, -464.2, 393.4, 466.8, 389.5, 469.6, 385.7, 480.9, 370.9, 480.9, 370.9, -492.2, 356.2, 493.2, 355.0, 494.4, 354.1, 494.1, 353.7, 185.8, 516.6, -187.6, 526.3, 190.7, 525.7, 195.7, 534.8, 200.7, 544.0, 203.9, 543.4, -205.8, 553.2, 204.0, 561.3, 204.0, 561.3, 202.3, 569.3, 189.3, 545.5, -190.9, 543.6, 185.8, 516.6, 195.7, 534.8, 190.7, 525.7, 187.6, 526.3, -185.8, 516.6, 179.3, 504.9, 178.5, 505.2, 172.9, 493.1, 173.3, 491.8, -173.3, 491.8, 173.8, 490.6, 196.2, 478.0, 189.5, 466.0, 205.2, 441.3, -222.8, 476.9, 207.3, 489.8, 195.7, 534.8, 418.3, 496.3, 419.3, 491.9, -421.6, 491.2, 420.4, 487.6, 420.7, 486.1, 421.1, 486.1, 421.1, 484.6, -419.4, 501.7, 421.0, 501.9, 420.8, 519.2, 421.1, 514.2, 420.3, 514.1, -419.7, 509.1, 419.0, 502.7, 419.0, 502.7, 418.3, 496.4, 418.3, 496.3, -418.3, 496.3, 418.3, 496.3, 412.4, 667.3, 410.4, 684.4, 413.1, 685.3, -407.6, 701.4, 411.8, 689.1, 408.8, 688.1, 409.9, 674.8, 410.7, 664.7, -410.7, 664.7, 411.6, 654.6, 415.4, 609.0, 415.4, 609.0, 419.2, 563.4, -419.9, 555.0, 419.9, 555.0, 420.6, 546.5, 420.6, 543.2, 420.9, 543.2, -421.2, 539.9, 417.4, 595.7, 417.3, 595.6, 413.5, 651.4, 413.0, 659.4, -413.3, 659.4, 412.4, 667.3, 427.3, 776.5, 428.0, 780.3, 430.1, 779.9, -433.0, 783.4, 446.6, 800.0, 455.1, 797.7, 460.2, 816.6, 457.1, 838.5, -457.1, 838.5, 453.9, 860.5, 455.4, 855.6, 452.0, 854.6, 450.1, 848.6, -444.2, 830.0, 444.2, 830.0, 438.3, 811.3, 432.8, 793.9, 430.7, 794.3, -427.3, 776.5, 406.6, 883.8, 406.0, 882.6, 403.3, 884.1, 400.0, 884.0, -374.4, 883.8, 374.2, 886.1, 348.9, 883.3, 349.2, 883.2, 348.7, 880.8, -348.6, 878.3, 347.6, 869.7, 349.5, 869.5, 350.4, 860.7, 355.0, 857.9, -358.6, 864.1, 366.8, 867.4, 382.6, 873.9, 382.6, 873.9, 398.3, 880.4, -402.4, 882.1, 405.1, 880.8, 406.6, 883.8, 377.5, 209.4, 376.8, 204.7, -376.0, 199.9, 376.1, 199.9, 392.8, 177.9, 393.6, 178.5, 409.4, 156.0, -412.5, 160.9, 412.5, 160.9, 415.7, 165.8, 417.1, 167.5, 416.0, 168.4, -416.3, 171.0, 416.3, 171.1, 416.1, 171.1, 416.0, 171.3, 413.9, 173.3, -413.9, 173.3, 411.9, 175.4, 394.7, 192.4, 397.1, 195.9, 377.5, 209.4, -225.8, 746.3, 226.0, 752.9, 224.7, 752.9, 223.6, 759.5, 217.9, 793.6, -217.9, 793.6, 212.2, 827.7, 210.5, 838.1, 207.5, 838.4, 208.8, 848.4, -208.5, 822.8, 203.1, 821.6, 208.2, 797.2, 209.2, 783.9, 213.3, 782.9, -210.2, 770.6, 209.7, 770.5, 210.6, 767.8, 210.6, 764.9, 225.7, 716.7, -214.3, 713.1, 218.1, 661.3, 217.9, 656.8, 219.4, 656.7, 220.8, 652.1, -223.9, 661.3, 221.3, 662.2, 221.9, 672.3, 223.8, 709.3, 225.1, 709.3, -225.8, 746.3, 377.7, 663.3, 378.7, 665.6, 378.0, 667.1, 376.3, 669.4, -368.6, 667.1, 356.4, 681.9, 350.7, 699.0, 351.9, 697.8, 351.0, 696.9, -351.3, 694.7, 360.6, 667.3, 356.5, 665.5, 358.8, 636.1, 359.1, 633.6, -359.1, 633.6, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2, -368.6, 647.3, 370.4, 646.5, 377.7, 663.3, 365.6, 457.1, 389.9, 484.9, -385.3, 491.1, 414.3, 512.8, 419.1, 522.3, 413.0, 527.4, 407.6, 540.2, -407.7, 539.3, 405.6, 539.1, 403.6, 538.0, 401.5, 535.4, 402.1, 534.9, -400.7, 531.7, 387.8, 504.4, 387.8, 504.4, 374.9, 477.0, 370.3, 467.0, -373.1, 463.9, 365.6, 457.1, 396.0, 295.6, 405.7, 311.6, 405.7, 311.6, -415.3, 327.6, 415.1, 326.1, 403.1, 330.3, 400.9, 326.8, 393.5, 314.7, -398.5, 311.6, 396.1, 296.5, 396.1, 296.0, 396.2, 296.0, 396.0, 295.6, -429.5, 402.8, 428.6, 401.2, 424.0, 404.3, 422.4, 402.4, 409.9, 388.2, -410.4, 387.3, 401.3, 370.6, 404.8, 377.1, 406.3, 376.3, 411.3, 382.1, -420.4, 392.5, 423.1, 391.0, 429.5, 402.8, 327.5, 317.9, 335.5, 300.7, -341.6, 301.3, 343.5, 283.5, 344.7, 282.9, 350.0, 293.2, 356.4, 303.0, -363.8, 314.1, 363.8, 314.1, 371.2, 325.2, 376.4, 333.1, 375.3, 339.9, -381.6, 341.0, 353.4, 336.2, 341.1, 338.4, 327.5, 317.9, 413.7, 482.7, -378.3, 457.0, 380.2, 454.0, 343.0, 431.2, 338.6, 427.9, 339.3, 427.0, -335.5, 422.7, 331.6, 421.7, 332.3, 419.0, 329.1, 415.3, 342.3, 424.3, -341.6, 425.3, 354.1, 435.3, 359.8, 439.8, 359.8, 439.8, 365.4, 444.3, -366.7, 445.3, 366.7, 445.3, 367.9, 446.3, 390.8, 464.5, 388.8, 467.8, -413.7, 482.7, 274.1, 435.0, 276.4, 430.3, 275.1, 429.0, 278.6, 425.7, -278.7, 425.6, 278.7, 425.6, 278.7, 425.6, 268.4, 467.8, 268.3, 467.8, -258.1, 510.1, 256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 255.8, 520.7, -256.8, 515.4, 258.1, 510.1, 259.6, 503.2, 259.6, 503.2, 261.0, 496.3, -267.6, 465.7, 266.5, 465.4, 274.1, 435.0, 64.3, 245.5, 63.3, 243.2, -63.3, 243.2, 62.3, 240.9, 69.8, 212.3, 64.6, 210.9, 66.9, 181.0, -65.6, 193.9, 66.4, 193.9, 65.9, 206.9, 65.1, 226.2, 66.4, 226.4, -64.3, 245.5, 43.9, 79.8, 44.0, 76.2, 43.5, 76.1, 44.2, 72.5, -44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 45.3, 66.2, 44.7, 65.8, -46.8, 61.7, 46.6, 62.8, 47.2, 62.9, 47.6, 64.1, 46.3, 72.1, -46.9, 72.5, 43.9, 79.8, 649.4, 530.7, 645.6, 524.9, 641.9, 519.1, -641.9, 519.1, 639.7, 515.7, 639.7, 515.7, 637.5, 512.3, 637.5, 512.3, -637.5, 512.3, 637.5, 512.3, 638.0, 511.3, 637.6, 511.1, 637.8, 510.0, -652.4, 503.5, 652.8, 504.4, 667.8, 498.9, 677.4, 495.4, 677.4, 495.4, -687.0, 491.8, 694.7, 489.0, 700.5, 484.1, 702.3, 486.2, 701.6, 497.2, -701.6, 497.2, 700.8, 508.2, 698.8, 512.4, 695.2, 510.7, 689.5, 513.1, -669.4, 521.9, 670.2, 528.0, 649.4, 530.7, 700.8, 471.3, 701.9, 472.8, -701.9, 472.8, 703.1, 474.3, 703.5, 474.5, 703.0, 475.8, 702.9, 477.3, -701.0, 474.9, 700.6, 474.2, 700.8, 471.3, 808.2, 400.0, 814.9, 404.7, -820.1, 403.3, 821.7, 409.3, 859.1, 470.9, 856.4, 472.5, 890.9, 536.0, -891.2, 536.4, 890.9, 536.6, 891.0, 537.3, 892.0, 543.8, 892.0, 543.8, -893.0, 550.3, 848.4, 476.5, 847.1, 476.9, 808.2, 400.0, 893.0, 550.3, -893.2, 551.5, 892.7, 551.8, 893.3, 552.6, 889.0, 549.7, 889.0, 549.7, -884.7, 546.7, 880.9, 539.6, 880.0, 540.1, 875.4, 533.5, 862.6, 514.1, -862.4, 514.2, 849.5, 494.8, 844.3, 485.5, 844.7, 485.2, 838.7, 476.3, -814.6, 432.8, 819.3, 429.5, 790.5, 389.3, 790.0, 388.3, 790.0, 388.3, -789.5, 387.2, 797.2, 395.2, 798.9, 393.6, 808.2, 400.0, 847.1, 476.9, -848.4, 476.5, 893.0, 550.3, 731.1, 91.4, 720.8, 83.6, 721.9, 78.2, -710.6, 75.9, 720.4, 73.8, 721.6, 76.1, 730.2, 71.7, 731.7, 69.2, -734.5, 70.8, 738.7, 69.9, 741.7, 82.2, 756.8, 78.4, 775.0, 86.9, -771.2, 83.6, 767.7, 87.7, 760.4, 88.4, 745.7, 89.9, 744.5, 94.7, -731.1, 91.4, 782.2, 136.8, 788.0, 137.7, 788.0, 138.5, 793.9, 138.7, -800.7, 141.9, 800.0, 143.3, 806.2, 148.0, 811.6, 152.0, 811.6, 152.0, -816.9, 156.1, 818.5, 154.8, 822.6, 162.9, 829.8, 165.7, 834.0, 165.0, -834.8, 169.5, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0, 913.4, 228.8, -918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 925.8, 238.2, 925.8, 238.2, -929.0, 240.6, 912.7, 229.3, 912.8, 229.1, 896.6, 217.7, 896.5, 217.6, -896.4, 217.7, 896.3, 217.7, 858.2, 190.7, 858.3, 190.6, 820.2, 163.7, -801.2, 150.2, 798.9, 152.6, 782.2, 136.8, 782.6, 330.9, 782.3, 332.4, -782.8, 333.4, 782.0, 333.8, 780.3, 335.4, 782.3, 338.7, 780.8, 339.3, -767.9, 345.5, 767.9, 345.5, 755.0, 351.7, 744.1, 349.8, 745.6, 341.5, -736.2, 331.2, 736.2, 331.2, 730.1, 324.6, 724.0, 317.9, 748.1, 316.3, -748.5, 323.3, 773.0, 328.8, 777.8, 329.9, 778.5, 328.6, 782.6, 330.9, -578.7, 157.1, 578.3, 156.9, 578.1, 157.0, 578.0, 156.8, 567.2, 135.5, -567.2, 135.5, 556.4, 114.1, 565.8, 120.1, 566.5, 119.0, 576.5, 124.0, -581.7, 126.7, 581.8, 126.6, 587.0, 129.2, 596.9, 134.4, 596.9, 134.4, -606.8, 139.6, 603.3, 151.5, 592.9, 148.5, 578.7, 157.1, 690.7, 281.6, -697.1, 288.6, 697.1, 288.6, 703.6, 295.6, 710.4, 303.0, 710.4, 303.0, -717.1, 310.4, 720.6, 314.2, 720.6, 314.2, 724.0, 317.9, 730.1, 324.6, -736.2, 331.2, 736.2, 331.2, 745.6, 341.5, 744.1, 349.8, 755.0, 351.7, -750.9, 353.7, 750.9, 353.7, 746.8, 355.7, 734.4, 346.0, 737.0, 342.8, -727.2, 329.8, 708.9, 305.7, 707.9, 306.5, 690.7, 281.6, 645.4, 281.4, -639.4, 274.1, 639.4, 274.1, 633.4, 266.7, 624.4, 257.5, 629.3, 253.2, -621.3, 242.7, 617.0, 239.1, 618.6, 237.3, 615.8, 231.9, 631.1, 256.4, -632.5, 255.7, 645.4, 281.4, 695.4, 173.0, 681.8, 158.3, 682.3, 157.8, -668.3, 143.7, 666.0, 142.0, 666.3, 141.5, 664.3, 139.4, 666.5, 141.3, -666.8, 140.9, 669.2, 142.5, 711.0, 169.1, 716.3, 163.2, 752.8, 195.8, -753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 758.2, 199.1, 758.1, 199.2, -762.5, 202.3, 764.9, 203.9, 764.9, 203.8, 767.2, 205.4, 768.4, 206.2, -768.4, 206.2, 769.5, 207.0, 732.3, 190.2, 729.6, 194.5, 695.4, 173.0, -769.5, 207.0, 794.8, 224.5, 794.8, 224.5, 820.2, 241.9, 812.5, 238.1, -810.9, 240.7, 804.0, 236.0, 757.7, 213.1, 757.7, 213.1, 711.3, 190.3, -709.2, 189.3, 709.9, 187.9, 707.8, 186.5, 707.8, 186.6, 701.6, 179.8, -695.4, 173.0, 729.6, 194.5, 732.3, 190.2, 769.5, 207.0, 574.2, 109.7, -572.5, 108.7, 572.4, 108.8, 570.7, 107.6, 569.7, 106.9, 569.6, 106.1, -568.7, 106.2, 569.2, 106.1, 569.2, 106.1, 569.8, 106.0, 572.2, 107.5, -572.8, 107.4, 574.2, 109.7, 538.5, 212.0, 511.4, 202.2, 511.4, 202.2, -484.2, 192.4, 483.2, 193.7, 468.9, 182.5, 453.6, 172.7, 477.3, 175.2, -476.5, 183.3, 499.3, 193.9, 505.2, 196.6, 505.2, 196.6, 511.1, 199.4, -524.8, 205.7, 524.1, 208.3, 538.5, 212.0, 480.4, 35.4, 492.4, 20.0, -492.4, 20.0, 504.3, 4.5, 503.8, 5.4, 504.9, 6.1, 505.4, 7.7, -500.4, 15.2, 499.3, 14.5, 493.2, 21.2, 486.8, 28.3, 485.7, 27.5, -480.4, 35.4, 413.7, 132.6, 409.4, 132.7, 408.4, 130.9, 405.1, 132.7, -406.3, 131.1, 406.3, 131.1, 407.5, 129.4, 427.1, 106.7, 425.9, 105.7, -444.3, 82.0, 453.8, 73.5, 465.3, 82.3, 470.6, 73.3, 450.2, 107.6, -442.5, 103.1, 414.2, 132.6, 414.0, 132.6, 414.0, 132.6, 413.7, 132.6, -470.6, 73.3, 480.3, 65.3, 491.4, 73.5, 496.1, 64.9, 470.4, 92.8, -470.4, 92.8, 444.8, 120.8, 428.9, 123.9, 424.2, 121.8, 414.2, 132.6, -414.0, 132.6, 414.0, 132.6, 413.7, 132.6, 442.0, 102.8, 439.1, 99.2, -470.6, 73.3, 578.5, 1.0, 573.7, -6.8, 567.4, -13.1, 568.9, -14.7, -569.8, -17.4, 571.5, -18.3, 570.6, -20.1, 568.1, -21.8, 573.8, -30.5, -577.0, -41.0, 574.6, -40.2, 577.3, -31.7, 577.7, -22.4, 578.1, -10.7, -584.0, -3.9, 578.5, 1.0, 240.9, 156.3, 240.3, 155.6, 239.5, 155.4, -239.6, 154.9, 248.0, 118.7, 248.0, 118.7, 256.4, 82.5, 253.0, 96.4, -253.5, 96.5, 250.6, 110.4, 245.7, 133.4, 246.6, 133.6, 240.9, 156.3, -254.9, 243.8, 255.7, 242.2, 250.0, 239.5, 245.2, 235.3, 235.1, 226.5, -234.7, 226.9, 225.0, 217.7, 225.1, 217.0, 225.1, 217.0, 225.3, 216.3, -226.0, 217.1, 248.9, 202.2, 265.1, 182.1, 266.6, 180.8, 266.6, 180.8, -268.0, 179.5, 268.3, 176.5, 271.1, 176.8, 274.3, 174.1, 267.1, 209.5, -270.2, 211.6, 254.9, 243.8, 274.3, 174.1, 280.3, 169.0, 280.3, 169.0, -286.3, 163.8, 286.7, 162.2, 291.1, 164.4, 293.7, 162.2, 289.7, 178.2, -281.7, 180.7, 285.8, 194.3, 287.8, 196.8, 281.7, 200.4, 283.1, 204.9, -269.4, 209.6, 276.7, 231.0, 270.2, 257.1, 270.8, 256.4, 254.6, 250.1, -254.9, 243.8, 270.2, 211.6, 267.1, 209.5, 274.3, 174.1, 245.2, 235.3, -250.0, 239.5, 255.7, 242.2, 254.9, 243.8, 254.6, 250.1, 270.8, 256.4, -270.2, 257.1, 266.8, 270.9, 262.5, 271.2, 263.4, 284.6, 260.9, 283.4, -260.9, 283.4, 258.3, 282.1, 252.2, 279.3, 252.4, 278.8, 246.4, 275.6, -241.1, 256.7, 240.2, 253.9, 245.2, 235.3, 246.4, 275.6, 230.9, 267.1, -231.4, 266.1, 215.5, 258.6, 220.2, 238.1, 220.2, 238.1, 225.0, 217.7, -234.7, 226.9, 235.1, 226.5, 245.2, 235.3, 240.2, 253.9, 241.1, 256.7, -246.4, 275.6, 357.1, 144.7, 357.5, 151.5, 356.2, 151.9, 358.0, 158.3, -344.2, 177.1, 356.5, 189.2, 361.9, 218.8, 361.3, 219.5, 361.3, 219.5, -360.7, 220.3, 355.7, 209.1, 352.7, 208.9, 352.1, 197.2, 350.9, 171.1, -353.2, 170.7, 357.1, 144.7, 310.9, 158.1, 306.2, 144.2, 302.9, 144.6, -301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.9, 127.8, -300.6, 127.6, 299.7, 125.0, 298.3, 122.7, 302.5, 120.1, 305.2, 115.3, -310.9, 124.6, 306.7, 127.1, 308.3, 138.9, 309.6, 148.5, 305.7, 151.6, -310.9, 158.1, 309.4, 53.8, 303.3, 55.2, 297.3, 55.1, 297.3, 56.6, -292.3, 52.8, 282.4, 55.0, 278.3, 61.0, 273.9, 47.9, 275.0, 35.4, -269.6, 34.9, 270.1, 33.0, 270.1, 33.0, 270.6, 31.1, 271.6, 29.7, -271.6, 29.7, 272.6, 28.3, 291.9, 39.5, 295.2, 37.4, 309.4, 53.8, -272.6, 28.3, 281.5, 15.3, 281.5, 15.3, 290.4, 2.4, 306.7, 25.1, -311.9, 21.3, 333.5, 40.1, 330.6, 42.5, 329.4, 47.0, 331.0, 48.8, -320.2, 51.3, 320.2, 51.3, 309.4, 53.8, 295.2, 37.4, 291.9, 39.5, -272.6, 28.3, 263.4, 293.9, 267.9, 291.5, 272.4, 291.5, 272.4, 289.1, -272.6, 289.1, 272.7, 289.2, 272.7, 289.2, 272.7, 289.1, 273.2, 289.5, -273.8, 289.7, 269.1, 295.9, 277.3, 306.1, 286.0, 318.8, 284.3, 320.9, -284.3, 320.9, 282.5, 323.1, 275.2, 330.1, 274.9, 329.8, 267.3, 336.5, -265.5, 338.1, 265.4, 339.8, 263.7, 339.6, 263.6, 339.6, 263.7, 337.9, -263.7, 336.2, 263.6, 315.1, 259.6, 314.3, 263.4, 293.9, 153.1, 461.8, -164.8, 441.2, 168.2, 442.5, 176.4, 420.6, 176.4, 416.5, 178.7, 416.5, -181.0, 412.4, 186.9, 405.9, 190.4, 408.1, 194.2, 400.8, 180.4, 426.9, -177.6, 425.5, 161.0, 450.1, 157.1, 456.0, 156.4, 455.6, 153.1, 461.8, -149.5, 388.3, 147.8, 368.2, 147.8, 368.2, 146.0, 348.1, 150.8, 329.2, -150.0, 329.0, 154.0, 309.9, 158.2, 344.5, 152.0, 345.3, 150.0, 380.7, -149.8, 384.5, 149.1, 384.6, 149.5, 388.3, 488.6, 852.4, 490.1, 864.3, -489.4, 864.4, 491.6, 876.2, 491.8, 878.8, 490.7, 880.5, 492.0, 881.3, -484.3, 884.0, 483.2, 883.3, 474.9, 881.8, 475.7, 881.1, 474.8, 880.1, -474.7, 878.3, 473.9, 865.1, 467.8, 861.9, 473.1, 852.0, 474.8, 848.9, -485.7, 848.5, 488.6, 852.4, 473.1, 852.0, 460.8, 773.6, 466.9, 772.5, -463.6, 692.9, 466.0, 687.8, 466.3, 687.2, 466.1, 681.7, 466.6, 682.9, -466.6, 682.9, 467.1, 684.1, 461.8, 693.8, 469.0, 697.8, 470.8, 711.5, -474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2, 477.9, 765.3, -478.2, 767.6, 483.4, 810.0, 483.4, 810.0, 488.6, 852.4, 485.7, 848.5, -474.8, 848.9, 473.1, 852.0, 580.6, 496.9, 580.8, 495.0, 576.3, 494.4, -572.1, 491.9, 568.0, 489.5, 564.1, 489.9, 563.8, 487.0, 566.6, 477.0, -566.8, 467.0, 569.4, 467.1, 572.1, 457.2, 568.4, 453.0, 574.9, 447.3, -572.0, 449.9, 575.7, 454.1, 576.4, 460.9, 578.5, 478.9, 583.0, 479.5, -580.6, 496.9, 570.5, 776.6, 568.1, 777.6, 568.6, 778.9, 566.7, 781.1, -553.8, 796.7, 553.8, 796.7, 540.9, 812.3, 525.4, 830.9, 521.3, 851.8, -510.0, 849.6, 512.6, 828.3, 512.6, 828.3, 515.2, 807.1, 515.6, 805.4, -517.5, 805.8, 519.9, 804.5, 533.1, 797.2, 533.1, 797.2, 546.4, 789.9, -558.4, 783.3, 557.9, 782.0, 570.5, 776.6, 538.4, 619.0, 540.1, 605.1, -540.1, 605.1, 541.9, 591.3, 541.1, 592.1, 553.2, 598.7, 552.4, 604.6, -551.4, 612.5, 537.6, 618.0, 538.4, 619.0, 476.1, 608.4, 475.7, 614.6, -466.7, 616.9, 468.3, 620.3, 469.2, 607.8, 469.2, 607.8, 470.1, 595.2, -468.0, 598.4, 476.6, 602.1, 476.1, 608.4, 470.1, 595.2, 472.3, 563.6, -472.3, 563.6, 474.6, 531.9, 475.4, 529.7, 486.1, 528.4, 491.4, 532.6, -488.9, 543.1, 496.5, 551.7, 508.7, 559.0, 503.3, 585.9, 497.1, 588.7, -476.1, 608.4, 476.6, 602.1, 468.0, 598.4, 470.1, 595.2, 549.3, 443.3, -563.3, 440.9, 563.8, 442.5, 577.4, 438.4, 576.8, 438.4, 576.1, 442.9, -574.9, 447.3, 568.4, 453.0, 572.1, 457.2, 569.4, 467.1, 563.1, 466.9, -562.9, 477.0, 556.3, 486.9, 544.2, 472.5, 552.8, 465.2, 549.3, 443.5, -549.3, 443.4, 549.3, 443.3, 549.3, 443.3, 516.5, 550.4, 517.0, 557.6, -517.0, 557.6, 517.5, 564.7, 517.6, 565.4, 517.1, 566.1, 517.0, 566.1, -516.8, 566.1, 517.0, 565.3, 517.0, 564.6, 516.7, 557.5, 518.6, 551.0, -516.5, 550.4, 474.2, 687.1, 474.0, 684.3, 473.9, 684.3, 473.7, 681.5, -492.4, 628.3, 493.5, 628.7, 513.3, 575.9, 514.3, 573.4, 514.3, 573.5, -515.2, 571.0, 505.3, 599.1, 505.3, 599.1, 495.3, 627.2, 484.8, 657.2, -485.9, 657.6, 474.2, 687.1, 450.6, 316.3, 450.9, 313.9, 452.2, 312.4, -451.2, 311.6, 456.5, 306.3, 452.4, 302.1, 453.6, 292.6, 456.8, 298.7, -459.4, 299.2, 466.5, 301.3, 472.6, 312.8, 472.6, 312.8, 478.6, 324.2, -478.7, 323.4, 471.0, 322.1, 463.3, 319.9, 461.5, 319.4, 461.5, 319.4, -459.7, 318.9, 458.1, 318.4, 458.1, 318.4, 456.6, 318.0, 453.6, 317.2, -452.2, 318.3, 450.6, 316.3, 193.0, 612.6, 191.5, 619.8, 193.1, 620.6, -189.9, 626.9, 187.0, 635.3, 187.0, 635.3, 184.0, 643.8, 184.3, 642.6, -183.1, 642.3, 182.2, 640.8, 182.7, 636.7, 183.7, 636.8, 185.3, 632.9, -188.4, 624.7, 188.4, 624.7, 191.5, 616.5, 192.3, 614.5, 192.7, 614.6, -193.0, 612.6, 219.0, 424.9, 221.4, 447.0, 233.1, 461.9, 223.8, 469.2, -218.1, 495.7, 218.1, 495.7, 212.4, 522.3, 207.3, 474.5, 208.9, 472.1, -219.0, 424.9, 212.4, 522.3, 209.1, 537.8, 209.1, 537.8, 205.8, 553.2, -203.9, 543.4, 200.7, 544.0, 195.7, 534.8, 207.3, 489.8, 222.8, 476.9, -205.2, 441.3, 211.9, 430.8, 211.9, 430.8, 218.5, 420.3, 217.7, 422.0, -218.8, 422.6, 219.0, 424.9, 208.9, 472.1, 207.3, 474.5, 212.4, 522.3, -461.7, 734.0, 463.2, 759.7, 463.1, 759.8, 464.7, 785.5, 462.5, 801.0, -462.5, 801.0, 460.2, 816.6, 455.1, 797.7, 446.6, 800.0, 433.0, 783.4, -430.7, 774.5, 439.5, 772.2, 446.0, 761.1, 450.1, 753.9, 450.1, 753.9, -454.2, 746.8, 458.0, 740.4, 463.1, 739.0, 461.7, 734.0, 447.6, 495.3, -448.0, 501.2, 447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5, -451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 451.9, 567.7, -451.9, 567.7, 451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2, -447.9, 501.2, 448.0, 501.2, 447.6, 495.3, 413.5, 651.4, 420.1, 608.0, -416.2, 607.4, 419.2, 563.4, 419.9, 555.0, 419.9, 555.0, 420.6, 546.5, -420.6, 543.2, 420.9, 543.2, 421.2, 539.9, 424.7, 497.4, 425.3, 497.4, -428.3, 454.9, 429.0, 448.0, 429.9, 448.1, 431.6, 441.3, 431.6, 441.3, -431.6, 441.3, 431.6, 441.3, 436.2, 422.4, 436.2, 422.4, 440.8, 403.5, -441.3, 401.3, 442.4, 401.0, 441.8, 399.1, 442.2, 404.5, 442.2, 404.5, -442.5, 409.9, 428.9, 530.8, 431.7, 531.2, 413.5, 651.4, 442.5, 409.9, -443.4, 424.6, 443.4, 424.6, 444.3, 439.3, 444.3, 445.8, 443.4, 445.8, -442.5, 452.2, 432.1, 526.1, 432.1, 526.1, 421.8, 600.0, 417.1, 633.6, -417.8, 633.8, 412.4, 667.3, 413.3, 659.4, 413.0, 659.4, 413.5, 651.4, -431.7, 531.2, 428.9, 530.8, 442.5, 409.9, 383.3, 722.9, 393.5, 735.4, -396.2, 749.3, 403.8, 747.8, 409.1, 754.3, 409.1, 754.3, 414.4, 760.8, -416.7, 763.5, 416.7, 763.5, 418.9, 766.3, 423.1, 771.4, 424.8, 770.6, -427.3, 776.5, 434.5, 793.1, 432.8, 793.9, 438.3, 811.2, 438.3, 811.3, -438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.2, -420.6, 782.9, 420.6, 782.9, 403.0, 754.5, 393.1, 738.7, 381.6, 737.4, -383.3, 722.9, 366.8, 867.4, 358.6, 864.1, 355.0, 857.9, 350.4, 860.7, -354.5, 820.5, 354.5, 820.5, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3, -359.7, 770.2, 363.7, 811.1, 362.7, 811.2, 365.7, 852.2, 366.3, 859.8, -369.6, 865.9, 366.8, 867.4, 377.8, 211.3, 377.6, 210.3, 377.6, 210.3, -377.5, 209.4, 397.1, 195.9, 394.7, 192.4, 411.9, 175.4, 400.3, 185.7, -401.1, 186.7, 390.4, 198.0, 389.4, 199.1, 389.4, 199.1, 388.3, 200.2, -383.0, 205.7, 383.6, 206.3, 377.8, 211.3, 239.8, 662.8, 239.0, 701.7, -233.3, 701.6, 226.8, 740.4, 226.3, 743.4, 225.6, 743.4, 225.8, 746.3, -225.1, 709.3, 223.8, 709.3, 221.9, 672.3, 221.9, 670.5, 225.1, 670.6, -228.3, 668.9, 234.0, 665.8, 239.7, 665.9, 239.8, 662.8, 223.6, 759.5, -224.7, 752.9, 226.0, 752.9, 225.8, 746.3, 225.6, 743.4, 226.3, 743.4, -226.8, 740.4, 243.2, 724.1, 244.4, 725.4, 262.0, 710.4, 263.0, 709.5, -263.0, 709.5, 264.0, 708.7, 312.0, 667.8, 311.7, 667.4, 360.0, 626.8, -359.6, 627.2, 360.2, 627.9, 359.8, 628.3, 353.5, 635.0, 353.1, 634.7, -346.4, 641.2, 315.7, 670.8, 315.7, 670.8, 284.9, 700.5, 262.0, 722.6, -262.0, 722.6, 239.0, 744.7, 237.6, 746.0, 237.6, 746.0, 236.2, 747.4, -229.9, 753.5, 229.3, 760.1, 223.6, 759.5, 285.2, 852.2, 296.7, 804.1, -297.5, 803.6, 317.2, 758.2, 316.2, 760.6, 323.3, 763.1, 322.6, 766.3, -318.0, 785.6, 314.5, 784.8, 306.5, 803.3, 295.8, 827.8, 291.3, 826.7, -285.2, 852.2, 349.9, 662.3, 350.7, 654.7, 355.3, 654.7, 355.0, 647.4, -352.0, 670.9, 358.7, 672.9, 351.3, 694.7, 351.0, 696.9, 351.9, 697.8, -350.7, 699.0, 338.7, 735.0, 345.8, 737.4, 340.8, 775.8, 339.6, 719.2, -343.7, 718.9, 349.9, 662.3, 340.8, 775.8, 339.9, 783.2, 339.9, 783.2, -338.9, 790.7, 327.5, 784.7, 330.7, 778.5, 322.6, 766.3, 323.3, 763.1, -316.2, 760.6, 317.2, 758.2, 319.6, 741.4, 322.8, 741.8, 328.4, 725.4, -338.4, 696.1, 338.4, 696.1, 348.4, 666.8, 349.1, 664.5, 349.7, 664.6, -349.9, 662.3, 343.7, 718.9, 339.6, 719.2, 340.8, 775.8, 385.0, 633.5, -387.8, 636.1, 383.1, 641.1, 381.3, 648.8, 380.1, 653.4, 380.1, 653.4, -379.0, 658.0, 378.4, 660.7, 376.7, 661.9, 377.7, 663.3, 370.4, 646.5, -368.6, 647.3, 359.5, 631.2, 359.8, 632.0, 361.1, 631.4, 362.7, 631.5, -373.8, 632.5, 378.5, 627.5, 385.0, 633.5, 400.7, 531.7, 402.1, 534.9, -401.5, 535.4, 403.6, 538.0, 403.4, 537.8, 403.4, 537.8, 403.2, 537.7, -357.2, 510.5, 356.8, 511.0, 310.5, 484.3, 343.2, 510.4, 348.2, 504.2, -386.0, 524.0, 393.3, 527.9, 394.3, 526.7, 400.7, 531.7, 356.4, 303.0, -350.0, 293.2, 344.7, 282.9, 343.5, 283.5, 344.3, 276.1, 338.5, 275.2, -332.8, 267.4, 335.2, 259.1, 340.4, 253.4, 337.6, 250.9, 339.1, 248.9, -340.9, 248.6, 340.6, 246.9, 340.1, 246.3, 343.2, 243.5, 345.7, 240.1, -353.6, 266.3, 350.3, 267.3, 355.0, 294.4, 355.7, 298.7, 353.9, 300.6, -356.4, 303.0, 384.0, 325.9, 390.1, 329.9, 392.4, 326.4, 400.9, 326.8, -403.1, 330.3, 415.1, 326.1, 415.3, 327.6, 419.6, 334.6, 419.6, 334.6, -423.8, 341.6, 403.5, 340.5, 401.6, 337.3, 384.0, 325.9, 354.1, 435.3, -341.6, 425.3, 342.3, 424.3, 329.1, 415.3, 326.5, 412.4, 326.5, 412.4, -324.0, 409.5, 332.6, 410.0, 335.1, 405.5, 342.0, 397.7, 367.3, 394.6, -370.0, 392.8, 393.7, 400.8, 390.0, 399.5, 387.8, 405.9, 381.9, 411.1, -368.0, 423.2, 368.9, 434.1, 354.1, 435.3, 272.8, 437.6, 273.4, 436.3, -273.4, 436.3, 274.1, 435.0, 268.9, 461.0, 268.4, 460.9, 262.9, 486.8, -261.9, 491.5, 261.0, 496.3, 261.0, 496.3, 261.0, 496.3, 261.9, 491.5, -262.9, 486.8, 267.9, 462.2, 267.5, 462.1, 272.8, 437.6, 67.4, 175.0, -67.4, 174.8, 67.4, 174.8, 67.4, 174.6, 69.5, 163.5, 68.3, 163.3, -69.2, 152.0, 70.3, 157.7, 73.0, 157.2, 76.7, 162.3, 87.0, 209.4, -89.9, 208.8, 103.2, 255.3, 115.4, 232.0, 85.9, 216.5, 68.6, 177.8, -68.0, 176.4, 67.9, 176.4, 67.4, 175.0, 60.2, 159.3, 61.6, 171.9, -66.0, 173.1, 63.0, 184.6, 63.0, 185.0, 63.2, 185.1, 63.0, 185.5, -63.0, 185.5, 63.0, 185.5, 63.0, 185.6, 65.5, 192.5, 53.0, 194.9, -48.4, 206.4, 44.4, 195.3, 38.1, 193.9, 40.3, 184.2, 41.9, 137.6, -41.9, 137.6, 43.5, 91.0, 30.1, 107.8, 53.0, 124.9, 60.2, 159.3, -43.5, 91.0, 43.7, 85.4, 43.7, 85.4, 43.9, 79.8, 46.9, 72.5, -46.3, 72.1, 47.6, 64.1, 49.1, 68.4, 49.1, 68.4, 50.5, 72.6, -53.3, 116.1, 55.4, 116.0, 60.2, 159.3, 53.0, 124.9, 30.1, 107.8, -43.5, 91.0, 681.0, 569.7, 678.1, 569.9, 678.1, 569.9, 675.1, 570.2, -666.1, 555.9, 665.9, 556.0, 656.7, 541.9, 658.6, 545.0, 659.2, 544.7, -661.6, 547.5, 671.3, 558.6, 673.6, 557.2, 681.0, 569.7, 641.5, 479.0, -641.5, 479.0, 641.5, 479.0, 641.6, 478.9, 639.0, 466.5, 650.4, 464.2, -659.2, 449.5, 665.3, 457.3, 683.8, 457.8, 686.6, 453.1, 689.2, 456.4, -689.2, 456.4, 691.8, 459.8, 668.7, 472.9, 666.6, 469.3, 641.6, 478.9, -641.5, 479.0, 641.5, 479.0, 641.5, 479.0, 791.8, 137.2, 766.4, 118.0, -768.4, 102.3, 740.9, 98.7, 740.1, 98.2, 740.1, 98.2, 739.3, 97.6, -735.9, 98.2, 735.2, 94.5, 731.1, 91.4, 744.5, 94.7, 745.7, 89.9, -760.4, 88.4, 777.7, 99.6, 772.6, 107.4, 784.9, 126.3, 788.4, 131.7, -786.9, 134.1, 791.8, 137.2, 796.7, 204.0, 801.9, 215.2, 799.9, 216.7, -807.2, 226.4, 792.9, 218.3, 792.9, 218.3, 778.7, 210.2, 772.5, 209.7, -774.3, 201.8, 767.4, 197.3, 758.0, 193.0, 759.9, 188.8, 752.5, 180.3, -776.1, 185.6, 777.9, 188.2, 796.7, 204.0, 752.5, 180.3, 747.3, 174.3, -748.6, 172.2, 742.1, 168.4, 741.1, 167.9, 741.3, 167.5, 740.5, 166.5, -752.1, 153.2, 750.4, 148.0, 765.4, 141.4, 766.1, 141.1, 768.7, 147.1, -772.0, 152.8, 773.5, 155.3, 773.6, 155.2, 774.9, 157.7, 789.9, 177.8, -785.8, 180.8, 796.7, 204.0, 777.9, 188.2, 776.1, 185.6, 752.5, 180.3, -700.8, 121.1, 692.8, 111.8, 692.8, 111.8, 684.7, 102.6, 687.4, 102.5, -689.7, 98.8, 689.9, 99.1, 714.6, 98.4, 715.3, 102.1, 739.3, 97.6, -740.1, 98.2, 740.1, 98.2, 740.9, 98.7, 752.8, 100.3, 746.8, 120.3, -760.7, 133.2, 761.0, 133.7, 760.9, 134.2, 761.4, 134.3, 731.0, 128.2, -729.0, 132.7, 700.8, 121.1, 761.4, 134.3, 764.2, 135.2, 766.5, 139.8, -765.4, 141.4, 750.4, 148.0, 752.1, 153.2, 740.5, 166.5, 723.1, 146.6, -727.5, 138.7, 705.7, 126.7, 702.9, 126.2, 703.3, 123.9, 700.8, 121.1, -729.0, 132.7, 731.0, 128.2, 761.4, 134.3, 583.1, 158.4, 580.9, 157.7, -580.9, 157.7, 578.7, 157.1, 592.9, 148.5, 603.3, 151.5, 606.8, 139.6, -632.0, 152.8, 632.0, 152.8, 657.2, 166.0, 636.3, 182.6, 620.1, 162.6, -583.1, 158.4, 657.2, 166.0, 673.1, 174.3, 673.1, 174.3, 689.0, 182.7, -693.0, 183.9, 691.0, 188.6, 695.0, 192.2, 690.8, 194.8, 687.8, 190.0, -680.7, 187.9, 666.8, 183.7, 666.8, 183.7, 653.0, 179.5, 623.6, 160.4, -618.0, 168.9, 583.1, 158.4, 620.1, 162.6, 636.3, 182.6, 657.2, 166.0, -733.6, 362.1, 732.7, 362.5, 732.7, 362.5, 731.8, 362.9, 690.2, 300.2, -690.1, 300.2, 645.8, 239.4, 637.4, 227.1, 637.8, 226.9, 629.3, 214.7, -628.1, 213.3, 628.0, 213.3, 626.8, 212.0, 626.8, 212.0, 626.8, 212.0, -626.8, 212.0, 632.4, 218.1, 632.4, 218.1, 638.0, 224.2, 638.4, 224.6, -638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0, -665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6, -685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2, -688.5, 279.2, 690.7, 281.6, 707.9, 306.5, 708.9, 305.7, 727.2, 329.8, -734.6, 343.7, 731.3, 345.8, 733.6, 362.1, 727.2, 329.8, 737.0, 342.8, -734.4, 346.0, 746.8, 355.7, 740.2, 358.9, 740.2, 358.9, 733.6, 362.1, -731.3, 345.8, 734.6, 343.7, 727.2, 329.8, 706.4, 330.7, 717.6, 347.6, -716.2, 348.6, 728.7, 364.4, 725.4, 366.0, 725.4, 366.0, 722.0, 367.6, -721.7, 367.9, 720.8, 365.9, 719.2, 365.0, 705.9, 360.5, 707.9, 354.5, -696.7, 344.0, 687.0, 328.8, 685.1, 330.0, 673.6, 315.9, 675.5, 321.6, -681.7, 319.5, 689.7, 323.2, 698.1, 326.9, 700.6, 324.6, 706.4, 330.7, -668.8, 149.5, 679.7, 163.4, 677.9, 165.3, 690.7, 177.3, 674.4, 168.6, -674.4, 168.6, 658.2, 159.9, 637.3, 162.6, 635.2, 146.2, 612.2, 132.4, -622.3, 122.5, 643.8, 135.2, 668.8, 149.5, 540.0, 203.6, 544.8, 209.8, -544.8, 209.8, 549.5, 216.0, 545.7, 212.3, 544.0, 214.0, 538.5, 212.0, -524.1, 208.3, 524.8, 205.7, 511.1, 199.4, 515.0, 201.9, 516.3, 200.1, -521.4, 200.9, 530.7, 202.2, 532.3, 199.4, 540.0, 203.6, 493.2, 21.2, -499.3, 14.5, 500.4, 15.2, 505.4, 7.7, 510.5, 23.9, 510.5, 23.9, -515.6, 40.0, 515.2, 40.4, 496.9, 33.0, 493.2, 21.2, 515.6, 40.0, -516.0, 41.4, 516.9, 42.3, 516.5, 42.7, 506.3, 53.8, 506.3, 53.8, -496.1, 64.9, 491.4, 73.5, 480.3, 65.3, 470.6, 73.3, 465.3, 82.3, -453.8, 73.5, 444.3, 82.0, 462.3, 58.7, 462.3, 58.7, 480.4, 35.4, -485.7, 27.5, 486.8, 28.3, 493.2, 21.2, 496.9, 33.0, 515.2, 40.4, -515.6, 40.0, 587.3, -74.6, 589.1, -80.4, 589.5, -86.3, 590.9, -86.2, -592.6, -88.4, 597.0, -86.2, 597.6, -88.0, 595.3, -80.4, 593.8, -76.3, -587.3, -74.6, 279.7, 73.4, 281.6, 75.0, 283.3, 74.8, 283.5, 76.5, -283.8, 77.5, 283.8, 77.5, 284.2, 78.5, 274.2, 128.6, 273.3, 128.7, -268.0, 179.5, 266.6, 180.8, 266.6, 180.8, 265.1, 182.1, 265.5, 181.5, -261.8, 178.5, 258.5, 175.0, 257.9, 162.7, 261.1, 162.6, 263.7, 150.1, -265.7, 140.4, 265.7, 140.4, 267.7, 130.7, 273.7, 102.0, 271.5, 101.4, -279.7, 73.4, 353.9, 96.6, 354.4, 104.1, 352.6, 104.8, 354.9, 111.6, -355.4, 111.8, 354.4, 113.6, 355.1, 114.2, 353.0, 126.2, 350.2, 134.3, -356.7, 139.2, 357.2, 139.2, 356.9, 141.9, 357.1, 144.7, 353.2, 170.7, -350.9, 171.1, 352.1, 197.2, 352.7, 194.0, 350.3, 193.8, 349.5, 190.1, -349.1, 188.4, 349.6, 188.2, 349.7, 186.4, 350.0, 180.1, 350.0, 180.1, -350.3, 173.8, 352.1, 135.2, 351.1, 135.1, 353.9, 96.6, 336.8, 156.0, -346.6, 170.8, 343.1, 173.1, 349.5, 190.1, 350.3, 193.8, 352.7, 194.0, -352.1, 197.2, 352.7, 208.9, 355.7, 209.1, 360.7, 220.3, 357.9, 224.1, -354.1, 225.8, 355.0, 227.9, 354.5, 228.5, 354.5, 229.1, 354.1, 229.1, -349.0, 223.4, 336.9, 222.5, 333.8, 226.6, 331.8, 220.7, 331.8, 220.7, -329.9, 214.9, 330.5, 191.8, 332.6, 191.9, 335.3, 168.8, 336.0, 162.4, -339.5, 160.1, 336.8, 156.0, 197.4, 398.0, 197.4, 397.9, 195.8, 399.4, -194.2, 400.8, 190.4, 408.1, 186.9, 405.9, 181.0, 412.4, 185.5, 404.4, -185.5, 404.4, 190.1, 396.4, 191.7, 394.9, 195.3, 395.7, 197.4, 398.0, -267.3, 336.5, 274.9, 329.8, 275.2, 330.1, 282.5, 323.1, 243.4, 371.5, -243.4, 371.5, 204.3, 420.0, 173.8, 423.9, 175.8, 445.4, 149.2, 472.6, -150.9, 467.6, 150.9, 467.6, 152.7, 462.6, 152.8, 462.2, 153.0, 462.3, -153.1, 461.8, 156.4, 455.6, 157.1, 456.0, 161.0, 450.1, 211.6, 394.2, -212.2, 394.7, 263.7, 339.6, 265.4, 339.8, 265.5, 338.1, 267.3, 336.5, -161.0, 450.1, 177.6, 425.5, 180.4, 426.9, 194.2, 400.8, 195.8, 399.4, -197.4, 397.9, 197.4, 398.0, 230.6, 368.8, 230.6, 368.8, 263.7, 339.6, -265.4, 339.8, 265.5, 338.1, 267.3, 336.5, 214.3, 393.5, 219.1, 399.0, -161.0, 450.1, 182.0, 340.9, 181.9, 342.0, 182.1, 342.0, 181.8, 343.0, -179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 177.8, 378.3, 163.4, 379.5, -150.4, 396.6, 158.1, 366.7, 165.8, 368.5, 182.0, 340.9, 606.6, 614.7, -613.0, 605.6, 611.2, 604.3, 615.8, 594.0, 621.3, 581.5, 619.6, 580.4, -626.8, 569.1, 625.3, 571.4, 628.0, 572.7, 627.2, 575.8, 626.3, 579.7, -625.3, 579.5, 623.3, 583.1, 615.0, 598.9, 616.8, 600.2, 606.6, 614.7, -755.2, 696.0, 759.7, 703.1, 759.7, 703.1, 764.3, 710.3, 750.1, 721.0, -751.8, 723.2, 739.3, 736.1, 743.2, 733.3, 741.4, 730.8, 743.5, 725.6, -749.3, 710.8, 744.3, 704.0, 755.2, 696.0, 615.8, 594.0, 611.2, 604.3, -613.0, 605.6, 606.6, 614.7, 598.3, 633.5, 603.5, 638.6, 590.1, 652.2, -590.7, 651.6, 585.5, 646.4, 580.9, 640.6, 579.6, 639.0, 579.6, 639.0, -578.3, 637.3, 577.2, 636.0, 576.0, 635.8, 576.1, 634.6, 576.4, 631.8, -577.6, 632.0, 579.1, 629.3, 579.9, 628.0, 579.9, 628.0, 580.6, 626.7, -586.2, 616.8, 583.9, 614.2, 591.8, 606.9, 601.4, 597.9, 609.1, 590.4, -615.8, 594.0, 591.8, 606.9, 587.9, 600.6, 599.4, 593.4, 607.0, 580.0, -621.3, 554.7, 618.1, 552.2, 635.6, 529.4, 635.9, 529.0, 641.7, 530.6, -642.5, 533.4, 643.4, 536.7, 640.7, 537.4, 639.0, 541.4, 632.9, 555.2, -632.9, 555.2, 626.8, 569.1, 619.6, 580.4, 621.3, 581.5, 615.8, 594.0, -609.1, 590.4, 601.4, 597.9, 591.8, 606.9, 576.4, 460.9, 575.7, 454.1, -572.0, 449.9, 574.9, 447.3, 576.1, 442.9, 576.8, 438.4, 577.4, 438.4, -578.4, 438.1, 577.9, 436.5, 578.5, 434.6, 598.0, 464.0, 628.7, 470.0, -623.1, 489.8, 630.0, 500.6, 631.2, 500.0, 636.9, 511.4, 637.2, 511.8, -637.6, 512.1, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3, -607.0, 486.6, 604.0, 489.4, 576.4, 460.9, 637.5, 512.3, 639.7, 515.7, -639.7, 515.7, 641.9, 519.1, 649.1, 530.3, 655.8, 530.1, 656.3, 541.6, -656.1, 537.2, 649.4, 537.5, 642.5, 533.4, 641.7, 530.6, 635.9, 529.0, -635.6, 529.4, 620.6, 520.5, 620.6, 520.5, 605.6, 511.6, 602.6, 509.9, -602.6, 509.9, 599.7, 508.2, 590.1, 502.5, 584.7, 505.2, 580.6, 496.9, -583.0, 479.5, 578.5, 478.9, 576.4, 460.9, 610.9, 469.7, 606.8, 486.0, -636.9, 511.4, 637.2, 511.8, 637.6, 512.1, 637.5, 512.3, 637.5, 512.3, -637.5, 512.3, 637.5, 512.3, 573.7, 767.7, 573.8, 767.6, 575.8, 769.6, -575.5, 770.6, 574.2, 774.0, 573.6, 774.5, 570.5, 776.6, 557.9, 782.0, -558.4, 783.3, 546.4, 789.9, 553.7, 788.1, 552.8, 784.7, 559.2, 779.4, -566.5, 773.6, 565.6, 772.1, 573.7, 767.7, 595.9, 745.9, 603.8, 735.1, -604.5, 735.6, 613.0, 725.3, 621.9, 714.5, 620.4, 712.7, 630.9, 703.8, -630.8, 703.8, 632.3, 705.6, 633.8, 707.5, 634.9, 708.8, 636.2, 709.4, -635.9, 710.2, 634.5, 713.3, 633.1, 712.6, 630.4, 715.1, 623.2, 721.6, -623.2, 721.6, 616.0, 728.0, 609.7, 733.6, 609.7, 733.6, 603.4, 739.3, -602.5, 740.0, 602.5, 740.0, 601.6, 740.8, 598.8, 743.4, 598.1, 742.9, -595.9, 745.9, 545.8, 831.4, 545.8, 831.4, 550.9, 851.6, 556.0, 871.7, -556.0, 871.9, 556.0, 871.9, 556.1, 872.2, 556.7, 874.7, 556.7, 874.7, -557.4, 877.2, 557.6, 878.3, 557.7, 879.4, 557.9, 879.4, 539.7, 881.0, -522.2, 884.3, 521.2, 880.5, 516.2, 860.4, 528.4, 835.8, 545.8, 831.4, -521.2, 880.5, 518.2, 884.3, 506.9, 883.2, 506.1, 880.9, 511.1, 866.3, -508.0, 865.3, 510.0, 849.6, 521.3, 851.8, 525.4, 830.9, 540.9, 812.3, -538.9, 813.6, 542.7, 819.2, 544.4, 826.1, 544.5, 826.3, 544.5, 826.3, -544.5, 826.6, 545.2, 829.0, 546.6, 829.6, 545.8, 831.4, 528.4, 835.8, -516.2, 860.4, 521.2, 880.5, 501.0, 479.8, 509.2, 464.3, 517.2, 464.4, -517.4, 448.8, 528.2, 446.9, 528.2, 446.9, 539.0, 445.1, 538.5, 445.1, -538.5, 445.4, 538.1, 445.8, 529.7, 453.6, 529.7, 453.6, 521.2, 461.3, -511.1, 470.5, 499.2, 474.1, 501.0, 479.8, 513.3, 575.9, 493.5, 628.7, -492.4, 628.3, 473.7, 681.5, 473.3, 677.4, 473.3, 677.4, 472.9, 673.2, -478.0, 656.7, 479.6, 657.2, 486.2, 641.2, 499.8, 608.6, 502.9, 609.6, -513.3, 575.9, 495.3, 627.2, 497.7, 601.0, 504.3, 601.6, 513.3, 575.9, -514.3, 573.4, 514.3, 573.5, 515.2, 571.0, 516.1, 568.5, 516.1, 568.5, -517.0, 566.1, 517.1, 566.1, 517.6, 565.4, 517.5, 564.7, 519.4, 590.9, -515.0, 592.1, 521.3, 617.1, 514.9, 633.7, 506.3, 648.9, 508.5, 650.2, -506.8, 653.2, 507.2, 653.4, 506.0, 656.7, 498.3, 643.3, 494.0, 641.4, -495.3, 627.2, 506.0, 656.7, 495.0, 685.1, 490.1, 684.0, 484.0, 713.4, -484.7, 720.8, 478.3, 721.1, 478.0, 728.9, 471.0, 709.9, 470.8, 707.1, -474.2, 687.1, 485.9, 657.6, 484.8, 657.2, 495.3, 627.2, 494.0, 641.4, -498.3, 643.3, 506.0, 656.7, 445.1, 359.6, 446.0, 352.4, 448.3, 351.9, -446.9, 345.2, 449.8, 331.0, 448.7, 330.7, 450.6, 316.3, 452.2, 318.3, -453.6, 317.2, 456.6, 318.0, 457.2, 318.6, 456.1, 319.7, 455.6, 321.4, -451.7, 335.6, 451.7, 335.6, 447.8, 349.9, 446.4, 354.8, 444.3, 355.2, -445.1, 359.6, 158.8, 562.8, 158.5, 560.6, 157.7, 560.5, 158.2, 558.4, -158.5, 556.2, 157.8, 556.1, 157.5, 553.7, 156.4, 553.2, 158.4, 549.0, -159.2, 544.2, 160.5, 553.3, 159.4, 553.5, 158.8, 562.8, 418.2, 496.4, -418.2, 496.3, 418.2, 496.3, 418.3, 496.3, 418.3, 496.3, 418.3, 496.3, -418.3, 496.4, 418.3, 496.4, 418.2, 496.4, 418.2, 496.4, 379.0, 658.0, -380.1, 653.4, 380.1, 653.4, 381.3, 648.8, 391.3, 646.7, 392.2, 650.9, -403.1, 653.0, 407.3, 653.8, 411.0, 652.7, 411.6, 654.6, 410.7, 664.7, -410.7, 664.7, 409.9, 674.8, 395.5, 676.3, 391.6, 669.5, 379.0, 658.0, -409.9, 674.8, 408.8, 688.1, 411.8, 689.1, 407.6, 701.4, 407.5, 703.4, -407.5, 703.4, 407.3, 705.4, 406.9, 710.5, 406.9, 710.5, 406.5, 715.6, -406.4, 715.7, 406.4, 715.7, 406.4, 715.8, 406.3, 717.1, 406.0, 718.3, -406.2, 718.4, 395.6, 705.4, 385.7, 702.3, 369.0, 705.6, 368.3, 705.3, -367.7, 704.7, 367.8, 704.1, 372.0, 686.8, 377.1, 669.7, 376.3, 669.4, -378.0, 667.1, 378.7, 665.6, 377.7, 663.3, 376.7, 661.9, 378.4, 660.7, -379.0, 658.0, 391.6, 669.5, 395.5, 676.3, 409.9, 674.8, 442.5, 452.2, -443.4, 445.8, 444.3, 445.8, 444.3, 439.3, 445.1, 452.6, 444.2, 452.7, -445.8, 465.9, 448.0, 480.4, 446.7, 480.6, 447.6, 495.3, 448.0, 501.2, -447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5, 451.5, 559.9, -451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7, 452.6, 578.7, -452.8, 581.9, 452.2, 585.4, 451.5, 585.3, 450.2, 588.8, 447.3, 596.8, -443.2, 597.4, 444.3, 604.8, 439.9, 575.1, 444.0, 574.5, 443.6, 544.2, -443.0, 498.2, 442.2, 498.2, 442.5, 452.2, 363.4, 734.1, 364.4, 724.0, -361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5, -366.7, 708.8, 366.7, 708.8, 367.8, 704.1, 367.7, 704.7, 368.3, 705.3, -369.0, 705.6, 374.3, 704.6, 376.1, 714.2, 383.3, 722.9, 381.6, 737.4, -393.1, 738.7, 403.0, 754.5, 402.3, 755.6, 388.1, 746.8, 373.2, 739.2, -368.3, 736.6, 364.5, 737.8, 363.4, 734.1, 382.3, 243.1, 380.0, 227.2, -380.0, 227.2, 377.8, 211.3, 383.6, 206.3, 383.0, 205.7, 388.3, 200.2, -392.4, 214.6, 386.1, 216.4, 383.8, 232.7, 383.0, 237.9, 381.0, 238.5, -382.3, 243.1, 262.2, 528.4, 258.2, 543.6, 259.6, 544.0, 257.0, 559.6, -255.0, 571.8, 255.0, 571.8, 252.9, 584.1, 247.6, 616.0, 247.6, 616.0, -242.3, 647.9, 241.0, 655.3, 243.6, 657.0, 239.8, 662.8, 239.7, 665.9, -234.0, 665.8, 228.3, 668.9, 240.2, 597.8, 243.9, 598.3, 262.2, 528.4, -228.3, 668.9, 225.1, 670.6, 221.9, 670.5, 221.9, 672.3, 221.3, 662.2, -223.9, 661.3, 220.8, 652.1, 226.3, 633.0, 226.4, 633.0, 231.9, 614.0, -250.7, 549.3, 247.1, 548.0, 269.5, 484.6, 262.2, 505.2, 267.1, 506.8, -262.2, 528.4, 243.9, 598.3, 240.2, 597.8, 228.3, 668.9, 212.2, 827.7, -217.9, 793.6, 217.9, 793.6, 223.6, 759.5, 229.3, 760.1, 229.9, 753.5, -236.2, 747.4, 233.8, 748.3, 235.0, 751.5, 233.8, 755.6, 232.7, 759.2, -232.7, 759.2, 231.7, 762.7, 221.9, 795.2, 209.5, 826.6, 212.2, 827.7, -252.9, 584.1, 255.0, 571.8, 255.0, 571.8, 257.0, 559.6, 255.6, 564.2, -257.2, 564.7, 257.4, 569.9, 257.5, 573.8, 257.5, 573.8, 257.6, 577.7, -258.6, 606.4, 272.9, 617.1, 259.5, 635.1, 270.6, 620.2, 253.8, 609.7, -252.9, 584.1, 354.7, 534.6, 362.3, 542.1, 362.3, 542.1, 370.0, 549.5, -371.9, 552.9, 369.4, 554.3, 368.8, 559.1, 364.9, 589.4, 368.6, 590.3, -361.0, 619.6, 363.8, 608.6, 360.1, 607.6, 359.2, 595.6, 358.0, 579.6, -358.0, 579.6, 356.8, 563.5, 356.1, 553.6, 356.1, 553.6, 355.4, 543.6, -355.0, 539.1, 356.5, 535.4, 354.7, 534.6, 368.8, 559.1, 369.4, 554.3, -371.9, 552.9, 370.0, 549.5, 373.2, 552.6, 376.3, 552.5, 376.5, 555.8, -376.5, 556.1, 376.7, 556.1, 377.0, 556.3, 373.0, 558.1, 370.2, 560.5, -368.8, 559.1, 386.0, 524.0, 348.2, 504.2, 343.2, 510.4, 310.5, 484.3, -301.3, 479.0, 302.0, 476.9, 292.1, 473.7, 287.7, 470.6, 288.2, 469.9, -284.3, 466.1, 282.0, 463.9, 282.5, 463.1, 279.8, 461.8, 294.6, 469.4, -294.1, 470.2, 308.5, 478.6, 314.9, 482.3, 314.9, 482.3, 321.3, 486.1, -353.7, 505.1, 351.5, 518.3, 386.0, 524.0, 355.0, 294.4, 350.3, 267.3, -353.6, 266.3, 345.7, 240.1, 349.9, 234.6, 355.0, 230.2, 354.1, 229.1, -354.5, 229.1, 354.5, 228.5, 355.0, 227.9, 367.7, 256.8, 363.9, 266.8, -387.9, 282.3, 389.9, 289.5, 392.0, 289.0, 396.0, 295.6, 396.2, 296.0, -396.1, 296.0, 396.1, 296.5, 375.5, 295.8, 364.6, 305.2, 355.0, 294.4, -396.1, 296.5, 398.5, 311.6, 393.5, 314.7, 400.9, 326.8, 392.4, 326.4, -390.1, 329.9, 384.0, 325.9, 377.6, 325.6, 375.1, 328.5, 371.2, 325.2, -363.8, 314.1, 363.8, 314.1, 356.4, 303.0, 353.9, 300.6, 355.7, 298.7, -355.0, 294.4, 364.6, 305.2, 375.5, 295.8, 396.1, 296.5, 437.6, 403.3, -437.5, 403.4, 432.1, 404.9, 429.5, 402.8, 423.1, 391.0, 420.4, 392.5, -411.3, 382.1, 410.7, 388.7, 420.7, 389.6, 430.0, 397.2, 433.8, 400.3, -437.8, 400.6, 437.6, 403.3, 325.6, 322.0, 326.6, 319.9, 326.6, 319.9, -327.5, 317.9, 341.1, 338.4, 353.4, 336.2, 381.6, 341.0, 386.2, 343.5, -389.5, 348.0, 388.2, 350.8, 383.4, 361.2, 378.8, 359.0, 369.4, 367.2, -365.1, 371.0, 364.9, 374.9, 360.7, 374.8, 357.9, 374.7, 358.1, 370.8, -355.4, 366.8, 346.5, 353.4, 346.5, 353.4, 337.7, 340.1, 331.6, 331.0, -330.1, 331.7, 325.6, 322.0, 420.5, 402.3, 415.5, 395.5, 407.1, 401.5, -393.7, 400.8, 370.0, 392.8, 367.3, 394.6, 342.0, 397.7, 340.5, 399.4, -338.5, 397.5, 334.9, 397.3, 334.6, 396.8, 337.2, 395.3, 339.5, 393.3, -341.5, 391.6, 341.5, 391.6, 343.5, 389.8, 352.1, 382.3, 352.1, 382.3, -360.7, 374.8, 364.9, 374.9, 365.1, 371.0, 369.4, 367.2, 397.1, 380.0, -403.3, 378.7, 420.5, 402.3, 369.4, 367.2, 378.8, 359.0, 383.4, 361.2, -388.2, 350.8, 388.6, 350.6, 390.1, 353.7, 392.0, 356.6, 396.6, 363.6, -396.6, 363.6, 401.3, 370.6, 410.4, 387.3, 409.9, 388.2, 422.4, 402.4, -422.1, 402.0, 421.2, 402.8, 420.5, 402.3, 403.3, 378.7, 397.1, 380.0, -369.4, 367.2, 381.9, 411.1, 387.8, 405.9, 390.0, 399.5, 393.7, 400.8, -407.1, 401.5, 415.5, 395.5, 420.5, 402.3, 421.2, 402.8, 422.1, 402.0, -422.4, 402.4, 424.0, 404.3, 428.6, 401.2, 429.5, 402.8, 432.1, 404.9, -437.5, 403.4, 437.6, 403.3, 439.2, 403.4, 440.7, 403.7, 440.8, 403.5, -436.2, 422.4, 436.2, 422.4, 431.6, 441.3, 431.6, 441.2, 431.5, 441.2, -431.3, 441.1, 421.1, 434.9, 421.1, 434.9, 410.9, 428.7, 396.4, 419.9, -389.8, 423.9, 381.9, 411.1, 226.5, 544.9, 227.1, 537.3, 227.1, 537.3, -227.6, 529.8, 242.2, 506.7, 239.7, 505.1, 251.8, 480.4, 251.0, 482.0, -251.2, 482.0, 250.5, 483.7, 242.6, 503.9, 242.6, 503.9, 234.6, 524.2, -230.6, 534.6, 234.1, 539.0, 226.5, 544.9, 68.6, 177.8, 85.9, 216.5, -115.4, 232.0, 103.2, 255.3, 104.5, 259.8, 104.5, 259.8, 105.7, 264.3, -105.7, 264.1, 105.7, 264.1, 105.6, 264.0, 103.7, 259.7, 103.7, 259.7, -101.9, 255.4, 85.3, 216.6, 82.1, 176.7, 68.6, 177.8, 685.5, 569.3, -683.3, 569.5, 683.3, 569.5, 681.0, 569.7, 673.6, 557.2, 671.3, 558.6, -661.6, 547.5, 672.6, 546.6, 674.9, 557.2, 685.5, 569.3, 702.7, 480.0, -702.5, 483.1, 702.5, 483.1, 702.3, 486.2, 700.5, 484.1, 694.7, 489.0, -687.0, 491.8, 687.5, 485.4, 693.9, 483.3, 702.7, 480.0, 857.0, 143.8, -836.9, 149.9, 832.1, 143.9, 816.9, 156.1, 811.6, 152.0, 811.6, 152.0, -806.2, 148.0, 830.0, 140.7, 841.8, 132.4, 857.0, 143.8, 792.8, 174.5, -792.8, 174.5, 795.0, 176.8, 797.2, 179.1, 799.7, 181.7, 799.7, 181.7, -802.1, 184.2, 802.4, 184.5, 802.4, 184.5, 802.7, 184.8, 809.4, 191.8, -809.4, 191.8, 816.1, 198.8, 816.8, 199.5, 816.8, 199.5, 817.5, 200.3, -850.9, 235.1, 853.6, 232.9, 884.2, 269.9, 875.7, 265.1, 875.7, 265.1, -867.2, 260.3, 832.9, 224.5, 835.0, 222.5, 802.7, 184.8, 802.4, 184.5, -802.4, 184.5, 802.1, 184.2, 799.7, 181.7, 799.7, 181.7, 797.2, 179.1, -795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 867.2, 260.3, 842.6, 246.4, -842.6, 246.4, 817.9, 232.4, 799.6, 193.6, 800.5, 192.0, 774.9, 157.7, -773.6, 155.2, 773.5, 155.3, 772.0, 152.8, 783.0, 163.0, 782.9, 163.3, -792.8, 174.5, 830.4, 217.0, 845.6, 210.6, 867.2, 260.3, 797.2, 179.1, -795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 782.9, 163.3, 783.0, 163.0, -772.0, 152.8, 768.7, 147.1, 766.1, 141.1, 765.4, 141.4, 766.5, 139.8, -764.2, 135.2, 761.4, 134.3, 760.9, 134.2, 761.0, 133.7, 760.7, 133.2, -767.4, 139.3, 771.4, 135.0, 782.2, 136.8, 798.9, 152.6, 801.2, 150.2, -820.2, 163.7, 821.3, 166.9, 809.8, 174.1, 797.2, 179.1, 701.9, 194.3, -712.7, 197.5, 715.9, 194.0, 723.5, 200.8, 762.4, 221.2, 762.4, 221.2, -801.3, 241.7, 802.0, 241.9, 799.9, 248.5, 798.5, 255.3, 795.0, 256.8, -792.7, 251.7, 787.0, 248.0, 786.8, 247.9, 786.8, 247.9, 786.5, 247.7, -784.3, 246.3, 784.3, 246.3, 782.1, 244.9, 769.7, 237.1, 769.7, 237.1, -757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 729.6, 211.8, -726.8, 215.2, 701.9, 194.3, 626.8, 212.0, 636.0, 225.9, 636.5, 225.5, -645.8, 239.4, 667.0, 268.4, 665.7, 269.4, 685.6, 299.3, 655.5, 256.1, -655.9, 255.9, 626.8, 212.0, 635.9, 116.5, 646.2, 125.1, 646.2, 125.1, -656.5, 133.7, 657.2, 142.1, 662.6, 141.6, 668.8, 149.5, 643.8, 135.2, -622.3, 122.5, 612.2, 132.4, 593.2, 121.1, 593.2, 121.1, 574.2, 109.7, -572.8, 107.4, 572.2, 107.5, 569.8, 106.0, 580.0, 103.8, 580.0, 103.8, -590.2, 101.6, 613.7, 105.4, 614.5, 106.1, 635.9, 116.5, 590.2, 101.6, -600.3, 99.5, 600.3, 99.5, 610.4, 97.3, 613.6, 104.6, 618.0, 102.6, -625.6, 107.8, 631.3, 111.2, 630.8, 112.2, 635.9, 116.5, 614.5, 106.1, -613.7, 105.4, 590.2, 101.6, 499.3, 193.9, 476.5, 183.3, 477.3, 175.2, -453.6, 172.7, 441.0, 164.6, 441.0, 164.6, 428.4, 156.5, 457.3, 169.0, -456.3, 171.2, 484.2, 186.0, 491.8, 189.9, 491.5, 190.5, 499.3, 193.9, -601.4, 22.8, 597.4, 24.3, 593.3, 25.3, 593.4, 25.8, 591.9, 23.2, -590.0, 21.0, 590.4, 20.7, 590.7, 20.3, 589.6, 19.4, 588.8, 18.1, -595.3, 19.3, 598.7, 18.3, 601.4, 22.8, 276.3, 70.7, 278.0, 72.0, -278.0, 72.0, 279.7, 73.4, 271.5, 101.4, 273.7, 102.0, 267.7, 130.7, -255.6, 120.9, 270.1, 100.3, 276.3, 70.7, 349.7, 186.4, 349.6, 188.2, -349.1, 188.4, 349.5, 190.1, 343.1, 173.1, 346.6, 170.8, 336.8, 156.0, -330.5, 139.2, 331.3, 138.9, 324.3, 122.5, 337.7, 154.1, 337.7, 154.2, -349.7, 186.4, 335.3, 168.8, 332.6, 191.9, 330.5, 191.8, 329.9, 214.9, -320.4, 186.5, 320.4, 186.5, 310.9, 158.1, 305.7, 151.6, 309.6, 148.5, -308.3, 138.9, 325.1, 146.3, 330.3, 151.4, 335.3, 168.8, 308.3, 138.9, -306.7, 127.1, 310.9, 124.6, 305.2, 115.3, 310.1, 106.4, 310.1, 106.4, -315.0, 97.6, 323.2, 100.7, 319.7, 110.0, 324.3, 122.5, 331.3, 138.9, -330.5, 139.2, 336.8, 156.0, 339.5, 160.1, 336.0, 162.4, 335.3, 168.8, -330.3, 151.4, 325.1, 146.3, 308.3, 138.9, 263.7, 336.2, 263.7, 337.9, -263.6, 339.6, 263.7, 339.6, 230.6, 368.8, 230.6, 368.8, 197.4, 398.0, -195.3, 395.7, 191.7, 394.9, 190.1, 396.4, 202.0, 375.3, 211.2, 376.4, -213.9, 354.1, 213.9, 354.1, 214.0, 354.0, 214.0, 353.9, 238.8, 344.9, -238.4, 343.4, 263.7, 336.2, 214.0, 353.9, 226.4, 331.9, 237.8, 332.4, -238.9, 309.9, 240.5, 309.0, 240.7, 308.1, 241.0, 306.0, 252.2, 300.0, -252.2, 300.0, 263.4, 293.9, 259.6, 314.3, 263.6, 315.1, 263.7, 336.2, -238.4, 343.4, 238.8, 344.9, 214.0, 353.9, 150.0, 380.7, 152.0, 345.3, -158.2, 344.5, 154.0, 309.9, 154.8, 305.8, 154.8, 305.8, 155.7, 301.6, -155.8, 301.9, 157.5, 301.0, 159.2, 300.4, 157.2, 333.4, 155.5, 333.2, -151.7, 366.1, 150.8, 373.4, 150.3, 373.4, 150.0, 380.7, 591.4, 653.9, -591.6, 653.5, 589.9, 652.7, 590.1, 652.2, 603.5, 638.6, 598.3, 633.5, -606.6, 614.7, 616.8, 600.2, 615.0, 598.9, 623.3, 583.1, 612.9, 586.0, -616.4, 598.5, 609.4, 614.0, 600.4, 633.9, 601.3, 634.3, 591.4, 653.9, -607.0, 580.0, 599.4, 593.4, 587.9, 600.6, 591.8, 606.9, 583.9, 614.2, -586.2, 616.8, 580.6, 626.7, 575.6, 621.5, 580.0, 612.0, 586.2, 601.1, -593.2, 588.6, 607.2, 580.2, 607.0, 580.0, 586.2, 601.1, 582.8, 599.4, -589.3, 586.8, 592.4, 572.5, 593.4, 567.5, 593.4, 567.5, 594.5, 562.6, -599.8, 538.4, 599.8, 538.4, 605.0, 514.1, 605.3, 512.9, 605.8, 511.8, -605.6, 511.6, 620.6, 520.5, 620.6, 520.5, 635.6, 529.4, 618.1, 552.2, -621.3, 554.7, 607.0, 580.0, 607.2, 580.2, 593.2, 588.6, 586.2, 601.1, -523.8, 737.3, 526.4, 716.5, 526.4, 716.5, 529.0, 695.8, 528.6, 697.6, -530.3, 697.9, 531.6, 700.1, 538.0, 710.4, 538.1, 710.3, 544.4, 720.7, -544.4, 720.7, 544.4, 720.7, 544.4, 720.7, 534.1, 729.0, 523.0, 735.9, -523.8, 737.3, 573.1, 676.7, 567.3, 670.3, 574.9, 663.4, 576.6, 650.0, -576.6, 649.8, 576.6, 649.8, 576.7, 649.6, 577.5, 643.4, 575.7, 642.6, -578.3, 637.3, 579.6, 639.0, 579.6, 639.0, 580.9, 640.6, 581.0, 646.3, -579.7, 646.3, 578.4, 652.1, 575.8, 664.4, 568.2, 671.3, 573.1, 676.7, -536.3, 636.7, 537.3, 627.8, 537.3, 627.8, 538.4, 619.0, 537.6, 618.0, -551.4, 612.5, 552.4, 604.6, 552.6, 604.5, 553.8, 606.4, 555.2, 608.1, -563.2, 618.2, 573.3, 624.9, 571.1, 628.3, 563.9, 639.2, 551.3, 641.0, -536.3, 636.7, 549.3, 443.5, 552.8, 465.2, 544.2, 472.5, 556.3, 486.9, -555.7, 487.9, 555.3, 487.8, 555.0, 488.9, 553.7, 495.1, 551.2, 494.6, -547.5, 500.3, 547.7, 500.0, 547.5, 499.8, 547.5, 499.4, 547.6, 497.4, -547.6, 497.4, 547.6, 495.4, 547.8, 490.8, 547.8, 490.8, 547.9, 486.2, -548.0, 483.4, 548.0, 483.4, 548.1, 480.6, 548.7, 462.0, 557.9, 450.1, -549.3, 443.5, 517.0, 564.6, 517.0, 565.3, 516.8, 566.1, 517.0, 566.1, -516.1, 568.5, 516.1, 568.5, 515.2, 571.0, 514.3, 573.5, 514.3, 573.4, -513.3, 575.9, 502.9, 609.6, 499.8, 608.6, 486.2, 641.2, 493.4, 624.6, -492.9, 624.4, 499.7, 607.6, 508.3, 586.1, 508.0, 586.0, 517.0, 564.6, -469.6, 385.7, 466.8, 389.5, 464.2, 393.4, 463.9, 393.2, 459.0, 391.3, -455.0, 392.5, 454.1, 389.4, 452.7, 386.4, 452.7, 386.4, 451.3, 383.3, -452.5, 381.9, 454.8, 383.8, 458.3, 384.2, 463.9, 385.0, 467.7, 382.6, -469.6, 385.7, 396.3, 586.8, 397.2, 582.8, 397.3, 582.8, 398.2, 578.9, -398.4, 578.1, 398.4, 578.1, 398.6, 577.3, 409.8, 571.4, 405.2, 559.0, -407.6, 540.2, 413.0, 527.4, 419.1, 522.3, 414.3, 512.8, 411.6, 510.8, -416.2, 504.6, 418.2, 496.4, 418.2, 496.4, 418.3, 496.4, 418.3, 496.4, -419.0, 502.7, 419.0, 502.7, 419.7, 509.1, 410.4, 547.4, 408.3, 546.9, -396.9, 584.7, 396.6, 585.7, 396.5, 585.7, 396.3, 586.8, 406.5, 715.6, -406.9, 710.5, 406.9, 710.5, 407.3, 705.4, 414.6, 682.2, 422.2, 683.1, -424.1, 659.7, 421.7, 688.2, 416.6, 688.1, 406.5, 715.6, 425.5, 707.4, -429.7, 691.9, 428.8, 691.6, 432.1, 675.9, 441.2, 632.3, 440.7, 632.2, -450.2, 588.8, 451.5, 585.3, 452.2, 585.4, 452.8, 581.9, 453.1, 588.3, -453.1, 588.3, 453.5, 594.6, 451.7, 607.4, 450.4, 607.2, 447.3, 619.8, -436.4, 663.6, 437.3, 663.9, 425.5, 707.4, 421.8, 600.0, 432.1, 526.1, -432.1, 526.1, 442.5, 452.2, 442.2, 498.2, 443.0, 498.2, 443.6, 544.2, -443.5, 549.1, 441.7, 549.1, 439.7, 554.0, 430.8, 577.0, 422.4, 576.8, -421.8, 600.0, 450.1, 848.6, 452.0, 854.6, 455.4, 855.6, 453.9, 860.5, -453.3, 865.0, 453.3, 865.0, 452.6, 869.4, 442.1, 862.3, 444.4, 858.9, -436.1, 848.5, 428.4, 838.7, 428.5, 829.0, 420.7, 828.9, 435.5, 829.1, -437.5, 836.6, 450.1, 848.6, 365.7, 852.2, 362.7, 811.2, 363.7, 811.1, -359.7, 770.2, 360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 361.6, 774.6, -361.0, 774.7, 361.6, 785.4, 363.7, 818.8, 361.5, 819.0, 365.7, 852.2, -444.9, 882.7, 427.4, 888.3, 425.7, 884.8, 406.6, 883.8, 405.1, 880.8, -402.4, 882.1, 398.3, 880.4, 394.0, 872.0, 396.6, 870.7, 395.0, 861.0, -392.2, 844.6, 396.7, 830.6, 389.3, 828.2, 417.3, 837.2, 412.8, 851.2, -436.3, 874.3, 440.6, 878.5, 442.2, 883.6, 444.9, 882.7, 416.0, 171.3, -416.1, 171.1, 416.3, 171.1, 416.3, 171.0, 417.8, 183.6, 417.8, 183.6, -419.4, 196.3, 421.3, 210.6, 421.0, 210.6, 422.5, 225.0, 417.7, 260.8, -417.2, 261.1, 417.5, 297.2, 417.2, 296.7, 417.2, 296.7, 416.8, 296.1, -416.0, 242.1, 416.4, 242.1, 416.1, 188.1, 416.0, 179.7, 415.9, 179.7, -416.0, 171.3, 346.4, 641.2, 353.1, 634.7, 353.5, 635.0, 359.8, 628.3, -359.0, 628.9, 359.6, 629.7, 359.5, 631.2, 359.1, 633.6, 359.1, 633.6, -358.8, 636.1, 358.4, 641.9, 355.7, 641.6, 355.0, 647.4, 355.3, 654.7, -350.7, 654.7, 349.9, 662.3, 349.7, 664.6, 349.1, 664.5, 348.4, 666.8, -346.5, 658.6, 347.7, 658.4, 347.1, 650.0, 346.8, 645.6, 344.6, 644.3, -346.4, 641.2, 261.3, 688.3, 264.5, 698.4, 267.0, 702.9, 262.0, 710.4, -244.4, 725.4, 243.2, 724.1, 226.8, 740.4, 233.3, 701.6, 239.0, 701.7, -239.8, 662.8, 243.6, 657.0, 241.0, 655.3, 242.3, 647.9, 256.2, 664.4, -254.6, 667.2, 261.3, 688.3, 242.3, 647.9, 247.6, 616.0, 247.6, 616.0, -252.9, 584.1, 253.8, 609.7, 270.6, 620.2, 259.5, 635.1, 259.7, 636.7, -259.6, 636.7, 259.6, 638.3, 260.0, 649.2, 260.0, 649.2, 260.4, 660.1, -260.4, 662.7, 260.4, 662.7, 260.5, 665.3, 260.8, 672.8, 260.8, 672.8, -261.0, 680.4, 261.2, 684.4, 259.5, 685.3, 261.3, 688.3, 254.6, 667.2, -256.2, 664.4, 242.3, 647.9, 306.5, 803.3, 314.5, 784.8, 318.0, 785.6, -322.6, 766.3, 330.7, 778.5, 327.5, 784.7, 338.9, 790.7, 338.4, 794.6, -338.4, 794.6, 337.9, 798.5, 323.4, 804.1, 308.4, 807.4, 306.5, 803.3, -337.9, 798.5, 337.2, 803.9, 337.2, 803.9, 336.5, 809.4, 321.1, 829.8, -319.0, 828.2, 301.5, 847.1, 290.0, 859.4, 292.5, 867.4, 278.5, 871.8, -284.4, 870.0, 281.3, 861.8, 285.2, 852.2, 291.3, 826.7, 295.8, 827.8, -306.5, 803.3, 308.4, 807.4, 323.4, 804.1, 337.9, 798.5, 301.5, 847.1, -319.0, 828.2, 321.1, 829.8, 336.5, 809.4, 333.6, 832.1, 337.9, 833.6, -330.6, 854.9, 330.0, 857.6, 330.6, 857.7, 329.9, 860.4, 329.5, 862.2, -329.5, 862.2, 329.0, 864.1, 314.4, 857.3, 300.6, 853.6, 301.5, 847.1, -329.0, 864.1, 326.7, 873.5, 320.9, 879.5, 324.4, 882.9, 302.3, 890.3, -299.7, 883.1, 275.0, 882.2, 275.2, 882.2, 275.2, 881.7, 275.3, 881.2, -276.9, 876.5, 275.7, 875.5, 278.5, 871.8, 292.5, 867.4, 290.0, 859.4, -301.5, 847.1, 300.6, 853.6, 314.4, 857.3, 329.0, 864.1, 398.2, 578.9, -397.3, 582.8, 397.2, 582.8, 396.3, 586.8, 394.8, 593.0, 394.8, 593.0, -393.3, 599.3, 389.1, 616.4, 395.5, 622.4, 385.0, 633.5, 378.5, 627.5, -373.8, 632.5, 362.7, 631.5, 369.7, 602.6, 379.2, 604.2, 398.2, 578.9, -362.7, 631.5, 361.1, 631.4, 359.8, 632.0, 359.5, 631.2, 359.5, 631.2, -359.5, 631.2, 359.5, 631.2, 359.6, 629.7, 359.0, 628.9, 359.8, 628.3, -360.2, 627.9, 359.6, 627.2, 360.0, 626.8, 360.5, 623.2, 360.5, 623.2, -361.0, 619.6, 368.6, 590.3, 364.9, 589.4, 368.8, 559.1, 370.2, 560.5, -373.0, 558.1, 377.0, 556.3, 387.8, 566.8, 394.5, 579.5, 398.6, 577.3, -398.4, 578.1, 398.4, 578.1, 398.2, 578.9, 379.2, 604.2, 369.7, 602.6, -362.7, 631.5, 374.9, 477.0, 387.8, 504.4, 387.8, 504.4, 400.7, 531.7, -394.3, 526.7, 393.3, 527.9, 386.0, 524.0, 351.5, 518.3, 353.7, 505.1, -321.3, 486.1, 322.1, 486.6, 322.6, 485.9, 323.8, 485.7, 332.3, 484.2, -332.3, 484.2, 340.7, 482.8, 347.2, 481.7, 347.2, 481.7, 353.6, 480.6, -364.3, 478.8, 371.0, 472.7, 374.9, 477.0, 430.0, 397.2, 420.7, 389.6, -410.7, 388.7, 411.3, 382.1, 406.3, 376.3, 404.8, 377.1, 401.3, 370.6, -396.6, 363.6, 396.6, 363.6, 392.0, 356.6, 406.4, 368.4, 404.9, 370.3, -417.7, 384.1, 423.9, 390.6, 422.5, 394.9, 430.0, 397.2, 312.7, 349.7, -319.1, 335.8, 319.1, 335.8, 325.6, 322.0, 330.1, 331.7, 331.6, 331.0, -337.7, 340.1, 333.6, 348.9, 314.3, 352.2, 312.7, 349.7, 426.6, 461.9, -423.9, 473.2, 422.3, 473.1, 421.1, 484.6, 421.1, 486.1, 420.7, 486.1, -420.4, 487.6, 419.3, 484.4, 417.0, 485.2, 413.7, 482.7, 388.8, 467.8, -390.8, 464.5, 367.9, 446.3, 367.7, 447.2, 393.4, 453.0, 418.9, 459.8, -422.7, 460.9, 426.5, 460.5, 426.6, 461.9, 236.0, 594.4, 228.0, 614.6, -225.6, 614.0, 220.0, 634.9, 220.3, 631.4, 219.5, 628.1, 220.5, 627.8, -225.4, 586.6, 223.5, 586.4, 226.5, 544.9, 234.1, 539.0, 230.6, 534.6, -234.6, 524.2, 241.1, 558.2, 240.5, 560.0, 236.0, 594.4, 77.2, 274.3, -70.8, 259.9, 70.8, 259.9, 64.3, 245.5, 66.4, 226.4, 65.1, 226.2, -65.9, 206.9, 64.9, 213.5, 67.1, 213.8, 68.2, 220.7, 71.9, 242.5, -71.9, 242.5, 75.5, 264.2, 76.4, 269.2, 74.8, 270.2, 77.2, 274.3, -689.5, 513.1, 695.2, 510.7, 698.8, 512.4, 700.8, 508.2, 700.3, 515.6, -700.3, 515.6, 699.8, 523.1, 697.3, 524.2, 689.2, 517.7, 689.5, 513.1, -699.8, 523.1, 698.6, 542.0, 694.3, 542.7, 697.3, 560.8, 695.3, 564.7, -692.5, 565.5, 693.3, 568.6, 689.4, 569.0, 689.4, 569.0, 685.5, 569.3, -674.9, 557.2, 672.6, 546.6, 661.6, 547.5, 659.2, 544.7, 658.6, 545.0, -656.7, 541.9, 653.1, 536.2, 653.0, 536.3, 649.4, 530.7, 670.2, 528.0, -669.4, 521.9, 689.5, 513.1, 689.2, 517.7, 697.3, 524.2, 699.8, 523.1, -640.6, 486.8, 641.1, 482.9, 641.1, 482.9, 641.5, 479.0, 665.1, 466.5, -665.8, 463.1, 691.8, 459.8, 696.3, 465.5, 696.3, 465.5, 700.8, 471.3, -700.6, 474.2, 701.0, 474.9, 702.9, 477.3, 702.8, 478.7, 702.8, 478.7, -702.7, 480.0, 693.9, 483.3, 687.5, 485.4, 687.0, 491.8, 677.4, 495.4, -677.4, 495.4, 667.8, 498.9, 653.7, 497.4, 652.1, 495.6, 640.6, 486.8, -667.8, 498.9, 652.8, 504.4, 652.4, 503.5, 637.8, 510.0, 638.1, 507.7, -638.4, 507.7, 638.3, 505.4, 635.1, 498.0, 639.5, 496.1, 640.6, 486.8, -652.1, 495.6, 653.7, 497.4, 667.8, 498.9, 784.9, 126.3, 772.6, 107.4, -777.7, 99.6, 760.4, 88.4, 767.7, 87.7, 771.2, 83.6, 775.0, 86.9, -813.2, 104.8, 813.2, 104.8, 851.4, 122.6, 849.9, 116.6, 813.4, 137.1, -784.9, 126.3, 851.4, 122.6, 854.5, 124.1, 854.9, 123.5, 857.5, 125.5, -863.1, 129.5, 863.2, 129.3, 868.7, 133.4, 872.0, 135.8, 872.0, 135.8, -875.3, 138.2, 868.0, 135.7, 866.1, 141.0, 857.0, 143.8, 841.8, 132.4, -830.0, 140.7, 806.2, 148.0, 800.0, 143.3, 800.7, 141.9, 793.9, 138.7, -792.8, 138.7, 792.9, 137.9, 791.8, 137.2, 786.9, 134.1, 788.4, 131.7, -784.9, 126.3, 813.4, 137.1, 849.9, 116.6, 851.4, 122.6, 921.4, 271.7, -918.0, 273.4, 914.5, 273.9, 914.7, 275.0, 914.9, 275.8, 907.1, 277.0, -907.2, 278.6, 907.3, 278.8, 905.1, 279.6, 903.1, 280.6, 902.5, 281.0, -901.6, 279.7, 900.1, 278.9, 910.2, 274.1, 910.6, 274.7, 921.4, 271.7, -773.0, 328.8, 748.5, 323.3, 748.1, 316.3, 724.0, 317.9, 720.6, 314.2, -720.6, 314.2, 717.1, 310.4, 741.1, 315.2, 740.5, 318.1, 763.9, 325.8, -768.5, 327.3, 768.4, 327.9, 773.0, 328.8, 787.0, 248.0, 792.7, 251.7, -795.0, 256.8, 798.5, 255.3, 796.8, 263.4, 794.1, 271.2, 795.1, 271.6, -793.4, 271.7, 791.4, 277.9, 792.6, 283.1, 788.8, 283.1, 789.0, 300.4, -785.4, 317.7, 785.5, 317.1, 784.0, 316.8, 784.0, 315.9, 783.8, 302.9, -784.5, 302.9, 785.1, 289.9, 786.1, 269.0, 779.8, 266.6, 787.0, 248.0, -673.5, 315.8, 659.5, 298.6, 659.5, 298.6, 645.4, 281.4, 632.5, 255.7, -631.1, 256.4, 615.8, 231.9, 605.0, 210.3, 611.0, 203.2, 594.1, 188.7, -592.9, 180.0, 592.1, 178.0, 585.7, 172.0, 581.2, 168.9, 582.9, 166.5, -580.1, 161.0, 591.5, 174.3, 591.9, 173.9, 603.8, 186.8, 616.0, 204.4, -614.0, 205.7, 624.2, 224.7, 638.5, 251.0, 638.5, 251.0, 652.8, 277.4, -663.2, 296.6, 673.6, 315.7, 673.5, 315.8, 478.7, 141.4, 501.3, 162.4, -497.6, 169.5, 523.9, 183.4, 524.4, 183.1, 525.3, 184.7, 526.7, 186.0, -533.2, 191.2, 531.9, 192.8, 537.0, 199.6, 526.3, 193.5, 528.0, 190.6, -519.0, 181.6, 498.8, 161.5, 503.0, 150.3, 478.7, 141.4, 620.1, -35.4, -624.7, -11.6, 619.7, -9.4, 629.3, 12.3, 624.8, 14.0, 624.8, 14.0, -620.2, 15.7, 617.8, 13.9, 620.2, 10.6, 620.2, 5.5, 620.1, -14.9, -629.9, -28.1, 620.1, -35.4, 250.6, 110.4, 253.5, 96.5, 253.0, 96.4, -256.4, 82.5, 257.2, 79.3, 257.0, 79.3, 257.9, 76.1, 260.2, 67.8, -260.2, 67.8, 262.6, 59.6, 263.8, 66.2, 269.4, 65.1, 276.3, 70.7, -270.1, 100.3, 255.6, 120.9, 267.7, 130.7, 265.7, 140.4, 265.7, 140.4, -263.7, 150.1, 251.1, 135.4, 252.7, 130.8, 250.6, 110.4, 263.7, 150.1, -261.1, 162.6, 257.9, 162.7, 258.5, 175.0, 249.7, 165.6, 249.7, 165.6, -240.9, 156.3, 246.6, 133.6, 245.7, 133.4, 250.6, 110.4, 252.7, 130.8, -251.1, 135.4, 263.7, 150.1, 326.0, 83.2, 339.5, 82.3, 343.1, 87.8, -353.0, 81.4, 353.5, 89.0, 353.5, 89.0, 353.9, 96.6, 351.1, 135.1, -352.1, 135.2, 350.3, 173.8, 322.8, 160.6, 324.7, 128.1, 326.0, 83.2, -350.3, 173.8, 350.0, 180.1, 350.0, 180.1, 349.7, 186.4, 337.7, 154.2, -337.7, 154.1, 324.3, 122.5, 319.7, 110.0, 323.2, 100.7, 315.0, 97.6, -319.0, 90.5, 325.0, 87.7, 323.0, 83.4, 324.5, 83.3, 324.5, 83.3, -326.0, 83.2, 324.7, 128.1, 322.8, 160.6, 350.3, 173.8, 172.0, 295.9, -179.3, 293.3, 179.3, 293.3, 186.7, 290.7, 183.3, 295.7, 186.1, 297.6, -185.4, 304.5, 180.8, 306.1, 171.6, 299.5, 172.0, 295.9, 602.3, 667.7, -604.0, 664.1, 590.6, 659.9, 591.4, 653.9, 601.3, 634.3, 600.4, 633.9, -609.4, 614.0, 609.2, 614.5, 609.3, 614.5, 609.3, 615.1, 609.3, 615.2, -609.3, 615.2, 609.2, 615.2, 605.8, 641.4, 612.9, 644.7, 602.3, 667.7, -662.7, 698.1, 662.6, 699.1, 661.9, 699.0, 661.0, 700.0, 658.8, 702.5, -658.8, 702.5, 656.6, 705.1, 654.4, 707.5, 654.4, 707.5, 652.3, 710.0, -647.9, 714.9, 648.2, 719.6, 643.6, 719.9, 640.3, 720.1, 637.3, 715.8, -636.4, 710.8, 632.1, 687.1, 631.2, 686.3, 633.1, 662.4, 632.8, 666.0, -636.4, 666.3, 639.6, 670.2, 647.5, 679.7, 647.5, 679.7, 655.4, 689.2, -658.3, 692.8, 658.3, 692.8, 661.2, 696.3, 661.9, 697.2, 662.7, 697.2, -662.7, 698.1, 555.2, 608.1, 553.8, 606.4, 552.6, 604.5, 552.4, 604.6, -553.2, 598.7, 541.1, 592.1, 541.9, 591.3, 542.6, 585.6, 542.6, 585.6, -543.2, 580.0, 552.4, 591.6, 549.9, 593.8, 555.2, 608.1, 561.8, 494.2, -562.8, 490.6, 562.8, 490.6, 563.8, 487.0, 564.1, 489.9, 568.0, 489.5, -572.1, 491.9, 572.1, 492.7, 568.0, 492.8, 564.0, 493.7, 562.9, 493.9, -561.8, 493.9, 561.8, 494.2, 544.4, 720.7, 544.4, 720.7, 544.4, 720.7, -544.4, 720.7, 549.1, 728.1, 549.1, 728.1, 553.7, 735.5, 558.5, 743.3, -558.5, 743.3, 563.4, 751.1, 568.5, 759.4, 574.8, 760.3, 573.7, 767.7, -565.6, 772.1, 566.5, 773.6, 559.2, 779.4, 548.5, 769.2, 554.9, 762.5, -550.7, 745.6, 547.5, 733.2, 547.5, 733.2, 544.4, 720.7, 589.1, 754.2, -588.6, 757.8, 586.3, 757.5, 583.5, 760.9, 579.5, 765.7, 580.5, 767.1, -575.5, 770.6, 575.8, 769.6, 573.8, 767.6, 573.7, 767.7, 574.8, 760.3, -568.5, 759.4, 563.4, 751.1, 563.1, 714.0, 567.5, 713.8, 573.1, 676.7, -568.2, 671.3, 575.8, 664.4, 578.4, 652.1, 575.3, 653.6, 579.5, 662.6, -580.6, 673.2, 583.7, 702.7, 583.7, 702.7, 586.8, 732.3, 587.9, 743.2, -590.3, 743.5, 589.1, 754.2, 531.4, 675.9, 533.8, 656.3, 533.8, 656.3, -536.3, 636.7, 551.3, 641.0, 563.9, 639.2, 571.1, 628.3, 572.8, 628.1, -573.1, 630.7, 575.0, 633.2, 575.6, 633.9, 575.6, 633.9, 576.1, 634.6, -576.0, 635.8, 577.2, 636.0, 578.3, 637.3, 575.7, 642.6, 577.5, 643.4, -576.7, 649.6, 571.0, 656.4, 568.5, 654.3, 560.3, 659.1, 545.9, 667.5, -535.0, 679.2, 531.4, 675.9, 630.3, 847.0, 629.2, 849.3, 629.8, 849.8, -628.1, 851.5, 623.9, 855.9, 624.5, 856.6, 619.8, 860.2, 609.4, 869.5, -610.7, 874.4, 598.4, 878.2, 579.8, 884.0, 578.1, 879.9, 557.9, 879.4, -557.7, 879.4, 557.6, 878.3, 557.4, 877.2, 591.6, 861.8, 592.0, 862.9, -626.7, 848.5, 628.5, 847.7, 630.3, 846.9, 630.3, 847.0, 538.1, 445.8, -538.5, 445.4, 538.5, 445.1, 539.0, 445.1, 540.4, 444.8, 541.1, 445.4, -541.9, 444.6, 543.5, 442.4, 545.6, 443.9, 549.3, 443.3, 549.3, 443.3, -549.3, 443.4, 549.3, 443.5, 557.9, 450.1, 548.7, 462.0, 548.1, 480.6, -548.3, 478.7, 547.6, 478.7, 547.0, 476.8, 544.5, 467.9, 544.5, 467.9, -541.9, 459.0, 540.7, 454.7, 540.7, 454.7, 539.5, 450.4, 538.8, 448.1, -538.4, 448.1, 538.1, 445.8, 499.7, 607.6, 492.9, 624.4, 493.4, 624.6, -486.2, 641.2, 479.6, 657.2, 478.0, 656.7, 472.9, 673.2, 459.6, 660.6, -460.3, 644.6, 468.4, 624.5, 473.6, 611.8, 495.6, 603.8, 499.7, 607.6, -468.4, 624.5, 468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 468.1, 621.0, -468.2, 621.0, 468.3, 620.3, 466.7, 616.9, 475.7, 614.6, 476.1, 608.4, -497.1, 588.7, 503.3, 585.9, 508.7, 559.0, 509.0, 559.2, 512.5, 553.3, -516.3, 547.5, 515.7, 548.6, 516.4, 549.0, 516.5, 550.4, 518.6, 551.0, -516.7, 557.5, 517.0, 564.6, 508.0, 586.0, 508.3, 586.1, 499.7, 607.6, -495.6, 603.8, 473.6, 611.8, 468.4, 624.5, 446.4, 372.4, 445.7, 370.9, -445.1, 370.9, 445.0, 369.4, 444.8, 366.7, 444.8, 366.7, 444.5, 364.1, -444.1, 362.0, 444.8, 361.9, 445.1, 359.6, 444.3, 355.2, 446.4, 354.8, -447.8, 349.9, 448.9, 361.0, 448.0, 361.3, 446.4, 372.4, 191.5, 616.5, -188.4, 624.7, 188.4, 624.7, 185.3, 632.9, 179.2, 628.3, 179.6, 619.8, -183.2, 610.3, 182.7, 611.6, 191.2, 613.0, 191.5, 616.5, 183.2, 610.3, -174.4, 552.3, 178.0, 551.8, 172.8, 493.4, 172.9, 493.2, 172.9, 493.2, -172.9, 493.1, 178.5, 505.2, 179.3, 504.9, 185.8, 516.6, 190.9, 543.6, -189.3, 545.5, 202.3, 569.3, 197.7, 591.0, 197.7, 591.0, 193.0, 612.6, -192.7, 614.6, 192.3, 614.5, 191.5, 616.5, 191.2, 613.0, 182.7, 611.6, -183.2, 610.3, 168.3, 506.7, 170.6, 500.0, 170.6, 500.0, 172.8, 493.4, -178.0, 551.8, 174.4, 552.3, 183.2, 610.3, 179.6, 619.8, 179.2, 628.3, -185.3, 632.9, 183.7, 636.8, 182.7, 636.7, 182.2, 640.8, 174.0, 627.6, -163.2, 624.8, 165.9, 614.5, 165.1, 609.2, 165.1, 609.2, 164.4, 603.8, -165.5, 555.2, 164.6, 555.1, 168.3, 506.7, 164.4, 603.8, 161.6, 583.3, -161.6, 583.3, 158.8, 562.8, 159.4, 553.5, 160.5, 553.3, 159.2, 544.2, -161.2, 532.8, 165.9, 522.6, 163.3, 521.4, 165.8, 514.0, 165.8, 514.0, -168.3, 506.7, 164.6, 555.1, 165.5, 555.2, 164.4, 603.8, 403.1, 653.0, -392.2, 650.9, 391.3, 646.7, 381.3, 648.8, 383.1, 641.1, 387.8, 636.1, -385.0, 633.5, 395.5, 622.4, 389.1, 616.4, 393.3, 599.3, 408.9, 616.2, -408.9, 628.7, 403.1, 653.0, 406.4, 715.8, 406.4, 715.7, 406.4, 715.7, -406.5, 715.6, 416.6, 688.1, 421.7, 688.2, 424.1, 659.7, 430.8, 639.9, -431.3, 640.1, 438.6, 620.5, 441.4, 612.6, 441.4, 612.6, 444.3, 604.8, -443.2, 597.4, 447.3, 596.8, 450.2, 588.8, 440.7, 632.2, 441.2, 632.3, -432.1, 675.9, 424.6, 697.5, 419.2, 695.7, 406.5, 715.6, 406.4, 715.7, -406.4, 715.7, 406.4, 715.8, 432.1, 675.9, 428.8, 691.6, 429.7, 691.9, -425.5, 707.4, 421.8, 725.3, 421.8, 725.3, 418.1, 743.1, 416.7, 749.7, -416.7, 749.7, 415.4, 756.3, 414.9, 758.5, 413.6, 760.2, 414.4, 760.8, -409.1, 754.3, 409.1, 754.3, 403.8, 747.8, 407.7, 747.1, 412.9, 726.6, -406.2, 718.4, 406.0, 718.3, 406.3, 717.1, 406.4, 715.8, 418.8, 695.5, -414.0, 683.8, 432.1, 675.9, 458.7, 682.6, 460.2, 708.3, 460.1, 708.3, -461.7, 734.0, 463.1, 739.0, 458.0, 740.4, 454.2, 746.8, 450.4, 731.2, -455.4, 730.0, 456.6, 713.1, 457.6, 697.9, 462.2, 696.8, 458.7, 682.6, -439.7, 554.0, 441.7, 549.1, 443.5, 549.1, 443.6, 544.2, 444.0, 574.5, -439.9, 575.1, 444.3, 604.8, 441.4, 612.6, 441.4, 612.6, 438.6, 620.5, -435.6, 587.6, 437.6, 587.1, 439.7, 554.0, 438.6, 620.5, 431.3, 640.1, -430.8, 639.9, 424.1, 659.7, 422.2, 683.1, 414.6, 682.2, 407.3, 705.4, -407.5, 703.4, 407.5, 703.4, 407.6, 701.4, 413.1, 685.3, 410.4, 684.4, -412.4, 667.3, 417.8, 633.8, 417.1, 633.6, 421.8, 600.0, 422.4, 576.8, -430.8, 577.0, 439.7, 554.0, 437.6, 587.1, 435.6, 587.6, 438.6, 620.5, -392.3, 792.8, 390.7, 784.7, 386.5, 785.5, 380.8, 778.2, 371.1, 765.9, -366.9, 767.5, 361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1, -364.5, 737.8, 368.3, 736.6, 373.2, 739.2, 385.7, 764.5, 386.9, 765.2, -392.3, 792.8, 395.0, 861.0, 396.6, 870.7, 394.0, 872.0, 398.3, 880.4, -382.6, 873.9, 382.6, 873.9, 366.8, 867.4, 369.6, 865.9, 366.3, 859.8, -365.7, 852.2, 361.5, 819.0, 363.7, 818.8, 361.6, 785.4, 387.3, 793.1, -380.1, 822.5, 395.0, 861.0, 361.6, 785.4, 361.0, 774.7, 361.6, 774.6, -360.3, 764.1, 360.9, 758.8, 360.9, 758.8, 361.4, 753.6, 366.9, 767.5, -371.1, 765.9, 380.8, 778.2, 389.5, 801.5, 385.1, 803.2, 389.3, 828.2, -396.7, 830.6, 392.2, 844.6, 395.0, 861.0, 380.1, 822.5, 387.3, 793.1, -361.6, 785.4, 436.3, 874.3, 412.8, 851.2, 417.3, 837.2, 389.3, 828.2, -385.1, 803.2, 389.5, 801.5, 380.8, 778.2, 386.5, 785.5, 390.7, 784.7, -392.3, 792.8, 393.5, 794.3, 393.5, 794.3, 394.7, 795.9, 407.7, 812.4, -407.7, 812.4, 420.7, 828.9, 428.5, 829.0, 428.4, 838.7, 436.1, 848.5, -440.1, 860.0, 431.5, 872.2, 436.3, 874.3, 436.1, 848.5, 444.4, 858.9, -442.1, 862.3, 452.6, 869.4, 451.9, 874.1, 452.4, 874.2, 451.3, 878.7, -450.8, 880.6, 450.5, 882.6, 450.3, 882.5, 448.4, 883.8, 446.9, 883.9, -444.9, 882.7, 442.2, 883.6, 440.6, 878.5, 436.3, 874.3, 431.5, 872.2, -440.1, 860.0, 436.1, 848.5, 383.8, 232.7, 386.1, 216.4, 392.4, 214.6, -388.3, 200.2, 389.4, 199.1, 389.4, 199.1, 390.4, 198.0, 388.0, 215.4, -394.0, 221.9, 383.8, 232.7, 284.3, 466.1, 288.2, 469.9, 287.7, 470.6, -292.1, 473.7, 296.3, 475.1, 295.0, 478.2, 299.2, 480.6, 316.5, 484.7, -314.1, 495.1, 329.0, 509.6, 330.1, 511.2, 327.3, 513.3, 325.6, 516.9, -320.7, 527.7, 323.9, 534.9, 315.8, 538.5, 315.8, 538.5, 312.6, 531.3, -309.5, 524.1, 301.1, 504.9, 301.1, 504.9, 292.8, 485.6, 288.5, 475.9, -284.9, 476.1, 284.3, 466.1, 358.5, 448.9, 362.0, 453.0, 362.0, 453.0, -365.6, 457.1, 373.1, 463.9, 370.3, 467.0, 374.9, 477.0, 371.0, 472.7, -364.3, 478.8, 353.6, 480.6, 349.6, 477.1, 355.1, 470.8, 356.6, 461.0, -357.2, 457.1, 357.2, 457.1, 357.8, 453.2, 358.1, 451.1, 359.1, 449.2, -358.5, 448.9, 417.7, 384.1, 404.9, 370.3, 406.4, 368.4, 392.0, 356.6, -390.1, 353.7, 388.6, 350.6, 388.2, 350.8, 389.5, 348.0, 386.2, 343.5, -381.6, 341.0, 375.3, 339.9, 376.4, 333.1, 371.2, 325.2, 375.1, 328.5, -377.6, 325.6, 384.0, 325.9, 401.6, 337.3, 403.5, 340.5, 423.8, 341.6, -424.2, 342.3, 424.2, 342.3, 424.7, 343.1, 421.8, 363.6, 427.9, 379.8, -417.7, 384.1, 424.7, 343.1, 432.4, 355.7, 432.0, 356.0, 440.0, 368.4, -440.9, 383.7, 440.9, 383.7, 441.8, 399.1, 442.4, 401.0, 441.3, 401.3, -440.8, 403.5, 440.7, 403.7, 439.2, 403.4, 437.6, 403.3, 437.8, 400.6, -433.8, 400.3, 430.0, 397.2, 422.5, 394.9, 423.9, 390.6, 417.7, 384.1, -427.9, 379.8, 421.8, 363.6, 424.7, 343.1, 355.4, 366.8, 358.1, 370.8, -357.9, 374.7, 360.7, 374.8, 352.1, 382.3, 352.1, 382.3, 343.5, 389.8, -340.0, 384.6, 346.3, 374.7, 355.4, 366.8, 418.9, 459.8, 393.4, 453.0, -367.7, 447.2, 367.9, 446.3, 366.7, 445.3, 366.7, 445.3, 365.4, 444.3, -365.4, 444.7, 366.6, 444.6, 367.8, 445.0, 393.3, 452.4, 417.7, 449.6, -418.9, 459.8, 262.9, 486.8, 261.9, 491.5, 261.0, 496.3, 261.0, 496.3, -259.6, 503.2, 259.6, 503.2, 258.1, 510.1, 259.7, 503.9, 259.4, 503.9, -260.7, 497.6, 261.8, 492.2, 261.5, 492.1, 262.9, 486.8, 118.7, 318.3, -119.2, 321.0, 119.2, 321.0, 119.8, 323.7, 122.1, 325.8, 107.3, 335.3, -108.8, 344.5, 106.6, 339.6, 106.6, 339.6, 104.4, 334.7, 106.1, 328.2, -109.4, 329.0, 114.3, 323.3, 116.5, 320.8, 116.7, 318.2, 118.7, 318.3, -925.0, 270.0, 923.2, 270.9, 923.2, 270.9, 921.4, 271.7, 910.6, 274.7, -910.2, 274.1, 900.1, 278.9, 892.2, 274.4, 892.2, 274.4, 884.2, 269.9, -853.6, 232.9, 850.9, 235.1, 817.5, 200.3, 861.1, 193.4, 867.2, 232.5, -916.9, 264.8, 921.0, 267.4, 922.6, 266.3, 925.0, 270.0, 704.8, 239.4, -704.8, 239.2, 714.5, 236.3, 722.0, 239.1, 727.1, 241.1, 726.0, 244.0, -729.9, 248.9, 747.4, 270.5, 766.2, 271.9, 764.8, 292.2, 765.0, 289.6, -744.5, 291.9, 727.4, 284.4, 723.0, 282.4, 724.6, 278.8, 721.8, 273.1, -713.3, 256.2, 704.7, 256.2, 704.8, 239.4, 666.3, 239.8, 663.2, 236.4, -657.8, 242.9, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5, 638.7, 224.9, -652.4, 224.8, 656.3, 228.9, 666.3, 239.8, 773.6, 303.1, 775.2, 302.3, -778.8, 309.5, 784.0, 315.9, 784.0, 316.8, 785.5, 317.1, 785.4, 317.7, -785.1, 318.9, 784.8, 320.1, 784.9, 320.1, 781.7, 321.8, 783.7, 325.5, -782.6, 330.9, 778.5, 328.6, 777.8, 329.9, 773.0, 328.8, 768.4, 327.9, -768.5, 327.3, 763.9, 325.8, 764.2, 314.4, 765.2, 307.2, 773.6, 303.1, -697.2, 208.4, 686.5, 202.6, 682.2, 199.0, 680.7, 187.9, 687.8, 190.0, -690.8, 194.8, 695.0, 192.2, 697.4, 194.4, 698.4, 193.2, 701.9, 194.3, -726.8, 215.2, 729.6, 211.8, 757.4, 229.3, 757.5, 228.9, 724.9, 223.3, -697.2, 208.4, 624.2, 224.7, 614.0, 205.7, 616.0, 204.4, 603.8, 186.8, -608.6, 192.1, 608.6, 192.1, 613.4, 197.3, 620.3, 210.2, 614.9, 214.5, -624.2, 224.7, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5, -427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 455.7, 170.8, 457.2, 168.6, -484.2, 186.0, 620.2, 5.5, 620.2, 10.6, 617.8, 13.9, 620.2, 15.7, -610.8, 19.2, 610.8, 19.2, 601.4, 22.8, 598.7, 18.3, 595.3, 19.3, -588.8, 18.1, 583.6, 9.6, 583.6, 9.6, 578.5, 1.0, 584.0, -3.9, -578.1, -10.7, 577.7, -22.4, 577.6, -21.7, 578.8, -21.6, 580.0, -20.8, -600.1, -7.7, 602.6, -10.4, 620.2, 5.5, 151.7, 366.1, 155.5, 333.2, -157.2, 333.4, 159.2, 300.4, 164.9, 298.4, 164.9, 298.4, 170.5, 296.4, -166.4, 331.9, 170.9, 359.3, 151.7, 366.1, 170.5, 296.4, 171.2, 296.2, -171.2, 296.2, 172.0, 295.9, 171.6, 299.5, 180.8, 306.1, 185.4, 304.5, -183.7, 322.7, 183.7, 322.7, 182.0, 340.9, 165.8, 368.5, 158.1, 366.7, -150.4, 396.6, 150.3, 396.6, 150.3, 396.6, 150.3, 396.7, 149.9, 392.5, -149.9, 392.5, 149.5, 388.3, 149.1, 384.6, 149.8, 384.5, 150.0, 380.7, -150.3, 373.4, 150.8, 373.4, 151.7, 366.1, 170.9, 359.3, 166.4, 331.9, -170.5, 296.4, 618.3, 687.8, 619.4, 679.0, 603.6, 678.6, 602.3, 667.7, -612.9, 644.7, 605.8, 641.4, 609.2, 615.2, 628.7, 639.7, 622.9, 652.7, -618.3, 687.8, 705.5, 618.5, 711.2, 627.4, 711.2, 627.4, 716.9, 636.3, -710.2, 655.5, 702.4, 652.8, 687.9, 669.3, 675.3, 683.7, 676.1, 684.5, -662.7, 698.1, 662.7, 697.2, 661.9, 697.2, 661.2, 696.3, 664.7, 687.9, -665.7, 688.3, 670.2, 680.4, 674.1, 673.6, 674.1, 673.6, 678.0, 666.8, -691.7, 642.6, 685.3, 634.3, 705.5, 618.5, 743.5, 725.6, 741.4, 730.8, -743.2, 733.3, 739.3, 736.1, 735.2, 740.4, 735.2, 740.4, 731.1, 744.7, -721.4, 738.3, 724.7, 733.4, 718.2, 722.2, 717.3, 720.6, 717.3, 720.6, -716.3, 718.9, 710.1, 708.1, 710.1, 708.1, 703.9, 697.2, 703.3, 696.1, -703.6, 695.6, 702.6, 694.9, 712.2, 701.4, 711.9, 701.9, 721.2, 708.8, -730.6, 715.9, 730.6, 715.9, 739.9, 722.9, 741.7, 724.2, 743.6, 724.3, -743.5, 725.6, 685.5, 772.8, 679.5, 765.3, 672.3, 759.2, 673.6, 757.7, -672.1, 756.0, 672.1, 756.0, 670.7, 754.2, 667.7, 750.4, 667.7, 750.4, -664.7, 746.6, 664.1, 745.8, 664.1, 745.8, 663.5, 745.0, 653.5, 732.4, -648.2, 734.2, 643.6, 719.9, 648.2, 719.6, 647.9, 714.9, 652.3, 710.0, -670.8, 731.5, 665.9, 735.7, 679.5, 761.5, 682.5, 767.1, 680.8, 769.9, -685.5, 772.8, 575.0, 633.2, 573.1, 630.7, 572.8, 628.1, 571.1, 628.3, -573.3, 624.9, 563.2, 618.2, 555.2, 608.1, 549.9, 593.8, 552.4, 591.6, -543.2, 580.0, 545.2, 564.5, 545.2, 564.5, 547.1, 549.0, 544.2, 551.1, -550.9, 560.4, 554.6, 571.8, 564.8, 602.5, 566.0, 602.2, 575.0, 633.2, -552.2, 531.6, 552.3, 531.5, 551.5, 531.2, 551.5, 531.1, 556.7, 512.6, -556.7, 512.6, 561.8, 494.2, 561.8, 493.9, 562.9, 493.9, 564.0, 493.7, -563.0, 500.5, 561.9, 500.3, 559.9, 507.0, 556.0, 519.3, 556.4, 519.4, -552.2, 531.6, 550.7, 745.6, 554.9, 762.5, 548.5, 769.2, 559.2, 779.4, -552.8, 784.7, 553.7, 788.1, 546.4, 789.9, 533.1, 797.2, 533.1, 797.2, -519.9, 804.5, 522.8, 773.9, 526.4, 761.1, 550.7, 745.6, 519.9, 804.5, -517.5, 805.8, 515.6, 805.4, 515.2, 807.1, 519.5, 772.2, 519.5, 772.2, -523.8, 737.3, 523.0, 735.9, 534.1, 729.0, 544.4, 720.7, 547.5, 733.2, -547.5, 733.2, 550.7, 745.6, 526.4, 761.1, 522.8, 773.9, 519.9, 804.5, -580.6, 673.2, 579.5, 662.6, 575.3, 653.6, 578.4, 652.1, 579.7, 646.3, -581.0, 646.3, 580.9, 640.6, 585.5, 646.4, 590.7, 651.6, 590.1, 652.2, -589.9, 652.7, 591.6, 653.5, 591.4, 653.9, 590.6, 659.9, 604.0, 664.1, -602.3, 667.7, 603.6, 678.6, 619.4, 679.0, 618.3, 687.8, 618.4, 688.0, -618.4, 688.2, 618.6, 688.3, 602.2, 681.9, 602.3, 681.8, 586.0, 675.3, -583.3, 674.2, 581.2, 674.9, 580.6, 673.2, 531.6, 700.1, 530.3, 697.9, -528.6, 697.6, 529.0, 695.8, 529.9, 688.2, 529.6, 688.2, 530.8, 680.6, -531.2, 678.3, 531.1, 678.3, 531.4, 675.9, 535.0, 679.2, 545.9, 667.5, -560.3, 659.1, 560.5, 679.5, 547.8, 681.1, 531.6, 700.1, 611.2, 757.1, -629.3, 783.0, 624.2, 786.6, 637.1, 816.1, 639.1, 820.5, 640.9, 820.5, -641.0, 824.9, 639.3, 828.4, 639.3, 828.4, 637.6, 831.9, 624.6, 834.2, -616.6, 837.5, 610.6, 830.4, 603.2, 821.6, 610.7, 815.3, 610.8, 800.2, -610.9, 794.7, 610.9, 794.7, 610.9, 789.2, 611.0, 784.0, 611.0, 784.0, -611.0, 778.7, 611.1, 767.9, 616.2, 764.3, 611.2, 757.1, 670.7, 754.2, -672.1, 756.0, 672.1, 756.0, 673.6, 757.7, 650.1, 785.2, 657.3, 791.3, -641.0, 824.9, 640.9, 820.5, 639.1, 820.5, 637.1, 816.1, 641.6, 801.5, -644.6, 802.4, 652.0, 788.7, 661.4, 771.4, 659.6, 770.2, 670.7, 754.2, -626.7, 848.5, 592.0, 862.9, 591.6, 861.8, 557.4, 877.2, 556.7, 874.7, -556.7, 874.7, 556.1, 872.2, 590.4, 857.9, 627.4, 851.2, 626.7, 848.5, -547.0, 476.8, 547.6, 478.7, 548.3, 478.7, 548.1, 480.6, 548.0, 483.4, -548.0, 483.4, 547.9, 486.2, 546.7, 481.7, 546.9, 481.5, 547.0, 476.8, -492.2, 356.2, 480.9, 370.9, 480.9, 370.9, 469.6, 385.7, 467.7, 382.6, -463.9, 385.0, 458.3, 384.2, 462.7, 374.2, 467.7, 376.4, 477.2, 368.6, -484.7, 362.4, 488.7, 364.1, 492.2, 356.2, 396.9, 584.7, 408.3, 546.9, -410.4, 547.4, 419.7, 509.1, 420.3, 514.1, 421.1, 514.2, 420.8, 519.2, -420.7, 532.8, 420.4, 532.8, 420.6, 546.5, 419.9, 555.0, 419.9, 555.0, -419.2, 563.4, 411.4, 576.1, 397.0, 574.0, 396.9, 584.7, 419.2, 563.4, -415.4, 609.0, 415.4, 609.0, 411.6, 654.6, 411.0, 652.7, 407.3, 653.8, -403.1, 653.0, 408.9, 628.7, 408.9, 616.2, 393.3, 599.3, 394.8, 593.0, -394.8, 593.0, 396.3, 586.8, 396.5, 585.7, 396.6, 585.7, 396.9, 584.7, -397.0, 574.0, 411.4, 576.1, 419.2, 563.4, 418.1, 743.1, 421.8, 725.3, -421.8, 725.3, 425.5, 707.4, 433.4, 674.3, 434.0, 674.4, 442.2, 641.3, -444.8, 630.6, 447.3, 619.8, 447.3, 619.8, 447.3, 619.8, 444.8, 630.6, -442.2, 641.3, 435.7, 668.8, 435.7, 668.8, 429.2, 696.3, 423.6, 719.7, -425.6, 720.3, 418.1, 743.1, 394.7, 795.9, 393.5, 794.3, 393.5, 794.3, -392.3, 792.8, 386.9, 765.2, 385.7, 764.5, 373.2, 739.2, 388.1, 746.8, -402.3, 755.6, 403.0, 754.5, 420.6, 782.9, 420.6, 782.9, 438.3, 811.2, -438.9, 808.0, 416.1, 804.5, 394.7, 795.9, 438.3, 811.2, 438.3, 811.3, -438.3, 811.3, 438.3, 811.3, 444.2, 830.0, 444.2, 830.0, 450.1, 848.6, -437.5, 836.6, 435.5, 829.1, 420.7, 828.9, 407.7, 812.4, 407.7, 812.4, -394.7, 795.9, 416.1, 804.5, 438.9, 808.0, 438.3, 811.2, 416.1, 188.1, -416.4, 242.1, 416.0, 242.1, 416.8, 296.1, 407.0, 281.7, 407.0, 281.7, -397.3, 267.3, 397.0, 227.8, 431.5, 210.9, 416.1, 188.1, 397.3, 267.3, -390.0, 256.5, 379.9, 250.3, 382.7, 245.8, 382.5, 244.4, 382.5, 244.4, -382.3, 243.1, 381.0, 238.5, 383.0, 237.9, 383.8, 232.7, 394.0, 221.9, -388.0, 215.4, 390.4, 198.0, 401.1, 186.7, 400.3, 185.7, 411.9, 175.4, -413.9, 173.3, 413.9, 173.3, 416.0, 171.3, 415.9, 179.7, 416.0, 179.7, -416.1, 188.1, 431.5, 210.9, 397.0, 227.8, 397.3, 267.3, 275.3, 881.2, -275.2, 881.7, 275.2, 882.2, 275.0, 882.2, 263.9, 882.6, 255.8, 887.0, -252.7, 881.9, 240.2, 861.3, 244.8, 856.5, 243.7, 830.9, 244.0, 836.8, -247.3, 836.7, 251.0, 842.4, 255.4, 849.5, 255.4, 849.5, 259.8, 856.5, -264.9, 864.6, 264.9, 864.6, 270.1, 872.8, 272.7, 877.0, 273.1, 876.8, -275.3, 881.2, 239.4, 806.4, 234.4, 814.0, 241.5, 818.6, 243.7, 830.9, -244.8, 856.5, 240.2, 861.3, 252.7, 881.9, 246.6, 891.2, 211.6, 885.1, -210.9, 881.3, 205.0, 847.4, 218.0, 839.2, 239.4, 806.4, 210.9, 881.3, -210.8, 881.6, 209.1, 881.3, 209.1, 881.3, 212.1, 865.4, 209.0, 864.8, -208.8, 848.4, 207.5, 838.4, 210.5, 838.1, 212.2, 827.7, 209.5, 826.6, -221.9, 795.2, 231.7, 762.7, 223.7, 770.7, 235.1, 782.2, 238.5, 801.7, -239.0, 804.0, 240.0, 804.4, 239.4, 806.4, 218.0, 839.2, 205.0, 847.4, -210.9, 881.3, 359.2, 595.6, 360.1, 607.6, 363.8, 608.6, 361.0, 619.6, -360.5, 623.2, 360.5, 623.2, 360.0, 626.8, 311.7, 667.4, 312.0, 667.8, -264.0, 708.7, 275.7, 699.7, 273.7, 697.1, 283.5, 685.5, 292.3, 675.0, -292.3, 675.0, 301.1, 664.5, 313.0, 650.4, 313.0, 650.4, 324.9, 636.3, -342.0, 615.9, 337.3, 605.7, 359.2, 595.6, 355.4, 543.6, 356.1, 553.6, -356.1, 553.6, 356.8, 563.5, 339.0, 591.0, 311.6, 612.4, 311.1, 611.9, -307.1, 608.3, 329.4, 583.6, 347.8, 555.3, 351.6, 549.5, 356.2, 544.4, -355.4, 543.6, 257.4, 569.9, 257.2, 564.7, 255.6, 564.2, 257.0, 559.6, -259.6, 544.0, 258.2, 543.6, 262.2, 528.4, 267.1, 506.8, 262.2, 505.2, -269.5, 484.6, 270.8, 480.4, 270.8, 480.4, 272.0, 476.1, 273.8, 480.1, -271.2, 481.3, 270.4, 486.5, 263.9, 528.2, 265.0, 528.4, 257.4, 569.9, -279.0, 460.9, 279.1, 460.5, 278.2, 460.2, 277.5, 459.5, 277.2, 459.3, -277.0, 459.2, 277.0, 459.0, 283.9, 435.5, 283.9, 435.5, 290.7, 411.9, -300.0, 420.9, 285.7, 436.7, 279.0, 460.9, 308.0, 359.7, 310.3, 354.7, -310.3, 354.7, 312.7, 349.7, 314.3, 352.2, 333.6, 348.9, 337.7, 340.1, -346.5, 353.4, 346.5, 353.4, 355.4, 366.8, 346.3, 374.7, 340.0, 384.6, -343.5, 389.8, 341.5, 391.6, 341.5, 391.6, 339.5, 393.3, 322.1, 378.5, -319.9, 378.9, 308.0, 359.7, 339.5, 393.3, 337.2, 395.3, 334.6, 396.8, -334.9, 397.3, 323.6, 396.7, 316.9, 390.7, 312.2, 396.0, 305.9, 388.8, -301.7, 380.5, 299.6, 381.6, 301.0, 376.6, 301.0, 376.6, 302.4, 371.7, -303.9, 365.4, 305.2, 365.7, 308.0, 359.7, 319.9, 378.9, 322.1, 378.5, -339.5, 393.3, 431.3, 441.1, 431.5, 441.2, 431.6, 441.2, 431.6, 441.3, -431.6, 441.3, 431.6, 441.3, 431.6, 441.3, 431.5, 441.2, 431.3, 441.1, -431.3, 441.1, 260.7, 497.6, 259.4, 503.9, 259.7, 503.9, 258.1, 510.1, -256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 249.4, 547.7, 250.8, 548.1, -242.9, 574.7, 241.7, 578.5, 241.8, 578.5, 240.7, 582.4, 239.4, 588.6, -238.4, 588.4, 236.0, 594.4, 240.5, 560.0, 241.1, 558.2, 234.6, 524.2, -242.6, 503.9, 242.6, 503.9, 250.5, 483.7, 249.5, 484.7, 258.5, 489.8, -260.7, 497.6, 250.5, 483.7, 251.2, 482.0, 251.0, 482.0, 251.8, 480.4, -262.3, 459.0, 262.3, 459.0, 272.8, 437.6, 267.5, 462.1, 267.9, 462.2, -262.9, 486.8, 261.5, 492.1, 261.8, 492.2, 260.7, 497.6, 258.5, 489.8, -249.5, 484.7, 250.5, 483.7, 114.3, 323.3, 109.4, 329.0, 106.1, 328.2, -104.4, 334.7, 90.8, 304.5, 90.8, 304.5, 77.2, 274.3, 74.8, 270.2, -76.4, 269.2, 75.5, 264.2, 92.4, 285.4, 90.4, 286.9, 105.3, 309.6, -109.8, 316.5, 114.5, 316.6, 114.3, 323.3, 721.8, 273.1, 724.6, 278.8, -723.0, 282.4, 727.4, 284.4, 727.4, 284.5, 723.5, 283.6, 719.5, 282.8, -717.0, 282.2, 717.0, 282.2, 714.4, 281.7, 699.8, 278.7, 698.9, 280.9, -685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5, 699.5, 266.0, -701.2, 266.2, 721.8, 273.1, 677.8, 267.5, 665.2, 253.8, 665.2, 253.8, -652.5, 240.0, 657.8, 242.9, 663.2, 236.4, 666.3, 239.8, 685.6, 239.6, -690.8, 230.9, 704.8, 239.4, 704.7, 256.2, 713.3, 256.2, 721.8, 273.1, -701.2, 266.2, 699.5, 266.0, 677.8, 267.5, 641.5, 196.5, 647.2, 188.0, -652.8, 179.4, 653.0, 179.5, 666.8, 183.7, 666.8, 183.7, 680.7, 187.9, -682.2, 199.0, 686.5, 202.6, 697.2, 208.4, 705.9, 219.2, 705.9, 219.2, -714.6, 230.0, 715.2, 230.7, 715.9, 231.3, 715.8, 231.4, 715.7, 231.6, -715.0, 231.0, 714.1, 230.6, 677.8, 213.5, 671.3, 221.4, 641.5, 196.5, -686.3, 276.8, 685.8, 276.2, 685.8, 276.2, 685.2, 275.6, 698.9, 280.9, -699.8, 278.7, 714.4, 281.7, 706.7, 273.4, 700.2, 279.7, 686.3, 276.8, -714.6, 230.0, 705.9, 219.2, 705.9, 219.2, 697.2, 208.4, 724.9, 223.3, -757.5, 228.9, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, -741.4, 229.6, 741.4, 229.6, 725.3, 229.8, 720.0, 229.9, 718.0, 232.5, -714.6, 230.0, 652.8, 277.4, 638.5, 251.0, 638.5, 251.0, 624.2, 224.7, -614.9, 214.5, 620.3, 210.2, 613.4, 197.3, 620.0, 204.5, 620.0, 204.5, -626.6, 211.7, 626.7, 211.8, 626.7, 211.8, 626.8, 212.0, 626.8, 212.0, -626.8, 212.0, 626.8, 212.0, 655.9, 255.9, 655.5, 256.1, 685.6, 299.3, -696.0, 315.0, 696.0, 315.0, 706.4, 330.7, 700.6, 324.6, 698.1, 326.9, -689.7, 323.2, 669.0, 302.6, 669.0, 301.8, 652.8, 277.4, 689.7, 323.2, -681.7, 319.5, 675.5, 321.6, 673.6, 315.9, 673.6, 315.8, 673.6, 315.8, -673.5, 315.8, 673.6, 315.7, 663.2, 296.6, 652.8, 277.4, 669.0, 301.8, -669.0, 302.6, 689.7, 323.2, 521.4, 200.9, 516.3, 200.1, 515.0, 201.9, -511.1, 199.4, 505.2, 196.6, 505.2, 196.6, 499.3, 193.9, 491.5, 190.5, -491.8, 189.9, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5, -427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 423.8, 153.6, 423.0, 154.3, -420.4, 151.4, 414.8, 145.9, 415.1, 145.5, 409.3, 140.3, 413.9, 139.4, -413.9, 139.4, 418.6, 138.4, 425.7, 140.2, 425.1, 142.3, 431.7, 146.3, -476.5, 173.6, 477.8, 171.7, 521.4, 200.9, 616.4, -54.1, 618.2, -44.7, -618.2, -44.7, 620.1, -35.4, 629.9, -28.1, 620.1, -14.9, 620.2, 5.5, -602.6, -10.4, 600.1, -7.7, 580.0, -20.8, 579.0, -36.3, 595.0, -46.3, -616.4, -54.1, 580.0, -20.8, 578.8, -21.6, 577.6, -21.7, 577.7, -22.4, -577.3, -31.7, 574.6, -40.2, 577.0, -41.0, 582.2, -57.8, 582.2, -57.8, -587.3, -74.6, 593.8, -76.3, 595.3, -80.4, 597.6, -88.0, 597.7, -88.2, -598.1, -88.3, 598.2, -88.1, 605.5, -82.0, 608.1, -83.2, 612.3, -75.3, -615.4, -75.0, 614.4, -64.7, 616.4, -54.1, 595.0, -46.3, 579.0, -36.3, -580.0, -20.8, 609.3, 615.1, 609.3, 614.5, 609.2, 614.5, 609.4, 614.0, -616.4, 598.5, 612.9, 586.0, 623.3, 583.1, 625.3, 579.5, 626.3, 579.7, -627.2, 575.8, 627.0, 576.2, 627.3, 576.4, 627.3, 576.9, 628.7, 597.0, -628.7, 597.0, 630.0, 617.0, 631.0, 631.0, 631.0, 631.0, 631.9, 644.9, -632.5, 653.6, 632.6, 653.6, 633.1, 662.4, 634.6, 686.3, 634.3, 686.3, -635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8, 636.4, 710.8, -635.9, 710.5, 635.9, 710.2, 636.2, 709.4, 634.9, 708.8, 633.8, 707.5, -620.9, 661.5, 621.3, 661.4, 609.3, 615.1, 633.8, 707.5, 632.3, 705.6, -630.8, 703.8, 630.9, 703.8, 624.7, 696.0, 624.7, 696.0, 618.6, 688.3, -618.4, 688.2, 618.4, 688.0, 618.3, 687.8, 622.9, 652.7, 628.7, 639.7, -609.2, 615.2, 609.3, 615.2, 609.3, 615.2, 609.3, 615.1, 621.3, 661.4, -620.9, 661.5, 633.8, 707.5, 696.0, 603.6, 696.3, 604.1, 696.3, 604.2, -696.7, 604.7, 695.6, 610.5, 701.1, 611.6, 705.5, 618.5, 685.3, 634.3, -691.7, 642.6, 678.0, 666.8, 683.9, 659.1, 680.8, 656.7, 683.7, 646.7, -686.2, 637.8, 686.2, 637.8, 688.7, 629.0, 692.4, 616.3, 691.9, 616.1, -696.0, 603.6, 727.2, 652.4, 737.6, 668.6, 733.2, 676.6, 747.9, 684.8, -750.0, 690.9, 751.5, 690.4, 755.2, 696.0, 744.3, 704.0, 749.3, 710.8, -743.5, 725.6, 743.6, 724.3, 741.7, 724.2, 739.9, 722.9, 734.8, 702.4, -736.2, 702.0, 732.4, 681.1, 729.8, 666.8, 732.9, 653.7, 727.2, 652.4, -679.5, 761.5, 665.9, 735.7, 670.8, 731.5, 652.3, 710.0, 654.4, 707.5, -654.4, 707.5, 656.6, 705.1, 664.6, 716.4, 661.9, 718.3, 667.3, 731.5, -671.8, 742.5, 671.8, 742.5, 676.3, 753.6, 677.2, 755.8, 677.2, 755.8, -678.1, 758.1, 678.8, 759.8, 678.6, 759.8, 679.5, 761.5, 579.1, 629.3, -577.6, 632.0, 576.4, 631.8, 576.1, 634.6, 575.6, 633.9, 575.6, 633.9, -575.0, 633.2, 566.0, 602.2, 564.8, 602.5, 554.6, 571.8, 558.1, 584.8, -560.0, 584.3, 565.3, 596.8, 572.2, 613.1, 574.3, 612.5, 579.1, 629.3, -559.9, 507.0, 561.9, 500.3, 563.0, 500.5, 564.0, 493.7, 568.0, 492.8, -572.1, 492.7, 572.1, 491.9, 576.3, 494.4, 580.8, 495.0, 580.6, 496.9, -584.7, 505.2, 590.1, 502.5, 599.7, 508.2, 583.8, 515.9, 577.2, 514.0, -559.9, 507.0, 613.0, 725.3, 604.5, 735.6, 603.8, 735.1, 595.9, 745.9, -592.5, 750.0, 588.2, 752.9, 589.1, 754.2, 590.3, 743.5, 587.9, 743.2, -586.8, 732.3, 588.7, 728.1, 593.8, 730.4, 600.8, 728.6, 606.9, 726.9, -612.1, 728.4, 613.0, 725.3, 576.6, 650.0, 574.9, 663.4, 567.3, 670.3, -573.1, 676.7, 567.5, 713.8, 563.1, 714.0, 563.4, 751.1, 558.5, 743.3, -558.5, 743.3, 553.7, 735.5, 559.4, 692.0, 562.7, 692.0, 576.6, 650.0, -553.7, 735.5, 549.1, 728.1, 549.1, 728.1, 544.4, 720.7, 538.1, 710.3, -538.0, 710.4, 531.6, 700.1, 547.8, 681.1, 560.5, 679.5, 560.3, 659.1, -568.5, 654.3, 571.0, 656.4, 576.7, 649.6, 576.6, 649.8, 576.6, 649.8, -576.6, 650.0, 562.7, 692.0, 559.4, 692.0, 553.7, 735.5, 601.6, 740.8, -602.5, 740.0, 602.5, 740.0, 603.4, 739.3, 608.2, 747.5, 607.2, 748.1, -611.1, 756.9, 611.2, 757.0, 611.2, 757.0, 611.2, 757.1, 616.2, 764.3, -611.1, 767.9, 611.0, 778.7, 611.9, 774.5, 609.9, 774.1, 608.7, 769.4, -605.2, 755.1, 604.2, 755.3, 601.6, 740.8, 630.4, 715.1, 633.1, 712.6, -634.5, 713.3, 635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8, -637.3, 715.8, 640.3, 720.1, 643.6, 719.9, 648.2, 734.2, 653.5, 732.4, -663.5, 745.0, 660.2, 736.0, 655.5, 737.8, 647.5, 730.5, 638.9, 722.8, -635.8, 724.6, 630.4, 715.1, 556.0, 871.7, 550.9, 851.6, 545.8, 831.4, -545.8, 831.4, 546.6, 829.6, 545.2, 829.0, 544.5, 826.6, 554.0, 824.7, -563.2, 824.2, 564.4, 827.7, 569.6, 842.9, 560.9, 845.9, 557.4, 864.1, -556.7, 867.9, 554.8, 868.6, 556.0, 871.7, 514.8, 533.6, 503.1, 533.1, -491.9, 530.4, 491.4, 532.6, 486.1, 528.4, 475.4, 529.7, 474.6, 531.9, -474.7, 530.5, 474.7, 530.5, 474.8, 529.0, 469.2, 522.9, 486.6, 506.8, -498.4, 484.5, 495.6, 487.0, 501.4, 493.6, 504.5, 502.6, 508.3, 514.0, -508.3, 514.0, 512.1, 525.5, 513.5, 529.6, 514.9, 533.6, 514.8, 533.6, -448.4, 376.8, 447.4, 374.6, 447.4, 374.6, 446.4, 372.4, 448.0, 361.3, -448.9, 361.0, 447.8, 349.9, 451.7, 335.6, 451.7, 335.6, 455.6, 321.4, -462.3, 334.2, 453.4, 338.8, 451.1, 356.2, 449.7, 366.5, 451.2, 367.0, -448.4, 376.8, 442.2, 641.3, 444.8, 630.6, 447.3, 619.8, 447.3, 619.8, -450.4, 607.2, 451.7, 607.4, 453.5, 594.6, 455.3, 625.3, 455.3, 625.3, -457.1, 655.9, 458.4, 650.7, 444.6, 650.0, 442.2, 641.3, 305.5, 617.8, -304.9, 615.7, 308.3, 614.8, 311.1, 611.9, 311.6, 612.4, 339.0, 591.0, -356.8, 563.5, 358.0, 579.6, 358.0, 579.6, 359.2, 595.6, 337.3, 605.7, -342.0, 615.9, 324.9, 636.3, 323.8, 637.1, 319.9, 631.5, 314.9, 626.8, -310.2, 622.3, 306.8, 623.1, 305.5, 617.8, 273.1, 632.1, 273.6, 645.9, -270.9, 655.3, 260.4, 660.1, 260.0, 649.2, 260.0, 649.2, 259.6, 638.3, -262.0, 633.2, 273.2, 635.0, 273.1, 632.1, 356.6, 461.0, 355.1, 470.8, -349.6, 477.1, 353.6, 480.6, 347.2, 481.7, 347.2, 481.7, 340.7, 482.8, -342.5, 471.0, 347.1, 462.7, 356.6, 461.0, 410.9, 428.7, 421.1, 434.9, -421.1, 434.9, 431.3, 441.1, 431.3, 441.1, 431.5, 441.2, 431.6, 441.3, -429.9, 448.1, 429.0, 448.0, 428.3, 454.9, 428.0, 458.4, 427.4, 458.4, -426.6, 461.9, 426.5, 460.5, 422.7, 460.9, 418.9, 459.8, 417.7, 449.6, -393.3, 452.4, 367.8, 445.0, 367.1, 442.5, 388.9, 430.0, 410.9, 428.7, -367.8, 445.0, 366.6, 444.6, 365.4, 444.7, 365.4, 444.3, 359.8, 439.8, -359.8, 439.8, 354.1, 435.3, 368.9, 434.1, 368.0, 423.2, 381.9, 411.1, -389.8, 423.9, 396.4, 419.9, 410.9, 428.7, 388.9, 430.0, 367.1, 442.5, -367.8, 445.0, 68.2, 220.7, 67.1, 213.8, 64.9, 213.5, 65.9, 206.9, -66.4, 193.9, 65.6, 193.9, 66.9, 181.0, 67.2, 178.0, 67.2, 178.0, -67.4, 175.0, 67.9, 176.4, 68.0, 176.4, 68.6, 177.8, 82.1, 176.7, -85.3, 216.6, 101.9, 255.4, 102.1, 238.2, 82.5, 239.9, 68.2, 220.7, -819.3, 199.5, 818.6, 198.6, 817.2, 199.7, 816.1, 198.8, 809.4, 191.8, -809.4, 191.8, 802.7, 184.8, 805.2, 187.7, 805.6, 187.3, 808.4, 189.9, -810.7, 191.9, 810.7, 191.9, 813.0, 194.0, 816.1, 196.8, 817.1, 196.1, -819.3, 199.5, 916.9, 264.8, 867.2, 232.5, 861.1, 193.4, 817.5, 200.3, -816.8, 199.5, 816.8, 199.5, 816.1, 198.8, 817.2, 199.7, 818.6, 198.6, -819.3, 199.5, 857.7, 208.5, 857.7, 208.3, 896.1, 217.4, 896.2, 217.4, -896.3, 217.5, 896.3, 217.7, 906.7, 241.2, 902.2, 261.5, 916.9, 264.8, -896.3, 217.7, 896.4, 217.7, 896.5, 217.6, 896.6, 217.7, 912.8, 229.1, -912.7, 229.3, 929.0, 240.6, 934.5, 244.9, 934.5, 244.9, 940.1, 249.1, -943.0, 254.3, 941.7, 255.7, 941.3, 262.2, 941.3, 262.5, 939.2, 262.7, -939.3, 263.2, 939.6, 265.2, 925.6, 266.1, 925.5, 269.8, 925.5, 269.9, -925.2, 269.9, 925.0, 270.0, 922.6, 266.3, 921.0, 267.4, 916.9, 264.8, -904.8, 242.3, 906.9, 241.2, 896.6, 217.7, 896.5, 217.6, 896.4, 217.7, -896.3, 217.7, 638.0, 224.2, 633.7, 219.4, 633.7, 219.4, 629.3, 214.7, -636.9, 207.0, 635.4, 205.6, 641.5, 196.5, 671.3, 221.4, 677.8, 213.5, -714.1, 230.6, 713.9, 232.2, 675.4, 231.2, 638.0, 224.2, 714.1, 230.6, -715.0, 231.0, 715.7, 231.6, 715.8, 231.4, 719.2, 235.0, 721.8, 239.3, -722.0, 239.1, 714.5, 236.3, 704.8, 239.2, 704.8, 239.4, 690.8, 230.9, -685.6, 239.6, 666.3, 239.8, 656.3, 228.9, 652.4, 224.8, 638.7, 224.9, -638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 675.4, 231.2, 713.9, 232.2, -714.1, 230.6, 719.5, 282.8, 723.5, 283.6, 727.4, 284.5, 727.4, 284.4, -744.5, 291.9, 765.0, 289.6, 764.8, 292.2, 770.3, 294.4, 771.1, 303.5, -773.3, 302.8, 766.0, 305.3, 763.9, 299.3, 754.4, 295.7, 737.0, 289.2, -736.7, 290.0, 719.5, 282.8, 725.3, 229.8, 741.4, 229.6, 741.4, 229.6, -757.4, 229.3, 769.7, 237.1, 769.7, 237.1, 782.1, 244.9, 778.4, 241.6, -776.7, 243.5, 771.3, 242.0, 748.3, 235.9, 740.9, 244.0, 725.3, 229.8, -519.0, 181.6, 528.0, 190.6, 526.3, 193.5, 537.0, 199.6, 538.5, 201.6, -538.5, 201.6, 540.0, 203.6, 532.3, 199.4, 530.7, 202.2, 521.4, 200.9, -477.8, 171.7, 476.5, 173.6, 431.7, 146.3, 434.6, 169.1, 477.1, 160.4, -519.0, 181.6, 431.7, 146.3, 425.1, 142.3, 425.7, 140.2, 418.6, 138.4, -432.6, 135.3, 433.1, 136.8, 446.7, 132.3, 455.3, 131.1, 458.1, 133.7, -463.7, 128.7, 464.0, 128.4, 464.3, 128.6, 464.8, 128.5, 471.2, 135.4, -471.8, 134.9, 478.7, 141.4, 503.0, 150.3, 498.8, 161.5, 519.0, 181.6, -477.1, 160.4, 434.6, 169.1, 431.7, 146.3, 662.2, 550.8, 669.9, 559.1, -668.4, 560.5, 674.6, 570.2, 678.1, 576.1, 676.7, 578.5, 682.0, 581.7, -681.3, 582.6, 684.2, 587.1, 685.3, 586.9, 687.4, 596.0, 690.6, 595.2, -696.0, 603.6, 691.9, 616.1, 692.4, 616.3, 688.7, 629.0, 673.2, 615.5, -681.1, 606.5, 673.4, 583.9, 669.5, 572.2, 669.5, 572.2, 665.5, 560.5, -663.8, 555.6, 665.4, 554.2, 662.2, 550.8, 721.2, 708.8, 711.9, 701.9, -712.2, 701.4, 702.6, 694.9, 693.5, 684.1, 688.8, 682.7, 688.3, 669.9, -688.6, 678.5, 695.3, 678.2, 702.3, 686.5, 711.7, 697.7, 720.7, 697.3, -721.2, 708.8, 661.0, 700.0, 661.9, 699.0, 662.6, 699.1, 662.7, 698.1, -676.1, 684.5, 675.3, 683.7, 687.9, 669.3, 687.9, 669.4, 688.1, 669.6, -688.3, 669.9, 688.8, 682.7, 693.5, 684.1, 702.6, 694.9, 703.6, 695.6, -703.3, 696.1, 703.9, 697.2, 692.5, 699.2, 692.3, 698.0, 680.6, 698.7, -675.1, 699.1, 675.1, 699.1, 669.6, 699.4, 665.3, 699.7, 665.1, 700.8, -661.0, 700.0, 592.4, 572.5, 589.3, 586.8, 582.8, 599.4, 586.2, 601.1, -580.0, 612.0, 575.6, 621.5, 580.6, 626.7, 579.9, 628.0, 579.9, 628.0, -579.1, 629.3, 574.3, 612.5, 572.2, 613.1, 565.3, 596.8, 568.7, 582.3, -581.8, 570.3, 592.4, 572.5, 565.3, 596.8, 560.0, 584.3, 558.1, 584.8, -554.6, 571.8, 550.9, 560.4, 544.2, 551.1, 547.1, 549.0, 547.3, 547.2, -546.7, 546.9, 547.5, 545.3, 549.5, 538.2, 549.5, 538.2, 551.5, 531.1, -551.5, 531.2, 552.3, 531.5, 552.2, 531.6, 554.8, 533.5, 554.8, 533.5, -557.4, 535.4, 576.0, 549.0, 579.0, 546.1, 594.5, 562.6, 593.4, 567.5, -593.4, 567.5, 592.4, 572.5, 581.8, 570.3, 568.7, 582.3, 565.3, 596.8, -605.0, 514.1, 599.8, 538.4, 599.8, 538.4, 594.5, 562.6, 579.0, 546.1, -576.0, 549.0, 557.4, 535.4, 560.7, 520.3, 594.6, 506.5, 605.0, 514.1, -557.4, 535.4, 554.8, 533.5, 554.8, 533.5, 552.2, 531.6, 556.4, 519.4, -556.0, 519.3, 559.9, 507.0, 577.2, 514.0, 583.8, 515.9, 599.7, 508.2, -602.6, 509.9, 602.6, 509.9, 605.6, 511.6, 605.8, 511.8, 605.3, 512.9, -605.0, 514.1, 594.6, 506.5, 560.7, 520.3, 557.4, 535.4, 600.8, 728.6, -593.8, 730.4, 588.7, 728.1, 586.8, 732.3, 583.7, 702.7, 583.7, 702.7, -580.6, 673.2, 581.2, 674.9, 583.3, 674.2, 586.0, 675.3, 595.4, 701.2, -600.4, 701.8, 600.8, 728.6, 586.0, 675.3, 602.3, 681.8, 602.2, 681.9, -618.6, 688.3, 624.7, 696.0, 624.7, 696.0, 630.9, 703.8, 620.4, 712.7, -621.9, 714.5, 613.0, 725.3, 612.1, 728.4, 606.9, 726.9, 600.8, 728.6, -600.4, 701.8, 595.4, 701.2, 586.0, 675.3, 610. |