pax_global_header00006660000000000000000000000064133244303170014512gustar00rootroot0000000000000052 comment=1fd7db81049cf0f26abe70acdf6d59bf7e47e8e3 pgsphere/000077500000000000000000000000001332443031700126735ustar00rootroot00000000000000pgsphere/.gitignore000066400000000000000000000000701332443031700146600ustar00rootroot00000000000000*.o *.so /*.sql /results regression.out regression.diffspgsphere/COPYRIGHT.pg_sphere000066400000000000000000000030141332443031700161370ustar00rootroot00000000000000Copyright (c) 2003-2017, pgSphere development team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the pgSphere development team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pgsphere/Makefile000066400000000000000000000035621332443031700143410ustar00rootroot00000000000000 PGSPHERE_VERSION = 1.1.5 # the base dir name may be changed depending on git clone command SRC_DIR = $(shell basename $(shell pwd)) MODULE_big = pg_sphere OBJS = sscan.o sparse.o sbuffer.o vector3d.o point.o \ euler.o circle.o line.o ellipse.o polygon.o \ path.o box.o output.o gq_cache.o gist.o key.o \ gnomo.o EXTENSION = pg_sphere DATA_built = pg_sphere--1.0.sql DOCS = README.pg_sphere COPYRIGHT.pg_sphere REGRESS = init tables points euler circle line ellipse poly path box index \ contains_ops contains_ops_compat bounding_box_gist gnomo EXTRA_CLEAN = pg_sphere--1.0.sql $(PGS_SQL) CRUSH_TESTS = init_extended circle_extended # order of sql files is important PGS_SQL = pgs_types.sql pgs_point.sql pgs_euler.sql pgs_circle.sql \ pgs_line.sql pgs_ellipse.sql pgs_polygon.sql pgs_path.sql \ pgs_box.sql pgs_contains_ops.sql pgs_contains_ops_compat.sql \ pgs_gist.sql gnomo.sql \ ifdef USE_PGXS ifndef PG_CONFIG PG_CONFIG := pg_config endif PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else subdir = contrib/pg_sphere top_builddir = ../.. PG_CONFIG := $(top_builddir)/src/bin/pg_config/pg_config include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif crushtest: REGRESS += $(CRUSH_TESTS) crushtest: installcheck pg_sphere--1.0.sql: $(addsuffix .in, $(PGS_SQL)) cat $^ > $@ sscan.o : sparse.c sparse.c: sparse.y ifdef YACC $(YACC) -d $(YFLAGS) -p sphere_yy -o sparse.c $< else @$(missing) bison $< $@ endif sscan.c : sscan.l ifdef FLEX $(FLEX) $(FLEXFLAGS) -Psphere -o$@ $< else @$(missing) flex $< $@ endif dist : clean sparse.c sscan.c find . -name '*~' -type f -exec rm {} \; cd .. && tar --transform s/$(SRC_DIR)/pgsphere-$(PGSPHERE_VERSION)/ --exclude CVS -czf pgsphere-$(PGSPHERE_VERSION).tar.gz $(SRC_DIR) && cd - pgsphere/README.pg_sphere000066400000000000000000000014431332443031700155300ustar00rootroot00000000000000This is an R-Tree implementation using GiST for spherical objects like spherical points and spherical circles with useful functions and operators. NOTICE: This version will work only with postgresql version 9.1 and above. INSTALLATION: -- build and install gmake USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config gmake USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config install -- load extension psql -c "CREATE EXTENSION pg_sphere;" REGRESSION TEST (as the same user as the currently running postgresql server): make USE_PGXS=1 installcheck LONG REGRESSION TEST: make USE_PGXS=1 crushtest The 'make' program must be compatible with GNU make. For more information, have a look at http://pgsphere.projects.postgresql.org and https://github.com/akorotkov/pgsphere Have a lot of fun! pgsphere/box.c000066400000000000000000001030611332443031700136300ustar00rootroot00000000000000#include "box.h" PG_FUNCTION_INFO_V1(spherebox_in); PG_FUNCTION_INFO_V1(spherebox_in_from_points); PG_FUNCTION_INFO_V1(spherebox_sw); PG_FUNCTION_INFO_V1(spherebox_ne); PG_FUNCTION_INFO_V1(spherebox_se); PG_FUNCTION_INFO_V1(spherebox_nw); PG_FUNCTION_INFO_V1(spherebox_area); PG_FUNCTION_INFO_V1(spherebox_circ); PG_FUNCTION_INFO_V1(spherebox_equal); PG_FUNCTION_INFO_V1(spherebox_equal_neg); PG_FUNCTION_INFO_V1(spherebox_cont_point); PG_FUNCTION_INFO_V1(spherebox_cont_point_neg); PG_FUNCTION_INFO_V1(spherebox_cont_point_com); PG_FUNCTION_INFO_V1(spherebox_cont_point_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_circle); PG_FUNCTION_INFO_V1(spherebox_cont_circle_neg); PG_FUNCTION_INFO_V1(spherebox_cont_circle_com); PG_FUNCTION_INFO_V1(spherebox_cont_circle_com_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_box); PG_FUNCTION_INFO_V1(spherecircle_cont_box_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_box_com); PG_FUNCTION_INFO_V1(spherecircle_cont_box_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_circle); PG_FUNCTION_INFO_V1(spherebox_overlap_circle_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_circle_com); PG_FUNCTION_INFO_V1(spherebox_overlap_circle_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_line); PG_FUNCTION_INFO_V1(spherebox_cont_line_neg); PG_FUNCTION_INFO_V1(spherebox_cont_line_com); PG_FUNCTION_INFO_V1(spherebox_cont_line_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_line); PG_FUNCTION_INFO_V1(spherebox_overlap_line_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_line_com); PG_FUNCTION_INFO_V1(spherebox_overlap_line_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_path); PG_FUNCTION_INFO_V1(spherebox_cont_path_neg); PG_FUNCTION_INFO_V1(spherebox_cont_eq_path_com); PG_FUNCTION_INFO_V1(spherebox_cont_path_com); PG_FUNCTION_INFO_V1(spherebox_cont_path_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_path); PG_FUNCTION_INFO_V1(spherebox_overlap_path_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_path_com); PG_FUNCTION_INFO_V1(spherebox_overlap_path_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_poly); PG_FUNCTION_INFO_V1(spherebox_cont_poly_neg); PG_FUNCTION_INFO_V1(spherebox_cont_poly_com); PG_FUNCTION_INFO_V1(spherebox_cont_poly_com_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_box); PG_FUNCTION_INFO_V1(spherepoly_cont_box_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_box_com); PG_FUNCTION_INFO_V1(spherepoly_cont_box_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_poly); PG_FUNCTION_INFO_V1(spherebox_overlap_poly_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_poly_com); PG_FUNCTION_INFO_V1(spherebox_overlap_poly_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_ellipse); PG_FUNCTION_INFO_V1(spherebox_cont_ellipse_neg); PG_FUNCTION_INFO_V1(spherebox_cont_ellipse_com); PG_FUNCTION_INFO_V1(spherebox_cont_ellipse_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_box); PG_FUNCTION_INFO_V1(sphereellipse_cont_box_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_box_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_box_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_ellipse); PG_FUNCTION_INFO_V1(spherebox_overlap_ellipse_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_ellipse_com); PG_FUNCTION_INFO_V1(spherebox_overlap_ellipse_com_neg); PG_FUNCTION_INFO_V1(spherebox_cont_box); PG_FUNCTION_INFO_V1(spherebox_cont_box_neg); PG_FUNCTION_INFO_V1(spherebox_cont_box_com); PG_FUNCTION_INFO_V1(spherebox_cont_box_com_neg); PG_FUNCTION_INFO_V1(spherebox_overlap_box); PG_FUNCTION_INFO_V1(spherebox_overlap_box_neg); /* * Checks the box: if the latitude of a south-west corner is larger * than that of a north-east corner, swap both positions. */ static void sbox_check(SBOX *box) { if (FPgt(box->sw.lat, box->ne.lat)) { /* swap */ SPoint sp; memcpy((void *) &sp, (void *) &box->sw, sizeof(SPoint)); memcpy((void *) &box->sw, (void *) &box->ne, sizeof(SPoint)); memcpy((void *) &box->ne, (void *) &sp, sizeof(SPoint)); } if (FPeq(box->sw.lng, box->ne.lng) && FPne(box->sw.lat, box->ne.lat)) { box->sw.lng = 0.0; box->ne.lng = PID; } } /* * Puts the 'center' of a box b' into a point 'c' and returns it. */ static void sbox_center(SPoint *c, const SBOX *b) { c->lat = (b->ne.lat + b->sw.lat) / 2.0; c->lng = (b->ne.lng + b->sw.lng) / 2.0; if (FPgt(b->sw.lng, b->ne.lng)) c->lng += PI; } /* * Relationship between a circle and a box as PGS_BOX_CIRCLE_REL int8 value. */ static int8 sbox_circle_pos(const SCIRCLE *sc, const SBOX *sb) { if (FPlt((sc->center.lat + sc->radius), sb->sw.lat)) { return PGS_BOX_CIRCLE_AVOID; } else if (FPgt((sc->center.lat - sc->radius), sb->ne.lat)) { return PGS_BOX_CIRCLE_AVOID; } else if (FPzero(sb->sw.lng) && FPeq(sb->ne.lng, PID)) { /* full latitude range */ const SPoint tmpn = {0.0, PIH}; const SPoint tmps = {0.0, -PIH}; if (spoint_eq(&sb->ne, &tmpn) && FPge(sc->center.lat - sc->radius, sb->sw.lat)) { if (spoint_eq(&sc->center, &tmpn) && FPeq(sc->radius, (PIH - sb->sw.lat))) { return PGS_BOX_CIRCLE_EQUAL; } else { return PGS_BOX_CONT_CIRCLE; } } else if (spoint_eq(&sb->sw, &tmps) && FPle(sc->center.lat + sc->radius, sb->ne.lat)) { if (spoint_eq(&sc->center, &tmps) && FPeq(sc->radius, (PIH + sb->ne.lat))) { return PGS_BOX_CIRCLE_EQUAL; } else { return PGS_BOX_CONT_CIRCLE; } } else if (FPle((sc->center.lat + sc->radius), sb->ne.lat) && FPge((sc->center.lat - sc->radius), sb->sw.lat) ) { return PGS_BOX_CONT_CIRCLE; } else { return PGS_BOX_CIRCLE_OVER; } } else { bool lat_b_cont_c = ((sc->center.lat + sc->radius) <= sb->ne.lat) && ((sc->center.lat - sc->radius) >= sb->sw.lat); bool bcc = sbox_cont_point(sb, &sc->center); bool ccb = false; int8 pw, pe; SLine bw, be; /* west and east boundary */ SPoint bc; SPoint p1, p2; /* center */ sbox_center(&bc, sb); ccb = spoint_in_circle(&bc, sc); p1.lat = sb->sw.lat; p2.lat = sb->ne.lat; /* west */ p1.lng = p2.lng = sb->sw.lng; sline_from_points(&bw, &p1, &p2); /* east */ p1.lng = p2.lng = sb->ne.lng; sline_from_points(&be, &p1, &p2); /* check E/W boundaries */ pw = sphereline_circle_pos(&bw, sc); pe = sphereline_circle_pos(&be, sc); if (pw == PGS_CIRCLE_LINE_AVOID && pe == PGS_CIRCLE_LINE_AVOID) { if (bcc && lat_b_cont_c) { return PGS_BOX_CONT_CIRCLE; } return PGS_BOX_CIRCLE_AVOID; } if (pw == PGS_CIRCLE_CONT_LINE && pe == PGS_CIRCLE_CONT_LINE) { if (ccb) { return PGS_CIRCLE_CONT_BOX; } return PGS_BOX_CIRCLE_OVER; } if (bcc && lat_b_cont_c) { bool touw = false, toue = false; if (pw == PGS_CIRCLE_LINE_OVER) { touw = sline_circle_touch(&bw, sc); } if (pw == PGS_CIRCLE_LINE_OVER) { toue = sline_circle_touch(&be, sc); } if (touw && toue) { return PGS_BOX_CONT_CIRCLE; } else if (touw && pe == PGS_CIRCLE_LINE_AVOID) { return PGS_BOX_CONT_CIRCLE; } if (toue && pw == PGS_CIRCLE_LINE_AVOID) { return PGS_BOX_CONT_CIRCLE; } return PGS_BOX_CIRCLE_OVER; } return PGS_BOX_CIRCLE_OVER; } return PGS_BOX_CIRCLE_AVOID; } /* * Relationship between a line and a box as PGS_BOX_LINE_REL int8 value. */ static int8 sbox_line_pos(const SLine *sl, const SBOX *sb) { SPoint p1, p2, pbg, ped; SPoint lc[4]; int8 pw, pe, lcn, lcs; SLine bw, be; float8 minlat, maxlat; sline_begin(&pbg, sl); sline_end(&ped, sl); if (FPzero(sl->length)) { if (sbox_cont_point(sb, &pbg)) { return PGS_BOX_CONT_LINE; } else { return PGS_BOX_LINE_AVOID; } } sline_min_max_lat(sl, &minlat, &maxlat); if (FPgt(minlat, sb->ne.lat)) return PGS_BOX_LINE_AVOID; if (FPlt(maxlat, sb->sw.lat)) return PGS_BOX_LINE_AVOID; if (FPzero(sb->sw.lng) && FPeq(sb->ne.lng, PID)) { /* full latitude range */ if (FPle(sb->sw.lat, minlat) && FPle(maxlat, sb->ne.lat)) { return PGS_BOX_CONT_LINE; } return PGS_BOX_LINE_OVER; } /* create east/west boundaries */ p1.lat = sb->sw.lat; p2.lat = sb->ne.lat; /* west */ p1.lng = p2.lng = sb->sw.lng; sline_from_points(&bw, &p1, &p2); /* east */ p1.lng = p2.lng = sb->ne.lng; sline_from_points(&be, &p1, &p2); /* special case: east/west boundaries are connected */ if ((FPeq(sb->ne.lat, PIH) || FPeq(sb->sw.lat, -PIH)) && FPeq(fabs(sb->sw.lng - sb->ne.lng), PI)) { if (FPeq(sb->ne.lat, PIH)) { /* west */ p1.lat = sb->sw.lat; p2.lat = sb->ne.lat; p1.lng = p2.lng = sb->sw.lng; sline_from_points(&bw, &p1, &p2); bw.length *= 2; } if (FPeq(sb->ne.lat, PIH)) { /* west */ p1.lat = sb->ne.lat; p2.lat = sb->sw.lat; p1.lng = p2.lng = sb->ne.lng; sline_from_points(&be, &p1, &p2); be.length *= 2; } } pw = sline_sline_pos(&bw, sl); pe = sline_sline_pos(&be, sl); if (pw == PGS_LINE_EQUAL || pe == PGS_LINE_EQUAL) { return PGS_BOX_CONT_LINE; } if (pw == PGS_LINE_CONT_LINE || pe == PGS_LINE_CONT_LINE) { return PGS_BOX_CONT_LINE; } if (pw == PGS_LINE_CROSS || pe == PGS_LINE_CROSS) { if (pw == PGS_LINE_CROSS) { if (!spoint_at_sline(&pbg, &bw) && !spoint_at_sline(&ped, &bw)) { return PGS_BOX_LINE_OVER; } } if (pe == PGS_LINE_CROSS) { if (!spoint_at_sline(&pbg, &be) && !spoint_at_sline(&ped, &be)) { return PGS_BOX_LINE_OVER; } } } if (pw == PGS_LINE_OVER || pe == PGS_LINE_OVER) { return PGS_BOX_LINE_OVER; } /* check latitude */ lcn = sphereline_latitude_points(sl, sb->ne.lat, &lc[0], &lc[1]); if (lcn < 0) lcn = 0; lcs = sphereline_latitude_points(sl, sb->sw.lat, &lc[lcn], &lc[lcn + 1]); if (lcs < 0) lcs = 0; lcn += lcs; pw = sbox_cont_point(sb, &pbg); pe = sbox_cont_point(sb, &ped); if (pw && pe) { SPoint sp; int i; for (i = 0; i < lcn; i++) { if (sbox_cont_point(sb, &lc[i]) && (!spoint_eq(&pbg, &lc[i]) && !spoint_eq(&ped, &lc[i]))) { return PGS_BOX_LINE_OVER; } } /* check center */ sline_center(&sp, sl); if (sbox_cont_point(sb, &sp)) { return PGS_BOX_CONT_LINE; } else { return PGS_BOX_LINE_OVER; } } else if (!pw && !pe) { int i; for (i = 0; i < lcn; i++) { if (sbox_cont_point(sb, &lc[i])) { return PGS_BOX_LINE_OVER; } } return PGS_BOX_LINE_AVOID; } return PGS_BOX_LINE_OVER; } /* * Returns the relationship between a box and a path as * PGS_BOX_PATH_REL int8 value. */ static int8 sbox_path_pos(const SPATH *path, const SBOX *box) { int8 pos; int32 i; SLine sl; int32 n; const int8 sb_in = (1 << PGS_BOX_CONT_LINE); const int8 sb_ov = (1 << PGS_BOX_LINE_OVER); const int8 sb_os = (1 << PGS_BOX_LINE_AVOID); n = path->npts - 1; pos = 0; if (spoint_eq(&box->sw, &box->ne)) { if (spath_cont_point(path, &box->sw)) { return PGS_BOX_PATH_OVER; } else { return PGS_BOX_PATH_AVOID; } } for (i = 0; i < n; i++) { spath_segment(&sl, path, i); pos |= (1 << sbox_line_pos(&sl, box)); if (pos & sb_ov) { return PGS_BOX_PATH_OVER; } } if (pos == sb_in) { /* all lines inside box */ /* box contains path */ return PGS_BOX_CONT_PATH; } else if (pos == sb_os) { /* all lines outside box */ /* box outside path */ return PGS_BOX_PATH_AVOID; } /* box and polygon overlap */ return PGS_BOX_PATH_OVER; } /* * Returns the relationship between a polygon and a box as * PGS_BOX_POLY_REL int8 value. */ static int8 sbox_poly_pos(const SPOLY *poly, const SBOX *box) { int8 pos = 0; int32 i; SLine sl; SPoint sp; bool pcp; const int8 sb_in = (1 << PGS_BOX_CONT_LINE); const int8 sb_ov = (1 << PGS_BOX_LINE_OVER); const int8 sb_os = (1 << PGS_BOX_LINE_AVOID); sbox_center(&sp, box); pcp = spoly_contains_point(poly, &sp); if (spoint_eq(&box->sw, &box->ne)) { if (pcp) { return PGS_POLY_CONT_BOX; } else { return PGS_BOX_POLY_AVOID; } } for (i = 0; i < poly->npts; i++) { spoly_segment(&sl, poly, i); pos |= (1 << sbox_line_pos(&sl, box)); if (((pos & sb_in) && (pos & sb_os)) || (pos & sb_ov)) { /* overlaps */ return PGS_BOX_POLY_OVER; } } if ((pos & sb_in) == pos) { /* all lines inside box; box contains polygon */ return PGS_BOX_CONT_POLY; } else if ((pos & sb_os) == pos) { /* all lines outside box */ if (pcp) { /* polygon contains box */ return PGS_POLY_CONT_BOX; } else { /* box outside polygon */ return PGS_BOX_POLY_AVOID; } } /* box and polygon overlap */ return PGS_BOX_POLY_OVER; } /* * Relationship between an ellipse and a box as PGS_BOX_ELLIPSE_REL int8 value. */ static int8 sbox_ellipse_pos(const SELLIPSE *ell, const SBOX *box) { SCIRCLE sco, sci; SPoint ec; int8 pw, pe, po, pi; SLine bw, be; if (spoint_eq(&box->sw, &box->ne)) { bool scp = sellipse_cont_point(ell, &box->sw); if (scp) { return PGS_ELLIPSE_CONT_BOX; } else { return PGS_BOX_ELLIPSE_AVOID; } } /* init circles */ sco.center.lng = sci.center.lng = 0.0; if (box->sw.lat >= 0.0 && box->ne.lat >= 0.0) { sco.center.lat = sci.center.lat = PIH; sco.radius = PIH - box->sw.lat; sci.radius = PIH - box->ne.lat; if (FPlt(sco.radius, PIH)) sco.radius += EPSILON; } else if (box->sw.lat <= 0.0 && box->ne.lat <= 0.0) { sco.center.lat = sci.center.lat = -PIH; sco.radius = PIH + box->sw.lat; sci.radius = PIH + box->ne.lat; if (FPlt(sco.radius, PIH)) sco.radius += EPSILON; } else { sco.center.lat = -PIH; /* south */ sci.center.lat = PIH; /* north */ sco.radius = PIH + box->sw.lat; sci.radius = PIH - box->ne.lat; if (FPgt(sco.radius, 0.0)) sco.radius -= EPSILON; } if (FPgt(sci.radius, 0.0)) sci.radius -= EPSILON; po = sellipse_circle_pos(ell, &sco); pi = sellipse_circle_pos(ell, &sci); /* check by latitude */ if (pi == PGS_CIRCLE_CONT_ELLIPSE || pi == PGS_ELLIPSE_CIRCLE_EQUAL) { return PGS_BOX_ELLIPSE_AVOID; } if (FPeq(sco.center.lat, sci.center.lat)) { if (po == PGS_ELLIPSE_CIRCLE_AVOID) { return PGS_BOX_ELLIPSE_AVOID; } if (FPzero(box->sw.lng) && FPeq(box->ne.lng, PID)) { /* full latitude range */ if ((po == PGS_CIRCLE_CONT_ELLIPSE || po == PGS_ELLIPSE_CIRCLE_EQUAL) && pi == PGS_ELLIPSE_CIRCLE_AVOID) { return PGS_BOX_CONT_ELLIPSE; } else { return PGS_BOX_ELLIPSE_OVER; } } } else { /* equator modus */ if (po == PGS_CIRCLE_CONT_ELLIPSE || po == PGS_ELLIPSE_CIRCLE_EQUAL) { return PGS_BOX_ELLIPSE_AVOID; } if (FPzero(box->sw.lng) && FPeq(box->ne.lng, PID)) { /* full latitude range */ if (po == PGS_ELLIPSE_CIRCLE_AVOID && pi == PGS_ELLIPSE_CIRCLE_AVOID) { return PGS_BOX_CONT_ELLIPSE; } else { return PGS_BOX_ELLIPSE_OVER; } } } sellipse_center(&ec, ell); if (FPgt(box->sw.lng, 0.0)) { sline_meridian(&bw, box->sw.lng - EPSILON); } else { sline_meridian(&bw, box->sw.lng); } sline_meridian(&be, box->ne.lng + EPSILON); pw = sellipse_line_pos(ell, &bw); pe = sellipse_line_pos(ell, &be); /* check meridians */ if (pw == PGS_ELLIPSE_LINE_AVOID && pe == PGS_ELLIPSE_LINE_AVOID) { /* center is between west and east meridians */ if ((FPgt(box->sw.lng, box->ne.lng) && (FPle(ec.lng, box->ne.lng) || FPgt(ec.lng, box->sw.lng))) || (FPle(box->sw.lng, box->ne.lng) && (FPge(ec.lng, box->sw.lng) && FPle(ec.lng, box->ne.lng)))) { if (FPeq(sco.center.lat, sci.center.lat)) { if ((po == PGS_CIRCLE_CONT_ELLIPSE || po == PGS_ELLIPSE_CIRCLE_EQUAL) && pi == PGS_ELLIPSE_CIRCLE_AVOID) { return PGS_BOX_CONT_ELLIPSE; } else { return PGS_BOX_ELLIPSE_OVER; } } else { /* equator modus */ if (po == PGS_ELLIPSE_CIRCLE_AVOID && pi == PGS_ELLIPSE_CIRCLE_AVOID) { return PGS_BOX_CONT_ELLIPSE; } else { return PGS_BOX_ELLIPSE_OVER; } } } return PGS_BOX_ELLIPSE_AVOID; } else { SPoint p1, p2; /* create east/west boundaries */ p1.lat = box->sw.lat; p2.lat = box->ne.lat; /* west */ p1.lng = p2.lng = box->sw.lng; sline_from_points(&bw, &p1, &p2); /* east */ p1.lng = p2.lng = box->ne.lng; sline_from_points(&be, &p1, &p2); pw = sellipse_line_pos(ell, &bw); pe = sellipse_line_pos(ell, &be); sbox_center(&ec, box); /* ellipse contains box */ if (pw == PGS_ELLIPSE_CONT_LINE && pe == PGS_ELLIPSE_CONT_LINE && sellipse_cont_point(ell, &ec)) { return PGS_ELLIPSE_CONT_BOX; } } return PGS_BOX_LINE_OVER; } /* * Relationship between two boxes as PGS_BOX_REL int8 value. */ static int8 sbox_box_pos(const SBOX *b1, const SBOX *b2, bool recheck) { SPoint p1, p2, bc; int8 pw, pe; SLine bw, be; bool scp; if (spoint_eq(&b2->sw, &b2->ne)) { scp = sbox_cont_point(b1, &b2->sw); if (scp) { return PGS_BOX_CONT; } else { return PGS_BOX_AVOID; } } if (FPzero(b1->sw.lng) && FPeq(b1->ne.lng, PID)) { /* full latitude range */ if (FPge(b2->sw.lat, b1->sw.lat) && FPle(b2->ne.lat, b1->ne.lat)) { return PGS_BOX_CONT; } else if (FPgt(b2->sw.lat, b1->ne.lat) || FPlt(b2->ne.lat, b1->sw.lat)) { return PGS_BOX_AVOID; } return PGS_BOX_OVER; } /* create east/west boundaries from b2 */ p1.lat = b2->sw.lat; p2.lat = b2->ne.lat; /* west */ p1.lng = p2.lng = b2->sw.lng; sline_from_points(&bw, &p1, &p2); /* east */ p1.lng = p2.lng = b2->ne.lng; sline_from_points(&be, &p1, &p2); pe = sbox_line_pos(&be, b1); pw = sbox_line_pos(&bw, b1); sbox_center(&bc, b2); scp = sbox_cont_point(b1, &bc); if (scp && pe == PGS_BOX_CONT_LINE && pw == PGS_BOX_CONT_LINE) { return PGS_BOX_CONT; } if (pe > PGS_BOX_LINE_AVOID || pw > PGS_BOX_LINE_AVOID) { return PGS_BOX_OVER; } if (!recheck) { pe = sbox_box_pos(b2, b1, true); if (pe == PGS_BOX_CONT) { return PGS_BOX_OVER; } } return PGS_BOX_AVOID; } bool sbox_eq(SBOX *b1, SBOX *b2) { return (spoint_eq(&b1->sw, &b2->sw) && spoint_eq(&b1->ne, &b2->ne)); } bool sbox_cont_point(const SBOX *b, const SPoint *p) { if ((FPeq(p->lat, b->ne.lat) && FPeq(p->lat, PIH)) || (FPeq(p->lat, b->sw.lat) && FPeq(p->lat, -PIH))) { return true; } if (FPlt(p->lat, b->sw.lat) || FPgt(p->lat, b->ne.lat)) { return false; } if (FPgt(b->sw.lng, b->ne.lng)) { if (FPlt(p->lng, b->sw.lng) && FPgt(p->lng, b->ne.lng)) return false; } else { if (FPlt(p->lng, b->sw.lng) || FPgt(p->lng, b->ne.lng)) return false; } return true; } Datum spherebox_in(PG_FUNCTION_ARGS) { SBOX *box = (SBOX *) palloc(sizeof(SBOX)); char *c = PG_GETARG_CSTRING(0); void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); if (!get_box(&box->sw.lng, &box->sw.lat, &box->ne.lng, &box->ne.lat)) { reset_buffer(); pfree(box); elog(ERROR, "spherebox_in: wrong data type"); PG_RETURN_NULL(); } spoint_check(&box->sw); spoint_check(&box->ne); sbox_check(box); reset_buffer(); PG_RETURN_POINTER(box); } Datum spherebox_in_from_points(PG_FUNCTION_ARGS) { SBOX *box = (SBOX *) palloc(sizeof(SBOX)); SPoint *p1 = (SPoint *) PG_GETARG_POINTER(0); SPoint *p2 = (SPoint *) PG_GETARG_POINTER(1); memcpy((void *) &box->sw, (void *) p1, sizeof(SPoint)); memcpy((void *) &box->ne, (void *) p2, sizeof(SPoint)); sbox_check(box); PG_RETURN_POINTER(box); } Datum spherebox_sw(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) palloc(sizeof(SPoint)); SBOX *box = (SBOX *) PG_GETARG_POINTER(0); memcpy((void *) p, (void *) &box->sw, sizeof(SPoint)); PG_RETURN_POINTER(p); } Datum spherebox_ne(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) palloc(sizeof(SPoint)); SBOX *box = (SBOX *) PG_GETARG_POINTER(0); memcpy((void *) p, (void *) &box->ne, sizeof(SPoint)); PG_RETURN_POINTER(p); } Datum spherebox_se(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) palloc(sizeof(SPoint)); SBOX *box = (SBOX *) PG_GETARG_POINTER(0); p->lng = box->ne.lng; p->lat = box->sw.lat; PG_RETURN_POINTER(p); } Datum spherebox_nw(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) palloc(sizeof(SPoint)); SBOX *box = (SBOX *) PG_GETARG_POINTER(0); p->lng = box->sw.lng; p->lat = box->ne.lat; PG_RETURN_POINTER(p); } Datum spherebox_area(PG_FUNCTION_ARGS) { SBOX *box = (SBOX *) PG_GETARG_POINTER(0); float8 a; if (FPgt(box->sw.lng, box->ne.lng)) { a = PID + box->ne.lng - box->sw.lng; } else { a = box->ne.lng - box->sw.lng; } a *= (sin(box->ne.lat) - sin(box->sw.lat)); PG_RETURN_FLOAT8(a); } Datum spherebox_circ(PG_FUNCTION_ARGS) { SBOX *box = (SBOX *) PG_GETARG_POINTER(0); float8 a; if (FPgt(box->sw.lng, box->ne.lng)) { a = PID + box->ne.lng - box->sw.lng; } else { a = box->ne.lng - box->sw.lng; } a = (a * cos(box->ne.lat) + a * cos(box->sw.lat)); a += 2 * (box->ne.lat - box->sw.lat); PG_RETURN_FLOAT8(a); } Datum spherebox_equal(PG_FUNCTION_ARGS) { SBOX *b1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *b2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_eq(b1, b2)); } Datum spherebox_equal_neg(PG_FUNCTION_ARGS) { SBOX *b1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *b2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!sbox_eq(b1, b2)); } Datum spherebox_cont_point(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_cont_point(b, p)); } Datum spherebox_cont_point_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!sbox_cont_point(b, p)); } Datum spherebox_cont_point_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_cont_point(b, p)); } Datum spherebox_cont_point_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!sbox_cont_point(b, p)); } Datum spherebox_cont_circle(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos == PGS_BOX_CONT_CIRCLE || pos == PGS_BOX_CIRCLE_EQUAL); } Datum spherebox_cont_circle_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos != PGS_BOX_CONT_CIRCLE && pos != PGS_BOX_CIRCLE_EQUAL); } Datum spherebox_cont_circle_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos == PGS_BOX_CONT_CIRCLE || pos == PGS_BOX_CIRCLE_EQUAL); } Datum spherebox_cont_circle_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos != PGS_BOX_CONT_CIRCLE && pos != PGS_BOX_CIRCLE_EQUAL); } Datum spherecircle_cont_box(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos == PGS_CIRCLE_CONT_BOX || pos == PGS_BOX_CIRCLE_EQUAL); } Datum spherecircle_cont_box_neg(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos != PGS_CIRCLE_CONT_BOX && pos != PGS_BOX_CIRCLE_EQUAL); } Datum spherecircle_cont_box_com(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos == PGS_CIRCLE_CONT_BOX || pos == PGS_BOX_CIRCLE_EQUAL); } Datum spherecircle_cont_box_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); int pos = sbox_circle_pos(c, b); PG_RETURN_BOOL(pos != PGS_CIRCLE_CONT_BOX && pos != PGS_BOX_CIRCLE_EQUAL); } Datum spherebox_overlap_circle(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_circle_pos(c, b) > PGS_BOX_CIRCLE_AVOID); } Datum spherebox_overlap_circle_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_circle_pos(c, b) > PGS_BOX_CIRCLE_AVOID)); } Datum spherebox_overlap_circle_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_circle_pos(c, b) > PGS_BOX_CIRCLE_AVOID); } Datum spherebox_overlap_circle_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_circle_pos(c, b) > PGS_BOX_CIRCLE_AVOID)); } Datum spherebox_cont_line(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_line_pos(l, b) == PGS_BOX_CONT_LINE); } Datum spherebox_cont_line_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_line_pos(l, b) == PGS_BOX_CONT_LINE)); } Datum spherebox_cont_line_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_line_pos(l, b) == PGS_BOX_CONT_LINE); } Datum spherebox_cont_line_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_line_pos(l, b) == PGS_BOX_CONT_LINE)); } Datum spherebox_overlap_line(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_line_pos(l, b) > PGS_BOX_LINE_AVOID); } Datum spherebox_overlap_line_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_line_pos(l, b) > PGS_BOX_LINE_AVOID)); } Datum spherebox_overlap_line_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_line_pos(l, b) > PGS_BOX_LINE_AVOID); } Datum spherebox_overlap_line_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_line_pos(l, b) > PGS_BOX_LINE_AVOID)); } Datum spherebox_cont_path(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPATH *p = PG_GETARG_SPATH(1); PG_RETURN_BOOL(sbox_path_pos(p, b) == PGS_BOX_CONT_PATH); } Datum spherebox_cont_path_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPATH *p = PG_GETARG_SPATH(1); PG_RETURN_BOOL(!(sbox_path_pos(p, b) == PGS_BOX_CONT_PATH)); } Datum spherebox_cont_path_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPATH *p = PG_GETARG_SPATH(0); PG_RETURN_BOOL(sbox_path_pos(p, b) == PGS_BOX_CONT_PATH); } Datum spherebox_cont_path_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPATH *p = PG_GETARG_SPATH(0); PG_RETURN_BOOL(!(sbox_path_pos(p, b) == PGS_BOX_CONT_PATH)); } Datum spherebox_overlap_path(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPATH *p = PG_GETARG_SPATH(1); PG_RETURN_BOOL(sbox_path_pos(p, b) > PGS_BOX_PATH_AVOID); } Datum spherebox_overlap_path_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPATH *p = PG_GETARG_SPATH(1); PG_RETURN_BOOL(!(sbox_path_pos(p, b) > PGS_BOX_PATH_AVOID)); } Datum spherebox_overlap_path_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPATH *p = PG_GETARG_SPATH(0); PG_RETURN_BOOL(sbox_path_pos(p, b) > PGS_BOX_PATH_AVOID); } Datum spherebox_overlap_path_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPATH *p = PG_GETARG_SPATH(0); PG_RETURN_BOOL(!(sbox_path_pos(p, b) > PGS_BOX_PATH_AVOID)); } Datum spherebox_cont_poly(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPOLY *p = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(sbox_poly_pos(p, b) == PGS_BOX_CONT_POLY); } Datum spherebox_cont_poly_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPOLY *p = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) == PGS_BOX_CONT_POLY)); } Datum spherebox_cont_poly_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPOLY *p = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(sbox_poly_pos(p, b) == PGS_BOX_CONT_POLY); } Datum spherebox_cont_poly_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPOLY *p = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) == PGS_BOX_CONT_POLY)); } Datum spherepoly_cont_box(PG_FUNCTION_ARGS) { SPOLY *p = PG_GETARG_SPOLY(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_poly_pos(p, b) == PGS_POLY_CONT_BOX); } Datum spherepoly_cont_box_neg(PG_FUNCTION_ARGS) { SPOLY *p = PG_GETARG_SPOLY(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) == PGS_POLY_CONT_BOX)); } Datum spherepoly_cont_box_com(PG_FUNCTION_ARGS) { SPOLY *p = PG_GETARG_SPOLY(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_poly_pos(p, b) == PGS_POLY_CONT_BOX); } Datum spherepoly_cont_box_com_neg(PG_FUNCTION_ARGS) { SPOLY *p = PG_GETARG_SPOLY(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) == PGS_POLY_CONT_BOX)); } Datum spherebox_overlap_poly(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPOLY *p = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(sbox_poly_pos(p, b) > PGS_BOX_POLY_AVOID); } Datum spherebox_overlap_poly_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SPOLY *p = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) > PGS_BOX_POLY_AVOID)); } Datum spherebox_overlap_poly_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPOLY *p = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(sbox_poly_pos(p, b) > PGS_BOX_POLY_AVOID); } Datum spherebox_overlap_poly_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SPOLY *p = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(!(sbox_poly_pos(p, b) > PGS_BOX_POLY_AVOID)); } Datum spherebox_cont_ellipse(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) == PGS_BOX_CONT_ELLIPSE); } Datum spherebox_cont_ellipse_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) == PGS_BOX_CONT_ELLIPSE)); } Datum spherebox_cont_ellipse_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) == PGS_BOX_CONT_ELLIPSE); } Datum spherebox_cont_ellipse_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) == PGS_BOX_CONT_ELLIPSE)); } Datum sphereellipse_cont_box(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) == PGS_ELLIPSE_CONT_BOX); } Datum sphereellipse_cont_box_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SBOX *b = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) == PGS_ELLIPSE_CONT_BOX)); } Datum sphereellipse_cont_box_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) == PGS_ELLIPSE_CONT_BOX); } Datum sphereellipse_cont_box_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SBOX *b = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) == PGS_ELLIPSE_CONT_BOX)); } Datum spherebox_overlap_ellipse(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) > PGS_BOX_ELLIPSE_AVOID); } Datum spherebox_overlap_ellipse_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(0); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) > PGS_BOX_ELLIPSE_AVOID)); } Datum spherebox_overlap_ellipse_com(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_ellipse_pos(e, b) > PGS_BOX_ELLIPSE_AVOID); } Datum spherebox_overlap_ellipse_com_neg(PG_FUNCTION_ARGS) { SBOX *b = (SBOX *) PG_GETARG_POINTER(1); SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_ellipse_pos(e, b) > PGS_BOX_ELLIPSE_AVOID)); } Datum spherebox_cont_box(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_box_pos(box1, box2, false) == PGS_BOX_CONT); } Datum spherebox_cont_box_neg(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!(sbox_box_pos(box1, box2, false) == PGS_BOX_CONT)); } Datum spherebox_cont_box_com(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(1); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sbox_box_pos(box1, box2, false) == PGS_BOX_CONT); } Datum spherebox_cont_box_com_neg(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(1); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!(sbox_box_pos(box1, box2, false) == PGS_BOX_CONT)); } Datum spherebox_overlap_box(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_box_pos(box1, box2, false) > PGS_BOX_AVOID); } Datum spherebox_overlap_box_neg(PG_FUNCTION_ARGS) { SBOX *box1 = (SBOX *) PG_GETARG_POINTER(0); SBOX *box2 = (SBOX *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sbox_box_pos(box1, box2, false) == PGS_BOX_AVOID); } pgsphere/box.h000066400000000000000000000225501332443031700136400ustar00rootroot00000000000000#ifndef __PGS_BOX_H__ #define __PGS_BOX_H__ #include "path.h" /* Box datatype declarations */ /* * Spherical box structure. The definition of a spherical box * using two spherical points: south-west and north-east. */ typedef struct { SPoint sw; /* South-west value of a box */ SPoint ne; /* North-east value of a box */ } SBOX; /* PGS_RELATIONSHIPS */ /* PGS_BOX_CIRCLE_REL Box and circle */ #define PGS_BOX_CIRCLE_AVOID 0 /* box avoids circle */ #define PGS_BOX_CONT_CIRCLE 1 /* box contains circle */ #define PGS_CIRCLE_CONT_BOX 2 /* circle contains box */ #define PGS_BOX_CIRCLE_EQUAL 3 /* circle equals box */ #define PGS_BOX_CIRCLE_OVER 4 /* circle and box overlap */ /* PGS_BOX_LINE_REL Box and line */ #define PGS_BOX_LINE_AVOID 0 /* box avoids line */ #define PGS_BOX_CONT_LINE 1 /* box contains line */ #define PGS_BOX_LINE_OVER 2 /* box and line overlap */ /* PGS_BOX_PATH_REL Box and path */ #define PGS_BOX_PATH_AVOID 0 /* box avoids path */ #define PGS_BOX_CONT_PATH 1 /* box contains path */ #define PGS_BOX_PATH_OVER 2 /* box and path overlap */ /* PGS_BOX_POLY_REL Box and polygon */ #define PGS_BOX_POLY_AVOID 0 /* box avoids polygon */ #define PGS_BOX_CONT_POLY 1 /* box contains polygon */ #define PGS_POLY_CONT_BOX 2 /* polygon contains box */ #define PGS_BOX_POLY_OVER 3 /* polygon and box overlap */ /* PGS_BOX_ELLIPSE_REL Box and ellipse */ #define PGS_BOX_ELLIPSE_AVOID 0 /* box avoids ellipse */ #define PGS_BOX_CONT_ELLIPSE 1 /* box contains ellipse */ #define PGS_ELLIPSE_CONT_BOX 2 /* ellipse contains box */ #define PGS_BOX_ELLIPSE_OVER 3 /* ellipse and box overlap */ /* PGS_BOX_REL Box and box */ #define PGS_BOX_AVOID 0 /* box avoids other box */ #define PGS_BOX_CONT 1 /* box contains other box */ #define PGS_BOX_OVER 2 /* boxes overlap */ /* * Checks whether two boxes are equal. */ bool sbox_eq(SBOX *b1, SBOX *b2); /* * Checks whether a point is contained by a box. */ bool sbox_cont_point(const SBOX *b, const SPoint *p); /* * Input function of a box. */ Datum spherebox_in(PG_FUNCTION_ARGS); /* * Input function of a box from two points. The first point * is the south-west position, the second the north-east position. */ Datum spherebox_in_from_points(PG_FUNCTION_ARGS); /* * Returns the south-west edge of a box. */ Datum spherebox_sw(PG_FUNCTION_ARGS); /* * Returns the north-east edge of a box. */ Datum spherebox_ne(PG_FUNCTION_ARGS); /* * Returns the south-east edge of a box. */ Datum spherebox_se(PG_FUNCTION_ARGS); /* * Returns the north-west edge of a box. */ Datum spherebox_nw(PG_FUNCTION_ARGS); /* * Returns the area of a box. */ Datum spherebox_area(PG_FUNCTION_ARGS); /* * Returns the circumference of a box. */ Datum spherebox_circ(PG_FUNCTION_ARGS); /* * Checks whether two boxes are equal. */ Datum spherebox_equal(PG_FUNCTION_ARGS); /* * Checks whether two boxes are not equal. */ Datum spherebox_equal_neg(PG_FUNCTION_ARGS); /* * Checks whether a point is contained by a box. */ Datum spherebox_cont_point(PG_FUNCTION_ARGS); /* * Checks whether a point isn't contained by a box. */ Datum spherebox_cont_point_neg(PG_FUNCTION_ARGS); /* * Checks whether a point is contained by a box. */ Datum spherebox_cont_point_com(PG_FUNCTION_ARGS); /* * Checks whether a point isn't contained by a box. */ Datum spherebox_cont_point_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a circle. */ Datum spherebox_cont_circle(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a circle. */ Datum spherebox_cont_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a circle. */ Datum spherebox_cont_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a circle. */ Datum spherebox_cont_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a box. */ Datum spherecircle_cont_box(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a box. */ Datum spherecircle_cont_box_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a box. */ Datum spherecircle_cont_box_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a box. */ Datum spherecircle_cont_box_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a box overlap. */ Datum spherebox_overlap_circle(PG_FUNCTION_ARGS); /* * Checks whether a circle and a box don't overlap. */ Datum spherebox_overlap_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a box overlap. */ Datum spherebox_overlap_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a circle and a box don't overlap. */ Datum spherebox_overlap_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a line. */ Datum spherebox_cont_line(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a line. */ Datum spherebox_cont_line_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a line. */ Datum spherebox_cont_line_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a line. */ Datum spherebox_cont_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box and a line overlap. */ Datum spherebox_overlap_line(PG_FUNCTION_ARGS); /* * Checks whether a box and a line don't overlap. */ Datum spherebox_overlap_line_neg(PG_FUNCTION_ARGS); /* * Checks whether a box and a line overlap. */ Datum spherebox_overlap_line_com(PG_FUNCTION_ARGS); /* * Checks whether a box and a line don't overlap. */ Datum spherebox_overlap_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a path. */ Datum spherebox_cont_path(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a path. */ Datum spherebox_cont_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a path. */ Datum spherebox_cont_path_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a path. */ Datum spherebox_cont_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box and a path overlap. */ Datum spherebox_overlap_path(PG_FUNCTION_ARGS); /* * Checks whether a box and a path don't overlap. */ Datum spherebox_overlap_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a box and a path overlap. */ Datum spherebox_overlap_path_com(PG_FUNCTION_ARGS); /* * Checks whether a box and a path don't overlap. */ Datum spherebox_overlap_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a polygon. */ Datum spherebox_cont_poly(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a polygon. */ Datum spherebox_cont_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains a polygon. */ Datum spherebox_cont_poly_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain a polygon. */ Datum spherebox_cont_poly_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a box. */ Datum spherepoly_cont_box(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a box. */ Datum spherepoly_cont_box_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a box. */ Datum spherepoly_cont_box_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a box. */ Datum spherepoly_cont_box_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a box overlap. */ Datum spherebox_overlap_poly(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a box don't overlap. */ Datum spherebox_overlap_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a box overlap. */ Datum spherebox_overlap_poly_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a box don't overlap. */ Datum spherebox_overlap_poly_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains an ellipse. */ Datum spherebox_cont_ellipse(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain an ellipse. */ Datum spherebox_cont_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains an ellipse. */ Datum spherebox_cont_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain an ellipse. */ Datum spherebox_cont_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a box. */ Datum sphereellipse_cont_box(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a box. */ Datum sphereellipse_cont_box_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a box. */ Datum sphereellipse_cont_box_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a box. */ Datum sphereellipse_cont_box_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a box overlap. */ Datum spherebox_overlap_ellipse(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a box don't overlap. */ Datum spherebox_overlap_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a box overlap. */ Datum spherebox_overlap_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a box don't overlap. */ Datum spherebox_overlap_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains another box. */ Datum spherebox_cont_box(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain another box. */ Datum spherebox_cont_box_neg(PG_FUNCTION_ARGS); /* * Checks whether a box contains another box. */ Datum spherebox_cont_box_com(PG_FUNCTION_ARGS); /* * Checks whether a box doesn't contain another box. */ Datum spherebox_cont_box_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two boxes overlap. */ Datum spherebox_overlap_box(PG_FUNCTION_ARGS); /* * Checks whether two boxes don't overlap. */ Datum spherebox_overlap_box_neg(PG_FUNCTION_ARGS); #endif pgsphere/circle.c000066400000000000000000000210011332443031700142720ustar00rootroot00000000000000#include "circle.h" /* Circle functions */ PG_FUNCTION_INFO_V1(spherecircle_in); PG_FUNCTION_INFO_V1(spherecircle_equal); PG_FUNCTION_INFO_V1(spherecircle_equal_neg); PG_FUNCTION_INFO_V1(spherecircle_distance); PG_FUNCTION_INFO_V1(spherecircle_point_distance); PG_FUNCTION_INFO_V1(spherecircle_point_distance_com); PG_FUNCTION_INFO_V1(spherepoint_in_circle); PG_FUNCTION_INFO_V1(spherepoint_in_circle_neg); PG_FUNCTION_INFO_V1(spherepoint_in_circle_com); PG_FUNCTION_INFO_V1(spherepoint_in_circle_com_neg); PG_FUNCTION_INFO_V1(spherecircle_in_circle); PG_FUNCTION_INFO_V1(spherecircle_in_circle_neg); PG_FUNCTION_INFO_V1(spherecircle_in_circle_com); PG_FUNCTION_INFO_V1(spherecircle_in_circle_com_neg); PG_FUNCTION_INFO_V1(spherecircle_overlap); PG_FUNCTION_INFO_V1(spherecircle_overlap_neg); PG_FUNCTION_INFO_V1(spherecircle_center); PG_FUNCTION_INFO_V1(spherecircle_radius); PG_FUNCTION_INFO_V1(spherepoint_to_circle); PG_FUNCTION_INFO_V1(spherecircle_by_center); PG_FUNCTION_INFO_V1(spherecircle_area); PG_FUNCTION_INFO_V1(spherecircle_circ); PG_FUNCTION_INFO_V1(spheretrans_circle); PG_FUNCTION_INFO_V1(spheretrans_circle_inverse); bool scircle_eq(const SCIRCLE *c1, const SCIRCLE *c2) { return (spoint_eq(&c1->center, &c2->center) && FPeq(c1->radius, c2->radius)); } bool spoint_in_circle(const SPoint *p, const SCIRCLE *c) { float8 dist = spoint_dist(p, &c->center); if (FPle(dist, c->radius)) { return true; } return false; } void euler_scircle_trans(SCIRCLE *out, const SCIRCLE *in, const SEuler *se) { euler_spoint_trans(&out->center, &in->center, se); out->radius = in->radius; } Datum spherecircle_in(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) palloc(sizeof(SCIRCLE)); char *s = PG_GETARG_CSTRING(0); double lng, lat, radius; init_buffer(s); sphere_yyparse(); if (get_circle(&lng, &lat, &radius)) { c->center.lng = lng; c->center.lat = lat; c->radius = radius; reset_buffer(); /* * It's important to allow circles with radius 90 degrees! */ if (FPgt(c->radius, PIH)) { pfree(c); c = NULL; elog(ERROR, "spherecircle_in: radius must be not greater than 90 degrees"); } else if (FPeq(c->radius, PIH)) { /* set "exact" 90 degrees */ c->radius = PIH; } spoint_check(&c->center); } else { reset_buffer(); pfree(c); c = NULL; elog(ERROR, "spherecircle_in: parse error"); } PG_RETURN_POINTER(c); } Datum spherecircle_equal(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(scircle_eq(c1, c2)); } Datum spherecircle_equal_neg(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!scircle_eq(c1, c2)); } Datum spherecircle_distance(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c1->center, &c2->center); dist -= (c1->radius + c2->radius); if (dist < 0.0) { dist = 0.0; } PG_RETURN_FLOAT8(dist); } Datum spherecircle_point_distance(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c->center, p); dist = dist - c->radius; if (dist < 0.0) { dist = 0.0; } PG_RETURN_FLOAT8(dist); } Datum spherecircle_point_distance_com(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c->center, p); dist = dist - c->radius; if (dist < 0.0) { dist = 0.0; } PG_RETURN_FLOAT8(dist); } Datum spherepoint_in_circle(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(spoint_in_circle(p, c)); } Datum spherepoint_in_circle_neg(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!spoint_in_circle(p, c)); } Datum spherepoint_in_circle_com(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(spoint_in_circle(p, c)); } Datum spherepoint_in_circle_com_neg(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!spoint_in_circle(p, c)); } Datum spherecircle_in_circle(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(true); } else if (FPle((dist + c1->radius), c2->radius)) { PG_RETURN_BOOL(true); } else { PG_RETURN_BOOL(false); } } Datum spherecircle_in_circle_neg(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(false); } else if (FPgt((dist + c1->radius), c2->radius)) { PG_RETURN_BOOL(true); } else { PG_RETURN_BOOL(false); } } Datum spherecircle_in_circle_com(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(1); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(0); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(true); } else if (FPle((dist + c1->radius), c2->radius)) { PG_RETURN_BOOL(true); } else { PG_RETURN_BOOL(false); } } Datum spherecircle_in_circle_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(1); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(0); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(false); } else if (FPgt((dist + c1->radius), c2->radius)) { PG_RETURN_BOOL(true); } else { PG_RETURN_BOOL(false); } } Datum spherecircle_overlap(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(true); } else if (FPlt((c1->radius + c2->radius), dist)) { PG_RETURN_BOOL(false); } else { PG_RETURN_BOOL(true); } } Datum spherecircle_overlap_neg(PG_FUNCTION_ARGS) { SCIRCLE *c1 = (SCIRCLE *) PG_GETARG_POINTER(0); SCIRCLE *c2 = (SCIRCLE *) PG_GETARG_POINTER(1); float8 dist = spoint_dist(&c1->center, &c2->center); if (scircle_eq(c1, c2)) { PG_RETURN_BOOL(false); } else if (FPge((c1->radius + c2->radius), dist)) { PG_RETURN_BOOL(false); } else { PG_RETURN_BOOL(true); } } Datum spherecircle_center(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) palloc(sizeof(SPoint)); memcpy((void *) p, (void *) &c->center, sizeof(SPoint)); PG_RETURN_POINTER(p); } Datum spherecircle_radius(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(c->radius); } Datum spherepoint_to_circle(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) palloc(sizeof(SCIRCLE)); memcpy((void *) &c->center, (void *) p, sizeof(SPoint)); c->radius = 0; PG_RETURN_POINTER(c); } Datum spherecircle_by_center(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); float8 rad = PG_GETARG_FLOAT8(1); SCIRCLE *c; if (FPgt(rad, PIH) || FPlt(rad, 0.0)) { elog(ERROR, "radius must be not greater than 90 degrees or less than 0"); PG_RETURN_NULL(); } c = (SCIRCLE *) palloc(sizeof(SCIRCLE)); memcpy((void *) &c->center, (void *) p, sizeof(SPoint)); c->radius = rad; PG_RETURN_POINTER(c); } Datum spherecircle_area(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(PID * (1 - cos(c->radius))); } Datum spherecircle_circ(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(PID * (sin(c->radius))); } Datum spheretrans_circle(PG_FUNCTION_ARGS) { SCIRCLE *sc = (SCIRCLE *) PG_GETARG_POINTER(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SCIRCLE *out = (SCIRCLE *) palloc(sizeof(SCIRCLE)); euler_scircle_trans(out, sc, se); PG_RETURN_POINTER(out); } Datum spheretrans_circle_inverse(PG_FUNCTION_ARGS) { Datum sc = PG_GETARG_DATUM(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SEuler tmp; Datum ret; spheretrans_inverse(&tmp, se); ret = DirectFunctionCall2(spheretrans_circle, sc, PointerGetDatum(&tmp)); PG_RETURN_DATUM(ret); } pgsphere/circle.h000066400000000000000000000064161332443031700143140ustar00rootroot00000000000000#ifndef __PGS_CIRCLE_H__ #define __PGS_CIRCLE_H__ #include "euler.h" /* Spherical circle declarations */ /* * Spherical circle data structure: center and radius. */ typedef struct { SPoint center; /* the center of circle */ float8 radius; /* the circle radius in radians */ } SCIRCLE; /* * Checks whether two circles are equal. */ bool scircle_eq(const SCIRCLE *c1, const SCIRCLE *c2); /* * Checks whether a circle contains a point. */ bool spoint_in_circle(const SPoint *p, const SCIRCLE *c); /* * Transforms a circle using an Euler transformation. */ void euler_scircle_trans(SCIRCLE *out, const SCIRCLE *in, const SEuler *se); /* * Takes the input and stores it as a spherical circle. */ Datum spherecircle_in(PG_FUNCTION_ARGS); /* * Checks whether two circles are equal. */ Datum spherecircle_equal(PG_FUNCTION_ARGS); /* * Checks whether two circles are not equal. */ Datum spherecircle_equal_neg(PG_FUNCTION_ARGS); /* * Calculate the distance of two circles. If they overlap, this function * returns 0.0. */ Datum spherecircle_distance(PG_FUNCTION_ARGS); /* * Calculate the distance of a circle and a point. If a circle contains a point, * this function returns 0.0. */ Datum spherecircle_point_distance(PG_FUNCTION_ARGS); /* * Calculate the distance of a point and a circle. If a circle contains a point, * this function returns 0.0. */ Datum spherecircle_point_distance_com(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a point. */ Datum spherepoint_in_circle(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a point. */ Datum spherepoint_in_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a point. */ Datum spherepoint_in_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a point. */ Datum spherepoint_in_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle is contained by other circle. */ Datum spherecircle_in_circle(PG_FUNCTION_ARGS); /* * Checks whether a circle is not contained by other circle. */ Datum spherecircle_in_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains other circle. */ Datum spherecircle_in_circle_com(PG_FUNCTION_ARGS); /* * Checks whether circle does not contain other circle. */ Datum spherecircle_in_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two circles overlap. */ Datum spherecircle_overlap(PG_FUNCTION_ARGS); /* * Checks whether two circles overlap. */ Datum spherecircle_overlap_neg(PG_FUNCTION_ARGS); /* * Returns the center of a circle. */ Datum spherecircle_center(PG_FUNCTION_ARGS); /* * Returns the radius of a circle. */ Datum spherecircle_radius(PG_FUNCTION_ARGS); /* * Converts a point to a circle. */ Datum spherepoint_to_circle(PG_FUNCTION_ARGS); /* * Creates a circle from center and radius. */ Datum spherecircle_by_center(PG_FUNCTION_ARGS); /* * Calculates the area of a circle in square radians. */ Datum spherecircle_area(PG_FUNCTION_ARGS); /* * Calculates the circumference of a circle in radians. */ Datum spherecircle_circ(PG_FUNCTION_ARGS); /* * Transforms a circle using an Euler transformation. */ Datum spheretrans_circle(PG_FUNCTION_ARGS); /* * Inverse transformation of a circle using an Euler transformation. */ Datum spheretrans_circle_inverse(PG_FUNCTION_ARGS); #endif pgsphere/data/000077500000000000000000000000001332443031700136045ustar00rootroot00000000000000pgsphere/data/test_spherebox.data000066400000000000000000000425221332443031700175020ustar00rootroot00000000000000((0, -90d),(0,-90d)) ((0d, -90d),(10d, -80d)) ((10d, -90d),(20d, -80d)) ((20d, -90d),(30d, -80d)) ((30d, -90d),(40d, -80d)) ((40d, -90d),(50d, -80d)) ((50d, -90d),(60d, -80d)) ((60d, -90d),(70d, -80d)) ((70d, -90d),(80d, -80d)) ((80d, -90d),(90d, -80d)) ((90d, -90d),(100d, -80d)) ((100d, -90d),(110d, -80d)) ((110d, -90d),(120d, -80d)) ((120d, -90d),(130d, -80d)) ((130d, -90d),(140d, -80d)) ((140d, -90d),(150d, -80d)) ((150d, -90d),(160d, -80d)) ((160d, -90d),(170d, -80d)) ((170d, -90d),(180d, -80d)) ((180d, -90d),(190d, -80d)) ((190d, -90d),(200d, -80d)) ((200d, -90d),(210d, -80d)) ((210d, -90d),(220d, -80d)) ((220d, -90d),(230d, -80d)) ((230d, -90d),(240d, -80d)) ((240d, -90d),(250d, -80d)) ((250d, -90d),(260d, -80d)) ((260d, -90d),(270d, -80d)) ((270d, -90d),(280d, -80d)) ((280d, -90d),(290d, -80d)) ((290d, -90d),(300d, -80d)) ((300d, -90d),(310d, -80d)) ((310d, -90d),(320d, -80d)) ((320d, -90d),(330d, -80d)) ((330d, -90d),(340d, -80d)) ((340d, -90d),(350d, -80d)) ((350d, -90d),(360d, -80d)) ((0d, -80d),(10d, -70d)) ((10d, -80d),(20d, -70d)) ((20d, -80d),(30d, -70d)) ((30d, -80d),(40d, -70d)) ((40d, -80d),(50d, -70d)) ((50d, -80d),(60d, -70d)) ((60d, -80d),(70d, -70d)) ((70d, -80d),(80d, -70d)) ((80d, -80d),(90d, -70d)) ((90d, -80d),(100d, -70d)) ((100d, -80d),(110d, -70d)) ((110d, -80d),(120d, -70d)) ((120d, -80d),(130d, -70d)) ((130d, -80d),(140d, -70d)) ((140d, -80d),(150d, -70d)) ((150d, -80d),(160d, -70d)) ((160d, -80d),(170d, -70d)) ((170d, -80d),(180d, -70d)) ((180d, -80d),(190d, -70d)) ((190d, -80d),(200d, -70d)) ((200d, -80d),(210d, -70d)) ((210d, -80d),(220d, -70d)) ((220d, -80d),(230d, -70d)) ((230d, -80d),(240d, -70d)) ((240d, -80d),(250d, -70d)) ((250d, -80d),(260d, -70d)) ((260d, -80d),(270d, -70d)) ((270d, -80d),(280d, -70d)) ((280d, -80d),(290d, -70d)) ((290d, -80d),(300d, -70d)) ((300d, -80d),(310d, -70d)) ((310d, -80d),(320d, -70d)) ((320d, -80d),(330d, -70d)) ((330d, -80d),(340d, -70d)) ((340d, -80d),(350d, -70d)) ((350d, -80d),(360d, -70d)) ((0d, -70d),(10d, -60d)) ((10d, -70d),(20d, -60d)) ((20d, -70d),(30d, -60d)) ((30d, -70d),(40d, -60d)) ((40d, -70d),(50d, -60d)) ((50d, -70d),(60d, -60d)) ((60d, -70d),(70d, -60d)) ((70d, -70d),(80d, -60d)) ((80d, -70d),(90d, -60d)) ((90d, -70d),(100d, -60d)) ((100d, -70d),(110d, -60d)) ((110d, -70d),(120d, -60d)) ((120d, -70d),(130d, -60d)) ((130d, -70d),(140d, -60d)) ((140d, -70d),(150d, -60d)) ((150d, -70d),(160d, -60d)) ((160d, -70d),(170d, -60d)) ((170d, -70d),(180d, -60d)) ((180d, -70d),(190d, -60d)) ((190d, -70d),(200d, -60d)) ((200d, -70d),(210d, -60d)) ((210d, -70d),(220d, -60d)) ((220d, -70d),(230d, -60d)) ((230d, -70d),(240d, -60d)) ((240d, -70d),(250d, -60d)) ((250d, -70d),(260d, -60d)) ((260d, -70d),(270d, -60d)) ((270d, -70d),(280d, -60d)) ((280d, -70d),(290d, -60d)) ((290d, -70d),(300d, -60d)) ((300d, -70d),(310d, -60d)) ((310d, -70d),(320d, -60d)) ((320d, -70d),(330d, -60d)) ((330d, -70d),(340d, -60d)) ((340d, -70d),(350d, -60d)) ((350d, -70d),(360d, -60d)) ((0d, -60d),(10d, -50d)) ((10d, -60d),(20d, -50d)) ((20d, -60d),(30d, -50d)) ((30d, -60d),(40d, -50d)) ((40d, -60d),(50d, -50d)) ((50d, -60d),(60d, -50d)) ((60d, -60d),(70d, -50d)) ((70d, -60d),(80d, -50d)) ((80d, -60d),(90d, -50d)) ((90d, -60d),(100d, -50d)) ((100d, -60d),(110d, -50d)) ((110d, -60d),(120d, -50d)) ((120d, -60d),(130d, -50d)) ((130d, -60d),(140d, -50d)) ((140d, -60d),(150d, -50d)) ((150d, -60d),(160d, -50d)) ((160d, -60d),(170d, -50d)) ((170d, -60d),(180d, -50d)) ((180d, -60d),(190d, -50d)) ((190d, -60d),(200d, -50d)) ((200d, -60d),(210d, -50d)) ((210d, -60d),(220d, -50d)) ((220d, -60d),(230d, -50d)) ((230d, -60d),(240d, -50d)) ((240d, -60d),(250d, -50d)) ((250d, -60d),(260d, -50d)) ((260d, -60d),(270d, -50d)) ((270d, -60d),(280d, -50d)) ((280d, -60d),(290d, -50d)) ((290d, -60d),(300d, -50d)) ((300d, -60d),(310d, -50d)) ((310d, -60d),(320d, -50d)) ((320d, -60d),(330d, -50d)) ((330d, -60d),(340d, -50d)) ((340d, -60d),(350d, -50d)) ((350d, -60d),(360d, -50d)) ((0d, -50d),(10d, -40d)) ((10d, -50d),(20d, -40d)) ((20d, -50d),(30d, -40d)) ((30d, -50d),(40d, -40d)) ((40d, -50d),(50d, -40d)) ((50d, -50d),(60d, -40d)) ((60d, -50d),(70d, -40d)) ((70d, -50d),(80d, -40d)) ((80d, -50d),(90d, -40d)) ((90d, -50d),(100d, -40d)) ((100d, -50d),(110d, -40d)) ((110d, -50d),(120d, -40d)) ((120d, -50d),(130d, -40d)) ((130d, -50d),(140d, -40d)) ((140d, -50d),(150d, -40d)) ((150d, -50d),(160d, -40d)) ((160d, -50d),(170d, -40d)) ((170d, -50d),(180d, -40d)) ((180d, -50d),(190d, -40d)) ((190d, -50d),(200d, -40d)) ((200d, -50d),(210d, -40d)) ((210d, -50d),(220d, -40d)) ((220d, -50d),(230d, -40d)) ((230d, -50d),(240d, -40d)) ((240d, -50d),(250d, -40d)) ((250d, -50d),(260d, -40d)) ((260d, -50d),(270d, -40d)) ((270d, -50d),(280d, -40d)) ((280d, -50d),(290d, -40d)) ((290d, -50d),(300d, -40d)) ((300d, -50d),(310d, -40d)) ((310d, -50d),(320d, -40d)) ((320d, -50d),(330d, -40d)) ((330d, -50d),(340d, -40d)) ((340d, -50d),(350d, -40d)) ((350d, -50d),(360d, -40d)) ((0d, -40d),(10d, -30d)) ((10d, -40d),(20d, -30d)) ((20d, -40d),(30d, -30d)) ((30d, -40d),(40d, -30d)) ((40d, -40d),(50d, -30d)) ((50d, -40d),(60d, -30d)) ((60d, -40d),(70d, -30d)) ((70d, -40d),(80d, -30d)) ((80d, -40d),(90d, -30d)) ((90d, -40d),(100d, -30d)) ((100d, -40d),(110d, -30d)) ((110d, -40d),(120d, -30d)) ((120d, -40d),(130d, -30d)) ((130d, -40d),(140d, -30d)) ((140d, -40d),(150d, -30d)) ((150d, -40d),(160d, -30d)) ((160d, -40d),(170d, -30d)) ((170d, -40d),(180d, -30d)) ((180d, -40d),(190d, -30d)) ((190d, -40d),(200d, -30d)) ((200d, -40d),(210d, -30d)) ((210d, -40d),(220d, -30d)) ((220d, -40d),(230d, -30d)) ((230d, -40d),(240d, -30d)) ((240d, -40d),(250d, -30d)) ((250d, -40d),(260d, -30d)) ((260d, -40d),(270d, -30d)) ((270d, -40d),(280d, -30d)) ((280d, -40d),(290d, -30d)) ((290d, -40d),(300d, -30d)) ((300d, -40d),(310d, -30d)) ((310d, -40d),(320d, -30d)) ((320d, -40d),(330d, -30d)) ((330d, -40d),(340d, -30d)) ((340d, -40d),(350d, -30d)) ((350d, -40d),(360d, -30d)) ((0d, -30d),(10d, -20d)) ((10d, -30d),(20d, -20d)) ((20d, -30d),(30d, -20d)) ((30d, -30d),(40d, -20d)) ((40d, -30d),(50d, -20d)) ((50d, -30d),(60d, -20d)) ((60d, -30d),(70d, -20d)) ((70d, -30d),(80d, -20d)) ((80d, -30d),(90d, -20d)) ((90d, -30d),(100d, -20d)) ((100d, -30d),(110d, -20d)) ((110d, -30d),(120d, -20d)) ((120d, -30d),(130d, -20d)) ((130d, -30d),(140d, -20d)) ((140d, -30d),(150d, -20d)) ((150d, -30d),(160d, -20d)) ((160d, -30d),(170d, -20d)) ((170d, -30d),(180d, -20d)) ((180d, -30d),(190d, -20d)) ((190d, -30d),(200d, -20d)) ((200d, -30d),(210d, -20d)) ((210d, -30d),(220d, -20d)) ((220d, -30d),(230d, -20d)) ((230d, -30d),(240d, -20d)) ((240d, -30d),(250d, -20d)) ((250d, -30d),(260d, -20d)) ((260d, -30d),(270d, -20d)) ((270d, -30d),(280d, -20d)) ((280d, -30d),(290d, -20d)) ((290d, -30d),(300d, -20d)) ((300d, -30d),(310d, -20d)) ((310d, -30d),(320d, -20d)) ((320d, -30d),(330d, -20d)) ((330d, -30d),(340d, -20d)) ((340d, -30d),(350d, -20d)) ((350d, -30d),(360d, -20d)) ((0d, -20d),(10d, -10d)) ((10d, -20d),(20d, -10d)) ((20d, -20d),(30d, -10d)) ((30d, -20d),(40d, -10d)) ((40d, -20d),(50d, -10d)) ((50d, -20d),(60d, -10d)) ((60d, -20d),(70d, -10d)) ((70d, -20d),(80d, -10d)) ((80d, -20d),(90d, -10d)) ((90d, -20d),(100d, -10d)) ((100d, -20d),(110d, -10d)) ((110d, -20d),(120d, -10d)) ((120d, -20d),(130d, -10d)) ((130d, -20d),(140d, -10d)) ((140d, -20d),(150d, -10d)) ((150d, -20d),(160d, -10d)) ((160d, -20d),(170d, -10d)) ((170d, -20d),(180d, -10d)) ((180d, -20d),(190d, -10d)) ((190d, -20d),(200d, -10d)) ((200d, -20d),(210d, -10d)) ((210d, -20d),(220d, -10d)) ((220d, -20d),(230d, -10d)) ((230d, -20d),(240d, -10d)) ((240d, -20d),(250d, -10d)) ((250d, -20d),(260d, -10d)) ((260d, -20d),(270d, -10d)) ((270d, -20d),(280d, -10d)) ((280d, -20d),(290d, -10d)) ((290d, -20d),(300d, -10d)) ((300d, -20d),(310d, -10d)) ((310d, -20d),(320d, -10d)) ((320d, -20d),(330d, -10d)) ((330d, -20d),(340d, -10d)) ((340d, -20d),(350d, -10d)) ((350d, -20d),(360d, -10d)) ((0d, -10d),(10d, 0d)) ((10d, -10d),(20d, 0d)) ((20d, -10d),(30d, 0d)) ((30d, -10d),(40d, 0d)) ((40d, -10d),(50d, 0d)) ((50d, -10d),(60d, 0d)) ((60d, -10d),(70d, 0d)) ((70d, -10d),(80d, 0d)) ((80d, -10d),(90d, 0d)) ((90d, -10d),(100d, 0d)) ((100d, -10d),(110d, 0d)) ((110d, -10d),(120d, 0d)) ((120d, -10d),(130d, 0d)) ((130d, -10d),(140d, 0d)) ((140d, -10d),(150d, 0d)) ((150d, -10d),(160d, 0d)) ((160d, -10d),(170d, 0d)) ((170d, -10d),(180d, 0d)) ((180d, -10d),(190d, 0d)) ((190d, -10d),(200d, 0d)) ((200d, -10d),(210d, 0d)) ((210d, -10d),(220d, 0d)) ((220d, -10d),(230d, 0d)) ((230d, -10d),(240d, 0d)) ((240d, -10d),(250d, 0d)) ((250d, -10d),(260d, 0d)) ((260d, -10d),(270d, 0d)) ((270d, -10d),(280d, 0d)) ((280d, -10d),(290d, 0d)) ((290d, -10d),(300d, 0d)) ((300d, -10d),(310d, 0d)) ((310d, -10d),(320d, 0d)) ((320d, -10d),(330d, 0d)) ((330d, -10d),(340d, 0d)) ((340d, -10d),(350d, 0d)) ((350d, -10d),(360d, 0d)) ((0d, 0d),(10d, 10d)) ((10d, 0d),(20d, 10d)) ((20d, 0d),(30d, 10d)) ((30d, 0d),(40d, 10d)) ((40d, 0d),(50d, 10d)) ((50d, 0d),(60d, 10d)) ((60d, 0d),(70d, 10d)) ((70d, 0d),(80d, 10d)) ((80d, 0d),(90d, 10d)) ((90d, 0d),(100d, 10d)) ((100d, 0d),(110d, 10d)) ((110d, 0d),(120d, 10d)) ((120d, 0d),(130d, 10d)) ((130d, 0d),(140d, 10d)) ((140d, 0d),(150d, 10d)) ((150d, 0d),(160d, 10d)) ((160d, 0d),(170d, 10d)) ((170d, 0d),(180d, 10d)) ((180d, 0d),(190d, 10d)) ((190d, 0d),(200d, 10d)) ((200d, 0d),(210d, 10d)) ((210d, 0d),(220d, 10d)) ((220d, 0d),(230d, 10d)) ((230d, 0d),(240d, 10d)) ((240d, 0d),(250d, 10d)) ((250d, 0d),(260d, 10d)) ((260d, 0d),(270d, 10d)) ((270d, 0d),(280d, 10d)) ((280d, 0d),(290d, 10d)) ((290d, 0d),(300d, 10d)) ((300d, 0d),(310d, 10d)) ((310d, 0d),(320d, 10d)) ((320d, 0d),(330d, 10d)) ((330d, 0d),(340d, 10d)) ((340d, 0d),(350d, 10d)) ((350d, 0d),(360d, 10d)) ((0d, 10d),(10d, 20d)) ((10d, 10d),(20d, 20d)) ((20d, 10d),(30d, 20d)) ((30d, 10d),(40d, 20d)) ((40d, 10d),(50d, 20d)) ((50d, 10d),(60d, 20d)) ((60d, 10d),(70d, 20d)) ((70d, 10d),(80d, 20d)) ((80d, 10d),(90d, 20d)) ((90d, 10d),(100d, 20d)) ((100d, 10d),(110d, 20d)) ((110d, 10d),(120d, 20d)) ((120d, 10d),(130d, 20d)) ((130d, 10d),(140d, 20d)) ((140d, 10d),(150d, 20d)) ((150d, 10d),(160d, 20d)) ((160d, 10d),(170d, 20d)) ((170d, 10d),(180d, 20d)) ((180d, 10d),(190d, 20d)) ((190d, 10d),(200d, 20d)) ((200d, 10d),(210d, 20d)) ((210d, 10d),(220d, 20d)) ((220d, 10d),(230d, 20d)) ((230d, 10d),(240d, 20d)) ((240d, 10d),(250d, 20d)) ((250d, 10d),(260d, 20d)) ((260d, 10d),(270d, 20d)) ((270d, 10d),(280d, 20d)) ((280d, 10d),(290d, 20d)) ((290d, 10d),(300d, 20d)) ((300d, 10d),(310d, 20d)) ((310d, 10d),(320d, 20d)) ((320d, 10d),(330d, 20d)) ((330d, 10d),(340d, 20d)) ((340d, 10d),(350d, 20d)) ((350d, 10d),(360d, 20d)) ((0d, 20d),(10d, 30d)) ((10d, 20d),(20d, 30d)) ((20d, 20d),(30d, 30d)) ((30d, 20d),(40d, 30d)) ((40d, 20d),(50d, 30d)) ((50d, 20d),(60d, 30d)) ((60d, 20d),(70d, 30d)) ((70d, 20d),(80d, 30d)) ((80d, 20d),(90d, 30d)) ((90d, 20d),(100d, 30d)) ((100d, 20d),(110d, 30d)) ((110d, 20d),(120d, 30d)) ((120d, 20d),(130d, 30d)) ((130d, 20d),(140d, 30d)) ((140d, 20d),(150d, 30d)) ((150d, 20d),(160d, 30d)) ((160d, 20d),(170d, 30d)) ((170d, 20d),(180d, 30d)) ((180d, 20d),(190d, 30d)) ((190d, 20d),(200d, 30d)) ((200d, 20d),(210d, 30d)) ((210d, 20d),(220d, 30d)) ((220d, 20d),(230d, 30d)) ((230d, 20d),(240d, 30d)) ((240d, 20d),(250d, 30d)) ((250d, 20d),(260d, 30d)) ((260d, 20d),(270d, 30d)) ((270d, 20d),(280d, 30d)) ((280d, 20d),(290d, 30d)) ((290d, 20d),(300d, 30d)) ((300d, 20d),(310d, 30d)) ((310d, 20d),(320d, 30d)) ((320d, 20d),(330d, 30d)) ((330d, 20d),(340d, 30d)) ((340d, 20d),(350d, 30d)) ((350d, 20d),(360d, 30d)) ((0d, 30d),(10d, 40d)) ((10d, 30d),(20d, 40d)) ((20d, 30d),(30d, 40d)) ((30d, 30d),(40d, 40d)) ((40d, 30d),(50d, 40d)) ((50d, 30d),(60d, 40d)) ((60d, 30d),(70d, 40d)) ((70d, 30d),(80d, 40d)) ((80d, 30d),(90d, 40d)) ((90d, 30d),(100d, 40d)) ((100d, 30d),(110d, 40d)) ((110d, 30d),(120d, 40d)) ((120d, 30d),(130d, 40d)) ((130d, 30d),(140d, 40d)) ((140d, 30d),(150d, 40d)) ((150d, 30d),(160d, 40d)) ((160d, 30d),(170d, 40d)) ((170d, 30d),(180d, 40d)) ((180d, 30d),(190d, 40d)) ((190d, 30d),(200d, 40d)) ((200d, 30d),(210d, 40d)) ((210d, 30d),(220d, 40d)) ((220d, 30d),(230d, 40d)) ((230d, 30d),(240d, 40d)) ((240d, 30d),(250d, 40d)) ((250d, 30d),(260d, 40d)) ((260d, 30d),(270d, 40d)) ((270d, 30d),(280d, 40d)) ((280d, 30d),(290d, 40d)) ((290d, 30d),(300d, 40d)) ((300d, 30d),(310d, 40d)) ((310d, 30d),(320d, 40d)) ((320d, 30d),(330d, 40d)) ((330d, 30d),(340d, 40d)) ((340d, 30d),(350d, 40d)) ((350d, 30d),(360d, 40d)) ((0d, 40d),(10d, 50d)) ((10d, 40d),(20d, 50d)) ((20d, 40d),(30d, 50d)) ((30d, 40d),(40d, 50d)) ((40d, 40d),(50d, 50d)) ((50d, 40d),(60d, 50d)) ((60d, 40d),(70d, 50d)) ((70d, 40d),(80d, 50d)) ((80d, 40d),(90d, 50d)) ((90d, 40d),(100d, 50d)) ((100d, 40d),(110d, 50d)) ((110d, 40d),(120d, 50d)) ((120d, 40d),(130d, 50d)) ((130d, 40d),(140d, 50d)) ((140d, 40d),(150d, 50d)) ((150d, 40d),(160d, 50d)) ((160d, 40d),(170d, 50d)) ((170d, 40d),(180d, 50d)) ((180d, 40d),(190d, 50d)) ((190d, 40d),(200d, 50d)) ((200d, 40d),(210d, 50d)) ((210d, 40d),(220d, 50d)) ((220d, 40d),(230d, 50d)) ((230d, 40d),(240d, 50d)) ((240d, 40d),(250d, 50d)) ((250d, 40d),(260d, 50d)) ((260d, 40d),(270d, 50d)) ((270d, 40d),(280d, 50d)) ((280d, 40d),(290d, 50d)) ((290d, 40d),(300d, 50d)) ((300d, 40d),(310d, 50d)) ((310d, 40d),(320d, 50d)) ((320d, 40d),(330d, 50d)) ((330d, 40d),(340d, 50d)) ((340d, 40d),(350d, 50d)) ((350d, 40d),(360d, 50d)) ((0d, 50d),(10d, 60d)) ((10d, 50d),(20d, 60d)) ((20d, 50d),(30d, 60d)) ((30d, 50d),(40d, 60d)) ((40d, 50d),(50d, 60d)) ((50d, 50d),(60d, 60d)) ((60d, 50d),(70d, 60d)) ((70d, 50d),(80d, 60d)) ((80d, 50d),(90d, 60d)) ((90d, 50d),(100d, 60d)) ((100d, 50d),(110d, 60d)) ((110d, 50d),(120d, 60d)) ((120d, 50d),(130d, 60d)) ((130d, 50d),(140d, 60d)) ((140d, 50d),(150d, 60d)) ((150d, 50d),(160d, 60d)) ((160d, 50d),(170d, 60d)) ((170d, 50d),(180d, 60d)) ((180d, 50d),(190d, 60d)) ((190d, 50d),(200d, 60d)) ((200d, 50d),(210d, 60d)) ((210d, 50d),(220d, 60d)) ((220d, 50d),(230d, 60d)) ((230d, 50d),(240d, 60d)) ((240d, 50d),(250d, 60d)) ((250d, 50d),(260d, 60d)) ((260d, 50d),(270d, 60d)) ((270d, 50d),(280d, 60d)) ((280d, 50d),(290d, 60d)) ((290d, 50d),(300d, 60d)) ((300d, 50d),(310d, 60d)) ((310d, 50d),(320d, 60d)) ((320d, 50d),(330d, 60d)) ((330d, 50d),(340d, 60d)) ((340d, 50d),(350d, 60d)) ((350d, 50d),(360d, 60d)) ((0d, 60d),(10d, 70d)) ((10d, 60d),(20d, 70d)) ((20d, 60d),(30d, 70d)) ((30d, 60d),(40d, 70d)) ((40d, 60d),(50d, 70d)) ((50d, 60d),(60d, 70d)) ((60d, 60d),(70d, 70d)) ((70d, 60d),(80d, 70d)) ((80d, 60d),(90d, 70d)) ((90d, 60d),(100d, 70d)) ((100d, 60d),(110d, 70d)) ((110d, 60d),(120d, 70d)) ((120d, 60d),(130d, 70d)) ((130d, 60d),(140d, 70d)) ((140d, 60d),(150d, 70d)) ((150d, 60d),(160d, 70d)) ((160d, 60d),(170d, 70d)) ((170d, 60d),(180d, 70d)) ((180d, 60d),(190d, 70d)) ((190d, 60d),(200d, 70d)) ((200d, 60d),(210d, 70d)) ((210d, 60d),(220d, 70d)) ((220d, 60d),(230d, 70d)) ((230d, 60d),(240d, 70d)) ((240d, 60d),(250d, 70d)) ((250d, 60d),(260d, 70d)) ((260d, 60d),(270d, 70d)) ((270d, 60d),(280d, 70d)) ((280d, 60d),(290d, 70d)) ((290d, 60d),(300d, 70d)) ((300d, 60d),(310d, 70d)) ((310d, 60d),(320d, 70d)) ((320d, 60d),(330d, 70d)) ((330d, 60d),(340d, 70d)) ((340d, 60d),(350d, 70d)) ((350d, 60d),(360d, 70d)) ((0d, 70d),(10d, 80d)) ((10d, 70d),(20d, 80d)) ((20d, 70d),(30d, 80d)) ((30d, 70d),(40d, 80d)) ((40d, 70d),(50d, 80d)) ((50d, 70d),(60d, 80d)) ((60d, 70d),(70d, 80d)) ((70d, 70d),(80d, 80d)) ((80d, 70d),(90d, 80d)) ((90d, 70d),(100d, 80d)) ((100d, 70d),(110d, 80d)) ((110d, 70d),(120d, 80d)) ((120d, 70d),(130d, 80d)) ((130d, 70d),(140d, 80d)) ((140d, 70d),(150d, 80d)) ((150d, 70d),(160d, 80d)) ((160d, 70d),(170d, 80d)) ((170d, 70d),(180d, 80d)) ((180d, 70d),(190d, 80d)) ((190d, 70d),(200d, 80d)) \N \N \N \N ((200d, 70d),(210d, 80d)) ((210d, 70d),(220d, 80d)) ((220d, 70d),(230d, 80d)) ((230d, 70d),(240d, 80d)) ((240d, 70d),(250d, 80d)) ((250d, 70d),(260d, 80d)) ((260d, 70d),(270d, 80d)) ((270d, 70d),(280d, 80d)) ((280d, 70d),(290d, 80d)) ((290d, 70d),(300d, 80d)) ((300d, 70d),(310d, 80d)) ((310d, 70d),(320d, 80d)) ((320d, 70d),(330d, 80d)) ((330d, 70d),(340d, 80d)) ((340d, 70d),(350d, 80d)) ((350d, 70d),(360d, 80d)) ((0d, 80d),(10d, 90d)) ((10d, 80d),(20d, 90d)) ((20d, 80d),(30d, 90d)) ((30d, 80d),(40d, 90d)) ((40d, 80d),(50d, 90d)) ((50d, 80d),(60d, 90d)) ((60d, 80d),(70d, 90d)) ((70d, 80d),(80d, 90d)) ((80d, 80d),(90d, 90d)) ((90d, 80d),(100d, 90d)) ((100d, 80d),(110d, 90d)) ((110d, 80d),(120d, 90d)) ((120d, 80d),(130d, 90d)) ((130d, 80d),(140d, 90d)) ((140d, 80d),(150d, 90d)) ((150d, 80d),(160d, 90d)) ((160d, 80d),(170d, 90d)) ((170d, 80d),(180d, 90d)) ((180d, 80d),(190d, 90d)) ((190d, 80d),(200d, 90d)) ((200d, 80d),(210d, 90d)) ((210d, 80d),(220d, 90d)) ((220d, 80d),(230d, 90d)) ((230d, 80d),(240d, 90d)) ((240d, 80d),(250d, 90d)) ((250d, 80d),(260d, 90d)) ((260d, 80d),(270d, 90d)) ((270d, 80d),(280d, 90d)) ((280d, 80d),(290d, 90d)) ((290d, 80d),(300d, 90d)) ((300d, 80d),(310d, 90d)) ((310d, 80d),(320d, 90d)) ((320d, 80d),(330d, 90d)) ((330d, 80d),(340d, 90d)) ((340d, 80d),(350d, 90d)) ((350d, 80d),(360d, 90d)) ( (0, 90d),(0, 90d) ) \N \N \N \N \. pgsphere/data/test_spherecircle.data000066400000000000000000000136371332443031700201600ustar00rootroot00000000000000<(2.52,-0.92),0.07> <(1.51,-0.04),0.08> <(-2.08,-0.54),0.09> <(1.88,-1.22),0.08> <(1.42,-0.49),0.07> <(-1.74,-0.58),0.06> <(1.86,-0.00),0.02> <(-0.27,0.32),0.05> <(-0.70,-1.05),0.08> <(3.01,0.69),0.05> <(-0.19,0.04),0.04> <(-3.03,-1.33),0.07> <(-2.00,0.34),0.08> <(-1.24,-0.37),0.09> <(-0.70,0.51),0.09> <(-3.02,0.23),0.10> <(0.10,-0.19),0.04> <(-2.14,0.39),0.06> <(1.41,-1.12),0.09> <(2.00,0.31),0.09> <(2.63,0.58),0.10> <(-1.53,-1.10),0.10> <(1.41,-0.57),0.08> <(1.05,-0.79),0.07> <(-0.35,-0.72),0.07> <(2.88,0.04),0.04> <(2.02,0.32),0.06> <(0.87,0.69),0.07> <(-1.83,0.29),0.05> <(-0.78,0.72),0.08> <(2.08,-0.02),0.09> <(1.51,1.23),0.09> <(0.47,0.39),0.07> <(0.54,0.14),0.09> <(-0.83,1.19),0.08> <(-1.53,-0.88),0.09> <(-3.09,-1.09),0.10> <(1.04,-0.37),0.07> <(2.18,0.47),0.07> <(0.42,-0.31),0.07> <(2.03,-0.35),0.06> <(-1.59,1.07),0.07> <(2.75,1.23),0.08> <(1.00,-0.50),0.06> <(-2.06,-0.24),0.09> <(1.26,-0.23),0.10> <(1.90,-0.22),0.09> <(-2.40,-0.01),0.10> <(-1.56,-0.59),0.06> <(2.92,-0.70),0.03> <(-0.85,-0.27),0.09> <(-2.83,-0.40),0.07> <(0.52,-0.16),0.08> <(-1.49,-0.37),0.09> <(-1.92,-0.42),0.08> <(-1.00,-0.02),0.05> <(-2.96,-0.49),0.08> <(1.90,0.08),0.09> <(-1.74,0.57),0.04> <(2.47,-0.39),0.07> <(0.96,0.79),0.05> <(2.45,-1.08),0.09> <(0.70,0.05),0.09> <(1.07,0.72),0.09> <(-1.36,-0.29),0.07> <(-0.52,-0.48),0.06> <(-2.30,-0.78),0.07> <(1.35,-0.87),0.05> <(-0.77,-0.01),0.08> <(0.89,0.92),0.03> <(-1.56,-0.54),0.09> <(0.88,-0.04),0.10> <(-1.99,0.18),0.10> <(-2.61,-0.74),0.08> <(-2.69,-0.79),0.08> <(0.10,-0.02),0.09> <(2.39,0.13),0.09> <(-2.83,1.13),0.05> <(1.75,-1.07),0.09> <(0.81,-0.94),0.05> <(2.63,-1.43),0.09> <(-3.00,-0.70),0.09> <(-0.13,0.53),0.10> <(-0.09,1.34),0.08> <(0.90,1.02),0.08> <(0.52,0.83),0.07> <(2.67,0.27),0.10> <(-0.19,-1.02),0.09> <(-0.58,0.29),0.09> <(-2.98,-1.29),0.08> <(1.01,-0.79),0.07> <(-2.07,1.28),0.08> <(-3.07,0.31),0.06> <(-1.56,-0.45),0.07> <(-1.24,0.43),0.08> <(2.62,-0.96),0.09> <(1.70,0.64),0.06> <(-2.86,-0.24),0.09> <(2.02,0.68),0.09> <(-0.60,0.46),0.09> <(1.73,-0.16),0.05> <(-1.44,0.44),0.08> <(-2.49,0.74),0.06> <(-1.25,0.12),0.06> <(1.99,0.02),0.06> <(-2.56,-0.90),0.02> <(-2.66,0.44),0.09> <(0.67,-0.17),0.09> <(-3.08,-0.32),0.07> <(-1.60,1.38),0.09> <(-0.19,0.42),0.07> <(1.79,-0.68),0.10> <(-2.77,0.20),0.09> <(-1.71,-0.26),0.07> <(2.70,0.78),0.09> <(2.66,0.21),0.08> <(2.93,0.29),0.10> <(2.11,-0.32),0.06> <(-2.59,-1.05),0.07> <(2.94,0.82),0.10> <(0.38,-0.13),0.05> <(3.09,1.27),0.08> <(-1.63,0.14),0.09> <(1.73,0.93),0.08> <(-1.99,-0.93),0.06> <(-0.59,-0.12),0.08> <(2.33,1.12),0.08> <(1.35,-0.25),0.06> <(2.61,-1.40),0.10> <(-0.36,0.27),0.06> <(2.04,-0.54),0.09> <(-1.24,-0.41),0.09> <(-2.24,-0.84),0.08> <(-1.02,0.23),0.05> <(-1.12,-0.04),0.07> <(-0.74,0.61),0.08> <(-2.18,0.64),0.08> <(-2.88,-0.68),0.09> <(-1.15,-0.21),0.10> <(-2.44,-0.36),0.09> <(-2.09,-0.10),0.04> <(-2.78,0.80),0.10> <(3.08,-0.55),0.10> <(-2.20,-0.52),0.08> <(-0.45,0.17),0.04> <(-3.09,0.05),0.09> <(-0.94,0.09),0.05> <(-0.79,0.09),0.10> <(0.83,0.19),0.07> <(-1.79,-1.05),0.08> <(2.57,-1.21),0.09> <(1.29,-0.48),0.09> <(0.19,0.43),0.09> <(1.96,-1.20),0.07> <(-1.58,0.31),0.08> <(1.24,0.14),0.07> <(-1.48,1.00),0.08> <(1.02,-0.40),0.07> <(2.23,0.77),0.09> <(1.16,-0.44),0.04> <(-1.70,-0.50),0.09> <(0.26,-0.24),0.09> <(1.30,-1.04),0.06> <(1.68,-0.56),0.07> <(-2.92,-1.14),0.08> <(0.80,-0.72),0.07> <(2.27,1.25),0.05> <(-2.41,0.19),0.09> <(1.32,-0.81),0.07> <(0.51,-0.00),0.07> <(-3.04,0.63),0.08> <(-2.11,-0.17),0.08> <(1.34,-0.33),0.06> <(-1.63,1.12),0.07> <(0.04,-0.64),0.07> <(1.53,-0.18),0.06> <(1.89,-0.12),0.10> <(-2.34,0.06),0.06> <(-3.12,-0.06),0.08> <(2.67,0.29),0.07> <(-1.91,-1.15),0.04> <(-1.60,1.26),0.06> <(-2.07,-0.18),0.07> <(3.08,0.27),0.10> <(-2.38,0.27),0.08> <(0.19,0.65),0.09> <(-2.47,1.00),0.09> <(-2.74,-0.30),0.09> <(-1.06,0.22),0.08> <(-2.95,0.60),0.04> <(2.61,1.15),0.07> <(0.40,0.32),0.09> <(-1.36,-0.39),0.10> <(-0.48,-0.02),0.05> <(0.36,0.06),0.09> <(-0.55,0.20),0.10> <(-2.31,0.08),0.08> <(-2.33,-0.35),0.06> <(1.78,1.27),0.08> <(-0.37,-0.88),0.05> <(-0.13,-0.81),0.08> <(-0.85,-0.24),0.02> <(-0.34,1.31),0.09> <(-1.22,0.80),0.10> <(0.91,-0.47),0.08> <(-0.87,-0.95),0.07> <(1.22,-0.14),0.08> <(1.22,0.21),0.10> <(0.59,1.16),0.06> <(-1.79,0.26),0.05> <(1.61,-0.54),0.06> <(2.57,1.46),0.08> <(0.88,0.72),0.07> <(-0.46,0.49),0.07> <(-2.88,0.07),0.07> <(-0.96,-0.14),0.08> <(-2.07,-0.73),0.09> <(-2.09,-0.36),0.10> <(2.84,1.01),0.08> <(-2.41,0.12),0.08> <(-0.82,1.23),0.08> <(0.21,-0.60),0.08> <(-2.19,-0.18),0.05> <(-0.71,0.67),0.10> <(-0.13,0.23),0.09> <(2.36,-0.79),0.09> <(1.11,-0.22),0.08> <(-0.70,1.26),0.07> <(-1.82,-0.43),0.05> <(0.49,0.64),0.06> <(-2.87,0.25),0.07> <(-0.53,-0.99),0.08> <(1.01,-0.35),0.07> <(-1.62,0.47),0.07> <(-1.45,0.38),0.09> <(-1.78,0.26),0.07> <(-0.76,-0.61),0.08> <(-0.72,-0.87),0.09> <(1.53,0.05),0.10> <(-0.35,-0.75),0.08> <(1.73,0.20),0.05> <(-0.35,0.01),0.05> <(-1.33,-1.18),0.09> <(2.67,-0.08),0.09> <(-1.97,-0.05),0.09> <(0.34,-1.29),0.06> <(-2.59,0.27),0.09> <(-1.39,-0.48),0.09> <(-0.54,-0.11),0.08> <(-2.74,0.12),0.08> <(-2.97,-0.72),0.08> <(0.98,-0.52),0.07> <(-2.99,-1.22),0.08> <(3.09,0.63),0.03> <(-0.17,-0.43),0.07> <(-3.13,0.33),0.08> <(2.12,-0.15),0.09> <(1.14,-1.39),0.06> <(0.54,0.14),0.08> <(3.13,-0.63),0.06> <(-0.42,0.60),0.10> <(-2.94,-0.66),0.07> <(-0.16,0.72),0.09> <(-2.48,-0.50),0.08> <(-2.56,-1.20),0.08> <(2.75,0.22),0.07> <(-2.90,1.32),0.05> <(-2.21,-0.93),0.08> <(2.89,-0.76),0.10> <(-1.45,-0.10),0.08> <(-1.11,0.59),0.09> <(-2.92,0.22),0.08> <(-0.55,-1.11),0.08> <(1.90,-0.19),0.06> <(-0.27,-0.97),0.10> <(2.69,-0.43),0.07> <(0.77,1.38),0.09> <(1.12,1.21),0.09> <(-2.53,-0.50),0.08> <(1.69,0.06),0.09> <(3.11,0.81),0.06> <(-2.58,0.33),0.09> <(1.89,-0.89),0.04> <(-1.23,0.98),0.04> <(-1.45,0.69),0.07> <(-2.04,0.22),0.06> <(2.06,0.17),0.04> <(3.03,-0.41),0.08> <(3.05,-0.34),0.08> <(1.21,0.31),0.07> <(2.55,-0.14),0.09> <(1.20,0.23),0.07> <(0.78,1.26),0.10> <(0.96,0.04),0.06> <(3.14,0.03),0.10> <(-2.53,-1.05),0.09> <(1.31,0.09),0.09> <(0.70,-1.23),0.03> <(-1.15,1.09),0.09> <(2.91,-0.60),0.09> \N \N \N \N \N \N \N \N \. pgsphere/data/test_spherepath.data000066400000000000000000000075511332443031700176510ustar00rootroot000000000000001 {(0d,30d),(45d,30d),(90d,30d),(135d,30d),(180d,30d),(225d,30d),(270d,30d),(315d,30d)} 2 {(0d,-5d),(1d,-5d),(2d,-5d),(3d,-5d),(4d,-5d),(5d,-5d),(6d,-5d),(7d,-5d),(8d,-5d),(9d,-5d),(10d,-5d),(11d,-5d),(12d,-5d),(13d,-5d),(14d,-5d),(15d,-5d),(16d,-5d),(17d,-5d),(18d,-5d),(19d,-5d),(20d,-5d),(21d,-5d),(22d,-5d),(23d,-5d),(24d,-5d),(25d,-5d),(26d,-5d),(27d,-5d),(28d,-5d),(29d,-5d),(30d,-5d),(31d,-5d),(32d,-5d),(33d,-5d),(34d,-5d),(35d,-5d),(36d,-5d),(37d,-5d),(38d,-5d),(39d,-5d),(40d,-5d),(41d,-5d),(42d,-5d),(43d,-5d),(44d,-5d),(45d,-5d),(46d,-5d),(47d,-5d),(48d,-5d),(49d,-5d),(50d,-5d),(51d,-5d),(52d,-5d),(53d,-5d),(54d,-5d),(55d,-5d),(56d,-5d),(57d,-5d),(58d,-5d),(59d,-5d),(60d,-5d),(61d,-5d),(62d,-5d),(63d,-5d),(64d,-5d),(65d,-5d),(66d,-5d),(67d,-5d),(68d,-5d),(69d,-5d),(70d,-5d),(71d,-5d),(72d,-5d),(73d,-5d),(74d,-5d),(75d,-5d),(76d,-5d),(77d,-5d),(78d,-5d),(79d,-5d),(80d,-5d),(81d,-5d),(82d,-5d),(83d,-5d),(84d,-5d),(85d,-5d),(86d,-5d),(87d,-5d),(88d,-5d),(89d,-5d),(90d,-5d),(91d,-5d),(92d,-5d),(93d,-5d),(94d,-5d),(95d,-5d),(96d,-5d),(97d,-5d),(98d,-5d),(99d,-5d),(100d,-5d),(101d,-5d),(102d,-5d),(103d,-5d),(104d,-5d),(105d,-5d),(106d,-5d),(107d,-5d),(108d,-5d),(109d,-5d),(110d,-5d),(111d,-5d),(112d,-5d),(113d,-5d),(114d,-5d),(115d,-5d),(116d,-5d),(117d,-5d),(118d,-5d),(119d,-5d),(120d,-5d),(121d,-5d),(122d,-5d),(123d,-5d),(124d,-5d),(125d,-5d),(126d,-5d),(127d,-5d),(128d,-5d),(129d,-5d),(130d,-5d),(131d,-5d),(132d,-5d),(133d,-5d),(134d,-5d),(135d,-5d),(136d,-5d),(137d,-5d),(138d,-5d),(139d,-5d),(140d,-5d),(141d,-5d),(142d,-5d),(143d,-5d),(144d,-5d),(145d,-5d),(146d,-5d),(147d,-5d),(148d,-5d),(149d,-5d),(150d,-5d),(151d,-5d),(152d,-5d),(153d,-5d),(154d,-5d),(155d,-5d),(156d,-5d),(157d,-5d),(158d,-5d),(159d,-5d),(160d,-5d),(161d,-5d),(162d,-5d),(163d,-5d),(164d,-5d),(165d,-5d),(166d,-5d),(167d,-5d),(168d,-5d),(169d,-5d),(170d,-5d),(171d,-5d),(172d,-5d),(173d,-5d),(174d,-5d),(175d,-5d),(176d,-5d),(177d,-5d),(178d,-5d),(179d,-5d),(180d,-5d),(181d,-5d),(182d,-5d),(183d,-5d),(184d,-5d),(185d,-5d),(186d,-5d),(187d,-5d),(188d,-5d),(189d,-5d),(190d,-5d),(191d,-5d),(192d,-5d),(193d,-5d),(194d,-5d),(195d,-5d),(196d,-5d),(197d,-5d),(198d,-5d),(199d,-5d),(200d,-5d),(201d,-5d),(202d,-5d),(203d,-5d),(204d,-5d),(205d,-5d),(206d,-5d),(207d,-5d),(208d,-5d),(209d,-5d),(210d,-5d),(211d,-5d),(212d,-5d),(213d,-5d),(214d,-5d),(215d,-5d),(216d,-5d),(217d,-5d),(218d,-5d),(219d,-5d),(220d,-5d),(221d,-5d),(222d,-5d),(223d,-5d),(224d,-5d),(225d,-5d),(226d,-5d),(227d,-5d),(228d,-5d),(229d,-5d),(230d,-5d),(231d,-5d),(232d,-5d),(233d,-5d),(234d,-5d),(235d,-5d),(236d,-5d),(237d,-5d),(238d,-5d),(239d,-5d),(240d,-5d),(241d,-5d),(242d,-5d),(243d,-5d),(244d,-5d),(245d,-5d),(246d,-5d),(247d,-5d),(248d,-5d),(249d,-5d),(250d,-5d),(251d,-5d),(252d,-5d),(253d,-5d),(254d,-5d),(255d,-5d),(256d,-5d),(257d,-5d),(258d,-5d),(259d,-5d),(260d,-5d),(261d,-5d),(262d,-5d),(263d,-5d),(264d,-5d),(265d,-5d),(266d,-5d),(267d,-5d),(268d,-5d),(269d,-5d),(270d,-5d),(271d,-5d),(272d,-5d),(273d,-5d),(274d,-5d),(275d,-5d),(276d,-5d),(277d,-5d),(278d,-5d),(279d,-5d),(280d,-5d),(281d,-5d),(282d,-5d),(283d,-5d),(284d,-5d),(285d,-5d),(286d,-5d),(287d,-5d),(288d,-5d),(289d,-5d),(290d,-5d),(291d,-5d),(292d,-5d),(293d,-5d),(294d,-5d),(295d,-5d),(296d,-5d),(297d,-5d),(298d,-5d),(299d,-5d),(300d,-5d),(301d,-5d),(302d,-5d),(303d,-5d),(304d,-5d),(305d,-5d),(306d,-5d),(307d,-5d),(308d,-5d),(309d,-5d),(310d,-5d),(311d,-5d),(312d,-5d),(313d,-5d),(314d,-5d),(315d,-5d),(316d,-5d),(317d,-5d),(318d,-5d),(319d,-5d),(320d,-5d),(321d,-5d),(322d,-5d),(323d,-5d),(324d,-5d),(325d,-5d),(326d,-5d),(327d,-5d),(328d,-5d),(329d,-5d),(330d,-5d),(331d,-5d),(332d,-5d),(333d,-5d),(334d,-5d),(335d,-5d),(336d,-5d),(337d,-5d),(338d,-5d),(339d,-5d),(340d,-5d),(341d,-5d),(342d,-5d),(343d,-5d),(344d,-5d),(345d,-5d),(346d,-5d),(347d,-5d),(348d,-5d),(349d,-5d),(350d,-5d),(351d,-5d),(352d,-5d),(353d,-5d),(354d,-5d),(355d,-5d),(356d,-5d),(357d,-5d),(358d,-5d),(359d,-5d)} \. pgsphere/data/test_spherepoint.data000066400000000000000000000076401332443031700200450ustar00rootroot00000000000000(1.32,0.61) (-0.40,-0.17) (2.30,0.60) (-0.92,-0.19) (-0.93,0.52) (1.89,0.10) (1.33,0.52) (2.19,0.94) (0.13,0.34) (0.19,-0.79) (0.52,0.45) (-1.62,0.14) (-1.46,-0.75) (-0.81,-0.08) (3.00,-0.08) (2.21,-0.91) (0.89,1.48) (-0.61,-0.82) (1.06,-1.13) (1.99,-1.11) (-0.18,-0.41) (3.09,1.25) (0.01,0.28) (-3.08,0.72) (-2.67,0.97) (2.32,0.88) (-1.44,0.07) (-0.26,-0.09) (-2.79,1.36) (-0.27,-0.51) (2.15,0.84) (-1.58,0.30) (2.23,0.63) (-0.43,0.52) (-3.12,0.85) (2.65,-0.20) (2.33,-0.05) (-2.08,0.14) (-0.92,-1.16) (2.87,-1.38) (2.43,1.09) (-0.44,-0.50) (0.41,-0.34) (-1.47,-0.44) (2.61,0.34) (3.02,0.84) (1.14,0.01) (-3.12,-0.21) (0.99,-1.22) (2.39,-0.42) (-2.33,-0.20) (0.22,-0.09) (-0.78,-0.41) (-2.51,-0.53) (0.66,1.29) (-2.68,-0.78) (1.48,-0.93) (1.57,-1.06) (2.33,-0.66) (1.08,0.27) (-0.21,-0.30) (-2.69,-0.49) (-1.82,0.48) (0.03,0.29) (2.50,0.63) (-0.73,-0.14) (-2.09,-0.49) (-0.89,0.66) (1.29,0.57) (2.51,-0.96) (2.66,0.16) (0.97,-0.84) (-1.00,1.02) (2.71,0.08) (2.64,-0.89) (-2.35,0.92) (1.10,0.35) (1.07,1.09) (1.13,0.53) (-0.33,-0.29) (1.50,1.10) (-3.06,0.07) (0.25,-0.17) (0.07,-0.46) (0.06,0.40) (-2.60,0.75) (-1.38,-0.66) (2.01,-0.23) (0.42,-0.01) (1.05,-1.24) (-2.11,-0.82) (-0.16,-0.05) (0.30,-0.39) (1.35,0.05) (-0.93,0.50) (-2.28,0.11) (2.82,0.68) (2.74,-0.90) (1.36,-0.31) (-0.81,-0.20) (2.07,-0.04) (-2.59,0.57) (-1.82,0.44) (-0.46,0.06) (1.09,-0.57) (2.49,-0.07) (-2.39,-0.14) (-1.92,-0.47) (-1.26,0.35) (-2.83,0.16) (1.42,0.42) (-3.13,-0.99) (-0.31,0.14) (-1.63,-0.14) (-1.01,-0.63) (-2.75,-0.20) (1.21,0.69) (0.05,-0.97) (-2.30,0.12) (2.05,-0.82) (1.30,-0.33) (2.89,0.03) (2.47,0.50) (-2.59,0.28) (-1.16,-0.21) (-0.28,0.15) (2.26,-0.90) (1.40,0.67) (-2.93,0.50) (-1.62,0.09) (1.32,0.32) (-2.40,0.43) (-1.88,0.80) (-0.84,0.80) (-2.15,-0.04) (1.29,-0.90) (2.26,0.27) (1.56,0.48) (3.06,0.12) (2.54,0.59) (0.98,-0.60) (1.41,0.05) (1.25,0.42) (-3.11,-0.19) (2.22,-0.73) (0.42,0.09) (-0.98,-0.11) (-0.02,0.99) (-1.06,0.32) (-2.14,-1.13) (-3.11,0.35) (1.45,-0.39) (-2.92,-0.90) (0.93,0.27) (2.42,1.29) (2.65,-0.07) (-2.19,0.05) (-1.33,-0.23) (2.24,-0.57) (-1.81,0.88) (0.01,0.51) (0.97,-0.71) (2.71,-0.26) (1.67,-0.35) (-1.52,0.45) (-1.78,-0.01) (0.38,1.03) (1.90,-0.69) (1.92,0.65) (-1.83,-1.40) (-2.27,0.45) (0.84,0.18) (-0.87,0.60) (2.20,0.89) (-0.39,-0.33) (0.84,-0.71) (0.62,-0.15) (1.63,-0.11) (1.43,0.46) (-0.45,0.91) (2.02,0.24) (-1.25,-0.73) (2.45,0.74) (2.82,0.52) (2.50,-0.83) (-2.02,0.32) (1.89,-0.02) (1.48,0.98) (1.45,-0.54) (-3.00,-1.04) (3.08,-0.25) (2.41,0.02) (-2.56,-0.51) (2.14,-0.58) (2.87,-1.24) (-3.12,-1.38) (1.24,0.95) (-0.67,1.05) (1.97,-0.20) (-0.01,-0.49) (-0.51,-0.43) (3.02,0.69) (1.09,-0.09) (-0.10,-0.57) (-3.08,-0.15) (0.08,0.32) (-1.54,-0.46) (-1.82,0.73) (-1.26,0.40) (0.22,-1.42) (1.23,-1.14) (-2.08,-1.03) (1.42,-0.64) (1.72,0.11) (1.70,0.90) (2.79,0.31) (2.90,0.28) (-2.54,0.69) (-2.17,0.28) (1.75,-0.00) (-1.16,-0.47) (1.02,0.12) (-0.88,-0.37) (2.45,-0.78) (-1.49,-1.16) (-0.31,1.25) (1.70,-0.94) (-1.96,0.05) (-1.70,-0.99) (-1.68,0.79) (-2.32,-0.35) (-2.01,-1.32) (2.55,-0.69) (2.87,0.26) (-0.01,0.64) (-0.17,0.84) (2.10,1.08) (1.91,0.90) (-0.80,-0.45) (2.51,0.44) (-0.92,-0.80) (1.18,0.83) (-2.79,0.90) (1.85,-0.46) (-2.47,0.02) (2.67,-0.65) (2.77,-0.22) (-1.95,0.27) (-1.76,0.31) (-0.37,0.64) (1.07,-0.97) (2.63,-0.28) (2.44,-0.32) (0.36,-0.86) (-1.31,0.89) (-0.12,-0.65) (-1.09,0.56) (-2.93,-0.05) (1.90,0.02) (2.54,-1.17) (2.75,1.18) (-1.05,-0.29) (0.42,-0.06) (-0.78,-1.15) (-1.29,0.10) (0.67,0.97) (3.00,0.76) (-0.12,-1.12) (-1.87,-0.02) (-1.68,-0.74) (1.84,-0.42) (0.57,0.10) (0.55,0.27) (-2.94,1.05) (1.49,0.52) (0.38,0.04) (1.94,1.33) (-1.39,0.41) (2.06,0.60) (1.06,-0.54) (2.92,-0.37) (0.53,-1.21) (0.69,1.35) (-2.67,-0.48) (1.31,1.19) (0.21,-0.72) (0.26,-1.00) (3.03,0.54) (-2.86,0.01) (1.97,1.48) (-1.74,0.93) (3.09,0.60) (-1.83,-0.28) (-3.06,-0.56) (1.46,-0.48) (0.69,-1.09) (0.13,-0.66) (-2.41,0.05) (1.23,-0.62) (0.67,0.89) (12h 12 , -2d 23.0 ) (180d 1m 10s , -2d 23' 59" ) (12h 11m 10 , +2d 23' 59.9 ) \N \N \N \N \N \N \N \N \. pgsphere/data/test_spherepolygon.data000066400000000000000000000075511332443031700204040ustar00rootroot000000000000001 {(0d,30d),(45d,30d),(90d,30d),(135d,30d),(180d,30d),(225d,30d),(270d,30d),(315d,30d)} 2 {(0d,-5d),(1d,-5d),(2d,-5d),(3d,-5d),(4d,-5d),(5d,-5d),(6d,-5d),(7d,-5d),(8d,-5d),(9d,-5d),(10d,-5d),(11d,-5d),(12d,-5d),(13d,-5d),(14d,-5d),(15d,-5d),(16d,-5d),(17d,-5d),(18d,-5d),(19d,-5d),(20d,-5d),(21d,-5d),(22d,-5d),(23d,-5d),(24d,-5d),(25d,-5d),(26d,-5d),(27d,-5d),(28d,-5d),(29d,-5d),(30d,-5d),(31d,-5d),(32d,-5d),(33d,-5d),(34d,-5d),(35d,-5d),(36d,-5d),(37d,-5d),(38d,-5d),(39d,-5d),(40d,-5d),(41d,-5d),(42d,-5d),(43d,-5d),(44d,-5d),(45d,-5d),(46d,-5d),(47d,-5d),(48d,-5d),(49d,-5d),(50d,-5d),(51d,-5d),(52d,-5d),(53d,-5d),(54d,-5d),(55d,-5d),(56d,-5d),(57d,-5d),(58d,-5d),(59d,-5d),(60d,-5d),(61d,-5d),(62d,-5d),(63d,-5d),(64d,-5d),(65d,-5d),(66d,-5d),(67d,-5d),(68d,-5d),(69d,-5d),(70d,-5d),(71d,-5d),(72d,-5d),(73d,-5d),(74d,-5d),(75d,-5d),(76d,-5d),(77d,-5d),(78d,-5d),(79d,-5d),(80d,-5d),(81d,-5d),(82d,-5d),(83d,-5d),(84d,-5d),(85d,-5d),(86d,-5d),(87d,-5d),(88d,-5d),(89d,-5d),(90d,-5d),(91d,-5d),(92d,-5d),(93d,-5d),(94d,-5d),(95d,-5d),(96d,-5d),(97d,-5d),(98d,-5d),(99d,-5d),(100d,-5d),(101d,-5d),(102d,-5d),(103d,-5d),(104d,-5d),(105d,-5d),(106d,-5d),(107d,-5d),(108d,-5d),(109d,-5d),(110d,-5d),(111d,-5d),(112d,-5d),(113d,-5d),(114d,-5d),(115d,-5d),(116d,-5d),(117d,-5d),(118d,-5d),(119d,-5d),(120d,-5d),(121d,-5d),(122d,-5d),(123d,-5d),(124d,-5d),(125d,-5d),(126d,-5d),(127d,-5d),(128d,-5d),(129d,-5d),(130d,-5d),(131d,-5d),(132d,-5d),(133d,-5d),(134d,-5d),(135d,-5d),(136d,-5d),(137d,-5d),(138d,-5d),(139d,-5d),(140d,-5d),(141d,-5d),(142d,-5d),(143d,-5d),(144d,-5d),(145d,-5d),(146d,-5d),(147d,-5d),(148d,-5d),(149d,-5d),(150d,-5d),(151d,-5d),(152d,-5d),(153d,-5d),(154d,-5d),(155d,-5d),(156d,-5d),(157d,-5d),(158d,-5d),(159d,-5d),(160d,-5d),(161d,-5d),(162d,-5d),(163d,-5d),(164d,-5d),(165d,-5d),(166d,-5d),(167d,-5d),(168d,-5d),(169d,-5d),(170d,-5d),(171d,-5d),(172d,-5d),(173d,-5d),(174d,-5d),(175d,-5d),(176d,-5d),(177d,-5d),(178d,-5d),(179d,-5d),(180d,-5d),(181d,-5d),(182d,-5d),(183d,-5d),(184d,-5d),(185d,-5d),(186d,-5d),(187d,-5d),(188d,-5d),(189d,-5d),(190d,-5d),(191d,-5d),(192d,-5d),(193d,-5d),(194d,-5d),(195d,-5d),(196d,-5d),(197d,-5d),(198d,-5d),(199d,-5d),(200d,-5d),(201d,-5d),(202d,-5d),(203d,-5d),(204d,-5d),(205d,-5d),(206d,-5d),(207d,-5d),(208d,-5d),(209d,-5d),(210d,-5d),(211d,-5d),(212d,-5d),(213d,-5d),(214d,-5d),(215d,-5d),(216d,-5d),(217d,-5d),(218d,-5d),(219d,-5d),(220d,-5d),(221d,-5d),(222d,-5d),(223d,-5d),(224d,-5d),(225d,-5d),(226d,-5d),(227d,-5d),(228d,-5d),(229d,-5d),(230d,-5d),(231d,-5d),(232d,-5d),(233d,-5d),(234d,-5d),(235d,-5d),(236d,-5d),(237d,-5d),(238d,-5d),(239d,-5d),(240d,-5d),(241d,-5d),(242d,-5d),(243d,-5d),(244d,-5d),(245d,-5d),(246d,-5d),(247d,-5d),(248d,-5d),(249d,-5d),(250d,-5d),(251d,-5d),(252d,-5d),(253d,-5d),(254d,-5d),(255d,-5d),(256d,-5d),(257d,-5d),(258d,-5d),(259d,-5d),(260d,-5d),(261d,-5d),(262d,-5d),(263d,-5d),(264d,-5d),(265d,-5d),(266d,-5d),(267d,-5d),(268d,-5d),(269d,-5d),(270d,-5d),(271d,-5d),(272d,-5d),(273d,-5d),(274d,-5d),(275d,-5d),(276d,-5d),(277d,-5d),(278d,-5d),(279d,-5d),(280d,-5d),(281d,-5d),(282d,-5d),(283d,-5d),(284d,-5d),(285d,-5d),(286d,-5d),(287d,-5d),(288d,-5d),(289d,-5d),(290d,-5d),(291d,-5d),(292d,-5d),(293d,-5d),(294d,-5d),(295d,-5d),(296d,-5d),(297d,-5d),(298d,-5d),(299d,-5d),(300d,-5d),(301d,-5d),(302d,-5d),(303d,-5d),(304d,-5d),(305d,-5d),(306d,-5d),(307d,-5d),(308d,-5d),(309d,-5d),(310d,-5d),(311d,-5d),(312d,-5d),(313d,-5d),(314d,-5d),(315d,-5d),(316d,-5d),(317d,-5d),(318d,-5d),(319d,-5d),(320d,-5d),(321d,-5d),(322d,-5d),(323d,-5d),(324d,-5d),(325d,-5d),(326d,-5d),(327d,-5d),(328d,-5d),(329d,-5d),(330d,-5d),(331d,-5d),(332d,-5d),(333d,-5d),(334d,-5d),(335d,-5d),(336d,-5d),(337d,-5d),(338d,-5d),(339d,-5d),(340d,-5d),(341d,-5d),(342d,-5d),(343d,-5d),(344d,-5d),(345d,-5d),(346d,-5d),(347d,-5d),(348d,-5d),(349d,-5d),(350d,-5d),(351d,-5d),(352d,-5d),(353d,-5d),(354d,-5d),(355d,-5d),(356d,-5d),(357d,-5d),(358d,-5d),(359d,-5d)} \. pgsphere/data/test_spherepolygon_aggregate.data000066400000000000000000000101651332443031700224050ustar00rootroot00000000000000(0d,-0.9) (1d,-0.9) (2d,-0.9) (3d,-0.9) (4d,-0.9) (5d,-0.9) (6d,-0.9) (7d,-0.9) (8d,-0.9) (9d,-0.9) (10d,-0.9) (11d,-0.9) (12d,-0.9) (13d,-0.9) (14d,-0.9) (15d,-0.9) (16d,-0.9) (17d,-0.9) (18d,-0.9) (19d,-0.9) (20d,-0.9) (21d,-0.9) (22d,-0.9) (23d,-0.9) (24d,-0.9) (25d,-0.9) (26d,-0.9) (27d,-0.9) (28d,-0.9) (29d,-0.9) (30d,-0.9) (31d,-0.9) (32d,-0.9) (33d,-0.9) (34d,-0.9) (35d,-0.9) (36d,-0.9) (37d,-0.9) (38d,-0.9) (39d,-0.9) (40d,-0.9) (41d,-0.9) (42d,-0.9) (43d,-0.9) (44d,-0.9) (45d,-0.9) (46d,-0.9) (47d,-0.9) (48d,-0.9) (49d,-0.9) (50d,-0.9) (51d,-0.9) (52d,-0.9) (53d,-0.9) (54d,-0.9) (55d,-0.9) (56d,-0.9) (57d,-0.9) (58d,-0.9) (59d,-0.9) (60d,-0.9) (61d,-0.9) (62d,-0.9) (63d,-0.9) (64d,-0.9) (65d,-0.9) (66d,-0.9) (67d,-0.9) (68d,-0.9) (69d,-0.9) (70d,-0.9) (71d,-0.9) (72d,-0.9) (73d,-0.9) (74d,-0.9) (75d,-0.9) (76d,-0.9) (77d,-0.9) (78d,-0.9) (79d,-0.9) (80d,-0.9) (81d,-0.9) (82d,-0.9) (83d,-0.9) (84d,-0.9) (85d,-0.9) (86d,-0.9) (87d,-0.9) (88d,-0.9) (89d,-0.9) (90d,-0.9) (91d,-0.9) (92d,-0.9) (93d,-0.9) (94d,-0.9) (95d,-0.9) (96d,-0.9) (97d,-0.9) (98d,-0.9) (99d,-0.9) (100d,-0.9) (101d,-0.9) (102d,-0.9) (103d,-0.9) (104d,-0.9) (105d,-0.9) (106d,-0.9) (107d,-0.9) (108d,-0.9) (109d,-0.9) (110d,-0.9) (111d,-0.9) (112d,-0.9) (113d,-0.9) (114d,-0.9) (115d,-0.9) (116d,-0.9) (117d,-0.9) (118d,-0.9) (119d,-0.9) (120d,-0.9) (121d,-0.9) (122d,-0.9) (123d,-0.9) (124d,-0.9) (125d,-0.9) (126d,-0.9) (127d,-0.9) (128d,-0.9) (129d,-0.9) (130d,-0.9) (131d,-0.9) (132d,-0.9) (133d,-0.9) (134d,-0.9) (135d,-0.9) (136d,-0.9) (137d,-0.9) (138d,-0.9) (139d,-0.9) (140d,-0.9) (141d,-0.9) (142d,-0.9) (143d,-0.9) (144d,-0.9) (145d,-0.9) (146d,-0.9) (147d,-0.9) (148d,-0.9) (149d,-0.9) (150d,-0.9) (151d,-0.9) (152d,-0.9) (153d,-0.9) (154d,-0.9) (155d,-0.9) (156d,-0.9) (157d,-0.9) (158d,-0.9) (159d,-0.9) (160d,-0.9) (161d,-0.9) (162d,-0.9) (163d,-0.9) (164d,-0.9) (165d,-0.9) (166d,-0.9) (167d,-0.9) (168d,-0.9) (169d,-0.9) (170d,-0.9) (171d,-0.9) (172d,-0.9) (173d,-0.9) (174d,-0.9) (175d,-0.9) (176d,-0.9) (177d,-0.9) (178d,-0.9) (179d,-0.9) (180d,-0.9) (181d,-0.9) (182d,-0.9) (183d,-0.9) (184d,-0.9) (185d,-0.9) (186d,-0.9) (187d,-0.9) (188d,-0.9) (189d,-0.9) (190d,-0.9) (191d,-0.9) (192d,-0.9) (193d,-0.9) (194d,-0.9) (195d,-0.9) (196d,-0.9) (197d,-0.9) (198d,-0.9) (199d,-0.9) (200d,-0.9) (201d,-0.9) (202d,-0.9) (203d,-0.9) (204d,-0.9) (205d,-0.9) (206d,-0.9) (207d,-0.9) (208d,-0.9) (209d,-0.9) (210d,-0.9) (211d,-0.9) (212d,-0.9) (213d,-0.9) (214d,-0.9) (215d,-0.9) (216d,-0.9) (217d,-0.9) (218d,-0.9) (219d,-0.9) (220d,-0.9) (221d,-0.9) (222d,-0.9) (223d,-0.9) (224d,-0.9) (225d,-0.9) (226d,-0.9) (227d,-0.9) (228d,-0.9) (229d,-0.9) (230d,-0.9) (231d,-0.9) (232d,-0.9) (233d,-0.9) (234d,-0.9) (235d,-0.9) (236d,-0.9) (237d,-0.9) (238d,-0.9) (239d,-0.9) (240d,-0.9) (241d,-0.9) (242d,-0.9) (243d,-0.9) (244d,-0.9) (245d,-0.9) (246d,-0.9) (247d,-0.9) (248d,-0.9) (249d,-0.9) (250d,-0.9) (251d,-0.9) (252d,-0.9) (253d,-0.9) (254d,-0.9) (255d,-0.9) (256d,-0.9) (257d,-0.9) (258d,-0.9) (259d,-0.9) (260d,-0.9) (261d,-0.9) (262d,-0.9) (263d,-0.9) (264d,-0.9) (265d,-0.9) (266d,-0.9) (267d,-0.9) (268d,-0.9) (269d,-0.9) (270d,-0.9) (271d,-0.9) (272d,-0.9) (273d,-0.9) (274d,-0.9) (275d,-0.9) (276d,-0.9) (277d,-0.9) (278d,-0.9) (279d,-0.9) (280d,-0.9) (281d,-0.9) (282d,-0.9) (283d,-0.9) (284d,-0.9) (285d,-0.9) (286d,-0.9) (287d,-0.9) (288d,-0.9) (289d,-0.9) (290d,-0.9) (291d,-0.9) (292d,-0.9) (293d,-0.9) (294d,-0.9) (295d,-0.9) (296d,-0.9) (297d,-0.9) (298d,-0.9) (299d,-0.9) (300d,-0.9) (301d,-0.9) (302d,-0.9) (303d,-0.9) (304d,-0.9) (305d,-0.9) (306d,-0.9) (307d,-0.9) (308d,-0.9) (309d,-0.9) (310d,-0.9) (311d,-0.9) (312d,-0.9) (313d,-0.9) (314d,-0.9) (315d,-0.9) (316d,-0.9) (317d,-0.9) (318d,-0.9) (319d,-0.9) (320d,-0.9) (321d,-0.9) (322d,-0.9) (323d,-0.9) (324d,-0.9) (325d,-0.9) (326d,-0.9) (327d,-0.9) (328d,-0.9) (329d,-0.9) (330d,-0.9) (331d,-0.9) (332d,-0.9) (333d,-0.9) (334d,-0.9) (335d,-0.9) (336d,-0.9) (337d,-0.9) (338d,-0.9) (339d,-0.9) (340d,-0.9) (341d,-0.9) (342d,-0.9) (343d,-0.9) (344d,-0.9) (345d,-0.9) (346d,-0.9) (347d,-0.9) (348d,-0.9) (349d,-0.9) (350d,-0.9) (351d,-0.9) (352d,-0.9) (353d,-0.9) (354d,-0.9) (355d,-0.9) (356d,-0.9) (357d,-0.9) (358d,-0.9) (359d,-0.9) \. pgsphere/doc/000077500000000000000000000000001332443031700134405ustar00rootroot00000000000000pgsphere/doc/Makefile000066400000000000000000000032701332443031700151020ustar00rootroot00000000000000#---------------------------------------------------------------------------- # # pgSphere documentation makefile # #---------------------------------------------------------------------------- ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else subdir = contrib/pg_sphere/doc top_builddir = ../../.. include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif .SECONDARY: .NOTPARALLEL: ifndef COLLATEINDEX COLLATEINDEX = $(DOCBOOKSTYLE)/bin/collateindex.pl endif ifndef JADE JADE = jade endif SGMLINCLUDE = -D $(srcdir) ALLSGML := $(wildcard $(srcdir)/*.sgm) ifdef DOCBOOKSTYLE CATALOG = -c $(DOCBOOKSTYLE)/catalog endif COLLATEINDEX := $(PERL) $(COLLATEINDEX) -f -g all : html .PHONY: html pdf ps XMLDCL = declaration/xml.dcl html : pg_sphere.xml $(ALLSGML) pg_sphere.dsl @rm -f *.html @rm -rf html mkdir html mkdir html/img cp img/*.jpg html/img cp pg_sphere.css html $(JADE) $(JADEFLAGS) $(SGMLINCLUDE) $(CATALOG) -d pg_sphere.dsl -i html -t sgml $(XMLDCL) $< mv *.html html pg_sphere.tex : pg_sphere.xml $(ALLSGML) pg_sphere.dsl $(JADE) $(JADEFLAGS) $(SGMLINCLUDE) $(CATALOG) -d pg_sphere.dsl -i print -t tex -o $@ $(XMLDCL) $< pdf : jadetex.cfg pg_sphere.pdf pg_sphere.pdf: pg_sphere.tex @rm -f $*.aux $*.log $*.out pdfjadetex $< pdfjadetex $< pdfjadetex $< ps : pg_sphere.ps pg_sphere.ps: pg_sphere.pdf pdftops $< $@ pg_sphere.dsl : pg_sphere.dsl-dist cp $< $@ jadetex.cfg : jadetex.cfg-dist cp $< $@ ## ## Clean ## clean distclean maintainer-clean: # HTML rm -rf html pg_sphere.dsl # print rm -f *.rtf *.tex *.dvi *.aux *.log *.ps *.pdf *.out *.fot jadetex.cfg # img make clean -C img pgsphere/doc/appendixes.sgm000066400000000000000000000040321332443031700163070ustar00rootroot00000000000000 Appendix Changes from version 1.0 to 1.1 Speed up index query time. The index scan is much faster than in 1.0. Remove B-tree index. It was used to cluster the index. This version is compatible to PostgreSQL 8.4 Changes from version 1.1 to 1.1.5 Modify behavior of function set_sphere_output_precision. Compatibility with PostgreSQL 9.2 and later. Creating spath and spolygon objects "as aggregate" from tables should now work. Improved accuracy of spoint (great circle) distance calculation. Add new contains operators consistent with the geometry operators of the plain used in PostgreSQL 8.2 and later: <@ and @>, the old operators @ and ˜ still work. Improved correctness of spatial indexing. pgsphere/doc/constructors.sgm000066400000000000000000000400741332443031700167250ustar00rootroot00000000000000 Constructors Constructors within pgSphere are functions needed to create spherical data types from other data types. For actual use, there isn't a difference to usual PostgreSQL functions. pgSphere constructor functions are named by returned data type. Constructor functions expecting one parameter only are implemented as casting operators, too. These are not mentioned here. Point There is only one constructor function for spherical points. spoint float8 lng float8 lat where lng is the longitude of the spherical point in radians, lng is the latitude of the spherical point in radians. A spherical point from longitude and latitude Get a spherical position with 270° of longitude and -30° of latitude. SELECT spoint ( 270.0*pi()/180.0,-30.0*pi()/180.0 ) AS spoint;]]> Euler transformation There are two constructor functions for an Euler transformation: strans float8 phi float8 theta float8 psi strans float8 phi float8 theta float8 psi character axis where phi, theta and psi are the three angles of Euler transformation. The fourth parameter is the three letter code of Euler the transformation axis. If that parameter is omitted, pgSphere will assume ZXZ. For more information about that parameter, see . Create an Euler transformation object Create a transformation object to rotate a spherical object counterclockwise, first 20° around the x-axis, second -270° around the z-axis, and last 70.5° around the y-axis. SELECT strans ( 20.0*pi()/180.0, -270.0*pi()/180.0, 70.5*pi()/180.0, 'XZY');]]> Circle The function scircle spoint center float8 radius returns a spherical circle with center at center and a radius radius in radians. The circle radius has to be larger than or equal to zero but less or equal to 90°. Otherwise, this function returns an error. A circle around the north pole Get a spherical circle around the North Pole with a radius of 30°. SELECT set_sphere_output('DEG');]]> SELECT scircle ( spoint '(0d,90d)', 30.0*pi()/180.0 );]]> ]]> Line The input of spherical lines using Euler transformation and length is quite circumstantial (see ). For short lines it is easier to input a line specifying the beginning and the end of the line. sline spoint begin spoint end If the distance between begin and end is 180° (&pgr;), this function returns an error because the location of the line is undefined. However, if longitudes of begin and end are equal, pgSphere assumes a meridian and returns the corresponding spherical line. A line created using begin and end of line A line starting at spoint '(270d,10d)' and ending at spoint '(270d,30d)': SELECT set_sphere_output('DEG')]]> SELECT sline( spoint '(270d,10d)', spoint '(270d,30d)');]]> Furthermore, there is a function for inputing a line using Euler transformation trans and line length length sline strans trans float8 length where the line length length must be given in radians. A line created with its transformation and length The same line as in , but using transformation and line length. SELECT sline ( strans '10d, 90d, 270d, ZXZ', 20.0*pi()/180.0 );]]> Ellipse You can use the function sellipse spoint center float8 major_rad float8 minor_rad float8 incl to create a spherical ellipse. The first parameter center is the center of ellipse. The parameter major_rad and minor_rad are the major and the minor radii of the ellipse in radians. If the major radius is smaller than minor radius, pgSphere swaps the values automatically. The last parameter incl is the inclination angle in radians. For more informations about ellipses, see . Create an ellipse An ellipse with a center at 20° of longitude and 0° of latitude. The minor radius is part of the equator. The major radius has a size of 10°. The minor radius has 5°. SELECT set_sphere_output('DEG');]]> SELECT sellipse ( spoint '( 20d, 0d )', 10.0*pi()/180.0, 5.0*pi()/180.0,]]> ]]> Polygon The aggregate function spoly spoint edge can be used to create a polygon from a set of spherical points. There are the same restrictions as for using the input function of spherical polygon (see ). The function returns NULL, if the polygon couldn't be created. Create a spherical polygon using a set of spherical points Create a table and put in some spherical points with a unique ID. Then, create two polygons with different edge sequences. SELECT set_sphere_output('DEG');]]> CREATE TABLE points ( i int PRIMARY KEY, p spoint );]]> INSERT INTO points VALUES (1, '( 0d, 0d)');]]> INSERT INTO points VALUES (2, '(10d, 0d)');]]> INSERT INTO points VALUES (3, '( 0d,10d)');]]> SELECT spoly(data.p) FROM ( SELECT p FROM points ORDER BY i ASC ) AS data ;]]> SELECT spoly(data.p) FROM ( SELECT p FROM points ORDER BY i DESC ) AS data ;]]> Path Similar to spherical polygons, you can use the aggregate function spath spoint edge to create a spherical path using a set of spherical points. There are the same restrictions as with the input function of spherical path (see ). The function returns NULL if the path couldn't be created. Create a spherical path using a set of spherical points Create a table and put in some spherical points with a unique ID. Then, create a spherical path from it. SELECT set_sphere_output('DEG');]]> CREATE TABLE points ( i int PRIMARY KEY, p spoint );]]> INSERT INTO points VALUES (1, '( 0d, 10d)');]]> INSERT INTO points VALUES (2, '( 0d, 0d)');]]> INSERT INTO points VALUES (3, '( 0d,-10d)');]]> SELECT spath(data.p) FROM ( SELECT p FROM points ORDER BY i ASC ) AS data ;]]> SELECT spath(data.p) FROM ( SELECT p FROM points ORDER BY i DESC ) AS data ;]]> Coordinates range The function sbox spoint south_west spoint north_east creates an sbox object with its first parameter south_west as the southwest edge and its second parameter northeast as the north-east edge of the coordinates range. Create a spherical box using edges A coordinate range between 0° and +10° in latitude and longitude. SELECT sbox ( spoint '(0d,0d),(10d,10d)' );]]> pgsphere/doc/examples.sgm000066400000000000000000000075751332443031700160040ustar00rootroot00000000000000 Usage examples General tbw Geographical tbw Astronomical Coordinates transformation A commonly used task is a coordinate transformation. With the parameters of a new coordinate system (plane) relative to an old one, &OHgr; longitude of the ascending node angle between line of nodes and the zero point of longitude in the old plane. &ohgr; argument of pericenter the angle from the ascending node to the position in the new plane. i inclination angle between the new plane and the old plane. you can do a transformation of an object object from an old into a new coordinate system using: object - strans '&ohgr;, i, &OHgr;' or object - strans (&ohgr;, i, &OHgr;) Otherwise, for a transformation of an object object from the new into the old coordinate system, use the operator +: object + strans '&ohgr;, i, &OHgr;' or object + strans (&ohgr;, i, &OHgr;) perihelion and aphelion coordinates of a comet's orbit We are assuming the orbital elements of a comet are &OHgr;=30°, i=60° and &ohgr;=90°. We get the spherical position of perihelion and aphelion with: SELECT set_sphere_output('DEG');]]> SELECT spoint '(0,0)' + strans '90d,60d,30d' AS perihelion;]]> SELECT spoint '(180d,0)' + strans '90d,60d,30d' AS aphelion;]]> pgsphere/doc/faq.sgm000066400000000000000000000001711332443031700147160ustar00rootroot00000000000000 FAQ tbw pgsphere/doc/functions.sgm000066400000000000000000000473731332443031700161760ustar00rootroot00000000000000 Functions The functions described below are implemented without having an operator. If you are missing some functions, see and use the operators. Area function The area function returns the area of a spherical object in square radians. Supported data types are: scircle, spolygon (if the polygon is convex), and sbox. Area of a spherical circle as a multiple of &pgr; SELECT area( scircle '<(0d,90d),60d>' ) / pi() AS area;]]> <type>spoint</type> functions Longitude and latitude The functions long spoint p lat spoint p returns the longitude or latitude value of a spherical position p in radians. Get the longitude and latitude of a spherical point in degrees SELECT long ( spoint '(10d,20d)' ) * 180.0 / pi() AS longitude;]]> SELECT lat ( spoint '(10d,20d)' ) * 180.0 / pi() AS latitude;]]> Cartesian coordinates The functions x spoint p y spoint p z spoint p return the Cartesian x, y or z value of a spherical position p. The returned values are always between -1.0 and +1.0. Get the Cartesian <literal>z</literal>-value of a spherical point SELECT z ( spoint '(10d,-90d)' ) AS z;]]> You can get a float8 array of Cartesian values using the function xyz spoint p Get the Cartesian values of a spherical point SELECT xyz ( spoint '(0d,0d)' ) AS cart;]]> <type>strans</type> functions Converting to ZXZ Using the function strans_zxz(strans), you can convert an Euler transformation to ZXZ axes transformation. Change the transformation axes to <literal>ZXZ</literal> Convert the transformation strans '20d, -270d, 70.5d, XZY' to a ZXZ transformation. SELECT strans_zxz ( strans '20d, -270d, 70.5d, XZY' );]]> Angles and axes It is possible to get the components of an Euler transformation. Getting Euler transformation attributes function description phi first angle of a transformation theta second angle of a transformation psi third angle of a transformation axes transformation axes as a three letter code
The angles will always returned as a float8 value in radians. The axes are returned as a three letter code. Get the second axis and its rotation angle SELECT theta( strans '20d,30d,40d,XZY' ) * 180 / pi() AS theta;]]> SELECT substring ( axes ( strans '20d,30d,40d,XZY' ) from 2 for 1 ) AS axis;]]>
scircle functions You can get the radius of a spherical circle in radians using the radius function. The center of the circle is available with the operator @@ (). Radius of a spherical circle in degrees SELECT 180.0 * radius( scircle '<(0d,90d),60d>' ) / pi() AS radius;]]> <type>sellipse</type> functions pgSphere provides 4 functions to get the parameters of a spherical ellipse: Getting spherical ellipse attributes function description lrad the major radius of the ellipse srad the minor radius of the ellipse center the center of the ellipse inc the inclination of the ellipse
To get the ellipse center, you can use the operator @@ () instead of using the function center(sellipse). Get the minor radius of an ellipse SELECT srad ( sellipse '< { 10d, 5d }, ( 20d, 0d ), 90d >' )]]>
<type>sline</type> functions Begin and end To get the beginning and the end of a line, pgSphere provides two functions: sl_beg sline line sl_end sline line Get the beginning of a line SELECT sl_beg( sline '(10d, 90d, 270d, ZXZ ), 20d';]]> Create a meridian You can create a meridian as a line using the function meridian float8 lng The function returns a line starting at a latitude of -90° and ending at a latitude of 90°. The line goes along the given longitude lng in radians. A meridian for longitude 20° SELECT set_sphere_output('DEG');]]> SELECT meridian (20.0 *pi() / 180.0 );]]> <type>spath</type> functions Count of points You can get the count of points of a spherical path using the function: npoints spath path Count of spath's points SELECT npoints ( spath '{(0,0),(1,0)}' );]]> Positions at a path pgSphere provides two functions to get points at a path. spoint spath path int4 i spoint spath path float8 f The first function returns the i-th point of a path. If i is less than 1 or larger than the count of spath points, the function returns NULL. The second function does nearly the same, but does linear interpolation between edge positions. Get the “center” of a one segment <type>spath</type> SELECT spoint ( spath '{(0d,0d),(30d,0d)}', 1.5 );]]> <type>spoly</type> functions Count of edges Similar to an spath (), you can get the count of edges of a spherical polygon using the function: npoints spoly polygon Count of edges of a spherical polygon SELECT npoints ( spoly '{(0,0),(1,0),(1,1)}' );]]> <type>sbox</type> functions The functions sw sbox box ne sbox box se sbox box nw sbox box return the corresponding southwest, northeast, southeast, or northwest edge. The returned value will be a spherical point. The southwest edge of a box SELECT sw ( sbox '( (0d,0d), (90d,0d) )' ) ;]]>
pgsphere/doc/img/000077500000000000000000000000001332443031700142145ustar00rootroot00000000000000pgsphere/doc/img/Makefile000066400000000000000000000003531332443031700156550ustar00rootroot00000000000000# Graphics EPS = logo.eps sbox.eps scircle.eps sellipse.eps sline.eps spath.eps sphere.eps spoint.eps spoly.eps strans.eps CONVERT = convert all: eps eps : $(EPS) %.eps: %.jpg $(CONVERT) $< eps:$@ clean : rm -f $(EPS) pgsphere/doc/img/logo.jpg000066400000000000000000000160331332443031700156610ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀáá"ÿÄÿÄE!1AQa"2q‘¡BR±Á#3bÑ$7Ct’¢áð&s‚DTc“²ÿÄÿÄ/!1Aa"Qq‘ð2B¡±ÑÁÿÚ ?ï舀""ˆˆ" ˆ€""ˆˆ" ˆ€""ˆˆ" ˆ€""ˆˆ" ˆ€""ˆˆõuÔÔ1ñÔÌØÛÓ<Ê­×ëª8ïGÏï¿`¢kyÃ*bk]—pnÓÈn¹µÞ¨º ì§EwÉдƹ;¬°ÔHÖ°œeÇaîWÐAz…òÕµM«Œ8Êw¼ÕþϨ'tQSЬ=Ä #cÜ|qÉ[±´Úô!ÉG†tyue$S¸=ñ7¹ÉÎàüˆú­Õ5T56hÇr+˜ÓÍ”¶7{[¶?¿Ó5—‡S—à\™÷l~Jº%2ꈊ D@DDD@DDD@—¼1ŽyäJÒ*û5m«ýÇ ~yáoÁÈr(6s=U+ªnU÷ •z ëªÙOwqÜøÛ*´ÍSÞ÷w.9Øì ¨VZþƸð9¹.aÚÊ”Êò¦ÃOh€1ÓHíÞáÏ[u’ž–ºN顽þ\pw¨E´m9†2㼎ÝÅbîxs[#s‚”ä“IðÊ8Å´Úå|µòÜeeU£ÆÇ@ÀýWåÊõm´\YéÎùNöHär¶ï¥î%u\ÒÈç‘‚\UCPRúMIs€'ÍZrS–ÒÑÅÅi½—ù¯L)€ož:–n~«öÕÚ;ëîQ †xÁàÏÅH>+ y<8ÆêJ˜]D×4d$P¶!ÄFäÜ/n”‡•éŽ.8;¨ÖVÔšyX×´µÎݹêºiDŒÉ䵺Šr+(¢Û`â|G,~ª]Œc4^4ÍÉÕ0¾–W>-ÚOVÿ¢ßªNš‘±ÞY“íµÌõçú+²2ëÀDE„D@DDD@DDD@A¼¸6ÏTIÇìÈ\èÊ3ËuÒ.tά·M¬æíæW/{%OŒ´‚×A ©+"W}ˆÁ=N> ´4 nB‰^_3e â3“îX¡.ª˜8U­Éý©1¯s¥Î6SbÆA @Žae’afB@Ç,õ(U6c=öYî&9,òñSYHÚoQªlQe•Îâ‘Ã$žžKF}d$™`i7š|¼OùJ½ª¦–Š7ÖM!‘†H›€ÌŽ!ž¸V´e—ƒ]r¹ýŸ5;K8™) ŸÃŒ~™[årIF A~1ãŽgò z‚B" ˆ€""ˆˆ" ˆ€""ˆˆ"æÚ÷´o³&’Ïdx’µ›TNÝÄ?À?‹Äýß+BoH¤ç-Ȳê-ilÓî>VËXãO³æãÑSEgyQ-T‰æYK¸˜ñ‚I+˜‡¾yÝ5D†I^rãœïï[ pàÜ£ø¥Ï&Kêo¹ý«Ä•çÒØá8{qÁ‚1¾vv>‹/lžÉÜsˆ^ªX 3¸†s€3ã•î±aÝäæy–I¨µ£ö(¥¥®ôêW‘>ùâqÁÉÉävVë5Á÷pceÖjiÚH0HÆ—cžÇ¯¿ʪ ýÛœÏ!¸ù/:HœÙ\ÒÒ3$d¼vÜÏõKhŒ¹Ö…93‹ÖötºKciå3K<µ3ô’SìÁNUË¡mI††­ÿÒHÃÞ€<|5cYóƒƒÓ5«²6Gº! „D@DDD@DQëëa·POYPî¡a{Š—Ú^¸b×è”rܪ[†»ŸrßÅñè¸1•Îl{»öƒ¼~]’÷w'©ä£jESª5UÊ¡ç…òí¹Ù­ÎßE2™ ÑG3›—ÆÞß,ìãåÑiãAA&ÌœËÅxDØÐ_ÌŒ†­¥ 3¼1܆äþ´ð¼¸ñ8䞥nZ}‘¬þÒQÄï&ô NKéKÕÿƒRoúWŸßø$ºP÷€Ý˜Ñ†³ÆOC…3ÉK‰Û§ËI¥¾ +\““\ðM˜p{wpñê¶Ô€JÐ[¸+WNíÂÚÓ9´² œ@…Çò>+žiWÊðtE»4ŸŸßÎ;kg‰§#“†Ä|V/F”Ë’×MM ·‘­ß‹ÏÀòýúÝI5É¡­§¥>Ó¹>AåøGŸ?r³El‚([Ö±£°\^”q¤âQ °=„9®‚°JÐ!;— V{‘йÓÑ€w|Gf¿ù?š¬V¹²BcfCäwvZFßû‚÷…ÊH粇 ]iØc$l†œ|ZzyÒ—¦Ü­í¦š@k)Ç ÆÃŒNå•Oå°äë$µ]a®€d·Ö{AÇ~áÏ¢­ô©G‚ø×¸OŸS«¢Ç̨§ŽxÎc‘¡í> Œ…‘e›AD@DDQ.—*K5®ªå](Š––'K+ÏFž]O€ê¨#·-àûLƒÈŠ'(m/$¤ßƒ¤®WÛmùÔVz Û´dÕPÃ%Ee0•á‚ZŠW1'«Ðy®KÛ-ùÕý£Ã'VèãŽ1œŽ/hŸ‰?@¯ZR|v>ÔR­±´ƒ$Ÿ»Ÿ™è>?Ím©êdï{Ðì;Ë–<=Êdb–FSćw‚z’wù{?5–ü–µ 5³%4ô‹-½±UÔ5¥¦KuE „D“Ô;çÙ#9óÏÐtV¥Í´•QƒV20 ˜Ï€ gü«¤¬¬ˆvØÍ¼I÷Ô‚"/¤""ˆˆ" ˆ€§ö©ýWêî‡ó “²ºj5ŽZzy'« …½ü‚6Ü—\—XíSú¯Ô?Ýæ¯3¤­oèýÛ83Ÿk‡Ébu…*”âÚÛáy|Ý3¹FÎ×§¥Ëž¼Ë ô1ñ29Ùë5ÍÏ#…>-9£µ5Dwµµ d8}ÅfdUÛcËŒ·¾$¼%èhÑc•pXÎ:×1~¬®ÒÜe½ÕZíýåʘ»0ÎHñÉmcÔóº Ò6ËZê–nèÀkôÕ3íÚÞßlž‘ÔÓ>@ùý -ÏËê¬ú‹R EêJ[5 j.r:‡É r[ŸÅò겸ÿ_ÒšôÃ}#ØO'#èçM-ºŠ:š÷PÔÓËEU€YÛ%Љ¡Ý˜]Ï.ï'ÆßIJ_ŸG©ô7ÛâCWNÞ&=§8÷ðRtM\h jëðè[$—#9ß<—RêÖfbAÙNI¯s³§tªðò§òåôÎ)uÅ} ¶ØkÛQ4:P 9«…§UÚ¢¶›»jØÊ)[Äée8s\9´ùùxòæ©–­qU]u‚«w¶µæ*wãžk‡â[\Ó’]­øß']ÿSØÔ[îKÏ¡’é® ue$zÚˆé_Á,±ã²TJnÐ$š™ÓSiû„´àžŒc ƒ{$²\äªqs#t®qÉ9‰¹$¨mÖu”Ð ºdlÓðÊØCݱ#–G’ìŸWÍöWD7ÛþŽXtœ(Ñ\îž»¿ÙwÒšªÛ[=áóz=3'c&ïÖ÷';ñ’pÎIðÝnäíÒŽJª†ÛtÝξ–9]*b 6P8€;àóÝpmM5¢ºüÙ,¦Cž”a%Ãõú®¯==u ¶k=+CZï\@oÀ ×—Pë2Œ+—f¥/¿=ð:LT¬vâ¾Ü–{wnɯ”7k-}¢*—p6¦§wLã|ž™ß$uEó¬öÚ˦®JÊ1oo„ŸTøä®¡ØìÒÏÙU•òÍ$ÎûCäqq-lò2|ܰ3¿¤šå}¹Dæb~¦Ÿïä½""Ð8‚" ˆ€""ŸÚ§õ_¨ºÌ.]ep7M ú\}øÊî·[]%êÕUl¯‹½¤©ŒÇ+2FAó•BÍÙ–±Ýé.t¬®tôã„KTç4>+–üo›esÞ»^Ίoùpœ5üËEí|»©ê›¥{h»UVDáKQ)O,;?Uõàña‰•Vë˽Hgp†¡íÜŒuùcäWµÕÆÚå\ü4yW9W8Î>S*÷Ix¸:çKrlTóŽ9G0|H+.¯‚ž.Ï`‚Üâø[$m‰Àóßù­c{>5´°Íj¿=Ô¯gß'ôR5E5®Û¥ijjÙ$dðýÐÓ×ÌÖÝ–Õ\lsí~5­%÷7æ”+²r‚ró½íû,6+.¢Ñ‘ÓÀaŠáGy3[ëµÙêVÆÍ¥i´Å\׫•ɲº6là8@ۨꨑ[˜÷9Ôµì<[–‰LGäqù¬æÉS#1+*äa燗ò[Sé3î„nÔ$öÑ‘©D;g*·8¯&ÆÓ_ö·i°\£‰ì‚w8F]÷€n2¬š†ÃnÔW™YI[èwH‘±{U»cÙoÕ6gTG‰¦F‚ñÂÀ,•ôô÷ÍuqtRI$mŒ8F 5¤w]‘ÜbqmïAó^(l°QT€ÜÌF8擉Àyex:nØàðéj8^I,ŽCÿ½h/‡¥ò#=Ë»¹¿¹œþ!Ï”¥ G·µzªý7Lo°¿þTmi,kÚzØ¡tÍ¥‰“HÖnxC°OÔ-¥eºŠáO ÆðØH1¹¯!ÍÀÇ4·Y¨íÕn©„ÌéœÎìºI ¶È? Zy]y9‹"OQííש—‰Ö«ÅÃt%¹o{ô'VÓUê®æãg¿¾’Ñ€ci;;®wæ¡]tû)4­gÛw©ªdtO23†:î°·JÛ;Çý" ÷ÁÅ­È/Ñ¥-osL¦¦P×pI1p>ð²#ðÖL$£Œyð·¯Ìؗĸ³s­¹><ñ¿ÈhÂ¥o qÁîÚ0ì…3D;þŽ ï1ÿØå†§LÛjªfÆ¡Ž˜åíŽbÖ“Œr[ZX¡¡¤Š–œÄÞ·À-žŸÒ¥‘mó{R1ú‡UŽF=TÁjQ!jz:륭°Ûèæ«ž7¶c-.qkwqǸ/s:}_EMQi¼>Þb³E¸pw £öa@gºV\œßRû–iÄG˜üËerìwHÜîÕWÁWÕOï%m5A…Ç™Àñ;ûÊÍë‹&ØÊ/R¶×>ƧGÉtRã%¸ÉþG#:iÔöšß·¯ÓTÂY±ï C~ÝuîÆ“Y0±‘ßɃò†{ÑÏ‘·)Øê×`®‡MM,4´Ñ2*xXØâƒ c@Àtˇ‹:;œå½ûi~‡fVD.×du¯}³*".ã""ˆˆ" ˆ€*—ipêm[Iêbü-#9swÇÄd|Uµ>Oˆ„R²2(稈3Û²Xz:Ë¯Š“¦pÍMK+‹ž÷¸´¹Ç$å¤.…ÛƒšÁ|uúÚÂ(*Þ^î »™9Ÿæ;¡¸Cu<õañÈ×w‘àƒÔr?EïC[Š9å)ïRf¿7–ž`à©PÎZAƒä¥]mŽŽíU2ÂïÚ’ÇÂ@'#ž3±² º’ªŸy)åhñ,8^ðž Ãd÷U02qÞ4€íðTÛosE+] m`ãv:ái¢™LŽo5ÕèqÙ.6o^{ª‰#ü.!gŽe c$²Ç#çw±µÞ¨ÎüÔ•ÌÜq´GÿqÁ¿šê®å¥¶q[ŽÜž‘°dªCeZæ>{RñŸԬͫ÷m óÎOÍ{«wá’£^_þ›6¸€ óæ²:P¶ÀîµB|îNJ‘Æ_à “È¼ªÉ.å)2bßkŒ3¼ÉÙ~A<#(.¨ÕfNzõ*ïÙÆšuâê. >…Dðâq´’Ã=Ãb~Rû”!ÜÏ\j%lÔW÷:f´6š¦‚FÔK™§Ûݘoþ+|ˆ¾rMÉíŸW¨¤DE‚" ˆ€""ˆˆ" ˆ€…vµÒÞ­uêÆqA; Œe¾g¨æÊÚëBÕé Ë©¦Ñå%ÔÕÄr·Ã?uè;xm…õ²×Þì–ýCjšÛr³SJ7›OGÐ…xO´¤áܯI--sØZçF!—#ï°`‹pV²*‰¡9Ši#?ÀâTÔÝ™Ý4“çlAÕÖ)ÎÒ†qšw}×9¿BG0|W5ª‰”µ/‚®‘ÑJÃÝ?ùï&sÊ-Ò¼ z\¤³ù¬ÑÝëGþ¡ãÜp£ðQžSÌÓàè‡æ¿}›ÿzÏŒnþJé¤Q¦Í¹¯ž¢Ô׺ib”±ÙqÜ8d~NXY?šÇoe35'¥9ýû0ÞþðÜs#}ˆø¬-¨¢gJ‰=ä3ù¯Zííàñ²žîM“'Ráï$o[êõqØŠÔ6äÖþê™æGúå~údÕ/Î|ää®…s9eŽàš(¹»¼w€Ù¿>«#ª_-"§ŒGL‰ƒ“XÐÐ>dPí~„ª—©DÒÝ“éí6æLøÍ}HÜíø†ïõ'0¯h‹Í¶üž‰%à""‚B" ˆ€""ˆˆ" ˆ€""ˆˆ" ˆ€""ˆˆ" ˆ€""ˆˆ" ˆ€""ÿÙpgsphere/doc/img/logo.xcf000066400000000000000000012434621332443031700156720ustar00rootroot00000000000000gimp xcf fileÂÂBBRs)çicq ¡žA;*Ù Elephantÿ     ?J*Ù8)Ã)Ï)Û*Ù”¤ C6b7v7†MÓyO¦Œ½ñ¾¾ÆÐJýÀ „&0&@&‹)£)³£øª¡ž¥´¼¸7÷«£Ÿ¨·¼¸±3󲺷¯§¬µ¼º´¯«1ò¯³º¸²­´»¾»³­«.ºð¹±±µ´°°·»½»´®‰a,ºð¹´³´°««°±´·¶¦~a'稞œ °¹·µ¶´°¬§¡ŸžŸ§¯¥~‡%槨žœŸ®¸µ°±¬¥ —’‹ŠŽ—©©šŽˆ!ᢚ™Ÿ¢Ÿ›¥­ª¥¦¢›–’‡~ww~ˆ¡°ž‰¦ñž¦¢™—™›š˜™›ž žžðš‡{lffr›®¥–œ¸œÞ›Ÿž˜“‘”—–—™š››˜•‘„{qfabm|’¦®¨®»¾œÝ˜™™”Ž’—š˜˜š››˜”…zric`bkxŠ›«°µº¹«žðŸžœ›–’”“˜›œ››è•ŽŠxkfa\Z\dn~‹«³±©›~|ð¡¢¢¡¡ žœ–‘’“’”šœœæ˜†wneb^YVW^dt’ ©¤“„~|x þL𪨨©¦¢Ÿœ˜’‘””–šœœá™•އ€xog`]WSPPV_lvƒ˜Ÿš’‰}jT=.«þ¢ά««¬©¥Ÿœ—““•—™›œœš•އ{tf`[TONMMQYdfv„Œ–žž’cQ=-B«­¬ù«¨¡›˜™™ð›œ›˜’‹ˆ„}vmb]UOLLæMQ[`mx‰•ŸŽ{iME=9WTdЧ««­æ¬«©¢ ¢ž›š—˜›˜”‡†ƒ{tjb[QMLLçNX`gjs|‡’Ÿ¢š‡l\JHZUk§««á £©¬­ª¦¤¢££ž™˜˜š™•‹‡†yqha\TNLLèT\aaddp{Ž «©œ‹umuyˆ›©®®øž ¦ª¬¨¡ŸŸéœ™——™˜“‰ˆ†„}wphb_YROMLLèPW^aa_eexŽ¢®²©—Œ‹‘œ¥«®¯žá¤©¬¨ œ›š–’‘•–‘‰‡…†…yuohba]VRNLLèMPUY[\_]fv‡•¨®ª§¢Ÿ¢¤©¬­𢨬¨Ÿš—”““–‡……ó„~wtfaa_[UPMLLêOPRUWY^cr™§««¢œ™™ §«¤ã©®«¥š”ŽŒŒ’—ކ…†ƒ€{use`a]UOLLìMNOPSVbrŠš¡›†…ˆˆœ¨µã¶´ªŸ”Œ‹ŒŽ“Œ††…‚€{usica\QML LðMO\n‚‹Œ‡}‚„…–¦½ñ¶±¦œ”Œ‹‘Ї††õ„ztrga`\QL LðNRcy…€~‡”™„•¥ñ½¯¬¥œ–‘Œ‹‹Ž‹‡††ô…xtqfa_ZQML LïOWcw‹‘‰“¢©¨•„‰š¨ñ¤¥©¦ š“‹Š‰ˆ‡††ôƒ€zvslda]VOL LíMRWg~“‰‹š¨¯©•†’¢«£ò¤ œ™“’ŒŒ‹‡……††ôyvtqeab\TNL LìNTbjillN8BZmŠŠ©줢 œš•”“އ……„‚‚zttùpeaa[RLLæJHILOU_nƒ„kX>[l^du‡¢ì¡¢ œš•’Œ†……„xttùogbaWOLLïKB:DLWg{‹˜’rGøMeV_{£㢦¤Ÿœ›–’ŽŒ‹†…ƒ~}wtsogca^TNLLæC@IQj…›Ÿž–k2 %T{‹œ£¨㨪§¡œ›•“ŒŠ‡†ƒ{yvtqgbaa^UNLLäNQMKPZz–¤¡ž™d%$6* O—¥««§«ú¨ šš”‘‘팈††„xvttofbaa^TNLLäORPNVn¡Ÿ—ššd  (!\¦¯°­£«ð¦ ™˜•’“‘މ……ƒwtt÷ogbaa_UNLLäMNNTk‡ “Œ›§. 0S‚«°®§œ«ê©£Ÿš™™—“‹ˆ„ƒ€~xttsjcaaû`UPMLLäMQZm‹žŸ“€³Â¡I2`Œ¥±±§›˜«¬«©¢››š™“ŽŠ†‚€~}yutsc^aa_^YVQNMLR\sˆ›¢›‡©É̲s8#`ƒ¡±³­Ÿ–ž«¬ª§ œœ›™˜’Œˆ†ƒƒ€}xutsa^a`]]^]ZZYZfv’ ¢œ‹Š¥ÄÏÍÅ®†fVj¢±·°¨› µ¬ê¨¦ œš™––‡†……†‚}wtsqfaa_Ð`aa^fpŸ¥£“„”ºËÍÍÊÀ«›“–¦±«¤Ÿ®Å¡©ªª¨¤¡œ™–“Š……†÷ƒ|vtqi``aaÎ`a`iq€—¡§§ž„Š­ÈÍËĸ±©¢›‘„˜¨¥Ÿ¨»Ë¤¨ªª¥¡™–”‡……÷†‚zutqe_aaÎhm|ˆ–Ÿ£¨ª¨—u•¿ÌÍÀ¯ ¢¨©£˜‹‹œ¥¡¡²ÂÍœ§©ª©¦¡œ˜“”І……Ò€yttrkcbaadj{ˆ— ¦©ª«ª¥“{ Á¿´›— ª±´²¬£¢¦¢œ¨¿Éˬ뫪§¢ž˜•–”Ž‹ˆ……‚|vtshaaø\iyš¥ª««Å©£˜Š–§£—’ °µµ¸¸·¯«©¡ž³ÈÌËš¤«¬«©¨¤Ÿ›——”Žˆ†…{vsled`cw‹ž§¬¬«éª¦œŒu|‘™¥°·¹¸¹ºº´®©¤¯ÂÍÍí•¢©ª§¨¥Ÿœ™–ŒŽ‰……€ytqkjkqƒ—¨¬­¬¬««¬«¨™†r~›©°±³¶¸¹¹¸´¯§¥¹ÉÍÍΘ£«¬ªª¦Ÿ™”ŒŒˆ……ñƒ~wtrs{„•¤­®­­¬¬é§œ‹”£¯µ³°¯±´··µ²­ž—±ÇÍÍÓ–£ª­­«ª¦¡žš—”‘‹ˆ†…„‚~{wzƒ ª±²¯®­­¬®¡‹‘ž®··ñµ´³°±¶¶´³­—­ÅÌÌ£øº¯«°»Á¾7÷»±¬²½Á¾¸3óÂÈÀ»´¶¾Ä¼·´1ò¿ÃÊļ·ÀÈÉŽ¶µ.½ò¾À¾º¹ÂÈÈÆ½µ`,½ó»¸³³·»½Á½ª`'ç­¬«­·½½»º¹·²®¨¥¢¢§±¸ª~…%­è¬«¬µ¼»·µ±­¨£›–Ž”Ÿ°®œŽ‡!᮫©¨ª¬«©ª­±°¬¬¦¡š”ˆzzŠ¥³¡Œ©ö¬±®«¨¦§¨¦¥¥¦¤ï ›’‰}ummvƒŸ³©¤»«õ©¬«¦¢ŸŸ žž휙”‰~tjcdq˜«´°¶Àë§ù¦¢š›œ››êš˜•‰~vld_alz¡²·½Â¿´¬«÷ª¦¡ž™˜š››çš“Œ‰‚zrja\Z\ep¦³¼»³¤€}¯­®÷¬ª¦Ÿœ›š™››æ–…€zphc]YVW^iw„˜¨³²Ÿ‹€~{ þMò´³°²²°­ª¦¡œ››á™”†€zsh_\WSPPWapy‡”£© —‚nV=.®þ¥ñ¹¶³µµ°¬©¥¢ Ÿžœ››ßš•Ž‡|wnd[UPNMNRYen|‡• ¥¤™…fS=-B®½ã¼»¸·µ±¬ª¨¦¦¥Ÿœ›š™”ˆƒ~ysh_UPMMæNR\dpz„Œš¥¥•‚oQG>:X`h«®®½å»¹´²­¬«©¨§ œ›™–‡„‚}wnc[RNMMçOX_gnw}‹™¨ª£“ucOK]hv‘¬²±᯳¹¼»¸²°­¬¨¦¥£›™–’†„€{ui`\TOMMèT\acglv•§µµ¦”~u}†‘¢³¹¸ß­¯¶º¼¶¯­«ª¦¢ ž›™•‘‰…ƒ~zsia_YSPNMMèQW]`abhp€’©µº³£™˜œ¤­·»¼­á´¹»¶®ª¦£ œ›™”Ž‹ˆ…ƒ€{ysia`\WSOMMèNQUYZ[^bjxŠœ³º·´­ªª¬´¹»¬á²¸¹´¬§¡ž›˜™›™”‰†„‚~zxqga^ZUQNMMêOQSUWY_jw†¡°´·­¥££¬²·´ã¹¾¹°¨¢›˜“—™™’Ї…‚€|yvkc`\UOMMìNOPPTZfuŽž¦¢Ž‘Ž—¥±ÅäÆÄº®£Ÿœš—”–•”އ…„‚|xvib`\RM MðNP^qˆ‘‘‹ƒŠ‹ƒŠž¯ÍäÅÁµ«¢Ÿœ›™——“Ž‹‡„„ƒ|xujb_[RM MðOSeŒ†„Žœ¢–†Š®ï;º±©£ œ›˜–•’‹ˆ†„„õ€{xtha^ZRNM MïPXd{‘–Ž˜§±±œŠ¡°⯱·³¬§¡›š–’‰†„„‚€|ywqf`]VPM MíNS_l›¤ ›£±·¯šŒ˜ª³â­®±®ª¦Ÿ››™–‘ŒŠ‰†„„€|yxupfa\UOM MìOUeqony‡‹‰t—“•¤±­ï«©¦Ÿ››š–‰‡†„‚|xxùsjb`ZRMMæKIJMPWevŠ‹p]brz{np|n`n}Žª㬭¬«©¥Ÿœš™”‰‡†ƒ€zxxwrha`WPMMïLC;EMXm‡–¢›{lqvy{{øxgXi…—¬ã­®­«¨£ž›™˜”ˆ†ƒ€~zxvskd`]UOMMäLHAAJRmŽ¥ªª¡wowePg{{zw“§¯±ã®°®«§¤žœš˜’Œ‡„ƒ~|zxupga`]UOMMäJFEJQ^€ž¬«ª£tw^B\y{|„Ÿ±¸·±±¯å­ª§¢ž››˜ˆ††ƒ{yxxskc``]UOMMäJHIL_x—§§ ¢ }tzrdnz{}ް¼¼¸­²î°®¬¨¤ œ™“‹ˆ†ƒzxx÷sha``_UOMMLæMVt‘¥¨™‘ ­œ„{{xy…™¶½¸±¥篰°®«§£¡ž›˜“Œ†ƒ€{xxwpf``û_VQNMMäNR\r”¥©œ…“¶ÆÂš‚~{|‘ªº»°¢¯°±¯ª¨£ ›—”Š„€~{yxvne``^]XVRONMS^x¥ª£—Œ¯ÌÏˤ~z{{…¦¶¼·ª ¢±Ä²¯ª©¢¢ž›“Ž‹‰†„€~{yxwne`_\]^\ZZY\j|—¦ª¡©ÉÒÏͺ–‚~†š¬¸»»³§­»§¸µ±®ª¨£¢Ÿ›’ŒŠ‰‡…~zxwukd``^^_``djs†˜¨¬¨–…–¼ÎÐÏÌűž“–›®¹·°­¼Ê®´´±®«©¤¡ž›•‹‰‡„‚}yxupjd``Ãdhpyˆ•¢ª®­¢†Œ¯ÊÏÍÆ¼·±«¡˜‰‡¢µ±ªµÆÐ««±³°®¬ª£Ÿš•‘ŒŠˆ†|yxvphc``blt†“ž§¬­®­›}šÁÎϲ¦©°°ª ‘‘§³®­½ÊÒ«¶¶²¯¬ª¤Ÿœš–’Ž‹‰†{xxwqfa``dl~¢¬¯²±¯®¬šƒ¤ÃÁ·Ÿ›¥¯¸»¹µ¬ª°°ªµÇÎÐ༸³°­«¦ œ›˜”Œ‰‡‚}zxwpe``dn{‘¡°µµ€³±°­ ™©¦š§µ¹½À¿½¸´³¬«»ÌÏϤª´¶µ±®¬©¤›™•’Šˆ„}ywqgdgn’¦±·¸¶´³³²¯¦”~€“Ÿ­¹½½¾À¿½»¸²­¶ÆÏÏО£®µµ°®­ª¦ œ™•“’ŒŠ†ƒ€|xunlrx¢³¹»º·µµ¶¶³¤z‚ž®·º¼¼Â¾½½¼¹¯¬¾ÌÏÏО¦°·¶²¯­«©¥Ÿš˜–•ŽŠ‡ƒzxvv}‰ °»½½»¸¸¹¹´§›“š¨´¹¹¸ººö»½½¼·¤›³ÈÏÏߥ±·º¹¶±®¬«¨¢›™—•’Š…‚|z|…–¬·¼½½ºç¹¸­”™¥¶¾½¼ºº»¹¸º¼½¼¶ž”¯ÇÎΣø»±¨¬·¿¾7÷¼³©®º¿½¹3óÂÅÀ¼µµ¼ÂÁ½¹·1ò¿ÂÆÃ½·¾ÅÆÃ½¸·.¼¾ú¿¾º¸ÀÅÅû¾·g,¼½ó»¸´²¶º¼À½¬ƒg'ç­®®°·¼¼º¹¸µ°¬¦£¢£¨°·ª‘ƒŠ%­®ê¯µ»º¶´°«¦¡š–‘‘— °®ž’Œ!á±®¬«­­¬«¬®°¯«¬¥ ›•‹……ަ³¢’©ö¯´±®«©ªª©§§ë¥£¢¥ ›”Œ‚€xx}‡¡³ªž¤º®ò¬­­¨¤¢¡¡ Ÿžžœœîš•Œ‚ysmnwƒš¬³°¶¿Ã®ú©§¦£žœœ›ë˜—‘‹ztkgir~‘¡°¶½ÁÁ·¯þ®­­¬ø§¢ž›™š››çš•Œ†~{sjeadku…’¥²»¼µ¦„²þ¯®®û«ª¦ œœ›æ—‰„~uqlda^_es~ˆ™§²²¡Ž„ þVô·¶²³³±¬¨¥ œœ›á™–Š„~wnfc_\YY_juŠ–¢¨ ™…r^E4­þ¥ñ»¹¶·¶²¬©¤ Ÿžœ››ßš–‘Š…€{ynb]YWVW[akzƒ‹— ¤¥›‡m\E3J­¾ó¼º¹·³««§¢£¢ž››ó™•‹‡‚|yrh]XVVæW[cnw~ˆ›§§—‡uWNEAbqp«®­¾ø¼º·´­¬ª¤¤ðŸœ›™—‘‹‰‡ztjbZVVçW`gnw}›©ª¥•yhTQf”¬²²á²´º½½¹µ²®«§£¢¡›š—”Љ…~xogc\WVVè\dhlnx~…˜¨µµ§–y—¥´¹¹ß°±¸»½¸²®«¨£ žž›™–’Šˆ‚}wnhf`[XWVVèZ`eggmq}‰•ª¶¹³¥›˜ž¦®¸¼½°á¶º¼¸®¨¥£Ÿžœ™•‹Šˆ…|wohgc_[XVVèWZ^aacgmuŽž´º¸µ®ª©ªµº½¯ö´¹»¶«¤ Ÿœ››í™”Љ‡‚}{~rhfb]YWVVêXZZ]_aixŠ£°µ¸®¥¡¡«³¹µã¹½º³§¡žš–™š™“Œ‹‰‡„|yvmgd]XVVWîXY]emy §¤‘Ž’—¦²Âäú°¤Ÿžœ™—˜—–‹Š‰‡„€{yoigc[V VðWXdvŠ”•Ž…‹Œ† °ÉäÃÀ¶«¢žžš˜˜•‘‹‰‰ˆ…€{yqjfcZV VðX[kƒŽ‰ˆœ¢–‡Œž°ïɾº°¨¡Ÿž™—–”ŽŒŠ‰‰õƒ~{woieaZWV VïY`j~“˜š¨±°›Š¡±â±³¸´«¤ žœ˜“‘ŒŠ‰‰‡„|zxmgd_YV VíW\mv„›§¥ ¦³¸¯š˜ª³⯰³°§¢žœ›—“ŽŒŒŠ‰‰ƒ|{y|phc]XV VìX]lzyuµØË‹ŒŸ•ŽŽ–¦±®î¯­§¢žœ››˜’ŒŠŠˆ††{{ùwskgb[VVæSQSVY_n|vgwÁù÷ÒПrf|†’¬®ï­¨£žœ›š–ŒŠŠ‡…„~{{ùvmhg_YVVïTKCNV`s›¢›€“¿Êíÿÿø¦l]s‹š¯㯰¯®¨¢œš™–‹Š‡„ƒ‚}{zxskgd]XVVäUPHHS[s‘¦©§Ÿ~žâ§}ÇýÿÜœƒ•©²³㯲®«¦¡žœœš”ŽŠ‰‡ƒ}{y{qigd]XVVäRMLRZg… «§¥¢’¼ë”JŒéÿù¹¡²¹¹²±ã¯®«¦¢Ÿœœ™‘ŒŠŠ‡ƒ~|{{wtlgge]XVVäROQUm‚™§¥  ŒÈúÛ™¶òúóÀ±½¼¹­³î°®ª¥ žœš•‘‹Š‡ƒ~{{÷vmhggf]XVVäUTV]|”¥¨™’ ­¢ÓþÿãîñÊ·¯·½¹²¦箯¯®ª¤ žœ™•’ŽŠ‡„ƒ{{zwmggûf]YWVVäWZdv”¤ªžˆ•µÄÃÕèöÿùÅ’“«º»²¥Ÿ®¯°¯¨¤ ž›˜•‡„ƒ‚|{z}qggfe`^ZWVV[e|£©¥šŽ®ÊÍȶ¯ÞûÓŸ•¦µ¼¸¬¡£°±²¯§¦¡Ÿ›”ŽŒ‰ˆ…‚~|{zsgfddedbbacp€—¥©¢‘‘©ÇÐÍË·Ÿ¨œž­¹»»´¨¬º§¹¶²­§¥  žœ“ދЉ†‚~{zxumggeefghrtxŠš©¬¨—‰˜¼ÌÎÍËð’– ¯¹¸°«ºÈ±¶µ°­©¦¡Ÿœ–ŒŠ‰‡|{yzyoggÃmvy–¢ª®­¡‰°ÈÍÌÅ»¶°«¡™Œ‰£µ²ª²Ãή®³´°­ª§¡ž›–’‹Š†€|{z~xlggøkt~Š“ž¨­­§«›‡ ¿ÌÍÁ²¤§®¯ª¡“’§³®«ºÇЮ·¶²¯«§¡žœœ—“ŒŠ…|{zznhghks‚Ž¡¬°´³¯­ª™‰§ÁÀ¶ œ¥®·º¹·­©°²«³ÄË΀¢¼¸´±¬§¢Ÿœ›˜”’ŒŠ†}{{|oghtx’¡¯µ¶¶´³°¬ šª§žš¨µ¸¼¿¾½¸µ³®¬¼ÊÍÍ¥ª´·¶²­¨¥¢›™–”‘‹‰†€}{zojt|…“¦°¸¹¸¶µ´³°¦•Љ• ­¹¼¼½¿¾¼»¹²¬´ÅÍÍΠ¤®¶¶±­ª¨¥Ÿœ™–”“ŽŒŠˆ„{xrqz~£´¹¼»¸··õ¶³¥‘ƒ‰Ÿ®·»¼¼þ½¼¼Ô¹¯ª»ÉÍÍΠ¦±¸·³®¬ª©£Ÿ›™—–’‹ˆƒ}{yz‹ ²¼¾¾¼ººõµ§œ•œ©´¹ºº»»¼ú·¦œ³ÇÍͦ²¸»º·²®¬ª§£žœ›™—“Œ‰†ƒ€}ˆ–«¸½½¾½¼¼»º®–š§¶¾¼¼ºº»º¹º¼½¼· –°ÆÌÌ£ø 7÷"D[J+ 3óZ™ÇÖ¾–C1ò1V³èúüóã&.÷ 0p­ÉñÿÿûËT,ö %<|Æï÷ýÿÿûè—6'ô#Kn–¶ÞöÿÿúøÜz'%ô*YŒ¹Îäóýÿÿúþö ?!ò:[…§Ñîúûþÿ ÿûÑhô$Kr¤ÂÝîüÿÿûí˜3 ò0LxÆàóúýÿÿúúÙ†1ô?f”µ×êøþÿÿùþõ¼aô ":dŠÁÝîøýÿÿøýìºQø#p¢Êâøÿÿøþð¤]& þùYÇñûþÿ ÿ÷ëÉ\% üû&Œëþÿ"ÿöüõàÇ\) û >úZÅüÿ'ÿòïÓŸm7 +Ek•ÄûŒãÿ(ÿòþúéϘcG`ЧÏìúû CÀ÷ÿ+ÿõýîÛÉÖèòüÿÿû IÅøÿ.ÿûþþÿÿú$Ÿëþÿ4ÿú yÙþÿ4ÿúVÂüÿ4ÿúSÀüÿ4ÿúW»øÿ4ÿûZ½÷ÿ4ÿú ‡áüÿ4ÿû *¶ùÿ5ÿü!iÛÿ6ÿü5éÿ6ÿü-—ðÿ6ÿü,¤ùÿ6ÿû \Éÿ7ÿû#âÿ7ÿû RÇöÿ7ÿûsßüÿ7ÿûlàþÿ7ÿüväÿ8ÿûC¬õÿ8ÿù iÍýÿ8ÿûbÇúÿ8ÿükÑüÿ8ÿú¤òÿ9ÿúIÌþÿ9ÿû$zãÿ:ÿúoÝüÿ9ÿ‡L<L"8LýK-""7úIHGE&""3í"#$*E;5/$)0;ONLN/,í#%&2KD2*':DLSOLN/,ë,7;ALJA?MceZ_llmy‡~B*êAGIJLLRUrƒ‚{{‚ƒ„”—hBL(èLNMNNC`Œœ  Ÿ˜”•–Ÿˆƒœ«'çLQTXYgˆž©°°®«¤žœœ£¢¡¦ª««&æ|c^ku†•¢«³µ³±¬©¥£¤¥¥¡“Ž£LL"稉x{…Ž—£«³¶µµ´±®¬©§¥›†}|LL"窣”“—¦¬±³¶¹¹·¶´®ª§¡’€ZLL"â©£˜–™›Ÿ§«­¯´¸¹·¸¸°©¤£™vSMLLJ@!ü«¤ž››ç¢¨«¬¯´¸¸¹¹²«¦§›|]NJ5$"" å­ª¥Ÿœ›œ ¦©«¬°µ¸º¹´®¨¦œ‹wO/""!­ãª¤ œž £§«¬®²·¸³¯©¤˜‡8)'$"" ¬û«¨¦¡ŸŸê¡§ª«¬¯³µ²¯«¥ŸœƒS3/,"" ¬«ý©¦§§ì©¬®¯®®°¯­«¦ŸˆgD;;"!ù«¬««¬¬««ù¬®¯¯­­¬¬ö§ ¡—ƒeN-"!÷ª¬««ª©©ª««ú®±¯®­¬¬õª¤£¢—yK1)" ᫬««©¤£¦¨¨«®±¯®­¬¬­­¬¨¤Ÿ‘kJ<4" ©¥¢™•˜™¢©¬®®­¯°°ö­©¥ˆbICB!⫨¤ŸšŠ†‰—¡¨¬¬­°³²¯­§¢›‹hTV\!᩟˜““‘‡‡ˆ‹“¨«¯²¶¶°«¥ž™”|x…› ᦕ‡‰”žœ–‘‹‰›§¬°²··°¨ ™“’‰‰Š…‘ ߢŽvu¬°¦‘Šš¦ª­°·¶¬¡—‘‹‹ŒŒ}Y4*,Þ›“…i~¬¸­£“Š˜¤©¬¯µ´§œ“Œ‡ˆ‹ŒdKFJ^Ý’•¢…w𵵫”‡œ¢¦«®±®¢˜Ž‰††‰‹qdVJ/ú‹Œ•¨«Ý”Ÿµ©ˆŒ°½±—†¡¥«¬­«¡—Œ‰ˆ‡‹‘•zfXP=‹úŒ•¨«­Ù¥¼ÉÄ«Šœ³°˜‹¤¨«¬¬«£š‹‹Š˜ž˜Š†‹“› ©­ñ«¥œ‘«­—•–— ­¯¯Õ®¬²ÊÑɶ–Šœ˜”¦©««¬¬¦Ÿ˜”‘•Ÿ©«§«®¦¢¡¥«­¸ÄŸ«¥‘«®¦ ¢¤¦¬´µ³±®¬«Ã̹‘d:+.j””¥¨ª­¯®ª¦ ››£­¸½¿ÁÀº³¯¯°µººÂ³œ” £—¢¶¸·²´·¸¼ÀÁÀ½·±«ÌŠ?TŒ“£§ª­¯¯®«§¥¤¦­µ½ÂÆÆÅ½º¸·¹ºº€ª²¢¢©§£§²ÀÂÃÀÁ¾¹º¹¸¼À¾´§Í©c-u†‘¥©«¬­¯°®¬­®°²µ¹½ÅÇÈÆÃÃÁÀ¿ÀÀ½»¹»ºµ´¼ÀÁ¿¼¹´«££œ—ž­»µ¨Æ†; &1o€œ¦ª««¬®¯­­¯³³±­«¯º¼¾Á¿¿ÁÂÃÂÁ¾¿ÁÀ¼¸µ¶³­©¤ š”‘Œ†‰™±²§¯H 4PoŒ›¦ª««¬­­¬È© ’…ˆ‘’”𠧬±¯­®¯­¦¢Ÿ™‘ˆ€‚‚„ƒƒ…†„ƒ¡©¥±L  IjŠœ¨««Ì­®­¬ª¥•laagnmmqz€ˆ’‘“—–ˆ…ƒ}oedfknlpx|‚‚ˆ—¨°Ås$Â)g€“¢ª««¬¯¯­¬¦˜t^SOPSWURT\bfglqx|xmijjg]WUSW[^blmtx{ޤµÎ_¶?„’œ¥©««¬®®¬«¡‹iWNLLMONLLPTY\`dijf_\]_^VQOMNPV\dentw{‡š²ÎÄ«l=F^h|”𣧍ª¬­­ø«ª„m]OLLMñORVXYYVUUWXUOMLLØNU[acgmsw¤ÍÍȰ“š¨Ÿ’”›£§ª«¬­­¬©¦˜„qaQMLLþNPPøONPSUSOMMóOT[_achmsx‹œ‡M<M"8MýL.""7úJIHF'""3í"#$*F<5/$)0;POMPhv,í#%&2LE2*':ENUQMPhv,ë,7DJVTJIYkq|vvŸœ˜*êIPSTVV^o‹–”’ŽŒ™›˜V(þVWWìYŒ”¡­¬®ª£ ŸŸ¤¡›šž­'çVZ]alŽ¥­·»¹¹µ­¨¦§ª©¦¨¬­­&æny|„•£¯·¼½¼ºµ³±°¯®«¤—’¥VV"õ«‰‹‘œ¢«´º¼¼ôº¹¸·´°«Ÿ‹‚VV"ô­¨Ÿ›ž¡¤«±¸»¼¼÷»·²­¥•‡eVV"ó°­¥¡¢¢¥«±·º»¼¼ò»¸³«¨ŸgWVVTI!ò·³­¦£¢£§®µ·¸º¼¼ò¹³­«¤mXT<)'' 伺´ª¥££¦«±µ·¸º»¼¼»¶¯­¨–€Y6(''!á¾¼·­¨¤£¤¦ª²¶·¸¹»¼¼¹²®ª¤=/,*'' »ã¸±­¨¤¥¥©±¶··¸¹º»º´®ª§‰W953'' ò·¹¹¶´®ª««¯µ¸¹¸¸¹ôº¶¯¬ªmKCC'!ò´¶¶··³°±°´·¸¹¸¸¹ôº·²®­‰mW3'!ò³µµ´µ´³³²´¶¸¹¸¸¹ó»º·±¯¨ž„U8/' á´µ´±±¯®®¯±´·¹¹¸¸¹º»¼¹´°¨™tSC;' â´²¯¬ª£ Ÿ¢¦ª²¶¹¸¸º¼½½¹³®¥ŽhQLJ!©¥ ™”’™Ÿ©°¶·¹»½½öº²­¥“p\^e!ž™š›˜‘‘”Ÿ©²µº¼½½õ¸¯©¤ž‡‚Ž—¢ 没œ¨¨ š’‘©°´º¼½¼»´©¤ Ÿ••ýŽ™ ï­™š¶¼²§™”›¤­³¹¼¼ò¶­¢šš›š‡b;/2Þ¥›‡•µÀº±ž–›¢¬²¸»¼»²§žš•–š™ŠnTNQbÝš™¥–„Ÿº¿· ’𣬲¸º¼º®¢š–’“˜š™Ž}seO4ü¢­²Ý›£·«‹³Â¹¢‘𤬱¸ºº¹¬ ™—••™ —†€mUCû¢­±»Ù©¿ÉÅ­¢º·£–›¤¬¯¶¹»¸¬£›™›šž¢¥Ÿ”•““𣳏Ä·³¬¡ ¹¼­§¥¦§ª³¹¾¿¾º´ÌÓ̺œ‘—¥£š¤«¯´¸»¹°©£Ÿ  ¤ª±²¯²±¬¦¡ª·¸¼Ä®·³¬¡ ¸»³¬­°±´º¾ÀÀ½º·Äνª¼ØØÑµ¡›ž¦¬±µ¸»»·³­«©¨®¶¾ÃÅÇÅÀ·±µ¹»¼¼Æ¸©¤¬¯«§°¾¿¿»»¿ÀÁÂÅÇÆÁ¼·ÌƯÒðÿùÁ›—œ¤«±¶¹¼½»¸µ³®®¶½ÃÇÊËÊÈÁ½½»¾½¼½¹®®³²±µ½Äůůž¿ÃÆÃ½µÏ´}¼§ÊûûÏš¤ª°µº»¼½»º¹µ´¹½ÁÃÈËËÊÈÇÆÅÄÃÂÀÁÁËÀ¼½ÄÇÅÃÁ¾¼·±°¦¢ªµÀ½¶Êª±Ü…xÓúȉ™¢ª¯µ¸¹¼¾½¼¼¸¸·µ´¶½ÂÄÆÆǾÆÃÁÃÇÆÂ¾¾À¼³¯¬¨¥¢ŸŸ–”¢·»¶ÀËíö—gÂüÞ‰x“¢ª¯µ¸º¼½¼¹¶°«šŠ˜œŸ¥ª«±³µµ²²¥³°ª¤¢ž”ˆ‡‰‰‹ŒŒŽ‰Š”©µ´È­×ûØÄçúƆ|‘¢¬±¶º¼¼»º´­Ÿ“zjjovww{„Š’•—™›œš–‘ˆ„††tlry€}~ƒ††‰¢³ºÏ–ÂüÿÿÂù½‘™¦¯´·»½½¹¶¯ŸŠt_YY\_^[]djx}{{€‚~|uqpmllb\_elmrx|~‚‰™­¼Ð­¤ãÿÿ¬ù¾™›£ª±µ¸»¾½·³©”yeXVVWXWVVY]fkllppmkgefe^ZXWXZ^ckov{~ƒ’¤¹ÏÆ­ªÀ¸»Ç©œ¢¨­³·º¼½¼¶¯£ŒtdYVVðWXZ^`ab_]]_`]XWVVØX^bgintz~‹œ²ÍÎÉ´³®¯­Ÿž¤ª®³·º¼¼º³¬žŠwh[WVVþXYYXúY[][XWWóY\begiotz~Š™¬‡<ù7÷]8 J36÷)p?WQ2í #Y?-Y; ,í0+-LiR_mLFH2 ,ëJO#=s«36ŽÄÌËâl:*ê [u3#[ÂÔ›—ÌðýüöéÊ¡^$(òa ”Y[½ôóðøýÿÿùýô±X'ö4iŸÂ‘Îõÿÿúà¨\!&ö T¤Öéáãôüÿÿõüð¯F !øH~Ëøýûýÿ ÿöú¹L %T.!û¾ÐïýÿÿöüÄsCKac&!üóøþÿÿ÷Þµ¢™f8!ÿöøï—Y( ÿöûæYþý ÿøß¤X-þï )Gm†‚‹yC ÿÿ÷ù鼌M% ê ÿ €þ¥=þŸ=þ=þ=ü¡¤«;ü­ª«;û¶²¯­:û·³®­:¯­:þ¨­­: €þ±=þ­=þ¬=þ¬=ü¯­®;üµ°®;û½¹¸½:ûÀ¾¼½:ý¼¾½½:þ·½½: €þ´=þ°=þ¯=þ¯=ü±¯­;ü¶°­;û¼¹¸¾:û¿¾½¾:þ½¾¾:þ¸¾¾: €þ=þ=þ=þ=ü9;ür!;ûÂS:ûêy:úù´X9úýä¨; 9 € € € €äöŸ¤¨«­«©¥¡2žŸõ¡¤¨ª¬¬©¦¥¥/žþ ¡¡õ£§ª­¯«¨§©°,ê«©¦¦¨©¨¥£§«¯²±¯¯²·º»º(¬ô«­¯°¯©¤¥¨­°³³ý·º»»þº'©ê­±´¶¶±¦ššœ ¨®´¸»»º¹¹&ꦥ¦ª¯¶¹¶¬šŠ‰Š˜£®µ¹º¸¸' é¡¤©²·³¦„}|}€™¥­³µµ´´&æš›œž¢ª±±§“†~~€…’›£¨®±²±±³&è•–—™¢¨¬ªŸ–“™¢¥££¨¬®®¯'é‘‘”œ¢§§¦¢Ÿ £¨©¦Ÿ¡¨««*쑘›ž £¥¦¨©«¨ —””œ§,þ–™™ü¢¥§§ù£›‹Š-ï«¥¡œ›ž¢¤¥¤£ ˜Š‚€-ªò§¥¢¡¤¥¤£¡ ž™‰/õ£¢¢£¥§¨§¢žœœ1òš˜šž£¦¨¥Ÿš—–™0ò‰Œ‘–Ÿ¤¤ š•’0‰ôŠŽ”¢¡œ–‘Ž0òˆ‰Š‹• žš”‡0ò„‡‰ŒŽ“™žŸš•1ò…‡‹‘–œ¡¡Ÿ›š™—0òˆ‡Š–¤§¤ ›˜˜1ó‘•ž¦ªª¦¡›˜2ó“•™¦¬­©£ž™—2ô—𡦮°­§¡œ–2󒘛¤«°±«¥ž™–2󔚤©®®¨¡š”‘2󥡢¥¨¬«¥ž˜“Ž2󩨨©«ª§ š•Œ1ò¤¦¨ª««¨¤™“1òž¢¤©ª¨£œ—’1òš› ¥©¨£œ–’‘“1–ô™›¢§¨¥ž™–•–ý®¯ò•”—𡦩¦¡œ™•“°þ±ò”—𠥩©¤Ÿ™”‘û«®´¸ñ”˜š ¤©ª¦ ›—“‘‘úµ®²¸½𓕘ž¢¨ª©¥¡š—•”øÂÃÄÀ¾ÀÃð“—¢¨ªª©¥¢ž›™™š ÷ÊÄÅÆÆÄÄÇ쎑•¢¨ªª«©§¥¢¡ ¡§¬ôÄËÌËÇÆÇÈÇÇÉ÷Œ”œ¢§¨©ªªö©¨¥¢¢¦¬±¾ù«´ÃËÌËÈÈÉà‹‘—œ¡£¦¨ª¬­¬©¦§©¯¶ÁÇÈÇÀ·³·ÂÉËÊÉÉüÈÇÆ㌎“—𡤧ª¯¯­«ª«±¹ÃÈÉÇ»·¹ÂÇÉÉúÈÇÅÄÁÚŽ‘‘“•›ž£¨¯³²¯­®³ºÂÆÈÇÆÂ½¼ÀÅÇÈÈÇÆÅÃÀ½ŽÞ‘–šŸ¤­³´³°°´ºÀÅÇÈÇÄÀ¾ÀÄÈÈÆÄÃÃÀ¾¼ŒßŽ‘•šŸ¨°µ¶´³¶º½ÀÃÅÅÄÁÀÀÄÇÇÄÂÀ¿½»º‹÷Œ‘–›¤¬´··ú¸º¼¾ÀÂÂÁôÀÂÄÄÂÀ¿½»º¹‹ñŒŽ’—Ÿ¦¯´¸¹º»¼¾ÀÀ¿¾ú½»¹¸¸뉈‰‹”›¡ª°¶¹º»½¿ÀÀ¿¾½½ö¼»»ºº¹¸·µ‡íˆŠ—œ¤ª±´¶¸»½¾½¼»ººõ¹¸··¶µµ´³²Þ†‡ˆ‰‹Ž“™ ¦¬°²´·¹¹ºº¹¸¸··µµ´²°°¯®­쇈‰‹–£¨«­®°±³´µµ´³³ö±¯­«©¨§¦¤à†‡ˆŠŽ”œ¡¥¨ª«¬­®¯±±¯®­­¬ª¨¦£¡ Ÿ õ†‡ˆ‹“œŸ¤¥¦¨¨î©ª«ª¨§¦¦£¡ ž›˜—–!†ö‹• ¢¢£¥¥¤¤ø£¢ žžœš——ü“’’#üŒ–ž  ë¡Ÿœ›š™˜••–“Ž‘“’&žëž™˜˜—•”“’‘‘‹Š‘äö®³¸»½»¹µ±2ñ­¬­­°´¸º¼¼¸µ³²/­ñ¯®®¯²·º½½¹·µµ·,í»¸¶´µ´³²²µ¸¼¿¿½º»¼¾¾)¼þ»ººô¸´±±´·¼¿¿½¾ÀÀ¾(¹ê¼¾ÀÁÀ»°§££¥ª²·¼¿ÁÁÀ¾½&ç¶µ¶¹½ÂÅÁ¶£—‘‘” ¬·½ÀÀ¿½¼&ç°¯°³·¿Ã¿±™Š‚†”¢¯¶»¼¼»»&몫«­°·½½³žŽ„‚…‹š¥­²¸ºº¹'¥ê¦¨®´·µ«Ÿ–”˜Ÿª®­®³·¸·¸' ì£©®²³±­¦¥©¯²¯ª©­´·¶*øž ¦©ª«®°°ö²´±«¢Ÿ §³,þ¦§§ò¦©­°±²±®¦›””™-ﺴ¯ª¨ª­®¯¯®¬¤•‹ˆ-¹ò¶²¯®¯¯®­¬¬ª¥•/ñ²±°°±±²°¬¨§¨©©0ò©§¨«®±±®¨¤¢¢§0ò™››ž¢¨¬¬§¡ž0þ—˜˜õšž¥©¦¡š•—š0ò”—˜™› ¦§¤Ÿ—Žˆ0òŽ’–™œ ¤¨¨¦¢š’1ò’—¢¨­­«¨¥¢ 0’ô•™¡©°²±­¨¦¥1óžž¡©°µµ±­¨¥2ó¡¢¥©°µ¶´¯ª¥¤2ô¤¦¬°¶¸¶±«§£2ó ¥§®³¸¹´­§£ 2󢦨®´¹¹²«£œ™2¬ö°³·¶¯¨¢œ—2󯲲³µ´±«¦¢Ÿ›1ò­®³´µ¶³°ª¦¢Ÿ1òª«®°³µ³¯©¥¡ŸŸ1¨ôª«¯³²®¨¥¢¡£1¥ô¦§¬°±®©¦¤¤¥»ò¤£¥§«®°°¬©¦¥¢½ò£¤¦©­±²°¬§£¡Ÿû¸¼¿Ãñ¢¤¥©­²´±­¨¥¡ŸŸúÀº¾ÂÇð¡£¥©­²µ´°«¨¤£¢¡øÎÍËÈÆÈË¢¥©­±´µ²¯«¨¦¥¥¦ ÎûÍÌÌÍñž¡¤ª­±²´³±¯­¬««ý­±ûÉÍÏÏÎÎþÏÎÎ뜟£ª®°±²³²±²±¯¬¬®±µÄø·½ÈÍÏÏÎÏÏÎâ› ¦ª¬®¯±²³¶¶²°°²µ¼ÇÌÎÎÆ¿½ÀÉÎÏÏÎÍ㜞¢¥§©«­°²¶¸¶´³´¸ÀÉÍÎÍÈÃÀÂÉÎÏÏÎËþÊãž ¡¡£§ª­¯´¸¹¸··»ÁÈËÎÍËÇÄÅÊÍÎÎúÍËÉÇÅžè £§ª­³·»»¹¹½ÁÆÊÌÍÌÊÈÈÊÌÎÎùÍÊÉÇÄÂœí £§ª±¶»½½¼¾ÀÃÅÈËËÊÊõËÎÎÌÊÈÅÃÁÀ›íœŸ ¤¨®´º½¾¾ÀÁÂÃÅÈÈÉÉôÈÊÌÌÉÇÅÂÀ¾¾›âš›œ ¥«°¶º½¾ÀÂÂÃÄÅÆÆÇÇÆÆÈÇÄÂÁ¿½½—™ž¢¨¬²·º½¿ÁÂÃÄÄÃûÂÀ¿¾½½ð“”•—›ž¤¨­²¶º½ÀÀÁÁÀý¿¾¿¿þ¾¼¼»ð’“”–™œ¡¦«®²¶¹¼½¾¾½¼½ý¼»ººü¹¸·ò“”–™ž£©¬¯±´¶¸ºº¹¸ù¶´³±±°ò‘’”–›¢©¬®¯±²µ¶¶·¶öµ´³±¯¬«ª© ô‘“˜¡©¬­®®¯±±ñ²±±°¯®­«ª©§¤¤¥!ú‘–£ª¬¬ý­®­­¬«ôª©¨¦¤£¤£¡¡¢#û™¤«¬««þª¨¨þ§¥¥ô£¢¢ ›ž¡ŸŸ¡&õ«ª©ª©¦¥¥¤£¡¡ö žžœ™–˜žŸäö±µ¹¼¾¼º¶³2ñ°¯°°²¶º»½¼¹¶´³/°±õ´¸»½¾º·¶¶·,í¼¹¶µ¶¶´³²µ¹½¾¾¼º»¼½½)½ï¼»º»»¹´±±´·»¾¾½½¿¿½(ºê¼¾ÀÁ¿¹¯§££¥©°¶»¾À¿¾½¼&ô·¶·º½Áþ´¢—’’õ”Ÿ«¶¼¿¿½¼»&±é²´·¾Â½°šŒ…„„ˆ–¢°·»½¼»º&櫬­®±·¼»²Ÿ†„‡›¦¯´¹»ºº¹º&覧§©¯´·µ¬¡—•™ «¯°±¶¹º¹¹'¢ì¤ª®²´³®§¦©­±°­«¯¶¹¸*ì ¡§©¬®°°¯¯±²°«¤¡¢ª¶,þ¦©©ò¨ª­¯°±°®§œ—–œ-ï»¶±«©ª¬®®­­«¤˜Ž‹-ºò·³°®®¯­¬«©¨¥—/ô´²±°±²²±¬¨¦¥¥1ò«©©«®±²¯©¥£¢¤0ò› ¢¨¬¬¨£ŸžŸ0þ™ššõœž¥¨§¢œ™™œ0ò–˜ššœ ¦§¥¡™’0ò”—›¡¥¨©§¤ž•1ò”˜ž£ª­®¬©§¥£0“ô—›£©±³²¯«¨¨1󟞟£ª°µ¶²®ª¨2ó¡¢¥©°µ·µ°¬§¦2ô£¤ª¯µ¸¶±¬©¥2ó £¥¬³¸¹µ®¨¤¡2ó¡¥§®³¹¹³«¤š2ªõ«°´·¶°©£˜2ó­°±³µµ³­¨£ 1ò«¬²³µ¶´±¬¨¤¡Ÿ1ò§¨¬®³¶´°«§£¡¡1ò¤¥§ª¯´´°ª§¤£¥1£ô¥§­±²¯«¨¦¦§¼£ô¥§¬¯±°­ª§¥£¾ò£¤¦©­²³¯«§¤¢ û¹»¾Âñ £¤¨¬³µ²®©¦£¡ ú¿»¾ÁÅ𠢤¨¬³¶µ²­©¦¤£¢ÊúÉÆÅÆÈ¢¤©­³¶·´¯¬©§¦¥¥ ÷ËÊËËÊÉÉʟ«®²µ¶µ²°®­«©¨¬°þÈÌÌËÌËëž¡¤«¯±³µµ´³³²®ª©¬°´Âü¸½ÇÌÌ២¨¬®¯°²³´¶µ±¯¯±µ»ÅÊÌËÆ¿½ÀÇËÍÌÌËþÊãž ¤§©ª¬®°²¶¸¶´³´¸¿ÈËÌËÈÃÀÁÇËÌÌËÉþÇÚŸ ¢££¤§©¬®´¸¹¹¸¸»ÀÆÉËËÉÇÃÄÇÊËÌËËÊÉÇÅߠࢥ¨«±·»»ºº½ÀÄÈÊËÊÈÆÆÈÊÌÌËÊÈÇÅÃÀžøŸ¡¤§®µº¼¼ú¾¿ÁÃÆÈÈòÇÆÇÉËËÉÇÅÄÂÀ¾¡¥«±¸¼½½¾ÀÀÁÃÅÆÆõÇÉÊÇÅÂÁ¿½½윜›œŸ¢§¬´¹¼½¾ÀÀÁÂÃÄÄùÆÅÃÂÀ¾¼¼™š ¤©°µº¼¾¿ÀÁÂÂÁ÷À¿¿¾½¼½½ꔕ–™›ž¡¥«°¶¹¼¾¿ÀÀ¿¿¾¾½½¼»ï“”–˜šœŸ£¨¬²µ¹»½¾½½¼þ»¼¼þ»ººü¹¸¸ò”•—™ ¦ª¯²µ·¹ºº»º¹ø¸¶µ³²±±ò’“•—šŸ¦©­¯±³¶··¸·÷¶´±®­¬«« ’õ”˜Ÿ§«­®­®°²²±ò²³±±°¯­ª©§¦¦§!â‘’—¡©¬¬«ª«­®®­««¬­«ªª¨¦¤¤£¢¢¤#¬­ª¨§§¨©©§¥¤¥¦¤¤÷¢žœž¡  £&ú«¨¥¥¤¥¥ñ£¢¡¢¢¡  ž›—™žŸä3ñ /ï &1?HKC>BA5 ,ê7Yx‰«ª¡›Ÿ¢`< (è.mžÀÎÜäãßÛÝÞϤ{H$ 'è7g®Úñ÷úüüûúúùóàÄ“e/&÷ ^œÖòýÿÿöþýöéÊR&÷ +t´çøýÿÿøüöã¼h*&ö "]—Ðéöýÿÿ÷øę́\$&ö )Lƒ­×ïüÿÿôþýüù佂\.'é Do¬×õýÿÿüùòæÂŽH&*ì4}½îüþûíÚ¾£xL ,îp»ïüýöÔªzZ7 -ï,‚Î÷ýøã¥f0 -ð#LœÙùüìÇx;/ñEÄêúõÏ•D0òa¤ßöùè¬i$ 0ò5ŒËñúëÇx90ñ$Y°ãø÷Õ O0òP‘×ôöã¨i( 0ò3z¹ëùìÈ}A1ò%^­Ý÷öÔšI0ò5Ïðùï·q) 1ó E–âùõÝ’I2óU¤éûïÌz6 2ôf°ëúè·^$2ó!o¸íúâªL2ó *€ÉõúÚš<2ó7ÔøúÔ3 2óM¥ßú÷Ë…. 1ò%_¶æúôÁx( 1ò2yÍðûó»o"1ò:ŠÝøüôÀv%1ò8…Ûùý÷ˆ. ýò/uÐõþøÔ•:üò!_¿îþüâ²^' û ?ñP°æûþñØN ú (LzðJ§áûþýõÇŽM( ø)e›ÆîRªâûÿÿüä¿‚P  ÷,S›Ïíì&`·çüÿÿþöæ¾Hö 8j›Óïüù$_ºêüÿÿôü÷á¿~I ò$Ou§ÎîûÿøI¨Ý÷þÿÿãþøíÌ¡hB"  %/Km¥Èãñüÿÿù *v¶èùÿÿçþüñبR:-%"0CPas’±Ùïùüÿÿ÷;xÀåúþÿÿëýõ߯¢Ž‡}ihzŒž¬¾ÍÜçöýÿÿ÷!M•ÉðüÿÿíýöëÚÐÍɺ¸ÇÑÜåîô÷úþÿÿ÷ %_›Ùõþÿÿóþüù÷õõðñõ÷ùüþþÿø9o¿ëýÿÿýþ ÿø;‘Òôüÿÿøh­âöþÿÿö 7o·à÷üþÿÿôBŠ¿åòùüþÿÿþ ô O©ºÌàóúþÿ ÿøþýúõïìéò &E`l‰®Ôé÷úýÿÿ÷ýøòå×É¿° á  9ZвÓÜçòúþÿÿþýýûöîÚ¿œ†raL!â%Kq”¡¶Ñì÷úúöóòêÙʨT?0##æ&;Fb‰¸Ì×ÔÆ¼°ž„sV5 &é-Ls‰—‘q`O:/Ѩ¬°¯¬¬«¨£Ÿœš—”ŒŠ‰‡†ƒ€~~ƒŽ›¬²µµ³²±¯«¦‘…¢´½¾º¹¹ü¸³´··Õ²­™–´ÈËÉÊœ¢§®¯­­¬ª¥ š––‘‹Š‹ˆ…‚„Š˜¦³¸·¶´´ß±¦–‡°¼½¾¾½ºº¹··¹¹¸±ª˜˜¸ÊÌÊËœ¥§¬­­Â¬ª¦£¡™š–’“‹ŽŒˆŒ‘Ÿ¬¶º·µ¶··±ž’£¶»»½¿½¸¸¹·¸º¹µ¯©™˜³ÆÌÌͪ«¬­­×¬«§§¥ œœš˜•Ž‘‘—¦°·º¸·¸¹µ§•’¡¯·¸¹»¼»¹¹¸Æ¹·´°® •¤¹ÆËͬ¬­¯®­¬«ªª§¤¡¡¤¢š—”“’“‘“¯µ·¸¹¸··©•“ ±¸·¸º»ºº¹ê¶·´±°¯¦“„’°ÁÈ­­®²¯ª©¦¦Ù¥¦§¦¨¦Ÿžš™˜—–— ±·¸¶·¹¸³ž’ °¹»¸¹º¹¹¸¹¸¶¶ì±¯°¯¬£•“¦³³­®µ­¤¤ô›¢©ª«ª§¦¢žœ››Øœ¡®·¹·¶¸±¡•ž±¹¼¼»½½¹¸··³°¯±°®®²±®®«¢¢£”õ°¦žŸ•””Œ•«¬¬ü«¦¢ŸŸ Ù£­¶¹¹·²¡”›«¸¼½½¼½½º¹¹·³­¬­¬¬­°±®­«¥¢¡— ¬Ý­ª¨©©¨¨§¦¦¨­µ¹¸¶©˜œ®¸»¼¾¾¼¾¾»ºº·³­««¬ö­¯®­¬©¦¤¢Ü­ž ¨¬­¬«¨¦©®µ¹·´¤œ©¸½¼¼¾¾¼¾¾¼ºº¶±­¬««õ¬­¯¯­®­«©¨ß“¨«­­ª¦¤§­³¸·®Ÿ¥´½ÀÀ¾½¾½¼»º¹µ³¯¬¬ù­°¯­¯±°°ß‘§§¬®ª£¢¦ª°¶²¥Ÿ®»ÀÁÃÀ¾¿¿½ºº¸´´¯¬¬÷®¯°±³´²³®°¯§££¢¨§˜¡µÀÂÀÀôÁÀ¼¹º¹·´°®®¬¬ú­¯®°³¶¶þ¸Þ¥§°²²ª¤ œž“Œ¯ºÁÄÁÀÂÁ¿À¿»ºº¸µ²±°­¬¬ö­¯¯°´¸¸¹ºà­®°°¬¦£ž•‰•±¼¿ÃÄÃÃÅÁ¾ÀÀ¼»ºº··³¯¬¬÷­°²¶¸¹ºº­ï¯®ª§›Œ¡»ÂÃÅÄÆÆÅÁÁö¾¼»ººµ¶´¯¬¬ø°³¶·º¼¾ய²°¬¦‚—¯ÀÅÆÈÇÇÆÅÄÄÁ¾¼¼»¸³µ´¯­¬¬ø°³¶ºÁÃÇðµ´­§ „‚¥ºÃÆÉËÊÇÅÅôÂÁÀ¾¼º·¶²¯­¬¬ø²µ¶»ÅÉËõ­‡yŽ·ÁÃÇÊÊþÉÆÆôÂÀ¿½»º¹·±®­¬¬÷­³·¹¾ÅÊÌ‚ãxiwž¾ÄÃÇÉÇÉÉÅÅÈÇÁ¾½¼º¶´²¯­­¬««÷¬³¹¼ÁÆÈËõ‚sq°ÂÅÅÈÉÉãÆÅÅÈž¼»¹·µ°®­­««©§©¬´ºÁÆËÌÌ›û”¨»ÆÆúÉËËÈÅÆÆçÁ¼»º¹µ´¯­­¬ª¨¤¡¥ª´¾ÆÉÌÍ͛آ«ºÃÈÊËÌÍÌÇÅÆÅÃÀ½»¹¶²°°®­«¦¡œ› ©·ÃÈÈËÍÍ›ù¦²ÀÅÉÌÍÍáÌÆÅÅÄÁÁ¿»·³¯¯°¯­ª£™—ª»ÆÈÇËÍÍÕšŸ­ºÃÇÉÊÌËÊÉÅÇǾ¾º·´±¯°°®¬¨ š•“Ÿ°ÂÈÇÈËÍÍšÖ ¥´¿ÅÈÉÉÌËÇÇÈÉÆ¿½¼·µ³±¯¯®¬¬¨Ÿš•“£¶ÆÉÈÉÌÍÍÙ ¬¹¿ÆÉÉÊÊÈÆÇÉÆÀ½¼»·³²°­­¬¬«©¢›”¡ºÊÌËÌÍ͌ܠ±¿ÃÈÉÉÈÇÇÆÆÄÀ½¼»ºµ°°®­¬¬««ª¢›Š›µÉÍÍ騕¨»ÃÇÉÈÈÇÅÈÅÅÆÂÀ½¹·±­­¬ô«ª§¤Ÿ™‹‚‘¬ÇÍͬꦡ³ÂÇÅÈÇÆÇÇÊÆÆÅÁÀ¼¸´¯¬¬ªô©¦¡žœ˜ŠŽ«ÅÍÍÖ¾¼¸·ÁÇÆÄÉÉÇÆÈÊǾ¾À¼¸²­¬««¦¤¤¡œœ›š‹zŽ®ÄÉÌÍÍß®°ÃÅÃÁÄÅÃÅÊËÊÉÇÇÆÁ½¼¼º·²¬©¨¨¢ŸŸœœö›‰t²ÀÃÇËÍÍέ®´´¼ÃÆÃÄÇÈÉÊÉÈÈÆÅÄ¿¼¼¹¶³°«¨£¡žœœ››œ œƒqŠª¸¸¼ÅÉËÍ ò­¯¸¹»ÀÄÃÆÆÉÌËÉÉÞÅÃÀ½¼»¹¶°­«¨¡œ››™™¤q„œ¬¯µ»ÂÇÊ Ûž ¥¬¯°·»½¿ÂÂÇÉËÌËËÌÉÄ¿¼»»¸³­«ª¥žœ˜—™™œó’kWi– ¨­µ¼ÂÉœŸ¡§®±´¸»¾ÀÃÄÈËÌËÉËËÈÆÃ¿¼ºº¶°¬ª¦ œ›™˜šœœ™}_Ucs†’›Ÿ¦­¸Ü£¡¡£¦¬²¶¹½¿ÁÃÆÈÉÌÍÊÇÇÉÉÆÀ¼¹¸¸²­«ª£šší›œ¢ tovwvv{ƒ‰Œ’˜¦­®®§££¤¦«°´¹¿ÃÃÄÆÈÊËÍÍËÇÇÉÉĽ¹·¶³®¬«ª¥ž˜—•”˜ ›|fr•Œƒ||„ˆŒš¯¯ó°¯¬©©¬¯²µ¸¿ÆÇÇüÈÊËÌÌ—ÆÇÆÆÀº¶´±­«ªª¨¢›’‰}…Œ„rv‹¢§¡˜‹ƒ}€…‰’­¯°±±²±°¯°²µ·º¼ÂÇÉÈÈÉÊËËÊËÌÆÇÃÅ¿¸´²®«ª¨§£–Šsr}€usŒ¡©¨¨¥œ…ƒ‡Œ“°´¶¸¸õ¹º»¼¾¿ÀÁÃÆÇÇüÉÊÌËË“ÇÅÂÁ½¹´¯¬«¨¢Ÿš’‡ztqrˆˆx{—¨—¡©§ —““•˜³¸»½¾¾¿ÀÁÂÂÃÄÄÅÅÆÆÅÆÈÊÌÌÊÉÉÆÄÁ¾¹¶°¬«ª¤Ÿš’„ypouz”Œ‚¢©Ž…˜¥§¦¤¢žœž¹½ÁÄÅÅÆÇÇÈËÆÅÅÆÇÈÊÊÇÆÇÅþ»µ±­ª§¤ž—uqqs{ƒ““—Ÿ¥œˆ|€‰•››š ¾ÂÆÇÈȼÉÊÊÉÈÉÊÉÇÄÅÆÇÆÈÈÅÆÆÃ¿¼¸³¯¬©¢ž—~tqu}‚“¨±QQm}yx}ƒ…†‰‰‘ÅÆÈÉÉÈÈÉÊËÊÈÈËÉÇÆÄÄÅÄÃÄÅÄÃÀ¾¼¸³®¬©¤›”ŠƒuoxŠ™Ž|‡”—ŸªZZkxvtvvww~‚ÈÉÈÈÉøÈÅÅÆÇÅÄÃÃÀÃâÀ¼º¹µ°«¨£Ÿ—Œ~y}w‚™ŸŠ}ˆvr˜~~wtt÷{~‚…†ÉÈÇÆÆÅþÄÂÂÁÝ¿¾¿¿»¹µ´¯¨£¢žœ”ˆwyŠ|ƒš—Ž“vZEwyvtt邈‰Š’ÈÇÅÄÄÃÂÂÁÁÀ¿¿¾½¼½¿¿á½¼¼»¸µ±®¨ š›œ”‹œ‰y•žš‘qRRttîz‡‹‹‘™ÄÃÂÀ¾¾½½¼¼½¼¼ºú¼½¾½º¸¸õµ°ª£Ÿ™’”šœð…Œ•¢¨•„uLu{xttó{‚Š’–š£¿¿¾¼»ººý¹»¼¼½»ï¼»º·´µ´¯ª¢š—•ŽŒ‹ö¦ªª°µª}xüuywttó„Š•œ¡©¼»ºº¹¸¸þ¹¼¼ë¾½»º¹¹·µ±¯®¬§¢š’Ž‹¸øºµª’ «~ñxtu{…ˆ‘™¥¬»º¹¸¸¹èº¼½¼»»º¹¸¶µ³±®¬¨£š–‹ŒºøÀ¾—x™«í{ztu‰‹–›¢©«º¹¹¸¸¹¹ºë¹·¶´³³±¯®­©¥Ÿš•’‹‹åÚèŽo˜Çµv||wtu~‰‹–œ¦«¬¹¸¸¹¹¸ë·¶´²±¯¯®­¬«ª¥ž—“‘Œ‹î’€zzxu~‰‘™œ§«¬··¶¶÷´³³±°¯­¬ªª©÷¨§Ÿ—ŽŽÞ‹…‡†|}…Š˜¢ª«¬µ´´³²±°¯®­¬«©¨¦§¦¤¤ú£œ”Ž‹ׄˆ‡„€|ˆ‹‘𥫫¬°¯¯®­¬«ª©¨¦£¢  ¡¡ŸžŸŸš’‹…„}|‚†Š•¥««¬«ª©©ð¨§¥¤¢Ÿœ››Ÿžš˜š„ö~||‚‡‹•¥««í£¡¢£¤¥¡ŸŸœ˜•“œžš•à…„ƒ„ƒ{‚ƒ†Š˜ž§««œ›œŸ¡¢š›š•‘¡ↄ~€„€‚……‡Š‘™›¦««––˜šžŸ˜–˜˜”“†û„}‚„„…숌•œ› §«““”˜›•’•—” †ü~}‚„„ð‡ˆŠŒ•œ›¢©«’‘‘•˜&û…~~‚„„ô‡Š‹‹“™››¦««+‚„‡†‡ˆŠ‹‹‘”—››¦««à·»¼¼»¸²¯­«ª¥¡ ›™˜”Š…€…’¤µ»½½í¼º¶®›Š§»Âÿ¿½½¼¹¹¼½½×¹ ™¶ÊÍËÌ«±¶»½¼»³°¯¬«§¤¥ œ››™–‘Œ†ƒˆ ¯º¿¿½½î¼º°ž“´ÂÁÁ¿½½¼¼½½Ì¼·¡ºÌÎÌÍ«²µ»½½¼¶³°®¬ª§§¤ žœ››™—’“šª¶½ÀÀ¿½½¼·§™™©½ÂÂüÿ½½Çº´¤Ÿ¶ÈÎÎ϶¸»½½¼º¶²±¯¬ª©¨¦¤¢Ÿžœ›™˜™œ­¹½¾ÀÁ¿½¹®Ÿž­»ÁÀÀÁÀ¿½½é»¸ªœ¥¹ÈÍϸ»½½¼»º¹¶´²®¬¬â©¨¥£¡ œœ¡²¼½½¿À¾»­œž«»ÄÿÁÁ¾½½ì¼±š‡“²Äʼ¼½½º¶·²±±®®¯ò®«ª©§¦¤ ž¢§µ¼½½õ¾½·¢™ªºÁÄÃÀÀþ¾½½¼½ö¹®œ—ª·µ½½ç¶¯±¦¤¥ ¨±³´³³±®«ª©¦¥§­·¼½½ù¶¨›¤ºÃÄÄÂþ¿½½ù¼º¹º»¼½½ú´©ª¨˜û·°ª¬™™í–´¶·¸¹·´¯¬«©©«¯¸¼½½ù¸§™ ±ÁÅÅÃýÁ¾½½ø»·¶¸¸¹»½½ú·°¬©Ÿ ß·¸¹¼º··¶³³°®­¯¶»½½¼± ¢µÁÄÅÆÆÂÃÁ¾½½ð¹´´µ¶¶¹¼½½»¸´±®â½®°¸»º¹´¯­®³¹½¾»­¥±ÁÇÄÆÇÉÄÆÃ¾½½ö¼¹¶´µ¸¸º¼½½û¼º¹¶䣭¸»¼¼¶¯­­°¶½¿µ¨­¼ÆÉÉÊÉËÈÅÀ½½þº··ø¹º»¼¼º»½½þ¼ä¡­·¶º½¶¯¬­¯´»¹­§´ÁÇÇËÌÉÊÉľ½½þ¼¸¸¹»ºþ¼½½ù¯±º½·°¬¬é¯­£¦»ÇÊÈÉËËÊÈÅÁ¾½½»¹º¹¹ù¸¹º»»¼½½ß±³¼½º³­«ª©˜‘¡´ÂÊÌÊËÌÌËÊÊÄÀ½½¼»»º¹¹üº»¼½½ý¾½½è»¸±­¦œž¼ÇÈËÊÊÍÎÎÌÉËÅ¿½½ü»¹¹¸¸ý¹¼½½üÀÁÀ½ô¼»µ¯¡‘’¬ÇÍËÌÌÎøÌÈÉÆÄÁ¾½½ü»º¹¸¸û»½½¿ÄĽ÷¼·°–‡ž¹ËÎÎøÍÊÈÆÅ¿½½ü¼¸·¸¸ø»½ÀÆËÈÊô½¼¹µ­‹‡«ÃÍÎÏÏÎùÌËÉÈÄÀ½½ò¼¹¶··¸»½ÃÉÍÍÎöµ«Ÿ”“½ËÎÏÏÎùÍÉÉÈÿ½½ò¼º·µ´¶»¾ÄÊÎÏÏøŽ‚z¤ÆÎÎþÏÎÎäÊËÎÎÍÊÈÅ¿½»¼½½»·´²³µ»ÀÆËÎÎÏõ„…x}›¹ËÎÎÏÎÎçËÌÎËÊÉÅÀ½½»¼½¼·³¯®°³ºÂÊÎÏÏ¡û’™³ÆÎÎÏÎøÍËÇÇÄÀ¾½½ô¼¹´°¬«­±½ÆÌÏϦú©±ÂÌÎÏÏÎùÍÉÆÈÅ¿½½ô¼¸°¬©¨«±¾ÈÎÏϨú±¹ÆÌÎÏÏÎþÌÉÉýÅ¿½½ó»·¯ª§¥©²ÀÉÎÎÏÏô§ª¬ºÄÊÍÎÎÏÏÎÎúËÉÈÃÀ½½¼ó¹´­¨£¡«¸ÆÌÎÎÏϧú«±ÀÊÍÏÏÎúÍÉÉÅ¿½½þ¼»»ö·²­¨¡ ¯¿ÊÎÎÏ ÷«µÂÉÌÎÏÏÎÎùÍËÈÇǽ½ò»¹¹¸¶²­©žœ¬ÁÍÏÏœú«¹ÆËÌÎÎÌéËÈÆÃ¿½»»¼¼º·µµ²¬¦˜“¤¾ÎÏÏÙ­¡ž±ÁËÍÎÍÎÌÊÌËÌÍËÉÅ¿½¼º¹¸·¶µ³°®¨¡‘‰™µËÏϰû­ªºÈÎÎÌýÍËÍÍéÊÉž½¼¹¶´²±±°¬ª§£’†•²ÉÏÏ÷ÃÀ¾¾ÇÍÌËÌÌÍóÌÊÈȽ½»¶±°®­­ôª©©§““´ÇÌÎÏÏô½¾ÊÊÈÈËÎÌÊÍÎÎáÍËËÉÇÈÅÀ½»¶²®­¬«ªª©©ª©’u‘¶ÃÈËÎÏÏß»ºÂÂÅÊÌÊËÍÎÎÏÏÎÎÌËËÈÆÇ¾¼¸³¯¬«ª©¨¨ñ©¬¨‡c€«½ÁÃÈÎÏÏ Î¼»ÃÄÄÈÌÊÌÍÎÏÏÎÎÏÍÌÊÆÆÅÀ½º¶²®«ª©¨¨¦¦¨¬¦}Qg–³¹¼ÂÉÌÎ ñ®¯³¹¼¼ÀÃÅÆËÌÌÍÏÏÞÎËÈÆÃÁ¾½º´¯¬ª©¦¥¦¥¥¨¥—gCX€žª²·¼ÁÇÜ«®°¶»½¿ÂÄÇÇÊËÌÍÏÏÎÏÏÎÍÉÈÅÀ¾½¼·±­ª©¨¦¦ð§¥“xL9Sr‹›¦ª¯µ¾Ç®­®±´º¿ÁÃÇÉÊÉËËÌÎÏÎÌÍÎÎËÆÆÂ½½»¹³¯¬©¦¥¥¤§ª©˜sO@KgwŠ“˜ž¤¯î½¾½´¯¯°´·½ÀÄÇËÌÌËÍÍÏÈÎËÌÎÎÊÅÃÀ½»¸µ±®¬©£š˜ ¦ž}WD^}Œ‡€…‹“𦾾¿¾¿½º¶µ·¹»¿ÂÆËÎÎÏþÍÎÎÛÈÿ½¼¸µ²°­©£™‹xqx}pSTn—©© “ˆ‚†Ž• ½¾¿ÀÀò¾½»»½¾ÀÂÄÈÌÎÎÏÏÎðÆÀ½½º¶²±®«£š‹qQHHíFIq™¯°±°¤˜Œ‘— ¾ÁÃÄÄþÃÄÄôÅÆÇÉÉËÌÍÍÎÎÏÏÎÍÒÅ¿¼¹µ²°­ª£”†pN3-!(Gc­¤ž«µ±ª¡žŸŸ£¿ÃÅÇÇÈÈÉÉÊËËÌÌûÍÌÌÍÎÎÏÎÑÍËÈþº¶²°­©¢™„nS9($>i}¥°”‹ ®±°­­ª¨©ÄÇÉËÌÍÍÌÍÍÎÎ÷ÍËËÍÎÎÌÍÎÎÖÌÊÄÁ¿½¹³¯¬¦¡”‚bI4*%)Ap¬ª¦Œ†– ¦¨¨¦ªÇÊÌÍÎÎÍüÎÏÏÎÎËÍËÊÌÎÎÍÍÎÎÌËÊÅ¿½¼º·²¬¨ž”~dC0".Hp’®¼VVp~|}ƒ‹Ž’’›ËÌÍÎÎüÍÌÍÎÎÌüÍÎÎÍÍÞÊÇÅÁ½¼¸´±®§ž…bC+Fw’˜¢°\\ozyxz||ü…†ÌÌþÍÎÎÍÌÍÙÌËÌÍÍÌËÌÌÉÅÁ¾¼º³°¬ª¤—ƒ}dC$%_Ž‚…—„„|xxù„Š•ÍÌÌÍÌüËÊÉÈÈÉÛÊËËÉÇÇÅÂÀ½¼º´¬ª©©¢“|}tJ',]‹}el}zxxìy–—š¡ÎÍËÊÊËËÊÉÈÈÆÅÄÄýÅÇÈÈáÆÄÂÀ¾½»¸´­¦¤¤¥£››uQ>1X’¡›vRRxxðy€“››¡§ÌÊÉÇÆÆÅÄÃÃéÂÁÁÂÄÅÅÄÁÀ¾½¼ºµ­«¨¡Ÿœðx}||˜­›Š{My|zxxÖŠ— ¤¨¬ÈÆÅÄÃÂÁÀÀÁÂÃÃÂÁÁÂÃÃÂÀ¾½¼¼¸µ­¥¥¤žœ›öª®¯µ¾³˜‚|üx{zxxó†—£¨«°ÃÂÁÀ¿¾¾æ¿ÁÄÅÄÃÃÂÁÀÀ¾½»º¹¶°¬§ žŸž›¼øÂ¿³•š«´…ð|xx}– ¦ª¬µÁÀ¿¾½½è¿ÂÅÆÄÁÁÀ¿½¼»º¸¶³®©¦£Ÿ››½Èúžz„¡´ï…}xy”›¤©¬®´À¾¾½½è¾ÁÃÃÁ¿½½¼»¹¸·³¯ª§£¡Ÿž››ææ÷”r Ê¹{‚€zxyƒ•›¤©­®¶¾¾½½¿î¾¼»ºº¸¶µ´¯ª¤¡ žœ›𛇉|{y…— ¦©³´¹½½¼ü»º¸¶¶õ´²±¯ª¥ žœ‰€‚†™¦«´µ¹¼¼þ»ººü¸¶´²²÷°¯­¬§¢›펖’‡‚‰–››¥¬²´¹ºº¹¸¸ì·¶¶µ³±¯­¬­­«ª«ª¦ ›ÜŒ„ƒŠ˜›¦­²´¶·µ´´³³²±±¯¬ª©¨©«ª¦¥§ñŒ…ƒ‚†™›¥¬°³´¯®®ò¯­¬¬ª§¤£§©¨¦¢ý‰ŒŒó……‡˜›¤©­¯³©©ô«¬¬©¨©¨¤¡Ÿªâ…‹…ˆŒˆŠˆŠ’™›¤¨¬®°¤¥¦§¨©¥¤¦§¤¢„ûƒ‚„Šê‹–››¤¨ª­®¢¢£¤¥¦¢¡¤¦¤ „ü‚Šô’–™››¤¨ª­®¢¡¡þ£&ûŒ‚ƒŠüŽ“™››ù §¨¬®®+ö”‹Š’“–™››ùœ£¨©¬®°à¹¼½½¼¹³°®­«¥ Ÿœ›š–‘Œ‡…ƒ„‰”¢´¼½½ô¼·°Ž¨»Á¾¾¼¼ºã»¼¼½¹¢š¶ÈËÉÊ®³¸¼½½»³±°®¬§¡¡Ÿò›—’Žˆ‡‹“¡®¹¾¾½½ó»± •´ÁÀÀÁÁ¾¼¼Ç¹¢ºÊÌÊË®µ·»¾¾½·µ²°®ª¦¤¡ Ÿžœ›™”“•š¨µ¼¾¿¾½¼»·¨™š©¼ÁÀÁÂÁ¾¼¼ß»¶¥ µÇÌÌ͸º¼¾¾½»¹´³±®«©¦¦¤¡žžššéœ«¸¼½¿À¾¼¸® «¹À¿¾¿¾¾½¼¼Ç½¼¸«ž§¹ÆËÍ»½½¾½¼¼»¸¶³°®­¬«¨§¤¡ Ÿœž¡±»¼¼¾¿½»­ªºÂÁ¾¿¿½¼¼ó½¾½½²œ‹•²ÂȾ¾û½»··³³°ñ¯¬«¨¥£¢ Ÿ¢§´»¼½½ò¼¶£™¨¸¿ÂÁ¾¿¿½¼¼þ½¼¼þ½¾¾Û¹°ž˜©µµ¾½¼¶­°§§¨£ª²´µ´´²®¬ª¨¤£§®¶»¼¼ù´¦œ¤¸ÀÂÂÁý¿¼½½ù»ºº¼½½¾¾þ³§§þ™û·°¦¨œœî’šµ·¹º»¹µ±¯«¦¦ª°¸¼¼ò·¦™¡±¿ÃÃÂÁÁÀ½¼¼ï½¼¹¸¹ºº¼½¾¾·®©§¡ ß¹º»¾»¸¹¹¶³­«¬°¶»¼¼»± ¢³¿ÂÂÃÄÀÁÀ½¼¼û½»·¶¸¸ö»½¾¾¼¸³¯¯⾯±¹¼¼¹³¯­®²¹¼½º®¤°¿ÅÂÃÅÆÁÄÁ½¼¼ö½º¸·¸ºº¼½¾¾û½»¹·䥯º¼½½¶®¬­°µ¼¾µ©¬¹ÃÆÇÇÆÇÅÿ¼¼ý½»¹¹ø»¼¼½½¼¼½½飯¸¸º½µ®¬­­²º¹­§³¿ÄÅÈÉÇÇ÷þ¼¼½¼º¹ºº»ù¼½¼»¼¼½½å²³º½·°­ª¨­­¤Ÿ§ºÅÈÅÇÈÈÇÅÄÀ½¼¼»º»ö¼½¼½½¼¼½¼ê´µ½½¹³¬«©¨›•£³ÀÇÊÈÈÉÉÇÇö¾¼¼½¼¼»º»»ø½¾¾¼¼½¼¾ó½¼¸°­§ž‘Ÿ»ÅÆÈÈöÊËÊÈÇÇÃÀ½¼¼»º÷»¼½½¼¾À¾¾æ½»´® “•«ÅÊÈÉÉÊËËÊÉÆÆÄ¿½½¼¼þ»ººû¼½½¿Â¾½ö·°˜ŠŸ¸ÈËÊËËñÊÇÆÄÃÁ¾½¼¼½½º¹ººø¼½¿ÄÈÇÈñ½¼ºµ¬Š¬ÁÊËÌÍÌËËùÉÈÆÅ¿¼¼ñ¾½º·¹¸¹»½ÁÆÊËÌÖµ¬ –ƒ•¼ÈÊÌÌÍÌÌËÊËËÊÇÆÅÁ¾¼¼¾¾½º¶µµ·»½ÂÇÊÌÍÖ‡ˆ‰¤ÄËÊËÌËÌÌÉÉËËÊÇž½¼¼¾¾»·³±³¶»¾ÃÈËÌÌö†‡}‡Ÿ¸ÈËËÌÌöËÉÉËÈÇÆÂ¿¼¼ï½¾½¸³®¬®²ºÀÇÊÌÌÍžû“š²ÄËËÌõÍÌËËÊÉÅÄ¿½½ò¾½»·±ª©«±¼ÄÊÌÍÍ¡û¦¯ÀÉÌÌÍõÌËËÊÇÄÅþ½¾¾ó½¹²¬¦¦©±½ÆÌÌÍÍ¢ú­¸ÃÉÌÍÍõÌËËÊÇÆÆÃ¾½¾¾õ½¹°©££¨²¿ÈÌÌÍØ¢¤¦·ÂÈÊÌÌÍÍÌÌËÌÌÈÇÅ¿½¾¾½¾¾»·®§¡¢¬·ÄÊÌÌÍÍ¢ú¦«¼ÇÊÌÌúÊÆÆÃ¾½½¼ö¹µ¯§ ¢°¾ÉÌÌÍŸù©²ÀÆÉËÌÌËùÉÅÄÿ¼½½»ó¹·´¯©Ÿ«¿ËÌÌÍÍú«·ÄÈÊÌÌ÷ÊÉÉÇÅÃÁ½¼¼½ó»¹¶µ²¬§™•£»ÌÍÍÙ­£ °ÀÉËÌËËÊÉÊÈÉÊÈÆÃ¿½¼»º¹¸¶¶³¯¬¦ “‹›µÊÍͰû­«¹ÆËËúÊÉÊÉËÊÊéÇÆÃ¾½½»·´³±²±«©¥ ’‡˜²ÇÍÍ÷¿¼½ÅÊÉÈÊÊËåÉÆÆÅÀ¼½¼·±¯®­®­©§¦¤”‚–´ÆËÌÍÍô¾¿ÈÈÆÆÉËÉÈËÌÌáËÉÉÆÄÅÿ¼¼¹´®¬­ª©¨¨©ª©“y”µÂÆÉÌÍÍô¼»ÁÁÄÇÉÈÈÊËÌÌÞÊÉÉÅÄÄÀ¾¼¹´±¬©ª¨¥£¤¨¬ªŠg‚«»ÀÂÇËÌÍ ó½¼ÂÃÃÆÉÈÊÊÌÍÌÌÞËÉÇÄþ½»¸³¯ª§¥¥£¡¢¦«¨Ti—³¹½ÂÇÊÌ ñ¯±µº½½ÀÂÄÅÈÈÊËÍÍíÌÍÌËÈÆÄ¿¼½»µ¯ª§¥¢¡¡ð£¥£—jG\‚Ÿª³·¼ÀÆÛ®°²·»¾¾ÁÃÅÆÇÉÉËÍÍÌÌÍÌÊÇÆÃ¿½¼¼¸²­§¥¤¢££ð¦¤”zO ,JY%Èÿÿþ÷úíÍŸKú9‡ÙóÿÿìýõÜ·o7  %Èÿÿüýøòî î÷ãÁŠN# ú9‡Ùóÿÿìøâ­o;%Èÿÿü÷á̺ ºù®ˆR ú9‡ÙóÿÿøõÖBû%Èÿÿüí¹ˆ_ _úXC$ ú9‡ÙóÿÿùôÓˆ4û%Èÿÿüç¡^& &ú# ú9‡ÙóÿÿúôÒ†3û%Èÿÿüã‘Bú9‡ÙóÿÿúôÒ†3û%Èÿÿüã‘Bú9‡ÙóÿÿúôÒ†3û%Èÿÿüã‘Bú9‡ÙóÿÿúôÒ†3û%Èÿÿüã‘Bú9‡ÙóÿÿúôÒ‡3û%Èÿÿüã‘Bú9‡ÙóÿÿùôÓ‰7û%Èÿÿüã‘Bú9‡Ùóÿÿ÷öÛV*û%Èÿÿüã‘Bú9‡Ùóÿÿ÷úëÅ“U( û%Èÿÿüã‘Bú9‡Ùóÿÿ÷ý÷ãÆY)û%Èÿÿüã‘Bù 6ÒîýÿÿùúíÂŽS'  û%Èÿÿüã‘Bø -nµÝõþÿÿùýøèÅY44û%Èÿÿüã‘BïI€¸ßøýÿÿþýùåšû%Èÿÿüã‘B÷ ?ˆÁìøÿÿüùîßÖÖû%Èÿÿüã‘B÷ I€Àçÿÿüýùôññû%Èÿÿüã‘BöI‹Áé÷üÿÿû%Èÿÿüã‘BöK…»å÷þÿÿû%Èÿÿüã‘B ÷ MºÞöüÿÿû$}Â÷÷üÜŒ@ ÷Hˆºãð÷÷ûl¨××ü¿z8!ø !I€¸Í××ûIqü€R&!ø #Kwˆû,88ü2 #ú -488ü ü #ú °ü""ü3ü/HYYüM5/ü"cš½½ü¥xB/ô*y¼éëìííØ°€__/ô+{Âóûþÿÿôàɸ¸/ôU”Êíúÿÿûôìææÿ+ÿ(ÿ&ÿ%ÿ#ÿ ÿ!ÿ"ÿ#ÿ%ÿ%ÿÿÿÿÿÿþÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿþÿ ÿ ÿÿ ÿ ÿÿ ÿÿÿ ÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿþÿ ÿ ÿÿÿ ÿÿÿÿÿÿ%ÿÿ%ÿÿ%ÿÿ$ÿÿ$ÿÿ#ÿÿ ÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ ÿ,ÿ ÿ,ÿ ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿˆ+ˆ(ˆ&ˆ%ˆ#ˆ ˆ!ˆ"ˆ#ˆ%ˆ%ˆˆˆˆˆˆþˆ ˆˆˆˆˆˆˆˆˆˆˆ ˆˆˆ ˆˆˆ ˆˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆˆˆˆˆˆˆˆˆˆ ˆˆþˆ ˆ ˆˆ ˆ ˆˆ ˆˆˆ ˆˆˆ ˆ ˆˆˆ ˆ ˆ ˆˆ ˆ ˆ ˆˆþˆ ˆ ˆˆˆ ˆˆˆˆˆˆ%ˆˆ%ˆˆ%ˆˆ$ˆˆ$ˆˆ#ˆˆ ˆˆˆˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆ ˆ,ˆ ˆ,ˆ ˆ,ˆ,ˆ,ˆ,ˆ,ˆ,ˆü ü*û %+ +ú% 'ú#Js† †ùsU' %ù Mƒ³Ê Êù´‘W+ $ø F€½êÿ ÿøêÊU "÷ $I„¶âõÿ ÿ÷öèÆ‘I'õ M¹Þ÷üÿ ÿõýùêÂ…Q' ö@ƒ¿åöýÿ ÿõþúéÍŠL ö Jƒ¶àôüÿÿöýö꼉P'÷ F~Àà÷ýÿÿúýúñéåääúåçðøýÿÿöþûäÁ‰Q ÷!P‰»çõýÿÿùþöèÁŸˆˆù–¼ßöþÿÿöþ÷æÃW' ø4zºãøýÿÿøþöáÀ‰[D==íCOƒ¶ßóýþÿÿý÷ç¼…<ûCœßÿÿ÷þúçÃŽP÷J…¾áøýÿÿúÝ©MûCœßÿÿ÷öç¿‹L( ö$KƒµáóýÿÿúÝ©M÷ûûCœßÿÿ÷éÇŒU ö "M‚¸Þó÷÷úפKô ûûCœßÿÿùÕšP ÷ H~½ßçèèúÉ™Fô[B 'J^hhúgcG$ ûCœßÿÿù͆7 ÷ %Hv–——úƒd. ô C¢{@E¥¶¶ú´­|>ûCœßÿÿùÌ…5 û 6EIIû?0ô4uضzH-]¦Ôêêúçß PûCœßÿÿùܨc0 ûûôC—òേW{¼çüüúùñ­WûCœßÿÿ÷íÑg.þýôH£ÿÿëÉ‹žÌïÿÿúüó¯XúC›Þþÿÿ÷þùÚ¤[1 ôI¤ÿÿöæËÓèøÿÿúüó¯Xø<ŒÎòüþÿÿøýîУi:"û ôI¤ÿÿýùòôùýÿÿúüó¯X÷.l©ÕñùþÿÿùûìÕ s\VVúI7 üI¤ÿÿþÿúüó¯X÷8o¦ÞñüþÿÿúúðÖÀ´±±ù˜s8üI¤ÿ ÿúüó¯X÷ ?o©Òñüÿÿúýúðçâááù̬s?øI¤ðôúþÿÿúüó¯Xö=p«Úóüÿ ÿ÷ñÚ¬r+÷I¤»Îéüþÿÿúüó¯Xö:t«Ùðþÿ ÿ÷úòÚªd8öI¤q’Æíùþÿÿúüó¯Xö @p¬Õóûÿ ÿõþüòÕ§m9öI¤#P˜Óïúÿÿúüó¯X÷2v¯àôþ þÿöþöé¨f.ôI¤#S‰Ëêúýÿÿúüó¯Xø5j¥×îîúïðöûþÿÿöüöÕªq?ôI¤ #O˜Èëùÿÿúüó¯Xù6k¡ººù½Â×ëùþÿÿ÷þñÙªq8ôI¤ $V“Ððÿÿúüó¯X ü2Q__øep¢Ððûþÿÿ÷ûñÙªq3ôI¤0sÀëÿÿúüó¯X ü &&í,6iÎêüþÿÿþúñÉ“CüI¤ú^´çÿÿúüó¯Xö 6h£ÎñúþÿÿúÝ©MüI¤ú^´çÿÿúüó¯Xö5hÐíüÿÿúÝ©MüI¤ú^´çÿÿúüó¯Xü ü ö6i£ÚøþÿÿúÝ©MüI¤ú_µçÿÿúüó¯Xü $))ü ÷ 6rÅóþÿÿúÝ©MôI¤b·èÿÿúüó¯Xû'Z””ütG÷1mÃòþÿÿúÝ©MôI¤;|Åìÿÿúüó¯Xû:†ÀÛÛû¬k$÷ F‚ÌôþÿÿúÝ©MôI¤8y°ßõÿÿúüó¯XûBšÛûûúÇ~-÷ E{µáùÿÿúÝ©MôI¤=n²Øòûÿÿúüó¯XûCœßÿÿùÕ™Oö"F}¯ÝñýÿÿúÝ©MöI¤5m§ßöÿÿúüó¯XûCœßÿÿùãº{F  ÷Ex³Ûùýÿÿøþû×£JöI¤Hm©Ûòüÿÿúüó¯XûCœßÿÿùôⶃI;44í;G}²ÝòýþÿÿþøëÁŠ?öI¤ŽªÔóûþÿÿúüó¯XûCœßÿÿùüöܺ„í„´Ùóüþÿÿþ÷èÈ•\* øI¤Ûåóýÿÿúüó¯XûCœßÿÿúþöëÜØÖÖúØÛéõýÿÿöþýìÏ™^&øI¤óöûþÿÿúüó¯XûCœßÿÿüüøóññûó÷üþÿÿöüöÈ”Z1ôI¤ÿþúòäéôûÿÿúüó¯Xö9„½ÚàîùþÿÿõþúìÓ—]+ôI¤þýîÖ«¹Ûóÿÿúüó¯X÷"PrŒžÈëûÿÿöþüðËY* ôI¤ùíË¢oŒÅìÿÿúüó¯X÷"0Fb§àøÿÿ÷÷êÌ—O*ôI¤êÒjyž¶¶û³’ÍèêêôÖ´`&9p§Úåêê÷ä×¢k5û `°øÿÿ÷ø²k!Fz³ÕêêûçÊÝúüüôçÂi0v«ÛðàýÿÿíþúóÍ]1 5cŸÜïúÿÿúùèŽCû `°øÿÿíýúæÇZ* @sªÕàýÿÿöþûðÞ¤d÷ "f¶Úòþÿÿúûì‘Dû `°øÿÿíùðËšR$9p¯àýÿÿöýúìÊ—`/ ÷3d§Ùüÿÿúûì‘Dû `°øÿÿõþùçÈ‹Q'ø5oàýÿÿ÷ùîÌ›Z/ø3ˆÊûÿÿúûì‘Dû `°øÿÿ÷ýêÆ’S ùHàýÿÿ÷ñÙš`*ú #~Åúÿÿúûì‘Dû `°øÿÿøúΔL% ú;àýÿÿøìÌ|>ú !|Äúÿÿúûì‘Dû `°øÿÿøù¾v#û:àýÿÿúéÄh) ú !|Äúÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿúéÄh) ú !|Äúÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿùêÇp1 ú !|Äúÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿøíÍ~@ú !}Åúÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿ÷öå·€Aù &€Æúÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿöüõà¶yG ÷ #H–Ñûÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿöýö༃K÷MÁæýÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿìüóä·‚B "H„Åâõþÿÿúûì‘Dû `°øÿÿûø²c û:àýÿÿñá¶vC #F~¸ïúÿÿùþ÷ä‹Aû `°øÿÿûø²c û:àýÿÿñôß¶~F:44T€½áùýÿÿøþúæÆv6û `°øÿÿûø²c û:àýÿÿâþýùøúúóݶŒƒ—·âõýþÿÿý÷êÁP"û `°øÿÿûø²c û:àýÿÿîüøíëñùüöéÛØÖÖßêøýÿÿ÷ùìÑ’H# û `°øÿÿûø²c û:àýÿÿõô⺴Ìèûû÷òññûôøýþÿÿøèÅŽV"û `°øÿÿûø²c û:àýÿÿöîÑ’€˜Äèùþÿÿöý÷ìÅ”S) û `°øÿÿûø²c û:àýÿÿõêÇtOS‰¿íüþÿÿöþùåÄŒU# û `°øÿÿûø²c û:àýÿÿôéÄl7$QˆÇèúýÿÿöýù⽊T(û `°øÿÿûø²c û:àýÿÿôéÄh)"R—Çìó÷÷÷óêÀP%û ]ªð÷÷ûð¬_ û8àýÿÿôéÄh) %RŒÅÑ××÷ÑÇR!ûQ”Ñ××ûÑ–S û1àýÿÿôéÄh)(S‚‹ø‹€Q* û6cŒûŒe8 û!àýÿÿôéÄh) 2688ú61  û&688û6' û àýÿÿôéÄh) û  û û üàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ýàýÿÿúéÄh)4ÿÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ!ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ"ÿÿ"ÿÿ$ÿÿ$ÿÿ ÿ ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ#ÿÿ"ÿÿ!ÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿˆˆ ˆˆ ˆˆ ˆ ˆ ˆ ˆ ˆ ˆˆˆˆ!ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ"ˆˆ"ˆˆ$ˆˆ$ˆˆ ˆ ˆˆ$ˆˆ$ˆˆ$ˆˆ$ˆˆ#ˆˆ"ˆˆ!ˆˆˆˆˆˆ ˆˆ ˆˆ ˆˆ ˆˆýû û üü û û  ü ü3û"I`h hûcN) ü1Qhhúc( ø $J‡ªµ¶ ¶ø®ŽT) üU޶¶úŸd3 ø %UŒÀßéê ê÷éãÆ‘Z+ü$n·êêùϨg/ö $UÉæöü üöùçÇ”`0ü'wÅüü÷øê¢].ù #JÊÿÿ÷ü÷ÏZ- ü(xÇÿÿöüõÒ¤e5ø#WÄæÿÿöþüêÍšb*ü(xÇÿÿõþüðÕ›d0÷ 'OŒÃçøÿÿýýûùùôúüùìË–[/ü(xÇÿÿöûïОf3÷JŽÁèøþÿÿúþùóííììòíîñøüúëË¡[) ü(xÇÿÿöþùêÊ h8ø#\®Ù÷ýÿÿúøâŨ¦¥¥ò¦ª¼ÜñýøèÏ–_*ü(xÇÿÿôþÿÿþüëÒš^ ú'gÃéÿÿöýùóðã¿_][[ò\c„¿åÿÿúñË”Kü(xÇÿÿþüÿÿøþùî½|*ú'gÃéÿÿõþöäȺ¦‚R"ó(U¦Üÿÿþúì»e)ü(xÇÿÿôðüþÿÿþøËˆ.ú'gÃéÿÿõþî΃mW:ú%R¥ÛÿÿúþùÊp-ü(xÇÿÿüÜ÷üÿÿúûÏ‹/ú'gÃéÿÿ÷ýé½zXB?<88ú9Ai±àÿÿûüÎs.ü(xÇÿÿü«éøÿÿúûÏ‹/ú'gÃéÿÿ÷þõᲨ§¦¥¥û©»ÛñÿÿûüÎs.ü(xÇÿÿüáõÿÿúûÏ‹/ú'gÃéÿÿûü÷îêç çûèíöûÿÿúþúËq.ü(xÇÿÿüƒÝôÿÿúûÏ‹/ú'gÃéÿÿüþýýü üýþþÿÿùþüõÅm,ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿùûóÓQ ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿ÷þüñÞ§n2ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿ÷ûðÔ®l8ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿûýúõóññ÷êÒ¦p<ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿûúðâÚÖÖù̪o.ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿúýîË–|k kõlmoqm[< ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿúýå²d<$ $ó'1DQWPC2 ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿúüá§M  ò (\~”“‹{Dü(xÇÿÿü‚ÝôÿÿúûÏ‹/ú'gÃéÿÿúüá¦J ò 4±ÒÒʺJ ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ò%c»ãüþÿüâªR& ò GŸÙÿÿøë·|;ü(xÇÿÿü‚ÝôÿÿúûÏ‹/òS Ïñûÿýç¸oK4 4ò5>f¯ßÿÿýøã°^&ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ò7l¥ÕïúþðÒ¤ ó…ŸÍëÿÿþýöÆm,ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ò0p®ÜóÿúñâÚÖ ÖûØàïùÿÿûüÎs.ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ó ;j¦×ÿýúõòñ ñüôùýÿÿûüÎs.ü(xÇÿÿü‚ÝôÿÿúûÏ‹/õ5o¬äóûþÿÿùüøæµb'ü(xÇÿÿü‚ÝôÿÿúûÏ‹/ö7n«Øóýÿÿøþ÷è·~=ü(xÇÿÿü‚ÝôÿÿúûÏ‹/÷;j¨Ôðúÿÿ÷üôݼ{E ü(xÇÿÿü~Öì÷÷úòȆ.ø1sªØë÷÷øñ߸‡Dü&tÁ÷÷ümºÎ××úÓ®u(ù:k¨Å××øÎ±~C ü!e¨××üI}ŠúuO ù;jù‰qI üDpü0588ú7-  ú'288ú5+ü +88ü ú  ûú ü ÿ ÿÿÿÿÿÿþÿÿÿÿ0ÿ 3ÿ 6ÿ8ÿ;ÿ<ÿ<ÿ<ÿ<ÿ<ÿ)ÿÿ(ÿ ÿ'ÿ ÿ&ÿ ÿ%ÿ ÿ$ÿ$ÿ$ÿ$ÿ$ÿ$ÿ$ÿ$ÿ ÿ ÿ$ÿ$ÿ$ÿ$ÿ$ÿ"ÿ!ÿÿ ÿ ÿ"ÿ#ÿ$ÿˆ ˆˆˆˆˆˆþˆˆˆˆ0ˆ 3ˆ 6ˆ8ˆ;ˆ<ˆ<ˆ<ˆ<ˆ<ˆ)ˆˆ(ˆ ˆ'ˆ ˆ&ˆ ˆ%ˆ ˆ$ˆ$ˆ$ˆ$ˆ$ˆ$ˆ$ˆ$ˆ ˆ ˆ$ˆ$ˆ$ˆ$ˆ$ˆ"ˆ!ˆˆ ˆ ˆ"ˆ#ˆ$ˆüúûû ûõ ú û  ûô[@ )F`fhhú^J' ú0Xch húgcB ôŸp1 Sª³¶¶ù§ˆP  ù /^œ®¶ ¶ì´¯{EÌ? )RŒ¼àçêêùÝÁ‹T$ ø.fÓãê êìèã´G"Ü›H)WÁã÷ûüü÷õæÂ”R( ö4c£Óðøü üïûøÝ¸ƒP ßžQ%QŽÏïÿÿøóÔ‹P ù,`ŸÞÿÿñûí‡E!â¨mV–ÅêøÿÿöùëÈ‘Q& ÷3jŸÑïÿÿðý÷伊Nê¾—ŽÉèùûûùùòûýÿýùîÉQ(÷4b¡ÎñúÿÿüþýúùùûÞøá¿‚õáÐÍëøýøóîíììíîóøýþþüæÄV ÷ !`ŸÒíüþÿÿûüøñíììíÜóùýõå¾ûóíìøú÷Üì§¥¥§¬ÄÝ÷ýÿþõ徎T+ ø*w¾çøþÿÿúñÛº¨¦¥¥÷§©Æãøûõáÿÿæýôå¶‹g^[[^f¸åôýÿþú忈Iú0…Ñôÿÿõþý÷òïÖ²~`\[[÷^c—Ìóÿÿøÿÿåý÷ݸ~N)!!)P€¹Þøýÿþ÷ݯa ú0…ÑôÿÿöûôÛõšvA#Ú!(p¹îÿÿýÿÿüõá´}I#  %L„Áðûÿþøß²c ú0…Ñôÿÿöù뾓{fP0ú$m¸îÿÿöþ÷æÀ‚=ðP£çøýúîÏžVú0…Ñôÿÿööä§nNB?;988ú;AÁðÿÿöýøÞ·uC ñG—ØéìæÄ”V, ú0…Ñôÿÿ÷ûóÖ¼­¨§¦¥¥ú¦¨Åãøÿÿ÷öä¶€=ò5u¨¶¸±‹]%ú0…Ñôÿÿúþüôìèç çûèð÷ýÿÿøëÁ}?ô ßDú0…ÑôÿÿúóÛ‰= ò 9hŠ”’‡ßDú0…ÑôÿÿúóÛˆ: ò M‘ÂÒÑÆßDò.€ÊïýÿÿôÜB òd³íÿþõßDò 'l°Ýóýþöâ b?4 4ò7=~ÀðÿÿüßDòI~·Üöüùí܆ ò…®×õÿÿþßDòC†¼é÷ýúìßØÖ ÖûØåòüÿÿúßDó !H}¶æþýøôñ ñüöûþÿÿúßDö GÀéøüÿÿøþûßDöB‚ºè÷þÿÿøýóßD÷ H~½Þôüÿÿ÷úðÔØ˜BøG‰ºàñ÷÷÷ëØ©¼„:ø !F€³Î×׸ŧj~Y'!ù Ks‰øi:1""ú+588ù1' #ú üÿ“þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ<“þˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆþˆ<À“þý ü# šM!ŠF ¼…O!äÁ};öëŸQýû­Yÿÿ°\ÿÿ°\þü­Zûõ¨VèË…@Ë—[' ˜W-_+' üû*¶h4¦m=Ù©h. ñß•Kü÷©Wÿÿ°\ÿÿ°\òäšNØ©i/ §h9q0ü8üýþ</ÿ/ÿ/ÿ1 ÿ1 ÿ2 ÿ4 ÿ4 ÿ€/ˆ/ˆ/ˆ1 ˆ1 ˆ2 ˆ4 ˆ4 ˆ€€/÷0dšÏêúýÿÿ/÷2_žËîúÿÿ/õ1`™Ðëúþÿÿ1ö*b£Ðìùûüü1ö,T—Èéîïï2÷'_Šª¯°°4ù )ASVWW4ú€ ÿ.ÿ.ÿ.ÿ0 ÿ2 ÿ3ÿ7ÿ¸ ˆ.ˆ.ˆ.ˆ0 ˆ2 ˆ3ˆ7ˆ¸€ÿöþüõߺ€I-üB–ÿÿöý÷߸ƒH -ü2uÿÿõýóâ´€G# -ü BüüöûöྀI /üïï÷ìá±u@1ý°°÷­¢vA2þWWúUO66ú · ÿ5 ÿ5 ÿ5ÿ6ÿ6ÿ8 ˆ5 ˆ5 ˆ5ˆ6ˆ6ˆ8€õÑôûýøÝ³_%4õ°áóøéÁŒI4õw·ÕÞÃP(4ö@€£®ŽV 5ö3AF8" 5÷ 7€€€€€€€€EEEE£%Q( GJ Black Textÿ     MAj GJj*pæpòpþGJjfkl¼mõo!oâp(p\pp¾pÎpÞÿ ÿ ÿ"ÿ#ÿ$ÿ%ÿ&ÿ'ÿ(ÿ)ÿ)ÿ)ÿ)ÿ)ÿ8ÿÿÿ ÿÿ!ÿÿ!ÿÿ=ÿþÿ<ÿþÿ<ÿ<ÿ;ÿ:ÿ8ÿÿ"ÿÿ ÿÿÿÿÿÿÿÿÿÿþÿÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿ%ÿ#ÿ"ÿ!ÿ ÿ ÿÿþÿ ÿÿ ÿÿ-ÿ-ÿ-ÿ-ÿ-ÿ-ÿÿ)ÿ&ÿ$ÿ"ÿ!ÿ"ÿ$ÿ%ÿ&ÿ'ÿ)ÿ)ÿ)ÿÿþÿÿþÿ=ÿÒÿþÿ<ÿ9ÿ:ÿÿþÿ"ÿÿþÿ#ÿÿþÿ$ÿÿ%ÿþÿÿ<ÿ;ÿ:ÿ9ÿ8ÿ+ÿþÿÿþÿ+ÿþÿÿþÿ ÿ;ÿ;ÿ;ÿSÿþÿÿþÿ$ÿÿþÿ"ÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ% ÿ2 ÿ0ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ ÿþÿ ÿ 6ÿ6ÿ8ÿ9ÿ:ÿ;ÿ<ÿ=ÿ>ÿþÿ=ÿþÿ*ÿ'ÿþÿÿ$ÿÿ#ÿÿ"ÿÿ ÿÿ"ÿ7ÿ7ÿ7ÿ7ÿ7ÿ7ÿ7ÿ7ÿ7ÿ&ÿþÿÿ%ÿÿ$ÿÿ#ÿÿ"ÿÿ"ÿÿ!ÿÿ ÿÿÿÿÿ ÿ ÿ3 ÿ3 ÿ3 ÿ3 ÿ3 ÿ3€ÿÿ ÿÿÿ ÿÿ ÿÿ ÿÿ!ÿÿ#ÿÿ#ÿÿ&ÿ>ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿÿþÿ%ÿþÿÿ%ÿþÿÿ$ÿþÿÿ!ÿÿ ÿÿÿÿÿÿÿÿ ÿÿ€€ÿþÿÿÿÿÿþÿÿ ÿþÿÿ 3ÿ 5ÿ8ÿ;ÿ=ÿþÿlÿ<ÿ:ÿ9ÿÿþÿ'ÿ ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ(ÿ'ÿ%ÿ$ÿ"ÿ!ÿ ÿÿ ÿ"ÿ€ÀÀÀvþÿÿÿÿÿÿþÿtÿþÿXÿþÿÿÿÿÿÿ.€€€-ÿ-ÿ-ÿ-ÿ.ÿ/ÿ0ÿ1 ÿ2 ÿ3 ÿ€€€ÿ(ÿ)ÿ*ÿ*ÿ+ÿ.ÿ/ÿ1 ÿ5ÿ6€€€ ÿ3 ÿ3 ÿ3 ÿ3 ÿ4 ÿ4 ÿ5ÿ·€€€€€€€€EEEE£%Q( ýýGridÿ     q¶Hq«ýýqÇ¡†¡’ýýr…ÿ½:êéú¨'~Y¦†@±0Ótü)"K;Y)s—’ö?þf:ûcfnz:ûkz}q8ùfr|{sk6÷fi|{qkn6÷t}|{|u3ôcgu~xutfgr2øgptos5øciz~|pt6ùgst€7ùdxsd6øcm|~vdþ,ùm|uo þ*øcl|}uoü*úhy|v ü)ùcru|uo ügst(újpozu ùslk|}v'ùhnivto÷yps{{pmu&ùmpkttdjör{zvqjx%ùmots{€ómp|yoqx$ùmpmk{søiluyyolü#ùmpmlyqø{ku}tk{ü"ømpmyrzwùkt|tltü ïckpmn{jlt|vpk ü ñkpmztwuo{vmx üñ{vm{qxtkxyrkx üòckk{hyxs{rlüòcktexoxk{üücmtûp||püoülseúnw{rqüoyôetotm|rsûqm|vôfuqlt{x}túpu}tdócwpjfxzjp|yùkx|tjógxpxnyqupty÷yj|ymòcszuryo{n{s÷rzxhòrylnsxpcihõkt}wkøizmsxpüqgúdt~ptü÷h{urqxqqüv|k ùygu|kxüùxvhrvwüx{m ûqv{nüùm|prypüxzp ûuz|nýùi|trwvü|xo únq|xpýùcu{twqüy|k ûp|xsùo|yqqüxgújp|wr ýúhzp üw€gûp}tt ýùeu~ph üsnújp|to úk~q{ ügyújp}sy ûx{u ük||ûp}tpþûl}{j ûru}súnp|vs?þf:ûcfnz:ûkz}q8ùfr|{sk6÷fi|{qkn6÷t}|{|u3ôcgu~xutfgr2ógptosoqrwz0ñciz~|ptmoqsuwz/ðgst€dmorsuwy{.ïdxsddjorssvwz{,ícm|~vdeeloqrsvyz|,ím|uojmjmoqrswz{}*ëcl|}uoel_jmorsvy|{}*ëhy|vaeaaelnqruw{}|})êcru|uo^`cjmnqsuuvygst(éjpozuX\_`cjmnqsuslk|}v'èhnivtoZ^`adjmnqyps{{pmu&çmpkttdZ\_acdljjr{zvqjx~~%æmots{€\[^`cdemp|yoqxwz|~~$åmpmk{sZW\_ciluyyoluvvy{|~~#ämpmlyqZ[X_{ku}tk{oruvwy{}~~"ãmpmyrzwUW`kt|tltnqqruvwy{}~~ áckpmEn{jVXlt|vpkjlnqruvwwy{}~~ ákpmDFztwuo{vmxdjjlnqruvwwy{}~~à{vmC{qxtkxyrkxcejjlnqruvwwy{}~~Þckk{@Chyxs{rl\^`cejlmoqruvwwy{}~~Ýckte?Bxoxk{Z\_acejlmorruvwwy{}~~Ücmt@?=Ep||pUWXZ\_adjllmorruvwwy{}~oÜlseC@?nw{rqVXZ[\_adjllnqrruvwwy{}oyÛeto9>tm|rsRVXZ[^_adjlmnqrruvwwyqm|vÚfuq7:lt{x}tQSVXZ[^`cdejmoqqssuwypu}tdÙcwpj8fxzjp|yRSWXZ[^`cdejmoqqssuwkx|tj~Øgxp7xnyquptyQRUWXZ[^`cdejmoqqssyj|ym|}~×cszu9ryo{Dn{sQRUWXZ\_acdejmoqqssrzxh{|}~×rylnsxpcCEihQRUWZ[\_acdejmoqqkt}wkz{|}~Öizm7sxp=?CFqgQSVXZ[\_acdejmoqdt~ptyz{|}~Õh{urqxqq>@DFv|kQSVXZ[\`acdejmygu|kxwyz{|}~Õxvhrvw>2>BEJx{mQSVXZ[^`ccdejmqv{nsuwyz{|}~Ôm|pryp79:?BEFxzpRVVWZ\^_`adjjuz|nrsuvwyz{}~Ói|trwv38:;@CEF|xoRVVWZ\^_`adnq|xpqrsuvwyz{}~Òcu{twq28:;>@CEJy|kSVVWZ\^_`adp|xsnqrsuvwyz{}}Òo|yqq38:;>@CEJxgSVVWZ\^_`jp|wrlnqrsuvwyz{|}Ñhzp+0379:=BCFJw€gSVVWZ\^_`p}ttllnqrsuvwyz{|}Ðeu~ph.0278:=BDFIsnUVVWZ\^jp|tojllnqrsuvwyz{||Ðk~q{*/0379=?BDFIgyUVVWZ\jp}syjjllnqrsuvwyz{||Ðx{u)+/338:>@BDJIk||UVVWZ\p}tpdjjllnqrsuvwyz{{|Ñl}{j++/279;>@BDFJru}sUWZnp|vsacdelmnnqrsuwyzz||?þf:ûcfnz:ûkz}q8ùfr|{sk6÷fi|{qkn6÷t}|{|u3ôcgu~xutfgr2ógptos©¬®¶¹0ñciz~|pt¦©¬¯±¶¹/ðgst€ž¦©®¯±¶·¼.ïdxsdž¡©®¯¯´¶¹¼,ícm|~vdŸŸ¤©¬®¯´·¹¼,ím|uo¡¦¡¦©¬®¯¶¹¼½*ëcl|}uoŸ¤–¡¦©®¯´·¼¼½*ëhy|v™Ÿ™™Ÿ¤§¬®±¶¼½¼½)êcru|uo”—œ¡¦§¬¯±±´·gst(éjpozuŒ‘–—œ¡¦§¬¯±slk|}v'èhnivtoŽ”—™ž¡¦§¬yps{{pmu&çmpkttdŽ‘–™œž¤jjr{zvqjx¾¾%æmots{€‘”—œžŸmp|yoqx¶¹¼¾¾$åmpmk{sމ‘–œiluyyol±´´·¼¼¾¾#ämpmlyqŽŒ–{ku}tk{©®±´¶·¼½¾¾"ãmpmyrzw†‰—kt|tlt§¬¬®±´¶·¼½¾¾ áckpmrn{j‡Œlt|vpk¡¤§¬®±´¶¶·¼½¾¾ ákpmosztwuo{vmxž¡¡¤§¬®±´¶¶·¼½¾¾à{vmn{qxtkxyrkxœŸ¡¡¤§¬®±´¶¶·¼½¾¾Þckk{jnhyxs{rl‘”—œŸ¡¤¦©¬®±´¶¶·¼½¾¾Ýcktegkxoxk{Ž‘–™œŸ¡¤¦©®®±´¶¶·¼½¾¾Ücmtjgcrp||p†‰ŒŽ‘–™ž¡¤¤¦©®®±´¶¶·¼½¾oÜlsenjgnw{rq‡ŒŽ‘–™ž¡¤¤§¬®®±´¶¶·¼½oyÛeto^ftm|rs‡ŒŽ”–™ž¡¤¦§¬®®±´¶¶·qm|vÚfuqZ_lt{x}t„‡ŒŽ”—œžŸ¡¦©¬¬¯¯±¶·pu}tdÙcwpj[fxzjp|y„‰ŒŽ”—œžŸ¡¦©¬¬¯¯±¶kx|tj¾ØgxpZxnyqupty†‰ŒŽ”—œžŸ¡¦©¬¬¯¯yj|ym¼½¾×cszu^ryo{on{s†‰ŒŽ‘–™œžŸ¡¦©¬¬¯¯rzxh¼¼½¾×rylnsxpcnrih†‰Ž‘–™œžŸ¡¦©¬¬kt}wk¹¼¼½¾ÖizmZsxpcgnsqg„‡ŒŽ‘–™œžŸ¡¦©¬dt~pt·¹¼¼½¾Õh{urqxqqfjosv|k„‡ŒŽ‘—™œžŸ¡¦ygu|kx¶·¹¼¼½¾ÕxvhrvwfVfkrvx{m„‡ŒŽ”—œœžŸ¡¦qv{n¯±¶·¹¼¼½¾Ôm|prypZ^_gkrsxzp‡‡‰Ž‘”–—™ž¡¡uz|n®¯±´¶·¹¼½¾Ói|trwvW[_bjnrs|xo‡‡‰Ž‘”–—™žnq|xp¬®¯±´¶·¹¼½¾Òcu{twqV[_bfjnrvy|k„‡‡‰Ž‘”–—™žp|xs§¬®¯±´¶·¹¼½½Òo|yqqW[_bfjnrvxg„‡‡‰Ž‘”–—jp|wr¤§¬®¯±´¶·¹¼¼½ÑhzpJRWZ^_cknsvw€g„‡‡‰Ž‘”–—p}tt¤¤§¬®¯±´¶·¹¼¼½Óeu~phKRVZ[_ckoswsn†‡‡‰Ž‘”jp|to¡¤¤§¬®¯±´¶·¹¼¼Ók~q{GNRWZ^cgkoswgy†‡‡‰Ž‘jp}sy¡¡¤¤§¬®¯±´¶·¹¼¼Óx{uCJNSW[_fjkovwk||†‡‡‰Ž‘p}tpž¡¡¤¤§¬®¯±´¶·¹¼¼Ñl}{j5JJNVZ^bfjkosvru}s†‰Žnp|vs™œžŸ¤¦§§¬®¯±¶·¹¹¼¼?þ,:û.ŒÙ:ûsÙá›8ù,¯àÓp6÷aÞç×Ady6÷¾áççÙÓר3ô JÁçãÏ»z2ø>œçç©}5øYÙåÖn6ù1´çè°57ùÍçè°6ø ˆàçåŒ7ùßçãœ6ø €ßçà’7úRÐÜãƒ8ù ¨—Ù› ü £(ú›CÎ ùHmÚáÂ'ùgǦ ÷b®ØÖŠd&ù £Ü¸?.ñ#b Ћ‡ØÂy/ñއÉ0AÅÕe.òh?<ÒÉ£Û˜(0òtº#†èçÈ]0ü Š»û:ÚÙ˜þ5ü€´#úJÂÖhý\Ëô%µ%nßæ¨ûáÁô,¾W(ÚÎâMú.ªâ³óÆ€ÏÏM™ßú1Ãßó1Ï“JÒ—®ÐúKßÒHò´ÐWÕ”1Õ€ûvØÉ?òªÒFwÈ\FèFú¨á½#øYÖhªÇ_ünèEú¸å„÷OÜ©¨ÇJü™ß< ùÀàvùÍÂ. ¾!ü¸Ö3 ûMÇ×TùˆÝk|ÐEüÄÍ* û>ÔÞaùUÝ™€Â1üÜÆ% úqÛÄCù ÁÔy¾KüÎÚ7 ûqÚÉ3ù”çÕË]üÃæCú|ÜÀ:úHÙççm ü²èEû}ßµ0ùÄçå› üyè_úqÜ´!újçå— üCçÐú„ß«ûÌçÒ ü:ÝÞûnàµû|ãÛJ û±á\úzÝ»,.ýefggõf`\ca^cgrr(þimmüv{€ý|}ü€~} cüdcpuuþz~~ü{xqiiömuzqijjÞeijq~}xttst"(+72'#"'5olzxrtAAGGHÛeort}~xnlnt%&#%+-('0>EE>nv|kfIHGEGJMècghv|zxxtngns#"(+--' ::ð7jrztl027>EIICHÞelp|wopt ! %('('%&-52+2:qu|pACEGHIIJJsmtxpÅfkw{wpio   iktwxx~zn#%&'(+-0025cl}tf>ACEGHHIJJwikx‚||õfkw|tr  ¹cluxppto#%'(+-00225m€uc>AACGHHIJJpoy€upuocjv}xko  untypnöky%&'(-00¸25qzwk>>ACEGHIhsv{}qitPPRjz}tm fnzug !yrry'(+-022my|u>>CCõEGkn{~tmyMPPRÇq|{si ntwmy !"lzzi'+--022r€o<>ACCEwry~rpKMMPRÇ{xp~ kuysjw !"#tum+-00sr~pc>>Asjt}xpisKKMMPRþqË sn{vg !""#g}t+-00l{zq<>Apt}xpHHIIKKMMPRøpjddltuttÒu|~rddgmy !"##kpss00mw~i:opt}{ljGHIIJKKMMPRúw{}{yuuüx€||Ø|xnklps !"#%&nz|n02srwgp€xnEEGHHIJJKKMMP÷€srnklpqyyùv€xoonkkÚrx~zssr"##%''tpynzwjqx~sfCEEGHIIytssãxy{ynq|phslfgrtwx||ãshk'k~ms|~umnlghpx{||{zxvwwÉvuuttq}t tpnu~{op€€~tpv|}ytnnüpsvMMPRÚyr{tc !"pks}…Ž…ñ|ztkgipsGHIIJKMMPRÚixyy tpmlkkwz~€…”•…û~tntCCEùGHIIJKMMPRìu|o sttðw|}|xy…Ž””†€ý|wtt÷sEGHIIJKMMPRër|l rkip|~}zuttþvddðrn|…”•‰€|}pguttõx}~yoilJKMMPRÅmxuw tppx}xpmnr{ npu…Ž”–‘„|sp}p<>ACnnmr|zppqMMPPRøjntpvyyÞsfgnxlpx{w|“–•‰€zzsk||odACCñEqhfqxy||zvpgsRRÓyp|{qpssmy}so#Œ“–•n|y225k{oACCE½GHIIJppt|}tmqRv|vilqitw|wkj…‰’–•Šm|y2257n|~niAEGGHIJJK¿xliw}~zut|xq kxti !‹‹‘–•'(iy22577nytrEEGHIIJJKKMMPÄrtwyxsy lr}uk !‘••‘Œ'(iy22577:pxutEGHHIJJKKMMPÅRrr|r sks|zrd ‰•–’''(iy22577:sru~wpGGHIIJKKMMPRÇq}r lypm †”–“&''(iy22577:<>yxvtGHHIIKKMMPRÇpr ykv|tkd‹“–”‹&''(jw22577:<>>qx~wpGHIIKKMMPÅRcq}r kp}xq‰Œ‘••%&&''(j€v22577:<>>AttwtHIIKKMMPÅgwr|ty tv~tg‰••‘#%&&''(j€v22577:<>>ACpxtxHIKKMMPÞux‚qx}k pq|vmp…•–‘Œ#%&&((€Œkv02557:<>AACCtwtrIIJJKMcp}|rvqsjx}qy‰”–“"#%&&'((pv02557:<>AACCEtxsyIJJKtq€|jRk~|w|xoj†Š‘••Ž!"#%&&''(tt00257:<>AACÃErx~ocJkjz~upRRmzuj‡‘••‹ !"%%&''(ws002557:>>AAƒCEGo{pov{pPPRRdr|pw‰”•‘Œ !"#%%&''xq-02257:<>>AACCEGm|vlsPPRRt~ss}pt„‹’–“ !"#%%&&'xn--0257:<>>AõCskq€xnMPPRÒ|oy p}}tlŠ‘••Ž "##%&&'zf--0225:<<>>ôAot|€vo|rMPPR€¶qj jp{{ri…”•‘ !"#%&&'zf--02257:>ACEGHIIàJlwujPR nsŠ’•Š}zssttsýtxÒ}sklq::<>>ACEGHHIIJKgz~tPR ‰‰•”‰tuvvýx{||Ã{zwvv€tldfl2557::<>>CEGGHIIJKMg|s †“•‘Œ{utrr€‘qtuy%&|€f++002257::<<>ACEGHIIJKMss}|p ‹‘•’ !""#%%{€f(+-002577:<<>ACEGGIIJKMPkt{ †””Ž !""#%%{€f((-002577<ô>ACEGGIIJKMPPÉt ‰‹’•’ !"##%{€f((+--0257:<<>ACEGGûHIJMPPÉkv ‚ˆ‘•“ !"##%{‚g((++-0257:<<>ACEGGûHIJMPPÉRr ‡Ž“•‹ !!"##{g'(++-02577:<>ACEGGûHIJMPPÂRT …‰‘•’ !!""#zƒg''(+-02577:<<>AEEGGHIJMPPÂRT †Ž“• !""#z‚g''((+-0257::<>ACEEGHIJMPPÂRT ˆ‹‘•’ !""z‚g&'((+-02557:<>ACEEGHIJMPPÂRT…”“ !!"yp&&'(+-02557::ACEGHIJMPPßRT…”“ !!áxt%&''(+-02277:<>ACCGHJJKMPRRT.ýefggüfcbeeûfgrr(þimmüv{€ý|}ü€~} cüdcpuuþz~~ü{xqiiömuzqijjÞeijq~}xttst’—˜›š–“’–šolzxrtŸŸ àeort}~xnlnt”•“”˜˜—–™ŸŸnv|kf¡ ŸŸý¢¤ícghv|zxxtngns“Ž’—˜˜ý–››ñjrztl™š›Ÿ¡¡ž Þelp|wopt‘”—–—–”•˜šš˜š›qu|pœ¢¢ ¡ý¢¥Ûcfitx||~~sy‹‘’“”•——˜˜™uonninz{roŸŸ ù¡¢££¤¤èkq~|tptsq|xk‘’”yqmkkösxxy{{pkköqy¡¡¢££¤¥ ïcps{mksŽŠŒyowdõ‘qsstz|ytmkkìp}tkkpx|xtsts£¤¥¥Éehq}yuqhoˆ‡‚Œ‹ovvipzxuttddfltyš››l~tižxpgdpsux|xmk©âclu|pq„‹‡„‰‹ŒŒŠŒns|pnp”•–—˜˜ç™šš›ktižŸŸ ¡¡¢¢smtxpÅfkw{wpio…‡……Š‹‹ƒiktwxx~zn“”•–—˜˜™™ššcl}tfžŸŸ  ¡¢¢wikx‚||öfkw|tr|y~……ꆊcluxppŽto“”–—˜˜™™ššûm€ucØžŸ  ¡¢¢poy€upuocjv}xko€„†ƒ…ˆŒuntypnöky”•–—˜™™šûqzwkÁžŸŸ ¡hsv{}qit©ª«jz}tm{|~€‚„……ˆˆfnzug‹ŽŽ‘yrry–—˜˜™ššmy|užžŸÐkn{~tmy¥©ªª««q|{siw|}ƒ……†ˆntwmyŠ‹ŽŽ‘’lzzi–˜˜¹™ššr€oœžžŸwry~rp£¤¤¥©ªª««{xp~{~€‚„…†kuysjwŠ‹‹ŽŽ‘’“tum˜˜™™sr~pc¦sjt}xpis££¤¤¥©ªª««qsrw}€‚„…sn{vg‹Œ‹ŒŒŽ‘’’“g}t˜˜™™l{zqœpt}xp  ¡¡££¤¤¥©ªª««pjddltuttÅu|~rddgmyŒ‘’““kpss™™mw~i›opt}{ljŸ ¡¡¢££¤¤¥©ªª««w{}{yuuüx€||â|xnklps‘’“”•nz|n™šsrwgp€xnŸŸ í¡¢¢££¤¤¥©ª€srnklpqyyùv€xoonkkârx~zssr’““”––tpynzwjqx~sfžŸŸú ¡¡ytssãxy{yy}‚‚nq|ph‡‡ˆ‹Œslfgrtwx||ãshk–k~ms|~umnlghpx{||{zxvwwÉvuutt|}~‚q}t…‡ˆ‰ŠŠ‹Žtpnu~{op€€~tpv|}ytnnöpsv¤¤¥©ªª««é|}~yr{tc†‡ˆ‰ŠŠ‹Žó‘’pks}…Ž…ë|ztkgipsŸ ¡¡¢£¤¤¥©ªª««Ú}~~ixyy…†‡ˆ‰ŠŠ‹Žtpmlkkwz~€…”•…û~tntžžŸô ¡¡¢£¤¤¥©ªª««ì}~€u|o……†ˆ‰ŠŠŠ‹sttðw|}|xy…Ž””†€ý|wttñsŸŸ ¡¡¢£¤¤¥©ªª««ù~€r|l……ô†ˆrkip|~}zuttþvddðrn|…”•‰€|}pguttïx}~yoil¢£¤¤¥©ªª««é€mxuw……tppx}xpmnr{Ûnpu…Ž”–‘„|sp}pœžnnmr|zppq¤¥©ªª««øjntpvyyÞsfgnxŠ‹Žlpx{w|“–•‰€zzsk||odžžñŸqhfqxy||zvpgs««Ûyp|{qps‡‰Š‹‹Š‹Žsmy}so“Œ“–•n|yššúk{ožžŸÍ ¡¡¢ppt|}tmq«v|vilq†‡ˆ‰Š‹ŒŠŠ‹itw|wkj…‰’–•Šm|yššø›n|~niŸŸý ¡¢¢£Óxliw}~zut|xq„……†‡ˆ‰Š‹ŒŠŠ‹kxti‘‹‹‘–•–—iyšš›únytrŸŸÌ ¡¡¢¢££¤¤¥©ªrtwyxsy„……†‡ˆ‰Š‹ŒŠlr}uk‘‘••‘Œ–—iyšš›ÅpxutŸŸ  ¡¢¢££¤¤¥©ªª«rr|rƒ„……†‡ˆ‰Š‹sks|zrdމ•–’––—iyšš›Åsru~wpŸŸ ¡¡¢££¤¤¥©ªª««q}rƒ„……†‡ˆ‰Š‹lypmŽŽ†”–“•––—iyšš›ÅœyxvtŸ  ¡¡££¤¤¥©ªª««prƒ„……†‡ˆykv|tkd‹ŽŽ‹“–”‹•––—jwšš›Åœqx~wpŸ ¡¡££¤¤¥©ªª«cq}rƒ„……†‡kp}xqŠŠ‹ŽŽ‰Œ‘••”••––—j€všš›þœtËwt ¡¡££¤¤¥©ªªgwr|ty„……†tv~tgŒŠŠ‹ŽŽ‰••‘“”••––—j€všš›þœÏžpxtx ¡££¤¤¥©ªux‚qx}k„…pq|vmp‹ŒŠŠ‹Ž…•–‘Œ“”••——ûkv™šš›þœžÊtwtr¡¡¢¢£¥cp}|rvqsjx}qy‰Š‹ŒŠŠ‹‰”–“’“”••–——pv™šš›þœžÄŸtxsy¡¢¢£tq€|j«k~|w|xojˆ‰Š‹ŒŠŠ‹†Š‘••Ž‘’“”••––—tt™™šš››œžÊŸrx~oc¢kjz~up««mzuj†‡ˆ‰Š‹ŒŠŠ‹‡‘••‹‘’””•––—ws™™šš›ÉžŸŸo{pov{p©ª««dr|pw†‡ˆ‰Š‹ŒŠŠ‰”•‘Œ‘’“””•––xq˜™šš›þœžŸÇm|vls©ª««t~ss}pt‡ˆ‰Š‹ŒŠ„‹’–“‘’“””••–xn˜˜™šš››œÙžskq€xn¥©©ª««|oyƒp}}tlˆ‰Š‹ŒŠŠ‘••Žò’““”••–zf˜˜™ššü›œœÙot|€vo|r¥©©ª««qj‚ƒjp{{riŠ‹Œ…”•‘ò‘’“”••–zf˜˜™šš›Åœnis{}|vogkm}{s~©ª««€‚ƒ„qt~unt‹‰‹“•’ŽŽ‘’““”••–{f˜˜ššÑ›sont}€{qn  ¡¡tt~{oªª«¬€‚ƒ„†kpz}~xx‰•”ŽŽŽä’““”••–{€hyngfquw|~|xkksŸ  ¡¡Ésxucªª¬€‚ƒ„…†‡yqt}‡”…qlrŽ‘’“”•yu{tnw|}vsqsûžŸŸ ¡¡à¢lwujª¬€‚ƒ„…††‡ˆnsŠ’•Š}zssttsýtx÷}sklq››œÝžŸŸ  ¡¡¢£gz~tª¬€‚ƒ„……†‡ˆ‰‰•”‰tuvvýx{||ó{zwvv€tldflšš›ûœžŸŸÜ ¡¡¢£¥g|s€‚ƒ„……†‡ˆ†“•‘Œ‹ŒŒ{utrròqtuy”•|€f˜˜™™šš›œ랟Ÿ ¡¡¢£¥ss}|p€‚ƒ„……݆‹‘•’ŒŠ‹ŒŽŽ‘’’“””{€f—˜˜™™šš››œþžŸŸ¡ñ¢£¥©kt{€‚ƒ„……†ß””Ž‹ŒŠ‹ŒŒŽŽ‘’’“””{€f——˜™™šš››œþžŸŸ¡ñ¢£¥©ªªt€ƒ„„……≋’•’‹ŒŠ‹‹ŒŽŽ‘’““”{€f——˜˜õ™šš››œœžŸŸÐ ¡¢¤©ªªkv€‚ƒ„„…‚ˆ‘•“Š‹‹ŒŠ‹‹ŒŽ‘’““”{‚g——˜˜õ™šš››œœžŸŸÐ ¡¢¤©ªª«r~€‚ƒ„„…‡Ž“•‹ŠŠ‹ŒŠ‹ŒŽ‘‘’““{g–—˜˜ü™šš››ûœžŸŸÊ ¡¢¤©ªª«­~‚ƒƒ„…‰‘•’ˆŠŠ‹ŒŠ‹‹ŒŽ‘‘’’“zƒg––—˜˜™šš››œŸÉ ¡¢¤©ªª«­~€‚ƒƒ„†Ž“•ˆˆ‰ŠŠŒŠŠ‹ŒŒŽ‘’’“z‚g––——˜˜™šš››ûœžŸŸÛ ¡¢¤©ªª«­}€‚ƒˆ‹‘•’‡ˆ‰‰Š‹ŒŠ‹ŒŒŽò‘’’z‚g•–——˜˜™šš›ûœžŸŸÛ ¡¢¤©ªª«­}~€‚‚…”“†‡ˆ‰‰Š‹ŒŠŠ‹ŒŽ‘ô’yp••–—˜˜™šš›ÕœžžŸŸ ¡¢¤©ªª«­}~€‚‚Œ‘•Œ†‡‡‰‰Š‹ŒŠŠ‹ŒŽ‘ô’xy••–—˜˜™šš›ÒœžŸŸ ¡¢¤©ªª«­}~€…”“…†‡ˆ‰‰Š‹ŒŠŠ‹‹ŒŽ‘‘òxt”•––—˜˜™šš››ñœžžŸ ¢¢£¤ª¬«­.ýefggõfeffhjggrr(þimmüv{€ý|}ü€~} cüdcpuuþz~~ü{xqiiömuzqijjãeijq~}xttstÓ×ÖÔÕÖÔÓÖÔolzxrtÒÒþÓàeort}~xnlntÔÕÔÔÖÖ×ÖÕÓÒÒÓnv|kfÔÓÒÒýÕÖícghv|zxxtngnsÐÔÏÓ×ÖÖþÑÓÓðÔjrztlÕÕÔÓÒÔÔÒÓÞelp|woptÊÎÑÒÑÑÔ×Ö×ÖÔÕÖÔÕÖÕÓqu|pÓÕÕÓÔýÕØÛcfitx||~~syÌÎÐÐÑÒÓÔÔÕ××ÖÖÕuonninz{roÒÒÓýÔÕÖÖèkq~|tptsq|xkÎÐÐÑÑÒÓÔyqmkkösxxy{{pkkúqyÔÔÕÖÖþØ ïcps{mksÏÈÊyowdÑÑõÒqsstz|ytmkkìp}tkkpx|xtstsÖÖØØÉehq}yuqhoÆÅÁÊÊÌovvipzxuttddfltyÔÔÓl~tiÒÒxpgdpsux|xmk×âclu|pqÃÉÅÃÇÌÍÊËÍns|pnpÔÕÖ×ÖÖÕÔúktiÓÒÒôÓÔÔÕÕsmtxpßfkw{wpioÄÅÄÄÈÌÉÂiktwxx~znÔÔÕÖ×ÖÖÕÕøÔcl}tfÓÒÒÓõÔÕÕwikx‚||öfkw|tr¼·¾ÄÄíÈcluxppÏÐtoÔÔÖ×ÖÖÕÕùÔm€ucÓÒÒÓÜÔÕÕpoy€upuocjv}xkoÀ¿ÀÃÄÂÄÆÊuntypnÐÐöÑkyÔÕÖ×ÖÕÕøÔqzwkÓÓÒÒÍÓÔhsv{}qit×ÙÙjz}tm¼¼¾¿ÁÃÄÄÆÆfnzugÌÏÏÐÑÑÒyrryÖ×ÖÖÕÕùmy|uÓÓÒÒökn{~tmyØ×ÙÙôq|{si¶¼½¿ÀÂÄÄìÆntwmyËÌÏÏÐÑÑÒÓlzziÖÖÕúr€oÓÓÒÒùwry~rpÖÖýØ×ÙÙÉ{xp~¼¿¾¿¿ÁÃÄÄkuysjwËÌÌÏÏÐÑÑÒÓÔtumÖÖÕÕsr~pcÓÓÒsjt}xpisÖÖýØ×ÙÙÉq¯®¶½¿¿ÀÁÃÄsn{vgÉÊÊÌÍÍÏÐÐÑÒÓÓÔg}tÖÖÕÕl{zqÓÓÒpt}xpÓÓÔÔÖÖýØ×ÙÙøpjddltuttÔu|~rddgmyÍÎÐÐÑÑÒÓÔÔkpssÕÕmw~iÓopt}{ljÒÓÔÔÕÖÖýØ×ÙÙúw{}{yuuüx€||â|xnklpsÑÑÒÓÔÔÕnz|nÕÕsrwgp€xnÒÒÓüÔÕÕÖÖôØ×Ù€srnklpqyyùv€xoonkkõrx~zssrÓÔÔÖòtpynzwjqx~sfÒÒúÓÔÔytssãxy{y·½ÁÁ¿nq|phÅÅÆÉÊÊslfgrtwx||ãshkÖk~ms|~umnlghpx{||{zxvwwÉvuutt¼½¾¿ÀÁq}tÄÅÆÇÈÊÊËÌÎÏÐÐÑÑtpnu~{op€€~tpv|}ytnnøpsvÖÖØ×ÙÙé¼½¾¿yr{tcÄÅÆÇÈÊÊËÌÎÏÐÐÑÑóÒÓpks}…Ž…ò|ztkgipsÒÓÔÔÕÖÖýØ×ÙÙÚ½¾¾¿ixyyÄÄÅÆÇÈÊÊËÌÎÏÐÐtpmlkkwz~€…”•…û~tntÒÒûÓÔÔÕÖÖýØ×ÙÙø½¾¿¿u|oÄÄöÆÇÈÈÊÊËÌsttðw|}|xy…Ž””†€ý|wttøsÒÒÓÔÔÕÖÖýØ×ÙÙù¾¿¿r|lÄÄõÆrkip|~}zuttþvddðrn|…”•‰€|}pguttöx}~yoilÕÖÖýØ×ÙÙ¿ëmxuwÄÄtppx}xpmnr{ÐÐÑÑÝnpu…Ž”–‘„|sp}pÓÓÒÒnnmr|zppqÖØ×ÙÙø¿jntpvyyßsfgnxËÌÎÏÐÐÑlpx{w|“–•‰€zzsk||odÒÒòqhfqxy||zvpgsÙÙÔyp|{qpsÅÇÈÉÉÊÊËÌÎÏÐsmy}soÔŒ“–•n|yÕÕÔk{oÒÒÄÓÔÔÕppt|}tmqÙv|vilqÄÅÆÇÈÉÊÊËËÌÎitw|wkj…‰’–•Šm|yÕÕÔÔn|~niÒÒýÓÔÕÕÖòxliw}~zut|xqÃÄÄáÅÆÇÈÉÊÊËËÌkxtiÑÒ‹‹‘–•Ö×iyÕÕÔÔúnytrÒÒúÓÔÔÕÕÖÖôØ×ÙrtwyxsyÃÄÄáÅÆÇÈÉÊÊËlr}ukÐÑÑÒ‘••‘ŒÖ×iyÕÕÔÔòÓpxutÒÒÓÓÔÕÕÖÖýØ×ÙÙrû|rÂÃÄÄáÅÆÇÈÉsks|zrdÏÐщ•–’ÖÖ×iyÕÕÔÔòÓsru~wpÒÒÓÔÔÕÖÖýØ×ÙÙúq}rÂÃÄÄáÅÆÇÈÉlypmÎÏÏÐц”–“ÕÖÖ×iyÕÕÔÔÓõyxvtÒÓÓÔÔÖÖýØ×ÙÙúprÂÃÄÄáÅÆykv|tkdÌÎÏÏЋ“–”‹ÕÖÖ×jwÕÕÔÔÓöqx~wpÒÓÔÔÖÖýØ×ÙÙùcq}rÂÃÄÄáÅkp}xqÊËËÌÎÏωŒ‘••ÔÕÕÖÖ×j€vÕÕÔÔÓöÒttwtÓÔÔÖÖôØ×ÙÙgwr|tyÃÄÄátv~tgÊÊËËÌÎÏω••‘ÔÔÕÕÖÖ×j€vÕÕÔÔÓÒøpxtxÓÔÖÖÛØ×Ùux‚qx}kÃÄpq|vmpÉÊÊËËÌÎÏ…•–‘ŒÔÔÕÕ××úkvÕÕÔÔÓÒÉtwtrÔÔÕÕÖØcp}|r¿vqsjx}qyÇÈÉÊÊËËÌΉ”–“ÓÔÔÕÕÖ××pvÕÕÔÔÓÒÌtxsyÔÕÕÖtq€|jÙ¿k~|w|xojÆÇÈÉÊÊËËÌ†Š‘••ŽÒÓÔÔÕÕÖÖ×ttÕÕÔÓÒÍrx~ocÕkjz~upÙÙ¿mzujÄÅÆÇÈÉÊÊËË̇‘••‹ÑÒÓÔÔÕÖÖ×wsÕÕÔÓÒõo{pov{p×ÙÙädr|pwÄÅÆÇÈÉÊÊËˉ”•‘ŒÑÑÒÓÔÔøÕÖÖxqÖÕÕÔÓÒöm|vls×ÙÙät~ss}ptÅÆÇÈÉÊÊË„‹’–“ÐÑÑÒÓÔÔÕõÖxnÖÖÕÕÔÔÓÓÒôskq€xnØ××ÙÙè|oyÂp}}tlÆÇÈÉÊÊËŠ‘••ŽÐÐÑÑþÓÔÔÕùÖzfÖÖÕÕþÔÓÓòÒot|€vo|rØ××ÙÙèqjÁÂjp{{riÈÉÊÊ…”•‘ÐÐÑÑóÒÓÔÔÕÕÖzfÖÖÕÕÔÓïnis{}|vogkm}{s~×ÙÙ¿æÀÁÂÃqt~untɉ‹“•’ÏÏÐÑÑÒÓÔÔÕãÖ{fÖÖÕÕÔÔsont}€{qnÓÓÔÔtt~{oÙÙçÛ¿¿ÀÁÂÃÄkpz}~xx‰•”ŽÎÏÏÐÑÑþÓÔÔÕêÖ{€hyngfquw|~|xkksÒÓÓÔÔÇsxucÙÙÛ¿¿ÀÁÂÃÄÄÅyqt}‡”…qlrÏÐÐÑÑÒÓÔÔÕyu{tnw|}vsqsÓÓÒÒþÓÔÔñÕlwujÙÛ¿¿ÀÁÂÃÄÄñÅÆnsŠ’•Š}zssttsýtxú}sklqÓÓÒÓÔñÕÖgz~tÙÛ¿¿ÀÁÂÃÄÄõÅÆ‰‰•”‰tuvvýx{||ò{zwvv€tldflÕÔÔÓÒîÓÔÔÕÖØg|s¿¿ÀÁÂÃÄÄðÅÆ†“•‘ŒÊÌÍÍ{utrrôqtuyÔÕ|€fÖÖÕÕÔÓÒîÓÔÔÕÖØss}|p¿¿ÀÁÂÃÄÄë‹‘•’ÊÊËÌÍÎÏÏÐÑÑÒÓÓÔÔù{€f×ÖÖÕÕÔÓÒÔñÕÖØ×kt{¿¿ÀÁÂÃÄÄ놔”ŽÉÊÊËÌÍÍÏÏÐÑÑÒÓÓÔÔù{€f××ÖÕÕÔÓÒÔñÕÖØ×ÙÙt¿¿ÀÂÃÃÄÄꉋ’•’ÉÊÊËÌÌÍÎÏÏÐÑÑÒÓÔÔú{€f××ÖÖÕÔÓÒØÓÔÕÖ×ÙÙkv¿¿ÀÁÂÃÃÄ‚ˆ‘•“ÈÉÉÊËÌÌÍÎÎÏÐÑÑÒÓÔÔú{‚g××ÖÖÕÔÓÒúÓÔÕÖ×ÙÙØr¾¿ÀÁÂÃÃćޓ•‹ÈÈÉÊÊËÌÍÎÎÏÐÑÑÒÒÓÔÔ{gÖ×ÖÖÕÔÓÒúÓÔÕÖ×ÙÙÓÛ¾¿ÀÁÂÂÃ…‰‘•’ÆÈÈÉÊÊËÌÌÍÎÏÐÑÑÒÒÓÓÔzƒgÖÖ×ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙÐÛ¾¿¿ÁÂÂÃ†Ž“•ÆÆÇÈÈÊÊËËÌÍÍÎÏÐÑÑÒÓÓÔz‚gÖÖ××ÖÖÕÕÔÔÓÓÒúÓÔÕÖ×ÙÙãÛ½¿¿ÀÁˆ‹‘•’ÅÆÇÇÈÉÊÊËÌÍÍÎÏÐÑÑñÒÓÓz‚gÕÖ××ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙãÛ½¾¿ÀÁÁ…”“ÄÅÆÇÇÈÉÊÊËËÌÍÎÏÐÑÑÒóÓypÕÕÖ×ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙãÛ½¾¿ÀÁÁŒ‘•ŒÄÅÅÇÇÈÉÊÊËËÌÍÎÏÐÑÑÒõÓxyÕÕÖ×ÖÖÕÕÔÓÒúÓÔÕÖ×ÙÙàÛ½¾¿¿À…”“ÄÄÅÆÇÇÈÉÊÊËËÌÌÍÎÏÐÑÑÒÒõxtÔÕÖÖ×ÖÖÕÕÔÓÒ÷ÓÕÕÖÖÙÛÙÛ.ý(11õ03512411­­(ðP„ƒ„ƒÆÛèèçèèæÚãççüèãá á£ÃÂÀØåä䨻ƒWUUWWUH°çæÑ„WROó\d¤äçàǸ¸¨]ùeÐͧ,ô!—«¾ããÁ€wb% ú<Áßy.ò7HÆÝÕÑË™> ú›Õ©5ö!€žÜæÇ—m#ûH¼Ùqô Y¾ÎÜßäãm õaÒÖ\ón©åܸ˜%‡ÞÎ7ê¨áÑŠ&þEúgÕ¾: û!ßè1ûJÙÕ3úT®âʆ ø 1gŽŽö¯ßãC ì“ç¯ÁåP8®áÙe% ñ³ÑãØÏ»¤»ÇçëÝÙÝççøÜ¿yke>ðAÓÚTŒåˆ:ŽìË ÷&5CyneK8ùgëÉ\OYnnö’Æççãѳ°€ò¤çŽHØÇ%’Ñå˜(ûKŽ£²²ûÇÏÕúqÚžÐT³ÇÏÜßߌJ7 æä_­çæßå¯*%7&û,ÉÏ ñZmzyy³Îåççèìïççûä­a#ü°ßT íp¦ººÆÜâççÙ±ÐçæçìïÝççùßÇ»±wütßmò(OYƒÚåáÓÁ¿µ5åtÖçèìðççÜâç– }¿¿ÊâæåÈkY: í8й:¡¡ÅáåËsAæåèìõèçÝeƒçàtô#tœÝççÓ¢žHð‡çˆb¹ÓÐÓÓƒ..ë!pÎÚƒçëõìÈäÖqàá“ ò (.ZËÓÝÝÖ°\1ö jÝççÖ£] ðkËâ®Wžìôî«HÛÔûkÙç— îWªÜç⤇?ÆÜç³T< îOÉß¿K’çðì¨FÜÔúaÚä‹ ó CR¿ãåÕĵßË0 íbÈè¸WèîíµYèÔúTÎçª% ø\µÆа ú(žáÃsôOÞïí¹YèÔúHÇç±&û#aß«ø, ÝÕyø1ÎïôÁüYèÔù7¶å».üwá«ú|Ïè8ù#ÈéôãHüYèÔúÆç¸& üŒå«ø>¼Þ¹Mø ÆéðçƒüZèÂú>Ää¾7 ûvâ«úwáÐyù›çðè|üZè ú0²ç¿% ù&É\ݳ úEÄã£8úWàòðºüZè  ú&Çæ©ð?ÍîÍßT&Þ½Où>åëñÐ3ü]è  ú1½æªð ßà“½ç‹bÄàù%ËëðÞMütèž ú0Äç§ð(žèÜe:åà¿ÜÊ? ùæîìRü—çm ó:Æå— bÙå»FùÏçç¸ ùèíï¸ü§çZ öT×èeÁè×›øŒßæç“ù>ÚèìÊ&üµçM÷jççàè»?÷µä†ßç‡ùºéðåJ ü½çC ÷M—èèçà öÞˆ †ßã®(ú‡çðì– üÇç. öm´ÝèňçÛ_ôJyÖåÛvù1àêè¤ üÏè.ð8ÜãݽJwãÙgñH¸ã翃#Ãêðß0 üÐè.öa²âèØ¡WúœåÕ* ó]ÐãäвÏäéên îÐè3 RºËÞäáÉ]8úÉæÂ ó hµÞåçèçç‹e<ð(Øè®y¶Ûççá°v ú(Æç¾ ú\Õèèççûãв³´´³ø²³²¸Èçèççúá ma û>Ùäž â—çèè¶¾ÆÆÇÏ×ÜÛÚÝ×ÒÉÆÆçè¡ú0Ýæg ù1Øèè¶ð%JZYUaJ5Ûè.ú‹ãÞ_ùÈèèÜRüÐè.û›çÜúUâèæ’üÐë0ý½çù%ÄèèàüÐê0ý&Ãù–èèåEüÐí1þRùçèè¶üÐì1!ù ´èèÚKüÏï3!údßèè’üÏï3 ù³èèÙüÏï5 úwèèåpüÈìP úÕèèÈ&ü½èsú—çèæYü¹ègþpffûgfec6ü~xommûkc /iðqw|~~|vuukdcc *ìIJJIJJKMKKvsttx}}pjjûRTI$MçJR[\WPMMtnlwvm\mmRYP& þKMMáPRTRMHIP[bPYTlesuwtioYoW]mWa["PÝMPRMPRUWWTPW]T[\W^vpuwok^\oYmnWb\þMPPRTUüwqjffõ|txvxysnff÷nlsjffc2þMPPRóTwskkmv{|yurrúsz|yy÷|€pkkc PR÷urtv|}ukküntt\\]^ì{hsxqnkklx~€tsnUërjjy~xvvrncgpWYY[[\\]]^`êamptvnjeemecquv{}xjgc ÷v}mnrUUWWY[\]^`abûdr{meeó][^uknpx|ph ùumTTUWWYþ[\\]^`abécnqxtnegmaT`xymgpzzxgc ùtptUUWWþY[[\]^`abcêefwymbemkiicefnjqvtkúmr}xmWWY[þ\]]þ^``aþbccefêlxxlfkbbjfgjjc\tkv}tgùRTr}|lWWûY[\\]]þ^``abceføgkv~hiij jùsw}whcòRTkr}xtWWY[\\]]þ^``aþbcceþfggúlvylij jùtm{|pgòRTTks}pcWY[\\]]þ^``abcefgiûkzxojjkèmqkpy|jfRTTUyzgWY[\\]]þ^``abcefgiúk|pjjkkètbepmu}tgRTTUWmtWY[\\]]þ^``þabbcefgijøqs|mskkmmókjnmipj~ylqonnòo|klnpqqv|^``øabbcceeffgijúvylkknnôrxpagrmv{|}}€}ù|{{|xvssùrx~~ceffgþijjùkotmmnnôwae{€ukbtopffûkrrffùqrtuuvwwüx{{||ø{yhhs}jjkúpt}pmnnçrntqeguwqdRTTUWWorY[\\]^^`aüstpnnôp{|{ppv…jkkün|rnnpqpqïrqRTTUWWorY[\\]^^`aþbccéefykggnvz{zzxytgpxupnnppqpqrñRTTUWWo€rY[\\]^^`aþbccþeffgñijsqqt{~}~svnppqpqrñRTTUWWoqY[\\]^^`aþbccþeffgþijjõspjpy}uvppqrñRTTUWny|tY[\\]^^`aþbccþeffgþijjkósf€uu{}zkxqqrñRTTUWg{WY[\\]^^`aþbccþeffgþijjkñmg|fnnmv~|sy…rrtrñRTTUWwtWY[\\]^^`aþbccþeffgþijjkîmqvfnppkfqxzzwgyttñRTTUp}|iWY[\\]^^`aþbccþeffgþijjkùmyn€fnppqømpuxppttósdkjrqoY[\\]]^õ`abbcceeffggijkmúk€sppqqrëjiu}wt|tvp}xyWY[\\]]ó^``abbcceeffggijkmúk€xppqqrîtpv~xks}{mWY[\\]]ø^`aabbceeþfggiþjkkmúk€vppqqrtðklwRgy€xy}xqjh\]]^ú`abbceefgijkmùnkfppqqrtâleuutmoy|}onw]^^`aabcceeffggiijkmnùstfppqqrtûvykWWïkjt|{vqh^`abbcceffþgiijþkmmnùkz€fppqqrtûwkUWWñY[oqx|klwbcceffgijkmnùd~gppqqrtûxkTUWWñY[\\pkxysqcceffgijkmnøpdvnppqqrtãoTUWWYWWY[\]^`dlu|~xkoffggijkkmþnpprütkppqrtuáRTUWWYWYY[]^^``aapt}|tqggijkkmnnpqrûvkpqqrtuúRTUWWYYé[\]^``aabcnjv||wkokmnnppqrþtrrûp{vmrr tuäRTUWWYY[\]^`aabbcefgitr|~toppqþrttümstt uáRTUWWY[[\]^`abccefgijkqku~|twrqqþrttuøkw}puwwuuÜRTUWWY\\]^`abbeefgijkkppqrs}€xptuuwwxümyxxw uÜRTUWWY\]]^abbcffgijkmmqqrtknu~|tzz{{úxp{{zzx wuéRTUWWY\]^`abccffgijkmnrrétuwkix||pt€}}p~wp}}{zzx wuUèWY[\]`aabegfikmmnqrttwxzzêxnzxr…€€ku|l‚€}}}{{zzxtUWÖY\\^`abcfgikmnpqtuwxz{}}€qlt||wj~jxy…‚€€ü}}{{zxûwttUWWèY\\^abcegiknqrrtwzz{€‚ƒƒÜ…†ˆ‰gu}|q}hˆˆ†ƒ…ƒƒ‚€€{{zzxxwwuuUWWÈ[]]`bcefikmprtuwz}}‚ƒ††ˆˆ‰‹ŒŽŽtm|ri‹‹ˆ†ˆ††…ƒ‚€€}}{{zxxwäUWWY\^]`befgjmmpruwx{€‚ƒ†‰‹‹üŒŽ‘‘Âjp€~xpŽ‹ˆ‹‰‰†…ƒ‚‚€€}{zzxzxUWWY]^^acfgimpnquwx{‚ƒ…ˆ‰ŒŽ‘’”––çp~€nwwxŒŽŒ‹‰ˆ†…ƒƒ‚€}{{€ªzjWW[]`^aefijnqqtxz}ƒ††‰‹Ž‘’”––—™ššq{€lœet||tq”’‘ŽŒ‹‰††…ƒ‚€}{{xpY[]`^aegiknqtwz}‚†‰‹Œ’–—™™ššœževry¡ŸŸiw{s™—–’‘ŽŽ‰ˆ†…ƒ‚€}}x‚[]`begjknqtux{‚…ˆ‹Œ”—™šœŸ¡£¥§u€yo¬ª§§òqp|t…šš—”‘Œ‰††’…‚€€|m[]`beijmnrux{‚…ˆ‹”—šœž¡¥§§ev€xj¬±®¬ª¬ª¨tuzgžš—”Ž‹‰‰ˆ…‚€€m~n^acfikmptw{ƒ†ˆ‹’–™ž¡£¥¨ª®cu‚zgµµ¶µ±±È¯¬ft~yw~œ™–’ŽŽŒ‰†ƒ‚dn}{tacfjmnqux}€…ˆ‹’—™ž£§¨ª®±fu|f¼¼ý½¼¸¸Èµ³¯koz}vpŒš—”’‘Ž‹ˆ……Wyvsdegknqtx{‚†‹Ž‘–™œ¡§ª®¯³eu€ygÁÃÃýÅÿ¿Ã¼º¶µ±lv{xŸœ™–”‘Œ‰ˆ†WYm{rogkpruz}€…‰Œ”™ž¡¥¬¯³¶cv|gÇÈËÌÌÎËÈÈÃÅÿ¼º¶om~|srœ™—”Œ‹‰W[\hz}tmprw{ƒˆŒ‘”™ž¡§¬±¶¸nwxgËÎÒÔÔÖØÖÒÒÃÐÌÈÇÿ½ºoyv‚Ÿœ—’Œ‹W[\^r|lmqtw}€†‹”—œ¡§ª¯µºp{‚xlÎÐÔØÚÚÜàÜÚÚ½ÖÔÐÌÈÇÿºptxqŸš–’ŽŒW[]`nuxpruz€…†‰”™ž¥¨¬¯cp|}soÒÔÖÚÜàâäâäååäàÚØÐÐòÌÇ¿¸gq}|mŒœ™–’þpfføgfec+3ü~xomm÷kc}ƒn8þ iìqw|~~|vuukdccwJ3&ì¡¢¢¡¢¢£¤££vsttx}}pjjø¬­¡Žj3!¥¤ä¥¢«±²¯ª¥¤tnlwvm²mm«±ª•…w/þ£¤¤ß©«­«¤ ¡©±·ª±­lesuwtio±o°³m¯¶±’ZªÛ©¥ª«¥©«®°°­©°³­±²¯´vpuwok´²o±mn°·²Ž[𥩩ª««¬¬­­®®wqjffõ|txvxysnffõnlsjffcšD쥩ªª««¬­wskkmv{|yurrúsz|yyö|€pkkc"©ôª«¬urtv|}ukküntt²²³´ë{hsxqnkklx~€tsn®‡ñrjjy~xvvrncgp°±±²³´µê¶mptvnj¹¹mecquv{}xjgc óv}mnr®®¯¯°°±±²³´µ¶·ûdr{m¹¹ò³±´Ã½npx|ph\ ùum­­®¯¯°±²³´µ¶·è¸nqxtn¹»¾¶­µÈymgpzzxgc9øtpt®®¯°°±²³´µ¶·¸è¹fwym·¹¾½»»¸¹º¿jqvtkc&ùmr}xm¯°°±þ²³³þ´µµ¶þ·¸¸¹ºélxxlº½··¼º»¼¼¸²tkv}tgzò¬­r}|l¯°°±±²²³³þ´µµ¶·¸¹ºø»kv~h»»¼ ¼ùsw}whcò¬­kr}xt°°±±²²³³þ´µµ¶þ·¸¸¹þº»»úlvyl»¼ ¼øtm{|pglò¬­­ks}pc°±±²²³³þ´µµ¶·¸¹º»ûkzxo¼¼½è¾Ákpy|jf*¬­­®yzg°±±²²³³þ´µµ¶·¸¹º»úk|p¼¼½½è·¹Àmu}tgn¬­­®¯mt°±±²²³³þ´µµþ¶··¸¹º»¼øqs|ms½½¾¾ó½¼¿¾»pj~ylqonnòo|klnpqqv|´µµø¶··¸¸¹¹ºº»¼úvyl½½¿¿ôÂÈÀ¶»Âmv{|}}€}ù|{{|xvssùrx~~¸¹ºº»¼ù½ot¾¾¿¿ôǶ¹ÉÌý·topffûkrrffùqrtuuvwwüx{{||ø{yhhs}¼¼½úpt}p¾¿¿ç¿ÂÁ¹»ÃÇÁd¬­­®¯¯or±±²²³´´µ¶üstpnnôp{|{ppv…¼½½ün|r¿¿ÀÁÀÁïÂÁ¬­­®¯¯or±±²²³´´µ¶þ·¸¸é¹ºykggnvz{zzxytgpxup¿¿ÀÀÁÀÁÂñ¬­­®¯¯o€r±±²²³´´µ¶þ·¸¸þ¹ºº»ò¼sqqt{~}~sv¿ÀÀÁÀÁÂñ¬­­®¯¯oq±±²²³´´µ¶þ·¸¸þ¹ºº»¼õspjpy}uvÀÀÁÂñ¬­­®¯ny|t±±²²³´´µ¶þ·¸¸þ¹ºº»¼½ósf€uu{}zkxÁÁÂñ¬­­®¯g{°±±²²³´´µ¶þ·¸¸þ¹ºº»¼½ñ¾g|f¿nmv~|sy…ÂÂñ¬­­®¯wt°±±²²³´´µ¶þ·¸¸þ¹ºº»¼½î¾qvf¿ÀÀkfqxzzwgyÂÂñ¬­­®p}|i°±±²²³´´µ¶þ·¸¸þ¹ºº»¼½ù¾yn€f¿ÀÀÁømpuxppÂÂósdkjrqo±±²²³³´õµ¶··¸¸¹¹ºº»»¼½¾úk€sÀÀÁÁÂëjiu}wt|tvp}xy°±±²²³³ó´µµ¶··¸¸¹¹ºº»»¼½¾úk€xÀÀÁÁÂïpv~xks}{m°±±²²³³ø´µ¶¶··¸¹¹þº»»þ¼½½¾úk€vÀÀÁÁÂðklw¬gy€xy}xqjh²³³´úµ¶··¸¹¹º»¼½¾ù¿kfÀÀÁÁÂäleuutmoy|}onw³´´µ¶¶·¸¸¹¹ºº»»¼½¾¿ùstfÀÀÁÁ Âèvyk¯¯°kjt|{vqh´µ¶··¸¸¹ºº»¼þ½¾¾¿ùkz€fÀÀÁÁ Âéwk®¯¯°°±±oqx|klw·¸¸¹ºº»¼½¾¿ùd~gÀÀÁÁ Âéxk­®¯¯°°±±²²pkxysq¸¸¹ºº»¼½¾¿øÀdvnÀÀÁÁ Âço­®¯°±°°±±²³´µdlu|~xkoºº»»þ¼½½¾þ¿ÀÀÂütkÀÀÁ ÂÃø¬­®¯°±°±±ò³´´µµ¶¶pt}|tq»»û¼½½¾¿¿ÀÁÂûvkÀÁÁ ÂÃú¬­®¯°±±ê²³´µµ¶¶·¸njv||wko½¾¿¿ÀÀÁÂûp{vmÂÂÃú¬­®¯°±±ì²³´µ¶¶··¸¹º»»tr|~toÀÀÁÂüms Ãú¬­®¯°±±é²³´µ¶·¸¸¹º»»¼½qku~|twrÁÁÂÃøkw}pÃÇÇÃÃܬ­®¯°±²²³´µ¶··¹¹º»»¼½½ÀÀÁrs}€xpÂÃÃÇÇÈümyÈÈÇ ÃÞ¬­®¯°±²³³´¶··¸ºº»»¼½¾¾ÁÁÂÂknu~|tÉÉüxpÉÉÈ ÇÃ鬭®¯°±²³´µ¶·¸¸ºº»»¼½¾¿ÂÂëÃÇkix||ptËËÌÊÊp~wpÊÊÉÉÈ ÇÃ®í¯±±²³µ¶¶·¹»º»½¾¾¿ÁÂÂýÇÈÉÉìxnzxr…ÌÌku|lÍÌÊËÊÊÉÉÈ®¯Ö±²²´µ¶·¸º»»½¾¿ÀÁÂÃÇÈÉÉÊÊËËÌqlt||wj~jxyÎÍÌÌüËÊÊÉÉÈëÇ®¯¯°±²²´¶·¸¹»»½¿ÁÂÂþÇÉÉüËÌÍÎÎñÏÐÑgu}|q}hÐÐÏÎÎúÍÌÌËËÉÉÈÇÃÇ®¯¯°±³³µ·¸¹º»½¾ÀÂÂÃÇÉÊÊËÍÎÏÏÐÐÑÑÒÓÓtm|riÑÑÐÏÐÏÏÎÎÍÌÌÊÊÉÉÈÇ宯°±²´³µ·¹º»¼¾¾ÀÂÃÇÈÉËÌÍÎÏÑÑüÒÓÔ××õjp€~xpÓÑÐÑÑöÏÎÎÍÍÌÌËÊÉÉÛÈÉÈ®¯°±³´´¶¸º»»¾À¿ÁÃÇÈÉËÍÎÎÐÑÒÓÔÔ×ÕØÙÙîp~€nwwxÔÒÔÓÒÑÑÐÏÎÎûÍÌËÊÉÉ¡j°°±³µ´¶¹º»¼¿ÁÁÂÈÉÊËÎÏÏÑÑÓ×ÕØÙÙÚÛÜÜq{€lÜet||tqØÕ×ÓÒÑÑÏÏÎÎÍÌËÊÉÉxp±±³µ´¶¹»»½¿ÁÂÇÉÊËÍÏÑÑÒÔÕÙÚÛÛÜÜùÝevryÞÞÁiw{sÛÚÙÕ×ÓÓÑÐÏÎÎÍÌËÊÊx‚±³µ·¹»¼½¿ÁÂÃÈÉËÍÎÐÑÒÔØÚÛÜÜÞÞßàâu€yoääââòqp|t…ÜÜÚØ×ÒÑÏÏÒÎÍÌÌË|m±³µ·¹»¼¾¿ÂÃÈÉËÍÎÐÑÔÔØÚÜÜÝÞàââev€xjäæåääóãtuzgÝÜÚØÔÓÑÑÒÐÎÍÌÌm~n´¶¸º»½¾ÀÂÇÉËÎÏÐÑÔÕÙÛÝÞßàãäåcu‚zgééèéææÉäft~yw~ÜÛÙÕÔÓÓÒÑÏÎÍdn}{t¶¸º¼¾¿ÁÃÈÊÌÎÐÑÔÕÚÛÝßâãäåæfu|fëëýìëêêÈéçækoz}vpŒÜÚØÕ×ÓÑÐÎίyvsd¹»½¿ÁÂÈÉËÍÏÑÓ×ÙÛÜÞâäåæçeu€ygíîîýðîííëÉèéælv{xÞÜÛÙØ×ÒÑÐϰ±m{ro»½ÀÂÃÉÊÌÎÑÒÔØÛÝÞàäæçècv|gðññòòñÈðîíëëèom~|srÜÛÚØÔÒÑѰ±²hz}t¾ÀÂÇÉËÎÐÒרÛÝÞâäæèênwxgñòóõõýöõóóÈôòñðîíìëoyv‚ÞÜÚÕÔÒѰ±²´r|l¾ÁÂÇÊÌÏÑÔØÚÜÞâäæéëp{‚xlòôõö÷÷þø÷÷õÉôòñðîíëptxqÞÜÙÕÓÒ°±³µnuxpÂÃÉÌÎÏÑÔØÛÝàãäæcp|}soóõõ÷÷øùùúûùø÷öôôòòðíêgq}|mŒÜÛÙÕþpfføgfecJ3%3ü~xomm÷kc½Â§[5!þ# iìqw|~~|vuukdccѶvW-&ùÔÕÕÔÕÕÖÖövsttx}}pjjÛúÔÏ¡W!ØÖäØÕÙÞßÜÙØÖtnlwvmßmmÙÞÙÕĶOÖß×ÙÛÙÖÓÔ×ÞãÙÞÛlesuwtioÞoÞàmÜâÞÓŽ/ÙÛרÙÙØ×ÙÜÞÞÛ×ÞàÛÞßÜávpuwokáßoÞmnÞãßÏüØ××ÙÙÛÜüwqjffõ|txvxysnffõnlsjffcÕoýØ×ÙÙÛôwskkmv{|yurrúsz|yyö|€pkkcÑ9×ÙöÛurtv|}ukkünttßßàáë{hsxqnkklx~€tsnÜÅ!òrjjy~xvvrncgpÞÞßàáêâmptvnjäämecquv{}xjgc ùv}mnrÜÜÞßàáâãûdr{määòàÞáìènpx|ph‘ úumÛÛÜÜÞßàáâãèänqxtnäæèâÛáíymgpzzxgc^ûtptÜÜÞßàáâãäéfwymãäèèææääåéjqvtkœBùmr}xmÜÞÞþßààáâþãääåélxxlåèããçåæççäßtkv}tg¹Ûúr}|lÜÞÞßàáâãäåøækv~hææç çùsw}whcÛúkr}xtÞÞßàáâþãääþåææúlvylæç çøtm{|pg¤Ûúks}pcÞÞßàáâãäåæûkzxoççèöêkpy|jfGÛÛúÜyzgÞÞßàáâãäåæúk|pççèèõëãäému}tg§ÛÛÜümtÞÞßàáþâããäåæçúqs|msè èôçéèæpj~ylqonnóo|klnpqqv|ááüâããääåæçúvylèèééôëíéâæëmv{|}}€}ù|{{|xvssùrx~~ääååæçùèotèèééôìâäîïìèãtopffûkrrffùqrtuuvwwüx{{||ø{yhhs}ççèúpt}pèééõëéëêäæììêdÛÛÜ÷orÞÞßßàááâüstpnnôp{|{ppv…çèèün|rééêéêýëêÛÛÜ÷orÞÞßßàááâþãääìåykggnvz{zzxytgpxupééêéêëÛÜ÷o€rÞÞßßàááâþãääåæóçsqqt{~}~svééêéêëÛÜ÷oqÞÞßßàááâþãääåæçõspjpy}uvééêëÛÜöny|tÞÞßßàááâþãääåæçèósf€uu{}zkxêêëÛÜüg{ÞÞßþàááâþãääåæçèòg|fénmv~|sy…ëëÛÜüwtÞÞßþàááâþãääåæçèûqvfééökfqxzzwgyëëÛúÜp}|iÞÞßþàááâþãääåæçèûyn€fééêømpuxppëëósdkjrqoÞÞßßààáüâããääåæçèúk€sééêêëðjiu}wt|tvp}xyÞÞßàáüâããääåæçèúk€xééêêëôpv~xks}{mÞÞßàáâãäþåææþçèèúk€vééêêëðklwÛgy€xy}xqjhßààáüâããääåæçèùékfééêêëðleuutmoy|}onwàááâþãääåæçèéùstfééêê ëëvykÜÜÞkjt|{vqhááâããääåæçèéùkz€fééêê ëüwkÜÜÞöoqx|klwãääåæçèéùd~gééêê ëüxkÛÜÜÞßøpkxysqääåæçèéùdvnééêê ëûoÛÜÜÞÞñßàáádlu|~xkoååææþçèèéëütkééê ëìÛÜÞþàááâùpt}|tqææþçèèéêëûvkéêê ëìÛÜÞýßàááâóãänjv||wkoèèééêëûp{vmëëìÛÜÞìßàááââããääåæætr|~toééêëümsëë ìÛÜÞùßàááâãääòåææçèqku~|twrêêëìûkw}pììÛÜÞßæàááâããääåææçèèééêrs}€xpëììíümyííìÛÜÞòßààáâããäååææçèèêëöknu~|tííîîúxpîîíí ìÛÜÞïßàááâãääååææçèèéëëìïkix||ptîîïîîp~wpîîí ìÜÞõßàáââãäæåæèèýéêëëþìííðxnzxr…ïïku|lïïîî íëÜêÞßßááâãäåææèèééêëììííîîñïqlt||wj~jxyðïïîíüìëëÜÜÞßõáâãääææèéêëëøìííîîïïððñöògu}|q}hññðïîíìÜÞàñáãääåæèèéëëììíîîýïðññòóötm|riòòññðïîíìÜÞéßáàáãäåæçèèéëììíîîïïðñòòóôõjp€~xpóòñòòüñððïïîíÜÞçàááâäåææèééêììíîîïððñòóóôôõîp~€nwwxôóôóóòòññððïîýíjÞÞèàááâäåæçéêêëííîîðññòòóôõõö÷æq{€l÷et||tqõõôóóòòññððïïîîäxpÞÞàááâäææèéêëìíîîïñòòóôõõöö÷äevryø÷÷iw{sööõõôóóòññððïïîîäx‚Þàáãäæçèéêëìíîîïðñòóôõöö÷÷øùu€yoùùøøòqp|t…÷÷öõôóòññþðïïåî|mÞàáãäæçèéëìíîîïðñòôôõö÷÷øøev€xjùúùùôtuzg÷÷öõôóòòýñðïïæm~náâäåæèèéëìîîðññòôõõö÷øøù÷cu‚zgúúûúúóùft~yw~÷öõõôóóáòñðïdn}{tâäåçèéêìíîïðñòôõöö÷øøùùùúfu|fûûþüûûúÌkoz}vpŒ÷öõõôóòñððÜyvsdäæèéêëíîîïñòóôõö÷øøùùúúeu€ygüüûúÌlv{x÷÷öõõôóòññÞÞm{roæèéëìíîïðòóôõö÷øøùúúûcv|güýüýýþüýýüûÐom~|sr÷ööõôóòòÞÞßhz}tèéëìîîðñóôõö÷øøùúûûnwxgüý ýüÓûoyv‚÷÷öõôóòÞÞßár|lèêëìîïñòôõö÷øøùúúûp{‚xlýýüÕûptxq÷÷õõóóÞÞàánuxpëìíïðñòôõö÷øùùúcp|}soýýþýüöûgq}|mŒ÷öõõþ›00û1.!6çöèãÏ”ƒƒ„n1UWñz¹àääæáÅÁÁk5ó%³¸ÊáçãdY6ô*ew¿çæ³%% 6ò!b²ÅF55ó(}¾»„#(#)ü ëdT}“ÅçæÒ”&&dZôMqsy®ÕåÞ˽°°ð±ÕèèÚË¿ÃÙçè qqñ5™¶ÅØèß©jkeT1îEžçÂù’½ç¸pú›áÀAû&ÀÇ7 ùbÀã¾AûkáÙJûºäF ùaÇâÊMú’áÇ(û*ºÓA ùnÔÞ£Cú ˆâœ ûÕÇ! ù†ÔßgûÔè?üFÚ–ú3¶á»7ümç®ú ß øWãÔ€EOZZóçámaZOEEC%üÂÐ3ú<ºçÖÛààòèçèèãàÛÖÖÕÆ½±°°û güZçªü!”0û¦è°è15az ÆÉÈÇÇËÖÚààÚ½ŒJJ7%û­âþü–çª ïPqŽŽ˜×èçØÅ™˜g%ügß›ü–èªí0>>]¢ÙÛÕÓаZ#*ËÃü–èªô%—¨³ÓäÚåè—ü–ç›õ >_„ÉçßÀ¶Wû*Ìß<óçèÃÀÚà®W7 üJçÜ!òÜèUÁåѦk ü¿ç!ûªèö.tÌÔÖ„5û:áÜ5!ûwèø<–Âç¹|÷ ¦çž "üjèFð#R©áÉ£(å繓àÌ#üjèa ô|Çå°m§ãèçÛM#üjèA ñ%k¾,ÒêÐÕáÅ\>ümèñÃè±5’Íßá”]û›èûÆçË#÷,J½ßÚÇeû Ðèüì¿(÷#–ÇçÜvEûçãýÆ,ø,gÐèÕ¯Cûç³ þ ÷ E¶Ûå¾Hü˜ès!ùZªáß±TüÄçs"÷:¹ÜÜ»AûTÛÅ!%ù<©Úä®a üŠçž'÷ E©åÞ°< ûÆã&*ø.¦áè¸J ügçÑ,øg¶åÚ™üÌèq.øKÐáÖwûäÁ!0òƒÒèÁb #Âáe2ó1¢àÞ«dåÍ5÷1¼ãÕ†çã(7øpÜèè¦ 8øœèèå˜%7÷gãê‹ÈæÃZþ3 óFØë|#˜ßÝ“ý¾,ú!Æì› úUÃèÊ\üæªûÃëË%ù&™çÜ‹ üßç‡ú#ÆèÉ#úFÃçÁ< ûŠçåbúÃíØAù±äÔq úŠãÔFúÁìá0 øPØá¨% ú ºè³ úÀèÔ? ú5¹çÌZ ú8Õç—ú Åíß5ù#äØs úJ×á úCÇíÌ3úYÌè©! ûŒåÙ1úkÙîÇ1ú>ºæ¼Cú ²çÇ ù †ßá›ù§áØP ‡þc:üsc8ûrjK7ùm|xjbR5øqp|{km[4öqjp{|me…2q÷pq||rf}M1þrqqùznliqr0röjpxlojtq.r÷ovkelhm--tölrtmhomrC,tuõqpwjqmnprb+þtuuûtlzlrrûnjt )ýnouuôjutirrqkhc#(ütsuuôjxrttqkoqxG'ùety|jpuuóyowktprnnmbP&÷tugo~uowuuô|otwkˆnm€g+%þtuuìgryxnvunyj†jp\xwp<$þtuuígs|wtk|mrƒq[ŽivkxA#þtuuìwyjx|t{vtp{€cwsnne"uwùkpw~|puuùtqniuJ!uwïkp{usuwuutrjuk„ uwïyv}yxvwuttzistluwïs~twtuuttwwmvtf%uwït~rutuwttxjuo{xcuwît|rwxtzo}{e‰kmyxeuwívwywxvmyxp’cmƒi|rcuwíq~lxxwgtxhtqprj{rptuwükcwwúylyq~ttûp{iWuwül€cwwôkzuittpw{iuwülcwwõqsujtrfxyfwþuwwül€cwwõdquirpo|mix wükcwwôudpvesp|i&üzxxw wükcwwóuttqtejhxucû{zxxwwükcwwóuttjqtfpm~prû{zzxwwükcwwþuttörqtgtuzf^ü}{zxxwuûst€cuutöjqvrm|nk<ý}{zzwuûox€cuutøpvgtgcü€}{zzwuûg}{huut÷jqunow^ü‚€}{{xwuûistuut÷dp||fuï…‚€}}zzxxwwusju utørppkn‚€{{zxwwuuju ut÷rmx~rmmMƒ€€{{zxxwuxwpu utørtxqnmwð‰†ƒ‚€€}{{zxwo|qu ut÷rqmxtjn\ˆ…‚€€}zxyp~qwuttþuttrqøe}vtjc+‡ýc@9ûsc7úr¼£W6ùm|xj·«5÷Áp|{k¾±[3õÁjp{|me΋1ÁöÀq||rfÊ¥.0þÂÁÁ÷qznliÁÂs/Âójpxlo¼ÂÁ‡+Âöovk¹lh¾˜;,Âõlrt¾homž#+ÂÃôÁpwjÁmnÀ·Q*þÂÃÃûÂlzlÂÂû¿¼Â…)ýnoÃÃôjutiÂÂÁkh¸“û ütsÃÃôjxrÂÂÁkoÁÈŸ'ùety|jpÃÃòyowkÂÀÂnnm·©%÷ÂÃgo~uoÇÃÃô|oÂǽÐnyÌ»˜%þÂÃÃìgryxnvÃnyjϼÀÔ¡¹ÇÀœ$þÂÃÃêgs|wtk|mÂÎÁ±Ó¸ÄªÈ þÂÃÃëÇyjx|t{vÂÀÉ̸ÇÁš¤¹Š!ÃÇùkpw~|pÃÃùÂÀ”ž¼¢!ÃÇïkp{x±ÃÇÃü•‡Ä„ ÃÇïyv„¦ÂÇÃÂÂɵˆ²‰ÃÇï•„‰‰¾ÃÂÂÇÇ¥{ug”ÃÇë¶…£´Š‰®ÂÂȼÃo{xcjÃÇíº…™ÇÈ{ŒÉ¹Ñ½myxe^ÃÇìÀ‹ˆÅȳoyxpÕ¸¾Îi|rcRÃÇëĈŒÈÈÇgtxhÂÁÀÂj{rÀÂÃÇükcÇÇúylyq~ÂÂúp{i¯ÃÇül€cÇÇôkzuiÂÂpw{iŠÃÇülcÇÇôqsujÂÂfxyºcÇþÃÇÇül€cÇÇôdquiÂÀo|m»È ÇükcÇÇóÃdpveËsp|i•üÉÈÈÇ ÇükcÇÇóÃÂÂqte¼hxuc~ÉÈ ÇükcÇÇòÃÂÂjqtfÀm~pÂQÉþÈÇÇükcÇÇþÃÂÂ÷qtgtuzf´üÊÉÉÈÈÇÃûst€cÃÃÂöjqvÂm|n½œþÊÉÉÇÃûox€cÃÃÂ÷pvgtg¸dýÌÊÉÉÇÃûg}{hÃÃÂöjqunoÇ´üÍÌÊÉÉÈÇÃûistÃÃÂ÷dp||fËïÎÍÌËÊÊÉÉÈÈÇÇÃsjà ÃÂøpp½¿ZùÏÎÍÌËËÉÉøÈÇÇÃujà ÃÂ÷mx~r¾¾¥ùÐÎÎÌÌËÉÉÈúÇÃxwpà ÃÂøtxqnmÇyøÑÏÎÍÌÌÊÉÉúÈÇo|qà ÃÂ÷Ámxtj¿²*îÓÑÐÎÍÌÌËÊÉÈyp~qÇÃÂÂþàÂÁøe}vtj¸˜‡ýcj9ûscÐ-7úrçÖ‰6ùm|xjãÙ5÷êp|{kèÞ3õêjp{|meðÉ1êöéq||rfîØK0þëêê÷qznliêë¯/ëójpxloçëêÅ!+ëöovkälhèÖb,ëõlrtèhomëÒ;+ëìôêpwjêmnéëã*þëììûëlzlëëûéçëÄ)ýnoììôjutiëëêkhäÔû# ütsììôjxrëëêkoêíÒ'ùety|jpììòyowkëéënnmã×!%øëìgo~uoììô|oëìèñn€ïæÖ%þëìììgryxnvìnyjñçéôÄØìéÓ$þëììêgs|wtk|mëðêÞóâèËíÒ# þëìììyjx|t{vëéîïäì鱿äÈ+!ìùkpw~|pììùëè§¹ÝÕ! ìúkp{yÒììëú礖âà ìïywƒŠ¼æììëëíÝž’ÖÇ ì龜“‘žàìëëììÃ~uhÔ ìëÕˆºÑ”’Èêëíçìo{xc¡+ ìíÚ‰«ìí„”îäòèmyxe” ììâ”éíÏoyxpõäèði|rc ìëè’€šííìgtxhëêéëj{ré5ë ìülcììúylyq~ëëúp{iÜ+ ìül€cììôkzuiëëpw{iÈ ìülcììôqsujëëfxyåœ ìül€cììôdquiëéo|mæ!í ìükcììôdpveîsp|iÕ!í ìükcììëöqteçhxuc¾þîíí ìükcììëõjqtfém~pëþîíí ìükcììë÷qtgtuzfáîíìûst€cììëöjqvëm|nèÓîíìûox€cììë÷pvgtgäžüïîîííìûg}{hììëöjqunoìá5ïîíìûistììë÷dp||fìÉüðïïîîíìüsjì ìëøppèéŽûñðïïîîíìüujì ìë÷mx~rèèØ-úñððïïîîíìüxwpì ìëøtxqnmì·üòñðïïîíûìo|qì ìë÷êmxtjéßGûóòñðïïîíùyp~qììëëþìë ëêøe}vtjäÖ‡þ :ý³9ýç®9û†ÜÑb8ûqßÙq7ùjÕáy7úTÙÕ–07útÐCd%6úhË&78ùˆ¶#K5ø™<5ù5Â]6ü?ÕH0ý]û ¸® ý1û) üãµ]ü5Íeý81*ù¶ÓÐAû”Èù.¸'úE”å¶ký܃ú6ÿÿ)õE˜ÕÂH zÐ*ýÿÿ+ò&²Ý­M>ÚTXéÿÿþ)'ôYÃÙ§ÒÁBÛÿÿþÞ*÷tÇåÞ!+ºÿÿ-ùƒÛµªõÿÿ-û²òýÿÿûøêM+ü–ýÿÿú·É¸1*ü@âÿÿöð²K>ØÐ(ü(Úÿÿùìãèž)ûAÒÍ'ýµÿÿø­Q!WÔ².ûUàª%÷’÷õÉÂê û–ÉAüZÚ­$ö|ߣDzèúkÕmü†ÛW#ö]‡(zèõdÏ— »ÜP!ýüzèö?©²!ËÒ þüzèö ¢³UÙ†'üyèö˜Ç% ÝZ&üyè ÷ ºÉÀ%üyè ÷ ‡¹hå˜%üyè øƒ¹&»Õ0#û ¡è ø ŽÀKÞŒ#û¼è ùyÀ&ºçJ"û!áÔ ù˜¶\ç“"û(èùœÜèÝ!üZèbû£èç˜!ü½çaû#Ään!üÏÇ*ú,ÄwüPÜ©ûTÉEaû˜ä€úâ¶]úeu|o{ õp}syq|xtþ ûj~txöry{mtszxrþ ûcz|hørtqyzp!ûopoùl}z|n!ûgx|kúupn!úcsuyùjt~ts ûg~stú|z~}i ûttö{p|tts|iûi||õhzyoku{húcr|xxûmzyfútuhþúh|rupûrvzkúotzhþ€úuzn{iúip}syùpt|sk þ…ú}ph{oûo}tjùvs}~tg þ‹ùpyngxt ûqytjøjs|xpk ý„Žøeuttsy ûds|u ùnw~xkü…‰‘ùj}pvp üro lü|ssüƒ‘øcnxkwp ûo{ppödop|}xnoû‚‰’øc|oxwp ûlvxtòps|wps€‘’øf|mxp üu|kóskuy~~{|†‘‘sú{xp ûn}tqöyqu|ƒŒƒývrýxp ûrxwkøts„‘‰€ýevýxpûkp}uù~‡’Œvýmtýwpûr}qjù€‘’ýnjüvwtûlxwpú‡Ž‘‘Œücqjützpû{q|kúŠ’’ügpqüo~jûi{v{ú‘‘Žýgoüglüt|iú„‡‘ýhjüh|vûp|sqúŒ‘þtüstûiuwrú„‘‘Šýhqültûxooú‰‘‹ýpkõn|tyj{xkú„‘Œüfugö{uxpp|lú…Ž‘‘Œüjxo÷r~mvxupû‡‘ücoløk}zlp}uú…‹‘üclúst{vù„…‘‘‰üe{oúm{|kù„‰Ž‘Ž‹ýqt úysuuú€‘Œýut ûq{iú…‹üewt ùkx}ytû‰Ž‘ük}w ùlpv~qú…Š‘üm~yöiztppz|pjú„‘ým~ ös}nn|rù„†Ž‘‰ücn{ôxtvpmu~xrú€‹‘üexxüqyrútvuoú€Œ‘Šüf|rüm~uúl{uyú†‹ügiükyuúlx~vpú‰Ž‘Œügiüo}kúlxyqû‹‘Œügiüuwrùky~{odúƒügiüxyq ùpuotû…ügiüqzr ùtr~~wkú…ˆŽügiütrx ùoz~pk ú€Œ‘‹ügnüj{pùpu}us úŒ‘‰üguük~høgrz|tn ù‡ŽŠüf|xüuxoølt}{zolù}‹Œüexzû{|oxöslz~~xrgjú€ŒŽŠ ührxützp÷yqx|nlú…ŽŒ ümotüqvxöyjo~xsuú… ûkpttüxttñylrv}}{kqˆ ûmpttüpysôjot€…‹ˆ úmpstsük}gòrgq{…ŒŽ‰~qhhnômpdzqxnzk!ú}„Œƒú|plnuômpjylowpn!ø„†‹t{ý|vttóympjxkfk"ò‚‰Šyqttz~õmpl|ef{m"úŒ‰ùyollt|Îeu|o{#*+/279;>@BDFJIp}syVXq|xtaacdejmnnqrsuvyzz{| Îj~tx"&*+/289;>@BDFJIry{mtszxr_aacdejlmnqrsuvwyz{| Ícz|h%**./28:;>@BDFJIMrtqyzp\_`aacdjlmnqqrsvwyz{{ Íopo&+*./38:=?BBDFJIMl}z|nZ[^``acdjlmmoqrsvwyy{{ Ìgx|k&++.039:=?BBDFJIMupnXZ[^``acdejlmoqrsuvwyz{ Ëcsuy"%*./039:=?BBDFJIMjt~tsX[^_``adejlmooqsuvwyzz Ëg~s#%*//079;=@BBDFJItt|z~}iXZ\_``acejlmooqruvwyzz Ëtt $)+./0389;=?DDFJ{p|tts|i[^_``adejlmmorssuvyyz Êi|| $)+./0389;=?DDEJhzyoRku{h^_``adejlmmorrssvyyzÉcr|xx $)+./0389;=?CDEmzyfQRUtuh_``acejllmoqrrsvyyÉh|rup $)+./0389;=?CDrvzkPPRSVotzh_`acdjllmnqrrsvwy€Éuzn{i $)+./0389;=?Cip}syNPQSVWpt|sk`cdejllnqqrruww…É}ph{o $)+./0389;=?Bo}tjMNPQSVWWvs}~tgadejjlnoqqruww‹Èpyngxt $)+./0389;=?qytjJMNNQRUWWXjs|xpkejjlmoqqruv„ŽÇeut tsy $)+./0389;=ds|uEJINNQRUVWX[^nw~xkjjlmoqqru…‰‘Çj}pvp "#&*.03789:=roCEFIMNQRSUWX[[\ll|ssjlmnorsƒ‘Æcnxkwp "#&*.03789:o{ppCEFIMNQQSUWX[[\^dop|}xnonoq‚‰’Æc|oxwp "#&*./3388lvxtBCDFIMMQQRUWXZ[[^`aaps|wpsq€‘’Æf|mxp "#&*./3378u|k@@CDFJIMPQRUVXZ[[^``aaskuy~~{|†‘‘sÈ{xp "#&*./037n}tq?@BDEJIMPQRSVWZZ[\_``adeeyqu|ƒŒƒÑvrxp "#&*./02rxwk>?@BCEJIIPPQSVWXZZ\_``acee÷jts„‘‰€Ðev xp "#&*./0kp}u;=??BCEFIINPQSUWXZZ\__``cee÷jl~‡’ŒvÅmt  wp "#&*./0r}qj;=??BCEFJINPQSUWXZZ\^__`cedejl€‘’Ånjvwt"$&*+.lxwp8:==?BCDEJINNPQSUVWZZ[\_`accdej‡Ž‘‘ŒrÄcqjtzp"$&*+{q|k38:==?BCCEJINNPQSUVVZZ[\_`aacdejŠ’’rûgpqËo~j $&**i{v{37:;=?BCCDFIMNPQRUVVXZ[\^`aaccd‘‘ŽqqÄgogl #&**t|i2379;=>@BCDFIMMNQRSUVXXZ\^_`aac„‡‘nqqûhjËh|v #%*p|sq2279;;>@BCDFJMMNPRSUVXXZ[^_`aacŒ‘noqütËst#%iuwr03239:;>@BBCEJIMNPQSUUWXZ[\_``aa„‘‘ŠnooûhqÌlt"xoo/03238:;=?BBCEJIMNPQRSUWXZ[\^_`aa‰‘‹mooúpkÌn|ty"j{xk.03238:;=?@BCEJIIMPQRSUWWX[\^_``„‘ŒmmooüfugÌ{uxp"p|l*+/03279;=>?BDEEIIMNQRSSVVWZ[\^_`…Ž‘‘ŒlmmnüjxoÇr~mvxup*+/00279;;>?BCDEJIMNPRSSVVWX[\^^`‡‘jlmmncolÈk}zlp}u)*+//0378:;=?@CDEJJINPQRSUVWXZ[\^…‹‘jllmmclÐst{v&)*+//0338::;>@BCDFJIMNQRRSUVWZ[\„…‘‘‰ejllüe{oÈm{|k%))*.//3389:;=?BCCEFJINPQQSSUVXZ[„‰Ž‘Ž‹dejjlqt"Èysuu%&)*.//03789:=>@BCEEFIMNPQRSUVWXZ€‘Œadeejjut$Éq{i%&)*.//02789:;>?BBDEFJINPPRRSUWXZ…‹acdeejewt%Èkx}yt&)*.//027889;>?@BDEFJIMNPQRSUVXZ‰Ž‘_acddeek}wÈlpv~q&&*+//027789;=?@BDDEJIMNPPRUUVV…Š‘_`accejm~yÈiztppz|pj*+.//23789:=?@@DDEFIMNNPQSUUV„‘_`accejm~Ès}nn|r)+.//33778:=>?@CDEFJIMNNQSUU„†Ž‘‰^`aaceecn{Çxtvpmu~xr*+./323789;=??BCDEJIMMNPRSS€‹‘\^_`aaddexxÆqyrtvuo++/022379:=>?BBCDFJIMMPQRS€Œ‘Š[\^_``cdf|rüm~uÌ"l{uy+./32238:;=>@BCDEFJIINQRR†‹Z[^__`ccgiÅkyu "lx~vp+/332379;==@@BCEFJJINPQQ‰Ž‘ŒZ[\^__acgiÅo}k "#lxyq/032379:==?@BCDFJJIMPQQ‹‘ŒXZ[\^__aagiÅuwr"$ky~{od33279:;=?@BCDEFJIMNPƒWXZ[\^^``giüxyqÊ"$&puot3278:;=??@CDEFJIMNP…VWWX[\\^``giüqzrÊ"$&)tr~~wk2389:;>?@BCEFFIIM…ˆŽVVWXZ[\\_`giütrxÊ #%&)*oz~pk79:;>>?@CDEFJJI€Œ‘‹UUVWXZ[\__gnüj{pÊ"$&)*+pu}us89:==>@BCDEFJIŒ‘‰SUVWXZ[[^^guük~hÊ"$%&)*.grz|tn9;=>?@CDDFF‡ŽŠSSUVWXZZ\^f|xüuxoÊ #%%)*../lt}{zol;=?@BCDEF}‹ŒRSSUWXXZ\\exzû{|oxÊ #$%&*..//slz~~xrgj@BCCEE€ŒŽŠQRRSUVWXZ\\hrxützpÑ #%&)*+.//3yqx|nl@BBDD…ŽŒPQQRSUVWWZ[motüqvxÊ #$&)*++//32yjo~xsuBDD…NQQRSUVWWZ[kpttxtt Ì "$%&)*+./0237ylrv}}{kqˆMNPQQRUVVWZZmpttpys Ñ"#%&)**+/032389:jot€…‹ˆMMPPQRSUVVXXmpstsük}g Ê "$%&**+./322789:=rgq{…ŒŽ‰~qhhnPQRSUUWXmpdzqxnzk â"#%%)**./032778:;=>?}„Œƒê|plnuSSUWWmpjylowpn ñ #$%)**+//33ñ789:=>>„†‹t{ý|vttóyWmpjxkfk Ú #$$))*+//033789:;=>‚‰ŠJyqttz~õmpl|ef{m Ù #$%&**+./332378:;;Œ‰EFFJIyollt|Îeu|o{;GJOVZ^bfjkosvwp}sy‡Œq|xt™™œžŸ¡¦§§¬®¯±´·¹¹¼¼ Îj~tx9BGJOV[^bfjkosvwry{mtszxr–™™œžŸ¡¤¦§¬®¯±´¶·¹¼¼ Ícz|h3?GGKOV[_bfjkosvwzrtqyzp‘–—™™œž¡¤¦§¬¬®¯´¶·¹¼¼ Íopo3BJGKOW[_cgkkosvwzl}z|nŽ”——™œž¡¤¦¦©¬®¯´¶··¼¼ Ìgx|k55BJJKRW^_cgkkosvwzupnŒŽ”——™œžŸ¡¤¦©¬®¯±´¶·¹¼ Ëcsuy59?GKNRW^_cgkkosvwzjt~tsŒ”–——™žŸ¡¤¦©©¬¯±´¶·¹¹ Ëg~s/5;?FNNRZ^bcjkkosvwtt|z~}iŒŽ‘–——™œŸ¡¤¦©©¬®±´¶·¹¹ Ëtt37=CJKNRW[^bcgoosv{p|tts|i”–——™žŸ¡¤¦¦©®¯¯±´··¹ Êi||137=CJKNRW[^bcgoorvhzyoku{h”–——™žŸ¡¤¦¦©®®¯¯´··¹Écr|xx137=CJKNRW[^bcgnormzyf†tuh–——™œŸ¡¤¤¦©¬®®¯´··Éh|rup137=CJKNRW[^bcgnorvzk~~„‡otzh–—™œž¡¤¤¦§¬®®¯´¶·€Éuzn{i137=CJKNRW[^bcgnip}sy{~„‡‰pt|sk—œžŸ¡¤¤§¬¬®®±¶¶…É}ph{o137=CJKNRW[^bcgko}tjz{~„‡‰‰vs}~tg™žŸ¡¡¤§©¬¬®±¶¶‹Èpyngxt137=CJKNRW[^bcgqytjvz{{†‰‰Œjs|xpkŸ¡¡¤¦©¬¬®±´„ŽÇeut7tsy137=CJKNRW[^bcds|urvw{{†‡‰Œ”nw~xk¡¡¤¦©¬¬®±…‰‘Çj}p3vp/379;BGKRSZ[^_cronrswz{„†‰Œ‘ll|ss¡¤¦§©®¯ƒ‘Æcnxk1wp/379;BGKRSZ[^_o{ppnrswz{„†‰Œ‘”dop|}xno§©¬‚‰’Æc|ox/wp/379;BGKOSW[[lvxtknoswzz†‰ŒŽ”—™™ps|wps¬€‘’Æf|m3-xp/379;BGKOSWZ[u|kjjnosvwz~†‡ŒŽ”——™™skuy~~{|†‘‘sÈ{1/xp/379;BGKORWZn}tqgjkorvwz~„‡‰ŽŽ‘–——™žŸŸyqu|ƒŒƒÑvr5/1xp/379;BGKNRVrxwkfgjknrvww~~„‡‰ŒŽŽ‘–——™œŸŸ÷¡ts„‘‰€Ðev73/5xp/379;BGKNRkp}ubcggknrsww{~„†‰ŒŽŽ‘––——œŸŸ÷¡¤~‡’ŒvÅmt71/7wp/379;BGKNRr}qjbcggknrsvw{~„†‰ŒŽŽ‘”––—œŸžŸ¡¤€‘’Ånj/353vwt359=BGJKlxwp[_ccgknorvw{{~„†‡‰ŽŽ‘–—™œœžŸ¡‡Ž‘‘Œ®Äcqj/353tzp359=BFJ{q|kW[_ccgknnrvw{{~„†‡‡ŽŽ‘–—™™œžŸ¡Š’’®ûgpq/33Ëo~j357=BFGi{v{WZ_bcgknnoswz{~†‡‡ŒŽ‘”—™™œœž‘‘ެ¬Ägo-/131gl357;BFGt|iVWZ^bcfjknoswzz{„†‡ŒŒŽ‘”–—™™œ„‡‘§¬¬ûhj//11Ëh|v137;?Fp|sqVVZ^bbfjknosvzz{~„†‡ŒŒŽ”–—™™œŒ‘§©¬üt11//Ëst135;?iuwrRSVW^_bfjkknrvwz{~„††‰ŒŽ‘–——™™„‘‘Ч©©ûhq11//Ìlt359xooNRSVW[_bcgkknrvwz{~„†‰ŒŽ‘”–—™™‰‘‹¦©©úpk311//Ìn|ty59j{xkKRSVW[_bcgjknrvwwz~„†‰‰Œ‘”–——„‘Œ¦¦©©üfug11Ì{uxp59p|lFJNRSVZ^bcfgkorrwwz{„„‡‡‰Ž‘”–—…Ž‘‘Œ¤¦¦§üjxo11Çr~m5vxupFJNRRVZ^bbfgknorvwz{~„„‡‡‰Œ‘””—‡‘¡¤¦¦§col311Èk}zlp}uCFJNORSZ[_bcgjnorvvw{~„†‡‰ŒŽ‘”…‹‘¡¤¤¦¦cl11Ð3st{vBCFJNORSW[__bfjknosvwz{„†‡‰Ž‘„…‘‘‰Ÿ¡¤¤üe{o11Èm{|k?CCGKOOSW[^_bcgknnrsvw{~„„†‡ŒŽ„‰Ž‘Ž‹žŸ¡¡¤qt9/11Èysuu?BCGKNORWZ[^_cfjknrrswz{~„†‡‰ŒŽ€‘Œ™žŸŸ¡¡ut=/11Éq{i?BCGKNORVZ[^_bfgkkorsvw{~~„†‰ŒŽ…‹™œžŸŸ¡ewt?/11Èkx}ytBCFKNORVZ[[^bfgjkorsvwz{~„†‡ŒŽ‰Ž‘–™œžžŸŸk}w//11Èlpv~qBBFJNNRVZZ[^bcgjkoorvwz{~~††‡‡…Š‘–—™œœŸ¡m~y//11Èiztppz|pjFJKNOVWZ[^_cgjjoorswz{{~„††‡„‘–—™œœŸ¡m~1/11Ès}n15n|rCJKNOSWZZ[_cfgjnorsvwz{{„††„†Ž‘‰”—™™œŸŸcn{3-11Çxtvp13mu~xrGJKNSVWZ[^bcggknorvwzz{~„„€‹‘‘”–—™™žžexx3-11Æqyr1135tvuoJJNRVVWZ^_cfgkknosvwzz~„€Œ‘Š‘”–——œžf|r5-311üm~u11Ì59l{uyJKOSVVW[_bcfjknorsvww{†‹Ž”––—œœgi5+311Åkyu1//1379lx~vpJOSSVWZ^bccjjknrsvvw{~‰Ž‘ŒŽ‘”––™œgi5+311Åo}k1//1379;lxyqNRSVWZ^_ccgjknosvvwz~‹‘ŒŒŽ‘”––™™gi35/11Åuwr11/11359=ky~{odSSVZ^_bcgjknorsvwz{~ƒ‰ŒŽ‘””——gi35/11üxyq11Ê/11359=BpuotSVZ[_bcggjnorsvwz{~…‡‰‰Œ‘‘”——gi15/11üqzr11Ê/11359=BCtr~~wkVW[^_bfgjknrsswwz…ˆŽ‡‡‰ŒŽ‘‘–—gi13/11ütrx11Ê/11357;?BCGoz~pkZ^_bffgjnorsvvw€Œ‘‹††‡‰ŒŽ‘––gn/3/11üj{p11Ê/113559=BCFJpu}us[^_ccfjknorsvwŒ‘‰„†‡‰ŒŽ””gu/1/11ük~h11Ê/113559=?BCGKgrz|tn^bcfgjnooss‡ŽŠ„„†‡‰ŒŽŽ‘”f|x/1/11üuxo11Ê/113537;??CGKKNlt}{zolbcgjknors}‹Œ„„†‰ŒŒŽ‘‘exz-1/11û{|ox11Ê/113537;=?BGKKNOslz~~xrgjjknnrr€ŒŽŠ„†‡‰ŒŽ‘‘hrx33+11ützp115Ñ7;?BCFJKNOSyqx|nljkkoo…ŽŒ~„†‡‰‰Žmot35+11üqvx11Ê357;=BCFJJNOSVyjo~xsukoo…{„†‡‰‰Žkptt5-11xtt1 13Ì79=?BCGJKORVWZylrv}}{kqˆz{~†‡‡‰ŽŽmptt5/11pys1 1Ñ359;?BCGGJNRSVW[^_jot€…‹ˆzz~~„†‡‡ŒŒmpsts11ük}g1 1Ê/1379=?BFGJKOSVVZ[^_crgq{…ŒŽ‰~qhhn~„††‰Œmpdzq31xnzk1 1â/1359;??CFGKNRSVZZ[_bcfg}„Œƒê|plnu„„†‰‰mpjyl31owpn1 1à-/157;=?CFGJNOSSWZ[^_cff„†‹t{ý|vttóy‰mp1jxk1fk1 1Ú-/137;==CCFJNORSWZ[^_bcf‚‰Švyqttz~õmp/l|e1f{m1 1/Ù1357;=?BFGJKOSSVWZ[_bbŒ‰rssvwyollt|ú#Âßh õƒã¤gÙÇ. ûgå’ö(ÒØKPÔÅ? ûÕÛ!ø¢ç¦TÏÔE!ûç—ù,çâÔÜ_!û&Ìßeú†çæƒ!ú±çÀ ù±ç㘠û?åçœø’àÖãáP û¼çç5ögܨ çßPûWÜæÙõ8×Ê#¼çÙHú¯ÙƵû1ÐÒ0ú3¹çæHþúFᆪzû!µØKú#ºçØOþ.úÁÐFÕYúŽánù²çà‹ þjúã–0ØAû]⣠ù­áåº& þØù˜Ñ7.Æ* û>ͺø‡ÜçÐ ýåøêtª û²Ü8 ù:ÇåçÅ]ü¹èùgã5®£ ü”çƒ ø*pççݤ1üYàèøŒÆ µ¦ ûJÙ”ö™ÜæãÉh%û ¿çèøÜzƦ û&ÃÉ#òa¡àççËEçèèø.ÙMѦ ü¦àFó <žÑääÛÒÒçèßø²±Ѧ ûHâœöŽ¶ÚæåèèÚýÅwýѦ û.ÄÈ!øUÈçèççý!ÄýѦû™áFù«èèÚ½ý­ýÁ£ûMß—ù8çèèýOü­Á#ûÉÃ%ú˜çèÜRü™7ü}Ñ8û‹ßhú×èè¸ü<™üEåYû?Ú³ú‡äèæsýA–ü*çeü®Û3ú°èèÜýEü%ܵûbß úJÜèè²þ¶ü ¤æû#ÁÅúnçèæRýF“üæ1ûçeúÌçè¿!ý£.õ_ݰÛÄú çèè˜ü,½ö¿Ð5€à_úˆæèÜEüd½÷†åt&Ͼû¼èèÓü”wøáÑ%™á7úPÙèèˆüèwúç³Ø¶ù žçèè*ü#ÖHúEÖçáOùÁèè¹ý©¸ úå±ú(çèè€ýÁ¹ ûžæÚCúnçèß_ü!ʃ ù0ÉàçÇûÐçè¿üvá5 ùgç|Âå“ú0×èè ü„åöЮPÓÝqú“åèè%ýƒå ö8ãpdçÞCù®çèàüŒÑô°Æ«åÇ>úFàèèŽü!ϱü:Иú¶æ¿*úMæèè_ü,áüvãú5Òç¼úŠçèÕ>ü1èWüϪú1ÆåÀ<úßçè©ü1èUüEàPú:ÉçÏPûàçæŽü1èUü­Á#ù3Ëå×qú æèáOü1èUüÑ— ù.«çç‹!û³çèÚü1èUügÔE ù™åä¾5ú&Æçè¼ü1èUü ¦Ê ù_Óçäk úpçèèOü1èeü<ØpùO½çã¾J únåèè:ü1è›üWä7ø”ÙçÚˆ3 ù ¶çèÊ#ü*ܶü£ÀøF¯á×Òƒ(ùççè”ü!ÌÍûÜŒöeÔääÑyúæçèŠ üpÊü0ÔR÷ÌççÜ5úqçèÙF ü (¼ü›Æ ö5zäçæÍ²>ú°çèÉ ûa¶eü¶´ñwÅãçãÓ_OÑæè¸ û<†ªü<ÐJüz®ççüæè¦ ú<&»ümãú8’ÕáççúÝ.#ô<ÕFÌ !üæççúÛ—dô<Êp ¶ˆ!ø°åèè’Öççîßž¢b <dÃçj"ò(Íçè}Y³¾Ôåççèõ<OÜ!ÙK"ú?èçèmùEz}¨Üç竃‹’”‘  !!vx%&''(+-02257:<>ACCGHJJKMPRRT‰”’ €¾ !t€w%%&'(+-022577:>AACGHIJKMPRRT†Ž’”Ž•  !pv%%&''(+002557:<>AAEHIJJMPRRTˆ“’Œ  m€v#%&&'(+-00557:<>AAEGIIJKPRRT…Œ’”Ž €È jx##%&'(+-002557<>>AEGHIJKPRRT…‰“’  ix##%&&'+--02257:<>ACGHIIKMPRT„‘”Œ  ix##%&&'(+-02257:<>>CGHIIKMPRTˆ“‘‹ Œiy!"##%&'(++00257:<AAEHJMMif’ m|| !""#%&'(++-02577>AAEHJkkt€’Ç m|{y !""#%&&'((+-0255:>AGIJMzttðsddho ðjpplttûuy}€íznjmq027:<EHIJypllsz~|{| ä{sllnt!""#%%&(++-257:<>EHHJ÷rmfgotvvxxúy{{yyxxÞvtot€qjt !!"##%&'(++0057<>ACCHÇ {xwwxyp€p !!"##%&'(++0027<>ACCGÈ p€p !!"##%'((+-025:>AACGÝ r~t~  "ï#%&'((+-057<>AAEî ús}x{è !!"#%&''++027:<>AEÉ u|zq !!"%&&'(+-05:<<>C Ê w{{m !"#%&&((+057:<>C Ê {zi !"#%&&'(+027:<>A Þ ziî !"#%%&&'(-022:: Ê z€i "##%%&'(+0227: Ì z€i !"##%%&(+-0277 ú ñ ziûï !"##%&'(-0055 ò ôwrú !""ö#%&(+--22 Ï wy !!""#&'(+-00 ä t€xð !!"#%&(++-0 ã pxï !!"#%&'(+--ó  ßg| !""#%&&'(-Ð g}!!"#%%&&(+üú   àg}!!""#%%&'+Ñ g} !"##%%&(õ  ì i}}yú !"##ý%'ö   ä mz~t !"##þ&þú  ß rwu !!""#%Û xps !""þ#Õ mt "#× mt ""Ù mt !"ì n~twð !ýÝ p}xu  Ù ty|q Ýxw~l Þ u€k þßuk ßuk ßurv lhàtxp qpp{át|j sogfrxx||zéd€e tnlox~ú|tqp{óde qttýx}ú|qjmxö|vmjjkntsõstnkjxx~ý}xttõrû}{xtqqrtrqûsx|}î|vnlns{ã}~€ƒ‹’”‘……†‡ˆ‰‰Š‹ŒŠŠ‹‹ŒŽ‘ôvx”•––—˜˜™šš›ÜœžžŸ ¢¢£¤ª¬«­|}€‰”’……†‡‡ˆ‰Š‹ŒŠŠú‹ŒŽó‘t€w””•–—˜˜™šš›מŸ ¡¢£¤ª¬«­|}~†Ž’”Ž•……†‡‡ˆ‰‰Š‹ŠŠ‹‹Œò‘pv””•––—˜™™šš›þœן ¡¢¢¤©««­|}~ˆ“’Œƒ„……†‡ˆˆ‰Š‹ŒŠŠ‹ŒŽím€v“”••–—˜˜™™šš››œŸ¡å¢£©««­{|…Œ’”Ž‚ƒ„……††‡ˆ‰Š‹ŒøŠ‹ŒŽòjx““”•–—˜˜™™ššý›œŸÙ ¡¢£©««­{…‰“’‚ƒ„……††‡ˆˆ‰‹ŒŒŠŠ‹ŽŽöix““”••–˜˜þ™šš›èœžŸ ¡¡£¥ª«­{„‘”Œ‚ƒ„……ˆˆ‰Š‹ŒŠŠ‹ŒŽòix““”••–—˜˜™šš›ÔœžŸ ¡¡£¥ª«­{ˆ“‘‹€‚ƒ„……††‡ˆ‰Š‹‹ŒŒŠ‹Œ´iy‘’““”•–—˜˜™™šš››œœžžŸ ¡¤©ª«­†Œ‘“’€€‚ƒ„……††‡ˆ‰Š‹‹ŒŒŠ‹ŒŽiy‘’““”•–—˜˜â™šš››œœžžŸŸ¡£¥ª«­…“’€€‚ƒ„……ú†‡ˆ‰Š‹‹êŒŠ‹ŒŽŽi|‘‘’“”•–—˜˜™þš››èœžžŸŸ¡£¥©«­Š‘“Œ~€‚ƒ„……†ã‡ˆŠŠ‹‹ŒŒŠŒŒŽŽi{‘‘’““”•——˜˜ü™šš››èžžŸ¡£¥©«¬Ž’’Œ}~€‚ƒ„……܆‡ˆ‰ŠŠ‹‹ŒŠ‹ŒŒŽŽi|‘’’“”•–——˜˜™šš››㞟 £¤©ª¬“}~€‚ƒ„„……†‡ˆ‰ŠŠè‹ŒŠ‹ŒŒŽi|‘’“”•–——˜˜ý™š››鞟 ¢¤¥ª¬‘’|}}~€‚ƒ„„……ↈ‰‰ŠŠ‹‹ŒŠ‹‹ŒŽi|‘’’“•––—˜˜ú™šš››꟠¢¤¥if’{|}}~€‚ƒƒ„……ↇˆ‰ŠŠ‹‹ŒŠ‹ŒŽm||‘’’“”•–—˜˜ú™šš››ÅŸ ¢kkt€’z{{|}~~€‚ƒ„„……†‡ˆˆ‰‰Š‹ŒŠŠŒm|{y‘’’“”••–——˜˜™ššø›œžqsw«‘Šz{{|}}~€‚ƒ„„……†‡ˆˆ‰‰Š‹ŒŠŠŒŒn{}x‘‘’“””••–—˜˜™ššylht}~|vrd’yz{|}}~€‚‚ƒ„……†‡ˆˆß‰Š‹ŒŠŠŒŒqy|t‘‘’’“””•––—˜˜torz“xoky¤©Œwyz{{|}~€‚‚ƒ„„……‡‡ˆˆ‰‰Š‹Š‹‹Œwu}s‘’““”rhfpvy{{zthit ¢£¥opyzz{||}~€‚ƒƒ„……†‡‡ˆˆ‰Š‹ŒŠ‹‹{q~pŽøytnls|€ù{qqp›œùŸ¡¢¤zttðsddho€‚ƒ„……†‡‡ðˆ‰Š‹ŒŠŠ‹jpplttûuy}€íznjmq™š››œœŸ ¡£u{ü|xpjjþlnnpnjümtzý|xttû”•–—˜˜š›òœŸ ¡¢ypllsz~|{| ñ{sllnt‘’’“””•—˜˜š›íœŸ  ¢suvwrmfgotvvxxúy{{yyxxövtot€qjt‘™’““”•–—˜˜™™š›œžž rsvwwy{{|}~€€‚ƒ„{xwwxyˆ‰ŠŠ‹‹ŒŠp€pŽ‘‘’““”•–—˜˜™™š›œžžŸrsuvwyz{{|~€‚ƒ„……‡ˆð‰ŠŠ‹ŒŒŠp€pŒŽŽ‘ò’““”–——˜˜™šš›ꞟrsuvwwzz{|}~€‚ƒ„……†í‡ˆ‰‰ŠŠ‹ŒŒr~t~ŽŽ’ó“”•–——˜˜™š›œêŸqsuvvwyyz{|}~~€€‚ƒ„……†ý‡ˆ‰‰‹úŒs}x{ýŽ‘Ú’“”•––˜˜™š››œŸqrsuvwwyyz|}}~€‚ƒ„……†í‡ˆ‰‰ŠŠ‹Œu|zqŒŒŽŽ‘Ú’”••–—˜˜™š›œœžqrsuvvwwyz{|}}€‚ƒ„„……놇‡ˆˆ‰ŠŠ‹w{{m‹ŒŒŽÙ‘’“”••——˜™š››œžqrsuvvwwyz{|}}~€‚ƒƒ„……†®‡ˆˆ‰ŠŠ‹{zi‹ŒŒŽŽ‘’“”••–—˜™š››œoqrsuuwwyz{|}}€€‚‚ƒ„„……†‡ˆˆŠŠ‹‹Œzi‹‹ŒŽÁ‘’“””••–—˜™šš››norssuwwyz{|}}~€‚‚ƒ„„……†‡ˆˆ‰ŠŠ‹Œz€i‹‹ŒŒŽŽž’““””•–—˜™šš››noqrssvwwy{||}~~€€‚‚ƒ„„…†‡‡ˆ‰‰Š‹‹z€iŠŠ‹ŒŽŽ‘’““””•—˜˜™š››mnoqrsvvwyz{||}~~€ƒñ„……†‡‡ˆ‰‰Š‹ziŠŠû‹ŒŽŽá‘’““”•–—˜™™ššmnoqrruuvwyz{{}}ò~€€‚‚ƒ„……††ˆˆô‰ŠwrŠŠ‹ŒúŽ‘’’û“”•—˜˜šålmnoqqsuuvyzz{||}~~€€‚‚ƒ……Á†‡‡ˆ‰‰wyŒŠ‹‹ŒŒŽ‘‘’’“•–—˜˜™™jlnooqssuvwyzz{||}~€‚ƒ„……ñ†‡‡ˆ‰t€xŒŒŠ‹ŒŒþŽ‘ú’“”•—˜˜ã™jlmnoqssuvwyzz{||}~~‚ƒ„……ð†‡‡ˆ‰px‹ŒŒŠ‹‹ŒŒòŽ‘‘’“”•–—˜˜ûlmnoqqërsuvwyyz{{|~€€‚„……솇ˆg|‹‹ŒŠŠ‹‹ŒŽÙ‘’’“”••–—˜jlnooqqrrsvwwyzz{|}~€€‚ƒ„……ˆ‡‡g}‹‹ŒŠ‹‹ŒŒŽ‘‘’“””••—˜jlmnooqqrsuvwwyz{|}~ú€‚ƒ„……Û†‡g}Š‹‹ŒŠŠ‹ŒŒŽ‘‘’’“””•–˜ejlmnooéqrsuvwyyz{|}~~€‚ƒ„„……݆g}ŠŠ‹‹ŒŠŠ‹‹ŒŽŽ‘’““””•—ejlmnnéoqrsuvvwyyz{|}~~€‚ƒ„„…î†i}}y‰Š‹ŒŒŠ‹‹ŒŽŽý‘’““á”–dejlmmnnoqrsuuwwyz{|}}~~€‚ƒƒ„…ìmz~t‰‰Š‹ŒŒŠŠ‹‹ŒŽŽý‘’““é•cdjllmmnnorssuvvwyz{|}}ú~€‚ƒƒè„……rwuˆ‰ŠŠ‹ŒŒŠŠ‹ŒŒ‘’ø“”cdejlmmÏnoqrsuvvwyz{||}}~€‚‚ƒƒ„„…xpsˆ‰‰Š‹ŒŒŠ‹‹Œþ‘’’Ä“acdejjmmnoqrssuuvwyz{{|}}~€€‚ƒƒ„……mt‡ˆˆ‰ŠŠ‹ŒŒŠŠ‹ŒŒŽñ’“acdejjlmnoqrssÓuvwyz{{||}~€€‚‚ƒ„……mt‡‡ˆ‰ŠŠ‹ŒŒŠ‹‹ŒŽ’Ä`adeejllmnoqrrssuvwyzz||}}~€‚‚ƒƒ„…mt†‡ˆˆ‰ŠŠ‹‹ŒŠŠ‹‹ŒŽÒ‘’`acdeejlmnoqqrrsuvwyyz{{|}~~‚ƒ„„n~tw†‡ˆ‰‰‹ôŒŠŠ‹ŒŒŽã‘_`acddjjlmnoqqrrsuvwyyz{{|}~~Ѐ‚ƒ„p}xu…†‡ˆˆ‰ŠŠ‹‹ŒŠŠ‹‹ŒŽŽ^_accdeejlmnoqq€­rsuvwyzz{{|}~~€€‚ƒty|q…††‡ˆˆ‰ŠŠ‹ŒŒŠ‹‹ŒŽŽ^_`acceejlmnooqqrsuvwwyzz{||}}€€‚‚xw~l……†‡‡ˆ‰‰ŠŠ‹ŒŠŠ‹ŒŒŽŽ^_`accdeejmnnooqqruvvwyyz{{|}}€‚ƒu€k……††‡‡ˆ‰‰Š‹ŒŒŠŠ‹‹ŒŽŽÕ\^_`aacddelmmnooqrsuvvyyzz{||}~~€€‚uk„……†ð‡ˆˆ‰Š‹‹ŒŠŠ‹ŒŒÖ[\_``accdejlmmooqrsuvvwyyz{||}~~€uk„……†‡òˆ‰ŠŠ‹‹ŒŠ‹ŒŒÕ[\^_``acdejlmmnooqsuuvwwyzz{||}}~€€urv„……ц‡‡ˆˆ‰ŠŠ‹ŒŒŠŠ‹ŒŒlhZ[\^_`aacdejllnnoqrsuuvwwyz{{}õ~€€txpƒ„……†Ù‡ˆ‰‰ŠŠ‹ŒŒŠqpp{Z[\^__`aacdejlmmnoqrssvvìwyzz{||}}~€t|jƒ„„……†Ã‡ˆ‰sogfrxx||zXZ[\^^``acdejjlmmnqrrsuuvwwyzz{||}~~d€e‚ƒ„„……ø†tnlox~Ì|tqp{WX[\\^__`acdejllmnoqrrsuuvwyyz{{||}~de‚‚ƒ„qttýx}ú|qjmxŠŠÔ|vmjjkntsacdeellmnoqrrsuuvwwyyz{{stnkjxx~ý}xttõrŠŠ‹ŒŒŠŠû}{xtqqrtrqûsx|}î|vnlns{‡‡ˆˆ‰Š‹‹ŒŒö½¾¿¿ƒ‹’”‘ÄÄïÅÆÇÇÈÉÊÊËËÌÌÍÎÏÐÑÑÒõvxÔÕÖÖ×ÖÖÕÕÔÓÒíÓÕÕÖÖÙÛÙÛ¼½¿¿‰”’ÄÄÅùÆÇÈÉÊÊËËúÌÍÎÏÐÑÑôÒt€wÔÔÕÖ×ÖÖÕÕÔÓÒíÓÔÕÖÖÙÛÙÛ¼½¾†Ž’”Ž•ÄÄÅðÆÇÇÈÉÊÊËËÌÌÍÎÐÐÑÑôÒpvÔÔÕÖÖ×ÖÕÕÔÓÒìÓÔÕÕÖ×ÙÙÛ¼½¾ˆ“’ŒÂÃÄÄùÅÆÆÇÈÉÊÊËùÌÍÎÏÐÐÑÑòm€vÔÔÕÕÖ×ÖÖÕÕÔÔÓÒÔïÕÖ×ÙÙÛ¼¼…Œ’”ŽÁÂÃÄÄúÅÆÇÈÉÊÊøËÌÍÎÏÐÐÑÑüjxÔÔúÕÖ×ÖÖÕÕÔÓÒíÓÔÕÖ×ÙÙÛ¼…‰“’ÁÂÃÄÄúÅÆÆÇÉÊÊËúÌÎÏÏÐÑÑüixÔÔÕÖÕÔÓÒíÓÔÔÖØÙÙÛ¼„‘”ŒÁÂÃÄÄùÅÆÆÇÈÉÊÊËúÌÍÎÏÐÑÑüixÔÔÕûÖ×ÖÖÕÕÔÓÒëÓÔÔÖØÙÙÛ¼ˆ“‘‹¿ÀÀÁÂÃÄÄùÅÆÇÈÉÉÊÊúËÌÍÎÎÐÐúiyÒÓÔÔúÕÖ×ÖÖÕÕÔÓÒìÓÔÖ×ÙÙÛ†Œ‘“’¿¿ÀÁÂÃÄÄùÅÆÇÈÉÉÊÊòËÌÍÎÎÏÐÐiyÒÓÔÔüÕÖ×ÖÖÕÔÓÒôÔÖØÙÙÛ…“’¿¿ûÀÁÂÃÄÄûÅÆÇÈÉÉÊìËÌÍÎÎÏÏÐi|ÒÒÓÔÔÕÖ×ÖÖÕþÔÓÓÒíÔÖØ×ÙÛŠ‘“Œ¾¿¿ÀÁÂÃÄÄùÅÆÈÈÉÉÊÊòËÍÍÎÏÏÐi{ÒÒÓÔÔüÕ××ÖÖÕÔÓÒóÔÖØ×ÙÛŽ’’Œ½¾¿¿ûÀÁÂÃÄÄÚÅÆÇÈÈÉÉÊÊËÌÍÍÎÏÏi|ÑÒÓÓÔÔÕÖ××ÖÖÕÕÔÔÓÓÒÒóÓÖÖ×ÙÛ“½¾¿¿úÀÁÂÃÃÄÄüÅÆÇÈÈèÉÊÊËÌÍÍÎÎÏi|ÑÑÒÓÔÔÕÖ××ÖÖþÕÔÔþÓÒÒëÓÕÖØÙÛ‘’¼½½¾¿¿ÀÁÂÃÃÄÄãÆÇÇÈÈÉÉÊËÌÌÍÎÎÏi|ÑÑÒÓÓÔÕÖÖ×ÖÖÕÔÓÒëÓÕÖØif’¼¼½½¾¿¿ÀÁÂÂÃÄÄãÅÆÇÈÈÉÉÊÊËÌÍÎÎÏm||ÑÑÒÓÓÔÔÕÖ×ÖÖÕÔþÓÒÒöÓÕkkt€’¹¼¼õ½¾¾¿¿ÀÁÂÃÃÄÄÕÅÆÆÇÇÈÉÊÊËËÍÎÎm|{yÑÒÓÓÔÔÕÕÖ××ÖÖÕÕÔÔÓÓÒÒqswü‘й¼¼½÷¾¿¿ÀÁÂÃÃÄÄéÅÆÆÇÇÈÉÊÊËËÍÍÎn{}xÑÒÒÓÔÔÕÝÖ×ÖÖÕÕÔylht}~|vrd’·¹¼¼½½¾¿¿ÀÁÁÂÃÄÄþÅÆÆìÇÈÉÊÊËËÍÍÎqy|tÑÒÒÓÓÔÔõÕÖÖ×ÖÖtorzõxokyÖ׌¶·¹¼¼Ü½¾¿¿ÀÁÁÂÃÃÄÄÅÅÆÆÇÇÈÉÊÊËÌÌÍwu}sÐÑÑÒÓÔÔçrhfpvy{{zthitÓÕÖØop·¹¹¼¼ö½¾¿¿ÀÁÂÂÃÄÄÅÆüÇÈÉÊÊ÷ËÌÌ{q~pÏÑÑøytnls|€ú{qqpÔÓÓÒúÔÕÖzttósddho¿¿ÀÀÁÂÃÄÄÅûÆÇÈÉÊÊËùÌjpplttûuy}€÷znjmqÕÕÔÓÓÒúÓÔÖu{ü|xpjjþlnnpnjümtzý|xttûÔÕÖ×ÖÖýÕÔÓÓôÒÓÔÕypllsz~|{| ö{sllntÒÓÓÔÔýÕ×ÖÖüÕÔÔÓÓïÒÓÓÕ¯±´¶rmfgotvvxxúy{{yyxxövtot€qjtÐÑÑÒþÓÔÔôÕÖ×ÖÖÕÕÔÔÓÓÒÒøÓ®¯´¶¶·¼¼ý½¾¿¿ïÀÁÂÃ{xwwxyÆÇÈÈÉÉÊÊòËp€pÎÏÐÐÑÑÒÒÓÔÔúÕÖ×ÖÖÕÕüÔÓÓÒÒø®¯±´¶·¹¼¼þ¾¿¿ÀüÁÂÃÄÄÅÆûÇÈÈÉÊÊ÷Ëp€pÍÏÏÐÑÑÒþÓÔÔõÖ××ÖÖÕÕÔÓÓÒÒ󮯱´¶¶¹¹¼¼½¾¿¿ûÀÁÂÃÄÄøÅÆÇÇÈÈÉÊÊ÷r~t~ÎÏÏÐÑÑÓÔôÕÖ××ÖÖÕÔÔÓÓÒÒ묯±´´¶··¹¼¼½¾¾¿¿ÀÁÂÃÄÄýÅÆÇÇÉúÊs}x{ÎÎýÏÐÑÑÒûÓÔÔÕÖÖÕþÔÓÓÒñ¬®¯±´¶¶··¹¼½½¾¿¿ûÀÁÂÃÄÄíÅÆÇÇÈÈÉÊu|zqÍÍÎÏÏÐÑÑÒõÓÔÕÕÖ×ÖÖÕÔÓÓðÒ¬®¯±´´¶¶·¹¼¼½½¿¿úÀÁÂÃÃÄÄÅÆðÇÈÈÉw{{mÌÍÍÎÏÐÐÑÑóÒÓÔÔÕÕ××ÖÕÔÔÓÓïÒ¬®¯±´´¶¶·¹¼¼½½¾¿¿ûÁÂÂÃÄÄÞÅÆÆÇÈÈÉ{ziÌÍÍÎÏÏÐÐÑÑÒÓÔÔÕÕÖ×ÖÕÕÔÓÓðÒ©¬®¯±±¶¶·¹¼¼½½¿¿ùÀÁÁÂÃÃÄÄîÅÆÆÈÈÉÉÊziÌÌÍÎÎÏÐÐÑýÒÓÔÔÕüÖ×ÖÕÕÓð§©®¯¯±¶¶·¹¼¼½½¾¿¿ùÀÁÁÂÃÃÄÄëÅÆÆÇÈÈÉÊz€iÌÌÍÍÎÏÏÐÐÑÑþÓÔÔûÕÖ×ÖÕÕóÔÓ§©¬®¯¯´¶¶·¼¼ü½¾¾¿¿ÞÀÁÁÂÃÃÄÄÅÅÆÇÇÈÉÉz€iËËÌÍÎÎÏÏÐÐÑÑÒÓÔÔìÕ×ÖÖÕÕÔÔ¦§©¬®¯´´¶·¹¼¼ú½¾¾¿¿ÀÀÂþÃÄÄÅ÷ÆÇÇÈÉziËËûÌÍÎÎÏÏúÐÑÑÒÓÔÔéÕÖ×ÖÕÕÔÔ¦§©¬®®±±´¶·¹¼¼½½þ¾¿¿úÀÁÁÂÃÄÄÆôÇÈwrÊÊËËÌÍÎÎúÏÐÑÑÒÓÓÔýÕ×ÖÖÕò¤¦§©¬¬¯±±´·¹¹¼¼ü½¾¾¿¿ûÀÁÁÂÄÄÅùÆÇÇwyÊÊÚËÌÌÍÍÎÎÏÐÑÑÒÒÓÓÔÕÖ×ÖÖÕÕ¡¤§©©¬¯¯±´¶·¹¹¼¼ý½¾¿¿ÀüÁÂÃÄÄÅúÆÇt€xÊÊýËÌÍÍÎþÏÑÑÒúÓÔÔÕ×ÖÖðÕ¡¤¦§©¬¯¯±´¶·¹¹¼¼õ½¾¾¿¿ÀÀÁÂÃÄÄÅùÆÇpxÉÊÊüËÌÌÍÍòÎÏÐÑÑÒÒÓÔÔÕÖ×ÖÖû¤¦§©¬¬÷®¯±´¶··¹¼¼þ¾¿¿ÀýÁÃÄÄíÅÆg|ÉÉÊÊËËÌÌÍÎÎÏÐÑÑáÒÓÓÔÔÕÕÖ×Ö¡¤§©©¬¬®®¯´¶¶·¹¹¼¼½¾¿¿ûÀÁÂÃÄÄÅúg}ÉÉÊÊñËÌÌÍÍÎÏÐÐÑÑÒÒÓÔÔÕé×Ö¡¤¦§©©¬¬®¯±´¶¶·¹¼¼½¾¿¿ûÀÁÂÃÄÄçÅg}ÈÉÉÊÊËËÌÍÍÎÎÏÐÐÑÒÒÓÓÔÔ÷ÕÖÖŸ¡¤¦§©©ñ¬®¯±´¶··¹¼¼½¾¾¿¿úÀÁÂÃÃÄÄèg}ÈÈÉÉÊÊËËÌÌÍÎÏÏÐÐÑÑÒÓÔÔùÕן¡¤¦§§ï©¬®¯±´´¶··¹¼¼½¾¾¿¿üÀÁÂÃÃÄøi}}yÇÈÉÊÊúËÌÌÍÎÏÏÑýÒÓÔÔâÖžŸ¡¤¦¦§§©¬®¯±±¶¶·¹¼¼½½¾¾¿¿ÀÁÂÂÃÄ÷mz~tÇÇÈÉÊÊËÌûÍÎÏÏÑÑýÒÓÔÔéÕœž¡¤¤¦¦§§©®¯¯±´´¶·¹¼¼½½ú¾¿¿ÀÁÂÂóÃÄÄrwuÆÇÈÈÉÊÊËùÌÍÍÎÎÐÑÑÒÓÔúœžŸ¡¤¦¦ô§©¬®¯±´´¶·¹¼¼½ë¾¿¿ÀÁÁÂÂÃÃÄxpsÆÇÇÈÉÊÊ÷ËÌÌÍÎÎÐÐÑÑþÒÓÓêÔ™œžŸ¡¡¦¦§©¬®¯¯±±´¶·¹¼¼½þ¾¿¿îÀÁÂÂÃÄÄmtÅÆÆÇÈÈÉÊÊËøÌÍÍÎÎÏÐÑÑñÓÔ™œžŸ¡¡¤¦§©¬®¯¯ú±´¶·¹¼¼ý½¾¿¿ÁñÂÃÄÄmtÅÅÆÇÈÈÉÊÊöËÌÌÍÎÎÏÐÐÑÑÓä—™žŸŸ¡¤¤¦§©¬®®¯¯±´¶·¹¹¼¼½½¾¿¿ÁÂæÃÄmtÄÅÆÆÇÈÈÉÉÊÊËËÌÌÍÎÎÏÐÑÑçÒÓ—™œžŸŸ¡¤¦§©¬¬®®¯±´¶··¹¼¼í½¾¾¿¿ÀÀÁÂÃÃn~twÄÅÆÇÇÉÊËøÌÍÍÎÎÏÐÑÑçÒ–—™œžž¡¡¤¦§©¬¬®®¯±´¶··¹¼¼þ½¾¾Ð¿ÀÀÁÂÃp}xuÄÄÅÆÆÇÈÈÉÉÊÊËËÌÌÍÎÏÏÐÐÑÑ”–™œœžŸŸ¡¤¦§©¬¬÷®¯±´¶·¹¹¼¼ò½¾¾¿¿ÀÀÁÂty|qÄÄøÅÆÆÇÈÈÉÊÊÜËÌÌÍÎÏÏÐÐÑ”–—™œœŸŸ¡¤¦§©©¬¬®¯±´¶¶·¹¹¼¼½¿øÀÁÁxw~lÄÄÅùÆÇÇÈÈÉÊÊËÞÌÍÍÎÏÏÐД–—™œœžŸŸ¡¦§§©©¬¬®±´´¶··¹¼¼½¿ÀúÁÂu€kÄÄÅúÆÇÇÈÉÊÊËÌýÍÎÏÏäБ”–—™™œžžŸ¤¦¦§©©¬®¯±´´··¹¹¼¼ü½¾¾¿¿ùÀÁukÃÄÄøÅÆÆÇÈÉÉÊÊËüÌÍÍÎÎå‘–——™œœžŸ¡¤¦¦©©¬®¯±´´¶··¹¼¼ü½¾¾¿¿ÀûukÃÄÄÅùÆÇÈÈÉÉÊÊûËÌÍÍÎÎä‘”–——™œžŸ¡¤¦¦§©©¬¯±±´¶¶·¹¹¼¼½þ¾¿¿ùÀurvÃÄÄÅÆûÇÈÈÉÊÊËßÌÍÍlhŽ‘”–—™™œžŸ¡¤¤§§©¬®¯±±´¶¶·¹¼¼½þ¾¿¿ùtxpÂÃÄÄøÅÆÇÇÈÈÉÊÊãËqpp{Ž‘”––—™™œžŸ¡¤¦¦§©¬®¯¯´´û¶·¹¹¼¼½õ¾¿¿t|jÂÃÃÄÄÒÅÆÇsogfrxx||zŒŽ‘””——™œžŸ¡¡¤¦¦§¬®®¯±±´¶¶·¹¹¼¼ó½¾¾¿d€eÁÂÃÃÄÄùtnlox~Ü|tqp{‰Œ‘‘”––—™œžŸ¡¤¤¦§©¬®®¯±±´¶··¹¼¼ó½¾¿deÁÁÂÃqttýx}ú|qjmxËËÔ|vmjjknts™œžŸŸ¤¤¦§©¬®®¯±±´¶¶··¹¼¼stnkjxx~ý}xttûrÈÈÉÊÊËû}{xtqqrtrqûsx|}ð|vnlns{ÅÅÆÆÇÈÉÉÊÊú0ËèèÊü¡èƒú¢çèäbü–è ù*åèè¤üwè ú èèÝCügè úK×èè¸üZç½ý èèþ7üYç½ù.áèè üYçÐú§èèÚTüYèÓù<×èçÀüYèÕú–èèãüYèÜúÐèè¾üYèÜûãçãdüYèáûÞç¾üYèáüèåŒüYçáû çÕüEÛàù*m®èèvûEÚÚ÷F®ÉæèèÙ3ûCØâ0ò5R¨âåèÜÆk”û1ÍÞO ñ.–¤ÒçèçÎ\bû¸ákð %,RÁÓÙææÛÖ¡:%ý„Cû¦ã†ñ 5n€¡ÚèèççÖ§”*ùçÔ¿¾Œ.ë£ç˜t±¾ÁÐâèçææÑsZ? ý¿ÕççõèçÖ¸|aa_aPJJþE<<üHJK__úh˜ÍèèççøèàÈ»»ˆ%ø J||žÏäççþßÛÛø×ÒÓÓÙÛÜçç÷èçØ›||e%÷ %&>޲¸ÏÏùÐÕØØÕÒÏÏö̱“:³è© )ù &<<&ü¢é¦;ü¡è¢;ûã®:ûtá»:ûRßÏ1:û&Ù×<:ûÖçP;üÖèR;üÖèR;üÖèR;üÖèR;ü¾çt;ü±ç«;ü†è¸;üTçÂ;ü5çÜ;ü5çã;ü5çã;ü5çâ;û1áã:û#Ïå_:û¶æz:û“çž;ü‡è¶;ü‡çµ;ü‡çµ;ûå¼ :ûjàË,:û7ÑÙK:ûÇåj;üÃèt;üÃèt;üÃçt;û¤è”ý:O#ûŠç¼úH›œØç#ûAçÙ ó&*zÏÒÜçèáØ#ûçèø*k}ˆÄãèççúÙ¯¤e#ûçèùC™¸¼ËáççúÙ€]F öܪm]]PC( õ (ERdçè¾¼ãççùá;¶ƒçõàׯ°§¦¦¤¤™„„únn}|„„þ¤¤ú¯ÅÙáèççøÕ¸}j0 šW[]`cevv‚u{€…ˆŒ’—œ¡¨¬±tpkÎÔÖØÚÞâåçéçéëëéåâÞÚØÖÔÒÌÅ¿¿nry}x~ž—”W[]`cfp|}nw{‚†‹Ž”šŸ¥¬yiz{mÐÖÜÜÞâçëíïññóÅñíëéçäàÜØÔÌÇÇÁxhy}xoš—W[]`cfjp~x}ƒ†‹–šŸ§oprtÐÖÜâäåëïõ÷ùùûÃù÷õóóíçäàÚÔÐÌÇ¿ºkv~xfšW[]`cfjitxŒƒˆ‹–š¡cv}~rdÎÒÚàåéíóùýýÿýÿÿýÊûùõïéåâÚÖÒÌÅ¿ºlux…W[]`cfknn{ro‰‹–nr}xdjËÐÖÜäéïóùýÿ ÿÌýùõñíçâÜÚÔËÅ¿ºsn{{W[]`cfkprj~x‰Ž’kx~pkÁÇÌÔÚâçíóõûÿÿþýÿÿÍýûù÷ñçââÜÒËÅ¿ºµi~W[]`cfmptwtymhv}~xky½ÃÈÐØÞäëñó÷ýÿÿýýûÿÿýÿÓý÷íååàØÐËýº¯lWY\^bfimqulwy|znª±º¿ÅËÒÚàåëïÿÿæûõóíçÞÖÎÈÁ½µ¯WY[^bfjmquosðtmsª±º¿ÇÌÖÞäéñõÿÿþýÿÿèý÷õñëâÚÒËý¶³WY[^bejnjkðqœ£ª±º¿ÈÐØâçï÷ûÿÿýÿÕýûù÷ñçàØÐÇÁ¼¶WW[]bekou~}sksxŒ£ª±º¿ÈÎØâéóûÿÿýûýÿÿýÙ÷ïåÞÖÌÇÁ¼UWYjit|~|xpjˆn{poª±º¿ÇÌØâéñûÿÿýÿÙûóíåÜÒËÅÁUWos~}qpyz†‹l~|ª±º¿ÇÌÖàéñùÿÿÙý÷ñëâØÐÈÃrx||ukjptx}…‰kxvo±º¿ÈÎØâéñùÿÿÙýùóíåÜÔËÅ~vptcgjnrw}ƒˆ‘gy~v…º¿ËÐÚäëñùÿÿØûùõïçÞÖÌÇtlp[`bgjnrw}ƒˆŒ‘q}}k¸¿ÅËÔÜåí÷ýÿÿÚûóéàÚÖÎoUW[^bfinrw{ƒˆŽ‘su{…½ÅËÒÜäí÷ýÿÿÚýõëâÜÖÌRTWY]aegmquz‚†Œ‘—kzt½ÃÈÒÜäíõýÿÿØý÷ïåâÔÌPRUW\`cfjnrxƒŒ‘–so~|tÁÇÐÚâëóûýýÿÿØùñéåÖÎPRTW[^aeimqw}‚‹Ž”šŸu{oÅÌÖÞçñ÷ûûýÿÿØûóëçÚÒMPRUY]`bgkpt{€ˆ‹‘—œl€x¿ÈÒÚäëó÷ùýÿÿþýÿÿØùóëåÜgMPRTY\^afjnrz…‰Ž”™Ÿl}{tÅÎÖàçïõùýÿÿþýÿÿØùñéäl~MPRTW\^aeimrx}ƒˆŒ‘—žow€v~ÌÔÞåëõ÷ýÿÿþýÿÿ×ý÷ïçlx‚JMPRUW\^bfintx}‚‰–œ£p|€mÇÌÒÜåïõýÿÿýÿýÔùñly‚tJMMPTW[]aeimrw}‚ˆŽ”š¡§r{†ÈÎÚâëñùýÿýýÿÿýÕùox‚tcIKMPRUY]`cfkptz…‹–œ¡nx~qoËÔÜåëóùûýÿÿÓýûlxvlÔIJMMRTW[^aeimqtx…‰–š¥k|~tÇÐØàåïõùýÿÿÑûlz‚vyØÒHJJMPRWY]`bfjnrw}ƒˆŒ’—Ÿ§vyÃÌÔÚàéïõùÿÿýý ÿÐýlxtlÚÔÎGIIKMPUW[]`cgkrw}‚†Œ‘–š¡h{xÅÎÒØàçíóùýûûþýÿ ÿÊýg{scÞØÐËGHIJMPTWY\^afiptx‚ˆŒ‘”šyp~yqÅËÐØÞäéñõùûûýýÿÿÉyk|tcâÚÔÌÈEHHIKMTUY[]aeijntx{‚†‹–žkvodÅËÐÖÜäéïùùûûýÿÿÆjr~€tfåàØÒËÅ>CGHJJPRWY\`bfimrw{€†‹’™Ÿqu½ÃÌÔÜâéíéïó÷ùûýÿÿÃýet€téåàÚÐÌÅÁAEHHJMPRTW[]acikptx}‚…‹‘–šq~zkº¿ÃÇÌÐÒÖÜÞàâåçç€Õo}xgâÜØÔÒÐËÅÁ¼¸7<>CGGJMPRRUY\^bfjmqux}‚ˆŒ‘–nxx¯µº¿ÅÈÈÎÒÖØÚÜànu~|tlÜÜÚÖÐÎËŽº¸µ5:CCÖGIKMMPRUY]`beimptx}‚†‹n{~p£¥ª¬³¶¼iky{qÈËËȵÁ¿½¼º¸³¯¨¥0025:>>CGHJMPRUW[]`bgjmptx{€†‰ŒtvdŸ£§±³ts}€xns¿¿ÁÁ¿¿½¼º¸µ±®¬ª§£00Â2:>>AEHIKPRRUW[]`egimqux}‚…‰jz€xšž¡om{{sd¸¸ºº¼¼ºº¸¶µ³¯¬ª¨§£ž--×27<<>CGHJMPPRUWY]aceimqtw{€ƒynzx—gvsi¬¬±³±õ¯®¬¨§£¡Ÿœ™++Ò05::>AEHKMPRTUW\^`cfjmptwx{€tô|td—™œžŸŸ££¥¥£¡÷Ÿžœ™™—”‘''Ö+0527:<AACEGIKMPRTW[inz|{tgyqq{~p{}€‚ƒ……‹‹Œ‹‰Îˆ…ƒ‚€#%&'((--027:<AEyip}voyWY\\]abcegm~xxrtuwwxxz{Îzxwutt !#%%&''(+0257:<>ps|xklRRTWYW[]`abelx~pnqrrtuwuÐtrqq "##%&&'+-02jhp|~zvmjKMPPRTUUW[]]`beq|mmnnpqrqpmû !"##Ø%&'(pnt~yomCCGIJKMMPRRUWY[\^aa|rgijjkkmkmkÑjii !"#!pgswz|xnk<>ACCGHIJJMPPRUWWY]^]nyoffijÃgiijiiggff okt|€}trl0257:<>CEGHIJKKPPRRTUWW\lx~p`aacceeffg÷ecnrszëqlk(+-0257::AACEGHIIPPRîTUUYYqvp]^``aabbccaáp{}|xtrdu&''((+-0255<<>ACEGGMMPRUùkym[[\\] ^Ü€wnpx!"##%&&''(+-022::<>ACEEJJKMMPPRûTpzWWY[ \Üxpgl{ !""#%%''(+-02277:<>ACCGHHIKMMPøRlxsUUWW YÑ !!"##&&'(+-00557:<>AACCEGHIJKMMPPn}vpTTU WÑ !!""##%&'(+-00257:<<>ACEGHHIJKKMpx~lRRTUTÝ !""!"#%&'((++-0257:<>ACEGHHøIJKp{jPP Rüô "##%&''-ú02557<<ñ>ACCEGGHIIg|qMMPRP°±³µ¸evv‚ÃÉÌÎÐÒÕÚÜÞãäætpkòõõö÷øùúúûúûüüûúùø÷öõõóòðíínry}x~ÝÚØ°±³µ¸ºp|}nÇÉÍÏÑÓØÜÞàäyiz{môõ÷÷øùúüüýüÉûúùø÷öõòððíxhy}xoÜÚ°±³µ¸º¼p~xÊÎÏÑÔÙÜÞâoprtôõ÷ùùúüüýþþýÍüúùø÷õôòðíëkv~xfܰ±³µ¸º¼itxŒÎÐÑÔÙÜÞcv}~rdòó÷øúûüýþþýÿþÿÿþÌýüûúù÷õóòðíëlux…°±³µ¸º½¿n{roÑÑÔÙnr}xdjñôõ÷ùûüýþþÿ ÿþÎýüüúù÷÷õñðíësn{{°±³µ¸º½ÀÂj~xÑÓÕkx~pkíðòõ÷ùúüýýþÿÿþþÿÿþÑüúùù÷óñðíëéi~°±³µ¸º¾ÀÂÇtymhv}~xkyìîñôöøùüüýþþÿÿþÿþÿþÕüúúøöôñîìëæl¯±²´·º»¾ÁÃlwy|znäæëíðñó÷øúüüÿÿæþýýüúøõòñíì鿝±±´·º¼¾ÁÃosðtmsäæëíðòõøùûüýÿÿþþÿÿþêýüüù÷óñîìè篱±´·¹¼¿jkðqÜßäæëíñôöùúüþþÿÿþÿþÙüúøöôðíë诰±³·¹½ou~}sksxŒßäæëíñòöùûýþÿÿþÿþÚüúøõòðíë®°±jit|~|xpjÐn{poäæëíðòöùûüþÿÿþÿÙþýüú÷óñðí®°os~}qpyÉËÏÑl~|äæëíðòõøûüþÿÿþüÝùöôñîrx||ukjÀÂÈÊÎÑkxvoæëíñòöùûüþÿÿþÛýüú÷õñð~vpt¸»¼¿ÂÇÊÎÐ×gy~v…ëíñô÷ùüüþÿÿþÚýüúøõòðtlp±µ·»¼¿ÂÇÊÎÐÒ×q}}kêíðñõ÷úüþþÿÿÚþýûø÷õòo®¯±´·º»¿ÂÇÉÎÐÓ×su{…ìðñó÷ùüþþÿÿÚþýüù÷õò«­¯±³¶¹»¾ÁÃÉÍÏÒ×Úkztìîñó÷ùüýþÿÿþÝüúùõòª¬®°²µ¸º¼¿ÂÈËÎÒ×Ùso~|tíðô÷ùüýþþÿÜþüûúõò©«­¯±´¶¹»¾ÁÇÊÍÑÓØÜÞu{oðòõøúüþþÿÛþýüú÷󥪬®±³µ·»½ÀÂÉÌÐÑ×ÚÜl€xíñó÷ùüýþþÿþþÿÿØþýüú÷g¥©«­±²´¶º¼¿ÂÉËÎÑÓØÛÞl}{tðòõøúüýþþÿÿþþÿÿØþüûùl~¤©«­°²´¶¹»¾ÂÈÊÎÐÒ×ÚÝow€v~òõøúüýþþÿÿþþÿÿþÙüúlx‚¢¤©«®°²´·º»¿ÂÈÊÍÑÔÙÜßp|€mðòó÷úüýþÿÿþÿþÕüly‚t¢¤¥ª­¯±³¶¹»¾ÂÇÊÍÐÓØÜÞâr{†ñò÷ùüüþþÿþþÿÿþÙox‚tc¡£¥©¬®±³µ¸º½ÀÂÉËÎÑÔÙÜÞnx~qoñõ÷úüýþþÿþÕlxvlõ¡¢¤¥«­°±´¶¹»¾ÁÂÈËÎÑÔÙÜàk|~tðôöøúüýþþÿÿÑþlz‚vyöó ¢¢¤©«¯±³µ·º¼¿ÂÇÊÎÐÒÕÚÞâvyîòõ÷øûüýþÿÿþþ ÿÒþlxtl÷õòŸ¡¡£¥ª®°±³µ¸»½ÂÇÊÍÏÒ×ÙÜÞh{xðòóöøúüýþþ ÿÏþg{scøöôñŸ ¡¢¤©­¯±²´¶º»ÀÂÈËÍÐÒרÜyp~yqðñôöøùûüýþþ ÿÎyk|tcù÷õòñŸ  ¡£¥­®±±³¶¹»¼¿ÂÈÉÍÏÑÔÙÝkvodðñôõ÷ùûüþþÿÊjr~€tfúøöóñ𞟠¢¢ª¬¯±²µ·º»¾ÂÇÉÌÏÑÔÕÛÞquìîòõ÷ùûüûüýþþÿÅþet€tûúø÷ôòð휟 ¡¢¥ª­°±³µ¸º¼¿ÂÈÊÍÏÑÔÙÜiswéëíñòóöøùúüüýýþþÇw~rnùø÷õôñî윞Ÿ¡¡£¥«­¯±³µ¸º½ÀÂÈÊÍÏÑÔÙÜlx~uìîðñôõ÷øùúûüüÃip|‚yfùø÷öõóòðí뛟  ¢¤ª¬­¯±³¶¸»½ÀÂÈÊÍÎÑ×ÙÜq~zkëíîðòôóõ÷øøùúú»o}xgù÷öõóôñðíëꛜžŸŸ¢¤©«¬®±²´·º¼¾ÁÃÈÊÍÐÒ×Ùnxxæéëíðññòóõö÷÷ønu~|tl÷÷Âõôòñðìëêéš›œŸŸ¡£¥ª«¬¯±²µ¸º»¾ÁÃÈÊÍÐÑÔÙl}xæéëíðíðñòòôyk{|kööõõÃôòñðíêççæš›œžŸŸ¡£¥©ª¬®°²µ·¹»¾ÀÂÇÊÍÎÑÔdqtoæçêëêëíððfu|tlôôòòññðîíìëéæåãšš›žž×Ÿ¡£¤¥ª¬®±³µ·¹»¾ÀÂÈÊÍÏÑÔn{~pßàääçèëiky{qññíÈìëëêçæãà™™šš›žŸ ¢¤ª¬®°±³µ·»¼¾ÀÂÈÉÌÏÑÒtvdÞßâæçts}€xnsííôìëëêéæåääâß™™ýš›ØŸ ¡£©«¬®°±³µ¹»»¾ÁÃÈÊÍÎÑjz€xÜÝÞom{{sdêêëëôêèéçæääãâßݘ˜×š›œœžŸ ¢¤ªª¬®¯±³¶¸¹»¾ÁÂÇÉÌÎynzxÚgvsiääæçæöåäãâßÞÞÜÛ˜˜Ô™š››œžŸ £¥¥ª¬®¯±´¶·¹»¾ÀÂÇÉÊÌft~tt{{pmÞßààääõãâàßÞÝÜÜÚØ——ý˜š››蟠£¥©«­®°²´µ¸º¼¾ÀÂÇÈÉÌtô|tdÚÛÜÝÞÞßßààßÞøÝÜÛÛÚØ×––Ö˜™šš››œœŸ £¥ª«¬®±²³µ¸º»½ÀÂÂsqy€|ksÔרÚÛÜÜÝÜòÛÚÙØØÕÔÒ•––—˜šš›ÚœžŸ¡£¤¥©«®°±²µ·¸º¼clyx}|kÏÐÑÓÔ×ÕÕØØÙÙØõÙØØÕ×ÔÓÓÑЕ•ú—˜š™š››ÚœŸŸ¡¢£¤©¬®¯±³µ¶ypr€xoqtwÍÎÐÑÒÒÓÔÔ××Ôú×ÔÔÓÒÑÑòÏΔ•–——˜™šš››➟Ÿ¡£¥ª«­¯±inz|{tgyÁq{~pÉÊÌÍÎÎÑÒÑÎÐÎÎÍÌË“”•–——˜˜™š››œœžŸ¡£¥©ª«tmu€zpt»¼½¾Àq{nÉÊËÌÌÎÏÐÏÎõÍÌËÊÉ’“•––——˜š›䟠¡£ietx~~slsµ·¹º»»j~xÂÇÈÉÉËÌôËÊÉÉÈÇ‘’”••––Ù—˜™šš›œŸyip}voy¯±²²³¶·¸¹»m~xxÂÂÃÇÇÈÈÉÏÈÇÑ“””•––—˜™šš››œps|xkl«¬­¯±°±³µ¶·¹lx~p¿ÁÂÂÃÇÃÂÁÖ’““”••–˜˜™šjhp|~zvmj£¥©ª«­®®°±³³µ·¹q|m¾¿¿ÀÁÂÁÀ¾ý‘’““Ø”•–—pnt~yomžžŸ¡¢£¤¥ª«¬®°±±²´¶¶|r»»¼¼½½¾½¾½Ñ¼»»‘’“‘pgswz|xnkœžžŸ ¡¢¢¤©ª¬®¯°±³´³nyoºº»¼»þ¼»»ºýŽÒokt|€}trl™šš››œžŸŸ ¡¢££ªª«¬­®¯¯²lx~pµ¶¶¸¸¹¹ºº»÷¹¸Žnrszöqlk—˜˜™šš››㞟Ÿ ¡¡©©ª«¬­®®±±qvp³´µµ¶¶··¸¸¶ìp{}|xtrdu•––——˜˜™ššœþžŸŸ¤ñ¥©ª«¬¬®®kym±±²²³ ´Ó€wnpx‘’““”••––—˜˜™šš››œžŸŸ¢¢£¤¥©ªª¬¬­pz°°± ²éxpgl{‘’’“””––—˜˜™šš››éœžžŸ  ¡£¤¤¥ªª«lxs®®¯¯þ°± ±ù‹ŒŽŽ‘ï’““••–—˜˜™™šš››œžŸó ¡¢£¥¥©ªn}vp­­®¯ °ø‹ŒŒŽŽ‘’“ᔕ–—˜˜™™šš››œœžŸŸ  ¡¢££¤px~l««¬­®­‹ùŒŽŽô‘’’‘’“”•–——˜˜ô™šš››œžŸŸ  ó¡¢£p{j©ªª««¬¬«Šü‹ŒŒýŽú’““”•––˜þ™ššþ›œœžŸó ¡¡g|q¤¥¥©©ªª«ªÞåàáäevv‚ìîïðñóõö÷øùùútpkýýþýüÛnry}x~÷öõÞÞàáäåp|}nìîïñòóõ÷÷øùyiz{mýý þýüÝxhy}xo÷öÞÞàáäåçp~xîðñòôõ÷÷øoprtýýþýüßûkv~xf÷ÞÞàáäåçitxŒðñòôõ÷øcv}~rdýýþýÿþÿÿþýüàûlux…ÞÞàáäåèén{roòòôõnr}xdjüýýþ ÿþýüâûsn{{ÞÞàáäåèéëj~xòóõkx~pküüýýþÿþþÿÿþýüäûúi~ÞÞàáäåèéëìtymhv}~xkyüüýýþÿþÿþÿþýüçûúlÜÞßáãåæèêìlwy|znùúûüüýþÿþýüúóÜÞÞáãåçèêìos÷tmsùúûüüýýþÿþþÿÿþýüóûúÜÞÞáãäçéjkøq÷øùúûüýýþÿþÿþýüûéÜÞÞàãäèou~}sksxŒøùúûüýýþÿþÿþýüçûÜÞÞjit|~|xpjñn{poùúûüüýýþÿþÿþýüèÜÞos~}qpyíîñòl~|ùúûüüýýþÿþýèürx||ukjéëíîðòkxvoúûüýýþÿþýüè~vptäæçéëìîðñôgy~v…ûüüýýþÿþýéütlpÞáãæçéëìîðñóôq}}kûüüýþÿþýêoÜÜÞáãåæéëìîðñóôsu{…üüýþÿþýèÙÛÜÞàâäæèêìíïñóôökztüüýýþÿþýçÙÛÜÞßáäåçéëíîðóôõso~|tüüýýþÿþýç×ÙÛÜÞáâäæèêìîïòóõ÷÷u{oüýýþÿþýçØÙÛÜÞàáãæèéëîïñòôö÷l€xüýýþÿþþÿÿþäýgØ×ÙÛÞßáâåçéëíîðòóõö÷l}{tüýýþÿþþÿÿþãýl~Ö×ÙÛÞßáâäæèëíîðñóôö÷ow€v~ýýþÿþþÿÿþâlx‚ÕÖ×ÙÜÞßáãåæéëíîïòôõ÷øp|€müýýþÿþÿþály‚tÕÖØÙÛÜÞàâäæèëìîïñóõ÷øør{†ýýþüÿþþÿÿþÜox‚tcÔÖØ×ÛÜÞàáäåèéëíîðòôõ÷ønx~qoüýýþþÿþÝlxvlýÔÕÖØÙÛÞÞáâäæèêëíîðòôõ÷øk|~tüýýþÿÛþlz‚vyýýÓÕÕÖ×ÙÜÞàáãåçéëìîðñóõö÷øvyüýýþÿþ ÿùþlxtlýýâÒÔÔÖØÙÜÞÞàáäæèëìîïñóôõ÷øh{xüýýþ ÿùþg{scýýßüÒÓÔÕÖ×ÛÜÞßáâåæéëíîïñóôõ÷yp~yqüüýýþ ÿùyk|tcýýßÒÓÓÔÖØÛÜÞÞàâäæçéëíîïñòôõ÷kvodüüýýþÿøjr~€tfþýýüßÓÒÒÓÕÕÙÛÜÞßáãåæèëìîïñòôõö÷quüüýýþÿ÷þet€tþþýýüÞÓÒÒÓÔÕØÙÛÞÞàáäåçéëíîïñòôõ÷iswúûüýý þúw~rnýýüþÓÒÒÔåÖØÙÛÜÞàáäåèéëíîïñòôõ÷lx~uüüýþùip|‚yfýýüÝûÓÓÒÒÓÓÕÖÙÛÛÜÞàâäæèéëíîïðòôõ÷q~zkûüüýþúo}xgýýüûüÔÓÓÒÒàÕÖ×ÙÛÜÞßáãåçèêìíîïñóôõnxxúúûüüýýùnu~|tlýýüûûúÔÓÓÒÒáÔÖØÙÙÛÜÞßáäåæèêìíîïñòôõl}xúúûüüýùyk{|kýýüþûúúüÕÔÓÒÒâÔÖØ×ÙÛÜÞßáãäæèéëìîïðòôdqtoúúûûüùfu|tlýýüöûúúùùÕÔÓÓÒÒ×ÔÖÖØÙÛÜÞàáãäæèéëíîïñòôn{~pøøùùúûûiky{qýüüýüûúýùøÕÕþÔÓÓÒÙÓÕÖÙÛÜÞÞàáãæçèéëíîïñòótvd÷øøúúts}€xnsüüûúùøÕÓÒÛÓÔÖ×ÙÛÜÞÞàáäææèêìíîïðòjz€x÷÷øom{{sdûûúùøþ÷ÖÖýÕÔÓÓÒÞÓÕÖÙÙÛÜÜÞàâääæèêëìîïðynzxögvsiùùúùø÷þöÖÖýÕÔÓÓÒàÓÖØØÙÛÜÜÞáâãäæèéëìîîïft~tt{{pmøøùø÷ýöõ××ûÖÕÔÔÓÓÒéÓÖØ×ÙÛÜÞßááäåçèéëìíîïtú|tdöö÷÷ ø÷öýõôÖÖûÕÔÕÔÓÓÒàÓÖØÙÙÛÜÞßàáäåæèéëësqy€|ksôôõöö÷ ÷öõôôóÕÖÖ×ÖÕÕÔÔÓÓÒáÔÖÖØ×ÙÜÞÞßáãäåçclyx}|kññòóôôõ õôóýòñÕÕý×ÖÕÕÔþÓÒÒãÔÕÖÖ×ÛÜÜÞàáâypr€xoqtwïðñòóó ôóòññðÔÕÖ××ÖÕÕÔÔÓÓÒÒåÔÖØÙÙÛÜÞinz|{tgyêq{~pîîïïððòóòîñððïïîÔÔÕÖ××ÖÖÕÕÔÓÓÒåÔÖØ×ÙÙtmu€zptæçèèéq{níîîïïðñðïîúÓÔÕÖÖ××ÖûÕÔÔÓÒÒäÓÔÖietx~~slsáãäåææj~xëìííîîïîíùìÒÓÔÕÕÖÖÜ×ÖÕÕÔÔÓÓÒÒyip}voyÜÞßßàâãääæm~xxëëììíîíìëýÑÒÔÔöÕÖÖ×ÖÕÕÔÔÓÓóps|xklÙÛÛÜÞÞôàáâãälx~péêëë ìëêÑþÓÔÔÕÖÕájhp|~zvmjÖØ×ÙÙÛÜÜÞÞààáãäq|mèééêëêéèÑýÒÓÔÔóÕÖ×pnt~yomÒÒöÔÕÖÖØÙÙÛÜÞÞôßáââ|rææççè èèçææÐÑÑÒÓÔÒpgswz|xnkÓÓÒÒìÓÔÕÕÖ×ÙÛÜÜÞÞàáànyoååæçæþçææåýÏÐÑÑñokt|€}trlÕÕÔÔÓÓÒúÓÔÕÖÖÙÙÛÜ÷ßlx~páââääåæäùÏÐnrszóqlk×ÖÖÕÕÔÔÓÓÒÒíÓÔÔ××ÙÙÛÛÜÜÞÞqvpàááâã äâép{}|xtrduÕÖÖ××ÖÖÕÕÔÔÓÓÒÖñØ×ÙÙÛÛÜÜkymÞÞßßà áö€wnpxÒÓÔÔÕÖü×ÖÖÕÕÓÒÕÖûØ×ÙÙÛÛüpzÞÞ ßôxpgl{ÐÑÑÒÓÓÔÔÖü×ÖÖÕÕÔÓÒÓþÔÖÖþØÙÙûlxsÜÜ ÞùÌÍÎÏÏÐÑÑÒôÓÔÔÕÕÖ×ÖÖÕÕÔÔÓÒóÓÔÕÖØØ×Ùn}vpÛÛÜ ÞøÌÍÍÎÏÏÐÑÑÒÓÔúÕÖ×ÖÖÕÕÔÓÒÓýÔÕÖÖûpx~lÙÙÛÜÛÌùÍÎÏÏÐÐÑÑôÒÓÓÒÓÔÔÕÖ××ÖÖÕÔÓÒÓ÷ÔÕÖp{j×ÙÙ ÛÙËüÌÍÍÎÎýÏÐÑÑþÓÔÔþÕÖÖÕÔÓÒóÓÔÔg|qÖØØ××Ù Ùú%Äæ£ ú&œìèkùwÓà‡ûeßág ùYÕæ×kù.Óà¡û™çß<ùwæç®0ú¹å½.ú°çº!ùÇâã ú(£èÍ*úHÕèž ø.žâåÌ"ûjÜØû_æãbùmÈèã†%&ý\äô¡åÐ!0´âåÇP(þU÷&ÄæÌÞçÓ‹6÷®èèçž84÷#açèèçæ:5õ“Ãåã¦v³çº0ð<¡ÝåÜÎ7 ZÛæŠ.÷\®ãèá¡TûwçáA,÷|ÌÞæß±? úÆç¿ +úèãÁ’úCÕå” *ü£_ ûsãà>*þ úÁèÍ:û.Òå:úŠäÜT;ûµçÉ :ûCæëj&þ<ûgâÖA$ý1åúÄè©"ü7Åîû.ßêW!û1Ïî¸û™çÐú0Çî¿ú,Éå”ú1ÅíÄ&ûmàâ]ú5ÐîÃü³çËú3Åè¿&û,Ùèvú<Õè´ ú|ãÑ8ùWßèºúÀæˆùãêµûUçèMú%³ëå û£è½úÇèå}!ú7ÏåŒùnÙîÕ($ûŠäÔ3ú’áìÅ>%ûÌè¢ ù>µåà'ûKçã8 ùbÙèÙh)ú¨æ§ùµßç²C+ûMÙãaù_ÓçÙ.û§çÇø1¯âèÌK.ûÙèƒøsÙèÜŠ0óyçÓ0E¾ççªU3õ¼å¤¾ÙèÕ5øæèçݶ5÷ÓèèßO4ödÓçèÏâÜ*3ó]¯èèÑ‹,²ç²0ñJÖàæÚ—%KÛäe.÷!|ÁèèÔ—(ûçÉ*õ£ÌåçåŒ:û.åçd(öT—ãèèÇûsäÇ&÷аàèçÄy# û(Êân"õ>’ÜåçÖ¼O û„ç×#ö7Š´åèèÏ–5üÜè|ô WÉÖççáÈd.ûyçÐõ>q©ßèèá¶¡*û.Èã|ú´Óèççüˆ] ûŽåÁ#ôzÕâççÜÉ£0ûÑçmøèçæÃŒ_ ü}çÒúÏm8"û!Éæq;ûtãÆ:ûËäh;ûçÑ:û Üèg†ƒ€€}zxmw|xwuttþuttrqølt{ktb‹‰…ƒ‚€{zj~xwwuttþuttrqøl~|{gnRî–‘Œˆ…ƒ‚€}zrnwwuttþur rqølzp|u\wîš–’‹ˆ…ƒ‚{|}jwwuttþur rqøzks|lwW îz~–’Ž‹†…‚r~oiwwuttþur rqsømjv{hr î|x™”‘Žˆ†ƒlxzkxwwuttþur rqönstgq|teH îz}uo‘މˆjmtxxwwuttþuqqrqöpstkjomn ònz~t”މg|€f{xxüwutrrqþrqqpösvmklyxf\ ì¬nx~pdŽ‹q€pc{zxxwutrrqpösvmkkr~kk 챪utq|gy|k€}zxxwutrrqpõtvmkkjwzeH 쵯ªxpwxsƒ€}{xxwutrrqpqpónpvumkkjl}lc 캳®§do~€|o…‚{xxwutrrqpþqppnópvumkkjjrye ì¼µ¯¨¡t|€zŒ†ƒ}xxwutrrqpnópvumkkjjm|pb ì½¶¯¨dq~~x„ƒ€}xxwutrrqpnpnòpvumkkjjbv|gì½¶±ªp€ztoy…€}xxwutrrþqppnpnñmptumkkjjih}ln뎺f}‚l™dpx}{zwtrqqp nûtvkkjjùkjrzjëýevmc™’do~qd}{zwtrqqp númswkkjjùgfl|g<éÃjtxkž™”Ž‹pp}{zwtrqqppnmüswkjjøijcywteéÅr€}f£Ÿš”‹dp|qizwtrqqppnmñswkjjiikieszh çh|}k®§Ÿš”Œˆ{s}qiwtrqqppnn músutjjiiøfmfdkUézss¯¨Ÿš–Œˆ…rw~uwtrqqnnmkûp|tjiigùkikxxcé€t½¸¯§¡œ–‘Œ‰…‚px}w~rqqnnmkðcjiiggmbkck~f"ïtf½¶®§¡œ–‘Œ‰…‚}m||ürqqnnmkðcjiiggpUmipzn`äcüµ¬§¡œ–‘Œ‰…‚{k|xepnnmmkkjjüpuziigøfeessw^éËüµ¬§¡œ–‘Œ‰…‚{wj|vjnmmk jùg|pwiiggþfeeûsxgéËüµ®¨Ÿš–Œˆ…‚{wtj}uvmmþkjjþijjúhkiigg÷feccs|maîËüµ®¨Ÿš”Œˆƒ€zwttõ~vmmkkjjiijjûs{niggfþeccûb{n`äÇ¿º³¬§Ÿš”‹ˆƒ€}zutrlw{ikkjjiiüwtwggfþeccúbrxfåý¸±ª¥ž™”Ž‹†ƒ€}zurqqgy~lkjiiþgiiüp{pggföecbbahhRáÁºµ¯¨£ž™’Ž‹†‚}xurqpnl{xxjiiggiiún|xggffþcbbúahh^Ὸ³®§¡ž™’Ž‹†‚}xurqpmtr}pciiggiiüky{ggfeþcbbúak|rP庵¯¨£ž™”‹ˆ…‚zwrqpnmkkrpggfûopfeecbøa`tu|TIä¶±¬§Ÿœ—”މˆ…€}xurppnmjkkuzxggfüw{leecbøa`yp|WRêµ®ª¥ž™–’Œˆ†ƒ{xuqpnnkjjûq{ueffûk|pfeecbøa`]o{TUᱬ¨£œ™”‹†ƒ€}zwtqnnmkijigktifeeüq|neecb÷a`^]o|hTᯪ¥¡š—’މ…‚{xwrpmmkjiigfmq~yeccùl{wwceccba÷`^]o~mRꪥ¡ž—”Œ†ƒ€}xuurnmkkiggófelxykccnqqccba÷`^\o€rMCÙ£Ÿœ—’Ž‹…‚{wttqnkkjifgfeccg}stbh|ylbbccbaö`^]\o€rMRÜŸš—”ŒŽ‰…€}zwttqnkkjgfgfeccbtmbtmbbcbaö`^]\o|pRWìžš—”‹‰†‚}zwunmkjiggcbøet{rzxpbba`óa``^]]\oxt`Jé™–”‹ˆ†ƒ{zwtrnmkiggffccbúq|taa`Ýa``^]\\ow{`M”‘‹ˆ…ƒzxutqpmkjigffbaüw{aa`ß^]]\[otP[RH‘Ž‹ˆ…‚€}xutrpnkjigfeebaúcy‚|o``^à]\[[oskkT[Œ‹ˆ†‚}zwtrqpmjigfecca`ùyq€x|s``^]Ý^]]\[YYognmUT‰†…ƒ{{wtqqpnkigfecbb`÷^h||uu{i^^]ß\[[YWogaJWJ…‚€zxwtpnnmkjggecbaa`^ôt{~g^h|wk^^]]\Þ]\\[YWrtgUPWJ€}{wttqmkkjiggfecaa`^öq‚tn]qpp]]\[ÖYWm{gJlhP}{xwutqpnmjigfeccba`^]^^]nl~uf\\úitxi\]]\[YèWh|kRpiI(zxutrqnmkjgfeccúba`^^]]ûp|€s\\ùo|p\]]\\[çYWWhxqRpmI5utqpnnkjigecbbûa``^]]ùcs‚oi\[[üxzg\\[YWênpwPmRHCrqnmkkiigfcbaa`^]\ûjsp[[ûh}q\[[YWüxnUPPîHJpnmkjjggfecbaa^^]\úr{t[YYùns|y[[YYWïU{pTPPMIMmkjiigeeøcbaa`]]\\[ûf|~iYYùq{ryYYWWéUswvRPRnJKigffeebbaa`^^\[ùgy~kYYWWütykWWUçpvRRPRtMGeeccbb``^^]]\\[[ùhysyYW Wûm~ppWWUæysuRRPTtPCcbaa``^^]\[YYWYYWúkwtnW WùqtdWWUUTÝoxsRMMPtU<a`^^]]^]]\[YWWYYWWkvwjU Uûn{oWUUTèRk~fRMKPvgE]]\\[[\\[[YWWúkwxcUUùqsxkUUTTóiovmPPJRxlJ[[Yü[YYWWöUWWouxfUTTûUn|nTTRüf}kPPùIRumKYYWUøTUnv€xeTTüwykRRün{pPPùIPtmGWWUTúlu‚xfRRTüj}pRRóvtPPMPKKtm>TTUTRújvyfRRümtwRRûPqypMMúGqm7R RúkxxcRRþPRRõp{kRRPsp{PMMøJMAsm5P PúfvwfPPüpyqPPûi{pMKKùMEIrscîÔÑÑÏÎÌÌËÊÉÈmw|xÇÃÂÂþàÂÁ÷lt{k·dî×ÓÑÑÎÎÍÌËÉÉj~xÇÇÃÂÂþàÂÁøl~|{g¿¬îÙ×ÔÒÐÎÎÍÌÊÉrnÇÇÃÂÂþàÂÁ÷lzp|u²Ç_ îÜÙÕÔÑÐÎÎÍËÉ|}jÇÇÃÂÂþàÂÁöqzks|lǯ3 îz~ÙÕÓÑÏÎÍËr~oiÇÇÃÂÂþàÂÁsømjv{h î|xÛØ×ÓÐÏÎlxzkÈÇÇÃÂÂþàÂÁõ¿st»q|t¹  îz}uo×ÓÑÐjmtÈÈÇÇÃÂÂþÃÁÁÂÁõÀst½jom¿@ ònz~tØÔÓÑg|€fÉÈÈýÇÃÂÂÁþÂÁÁÀösv¾½lyxf² íänx~pdÓÑq€pcÉÉÈÈÇÃÂÂÁÀõsv¾½½r~k½_ íæäutq|gy|kÌÊÉÈÈÇÃÂÂÁÀôtv¾½½¼wze  íéæäxpwxsÎÌÊÉÈÈÇÃÂÂÁÀÁÀò¿Àvu¾½½¼l}l¸B íëçåâdo~€|oÎÍËÉÈÈÇÃÂÂÁÀþÁÀÀ¿óÀvu¾½½¼jrye íëéæãÞt|€zŒÏÎËÊÈÈÇÃÂÂÁÀ¿òÀvu¾½½¼¼m|p·3íìèæãdq~~x„ÎÌÊÈÈÇÃÂÂÁÀ¿À¿òÀvu¾½½¼¼·v|g‹íìèæäp€ztoy…ÌÊÈÈÇÃÂÂþÁÀÀ¿À¿ñ¾Àtu¾½½¼¼»h}l¿ëðìëf}‚lÛdpxËÊÉÉÇÂÂÁÁÀ ¿ûtv½½¼¼ù½jrz¼|ëîìevmcÛÕdo~qdÊÉÉÇÂÂÁÁÀ ¿ú¾sw½½¼¼ø»ºl|gœéîjtxkÝÛØÓÑppÊÉÉÇÂÂÁÁÀÀ¿¾üsw½¼¼÷»¼¸ywt¹Jéðr€}fßÞÜØÔÑdp|qiÉÇÂÂÁÁÀÀ¿¾ñsw½¼¼»»½»¹szhƒçh|}kåâÞÜØÔÒÐ{s}qiÇÂÂÁÁÀÀ¿¿ ¾úsut¼¼»»÷º¾ºdk® ézssæãÞÜÙÔÒÐÎrw~uÇÂÂÁÁ¿¿¾½ûp|t¼»»ø½»kxxcaé€tìêæâÞÜÙ×ÒÑÎÍpx}w~ÂÁÁ¿¿¾½ûkc¼»»÷¾·½¸k~f’ïtfìèåâÞÜÙ×ÒÑÎÍÊm||üÂÁÁ¿¿¾½ûkc¼»»÷À®¾»pznµäcîëéäâÞÜÙ×ÒÑÎÍËÉk|xeÀ¿¿¾¾½½¼¼ûpuzi»»÷º¹¹ssw´QéñîëéäâÞÜÙ×ÒÑÎÍËÉÇj|vj¿¾¾½ ¼ûg|pw»»þº¹¹ûsxgéñîëéåãÞÜÙÔÒÐÎÍËÉÇÂj}uv¾¾þ½¼¼þ»¼¼ühk»»öº¹¸¸s|m¶áñîëéåãÞÜØÔÒÐÎÌËÉÇÂtt~v¾¾½½¼¼»»¼¼üs{n»»ºþ¹¸¸ú·{nµBäðíëçäâÞÜØÔÑÐÎÌÊÉÃÂÂlw{i½½¼¼»»üwtw»»ºþ¹¸¸ú·rxf‡åîìêæäàÝÛØÓÑÏÎÌÊÉÃÂÁÁgy~l½¼»»üp{p»»ºö¹¸··¶hh«åíëéæãßÝÛÕÓÑÏÍËÊÈÃÂÁÀ¿l{xx¼»»ún|x»»ººþ¸··ù¶hh´)åíêçåâÞÝÛÕÓÑÏÍËÊÈÃÂÁÀ¾tr}pc»»üky{»»º¹þ¸··ù¶k|rªWåëéæãßÝÛØÔÑÐÎÍËÉÇÂÁÀ¿¾½½rp»»ºûopº¹¹¸·ø¶µtu|­¡äèæäâÞÜÚØÓÑÐÎÌÊÈÃÂÀÀ¿¾¼½kuzx»»ºüw{l¹¹¸·ø¶µyp|¯¬êéåäàÝÛÙÕÒÐÏÎËÉÈÃÁÀ¿¿½¼¼ûq{ueººûk|pº¹¹¸·÷¶µ³o{­®"áæäãßÜÛØÔÑÏÎÌÊÉÇÂÁ¿¿¾½»¼»»ktiº¹¹üq|n¹¹¸·ö¶µ´³o|h­SêæäàÞÜÚÕÓÑÎÍËÉÈÇÂÀ¾¾½¼»»ùºmq~y¹¸¸ùl{ww¸¹¸¸·¶÷µ´³o~m¬‰ëäàÞÝÚØÔÒÏÎÌÊÈÃÿ¾½½»»óº¹lxyk¸¸nqq¸¸·¶÷µ´²o€r¥žÙßÞÜÚÕÔÓÑÎÍËÉÇÂÂÁ¿½½¼»º»º¹¸¸g}st·h|yl··¸¸·¶Ðµ´³²o€r¤«&ÞÜÚØÔÒÓÑÎÌÊÉÇÂÂÁ¿½½¼»º»º¹¸¸·tm·tm··¸·¶áµ´³²o|p«°JÝÜÚØÔÑÑÏÍËÊÉÇÿ¾½¼»»¸·øet{rzxp··¶µß¶µµ´³³²oxtµ¢dÛÙØÔÑÐÏÎËÉÉÇ¿¾½»»º¸·úq|t¶¶µÝ¶µµ´³²²ow{µ¤ˆØ×ÔÑÐÎÎËÉÈÃÂÁÀ¾½¼»»ºº·¶üw{¶¶µß´³³²±otª±« ×ÓÑÐÎÍÌÊÈÃÂÂÀ¿½¼»»º¹¹·¶úcy‚|oµµ´à³²±±oskk­±ÒÑÐÏÍËÊÉÇÂÂÁÀ¾¼»»º¹¸¸¶µùyq€x|sµµ´³û´³³²±±äognm®­"ÑÏÎÎËÉÉÇÂÁÁÀ¿½»»º¹¸··µ÷´h||uu{i´´³þ²±±ã°og¶¢¯¢DÎÍÌËÉÈÇÂÀ¿¿¾½¼»»¹¸·¶¶µ´ôt{~g´h|wk´´³³²ä³²²±±°rtg®ª¯¢^ÌËÊÉÇÂÂÁ¾½½¼»»üº¹¸¶¶µ´öq‚tn³qpp³³²±×°m{g¢lhªlÊÉÈÇÃÂÁÀ¿¾¼»»º¹¸¸·¶µ´³´´³nl~uf²²úitxi²³³²±è°h|k¬pi¡—ÉÈÃÂÂÁ¿¾½¼»º¹¸¸ú·¶µ´´³³ûp|€s²²ùo|p²³³²²±°êhxq¬pm¡šÃÂÁÀ¿¿½¼»»¹¸··û¶µµ´³³ùcs‚oi²±±üxzg²²±°ï¯npwªm¬ žÂÁ¿¾½½»»üº¸·¶¶µ´³²ûjsp±±ûh}q²±±°¯èxn®©ªª ¢À¿¾½¼¼»»º¹¸·¶¶´´³²ûr{t±±ûns|y±±°¯ò®{p­©ª¤¡¤¾½¼»»¹ø¸·¶¶µ³³²²±ûf|~i±±ùq{ry±±°°¯é®swv¬©«n¢£%»»ºº¹¹··¶¶µ´´²±ùgy~k±±°°ütyk°°¯®çpv¬«©¬t¤ŸF¹¹¸¸··µµ´´³³²²±±ùhysy±° °ùm~pp°°¯¯®êysu¬«ª­t©ž_¸·¶¶µµ´´³²±±þ°±±°úkwtn¯ ¯ùqtd¯¯®®­Ýoxs«¥¥©t®œ>¶µ´´³³´³³²±±°°±±°°kvwj® ®ûn{o¯®®­ë¬k~f«¥£ªvgŸP³³²²±±²²±±ü°¯¯°°úkwxc®®ùqsxk®®­­óiovmª©¢¬xl¢e±±°¯ö®¯¯ouxf®­­û®n|n­­¬óf}kªª©¡¬um£z±±°¯®ø­®nv€xe­­üwyk¬¬ò«n{p©©ª¡ªtmŸ~°°®­úlu‚xf¬¬­ûj}p¬««óvt©©¥©££tm|­­®­¬újvyf««¬ümtw««ûªqyp¥¥ö¤¥Ÿqm›y««¬¬úkxxc««þª««¬õp{k««ªsp{©¥¥ø¢¥smšvª ªúfvwfªª©ª©ªüpyq©©ûi{p¤££ù¥Ÿ¡rsclîôòòñðïïîîíímw|xììëëþìë ëê÷lt{këãžñôóòòððïïîîíj~xììëþìë ëêøl~|{géÛñõôôóñððïïîírnììëþìë ëê÷lzp|ußì– ñ÷õõôòñððïîî|}jììëþìë ëêöqzks|lìÜW ñz~õõóòñðïîr~oiììëþìë ëêsømjv{hëÀ ñ|xöõôóññðlxzkíììëþìë ëêõéstæq|täÓ) ñz}uoôóòñjmtííììëþìêêëêõéstèjoméj ònz~tõôóòg|€fîííìëêþëêêéösvèèlyxfß òùnx~pdóòq€pcîííìëêéýsvèèúr~kè– òúùutq|gy|kïîííìëêéýtvèèùçwzeÓ! úïùxpwxsðïîîííììëëêéêéývuèèùçl}läk íûúùødo~€|oðïîîííììëëêéþêééývuèèùçjryeÎ íûúúùøt|€zŒñðîîííììëëê éývuèèçúm|pãSíüûúùdq~~x„ðïîííììëëêéývuèèçúãv|gÉíüûúùp€ztoy…ïîííììëëþêé éûèétuèèçúæh}léüôûf}‚lödpxîîûíìëëêê éûtvèèççùèjrzç¼üíevmcöõdo~qdîîíìëëêê éúèswèèççøæål|gÓ1éüjtxk÷öõóòppîîíìëëêêééèüswèçç÷æçäywtävéür€}fø÷÷õôòdp|qiíìëëêêééèñswèççææèæäszhÂéh|}kùø÷÷õôóñ{s}qiìëëêêéé èúsutççææ÷åèådkÜ7ézssúù÷÷õôóñðrw~uìëëêêéé èûp|tçææøèækxxc™é€tüûúøø÷õôóòðïpx}w~ëêêéé èûkcçææ÷èãèäk~fÓïtfüûùøø÷õôóòðïîm||üëêêéé èûkcçææ÷éÜèæpznáëcüûúùøø÷õôóòðïîîk|xeééè çûpuziææ÷åäässwáüëûúùøø÷õôóòðïîîìj|vjéèè çûg|pwææþåääûsxgÐüëûúùù÷÷õôóñðïîîìëj}uvèèçþæççühkææþåääús|mâ#üëûúùù÷÷õôóñðïîíìëtt~vèèçæçüs{nææåäúã{náküæûúùø÷÷õôòñðïîíìëëlw{ièèççææüwtwææåäúãrxfÅüçûúùø÷öõóòñðïîíìëêêgy~lèçææüp{pææåäãúâhhÙåüûúúùø÷öõóòñïîîíìëêéél{xxçææún|xææååþäããùâhháCåüûúùøø÷öõóòñïîîíìëêéètr}pcææüky{ææåäãùâk|rÙ‰ëûúúùø÷öõôòñðïîíìëêééèèürpææåûopåääãøâátu|ÛÔîûúùø÷÷öõóòñðïîíìëééøèçèkuzxææåüw{lääãøâáyp|ÜÛîúùùø÷öõõóññðîîíìêééþèççûq{ueååûk|påääã÷âáào{ÛÜ9áúùùø÷öõôòñðïîíìëêééèèæçææktiåääüq|nääãöâááào|hÛ„îúùøø÷öõóòðïîîíìëéèèþçææúåmq~yääûl{wwääãâáùào~mÛÇîùøø÷öõôóñðïîíììëéèèæóåälxykäänqqääãâáùßo€rØÒçø÷÷öõôóòðïîîìëëêéèèçæåæåääôg}stãh|ylããääãâáÝàßo€rÖÙB÷÷öõôóóòðïîíìëëêéèèçæåæåää÷ãtmãtmããäãâáãàßo|pÙÞv÷÷öõôòòñïîîíììéèèçææäãøet{rzxpããâáþâááàåßoxtáÕžöõõôòññðîîíìëëéèèææåäãúq|tââáþâáááàßßow{áÖÆõôôòñððîííìëêéèèçææååãâüw{ââáàâßÞotÙÞÙÓôóòñðïïîíìëëééèçææåääãâúcy‚|oá ááàßÞÞoskkÛÞóòññïîîíìëëêéèçææåääâáùyq€x|sááàûáààßÞÞóognmÜÛ9òñððîîóìëêêééèææåääããáøh||uu{iááàþßÞÞïogâÕÜÕoðïïîííìëééèùçææääãââáôt{~gáh|wkááààßüàßßÞÞõrtgÜÙÜÕ”ïîîûìëëêèèþçææüåääââáöq‚tnàqppààßÞèm{gÕlhÙ¤îîíììëêééèçææåääòãâááàááànl~ufßßúitxißààßÞêh|kÛpiÔ×ííìëëêéèèçæåääýãâááàûp|€sßßùo|pßààßßÞóhxqÛpmÔÔìëêééùèçææääããþâááàùcs‚oißÞÞüxzgßßÞòÜnpwÙmÛÓÒëêéèèæüåäãââáàßûjspÞÞûh}qßÞ ÞÜèxnÜ×ÙÙÓÕééèèççææåääãââááàßûr{tÞÞûns|yÞÞÜó{pÛ×ÙÖÔÖèèçææäùãââáààßßÞûf|~iÞÞûq{ryÞÞÜëswvÛ×ÙnÕÖ?ææååääããââááßÞûgy~kÞ ÞütykÞÞÜõpvÛÙ×ÛtÖÒsääãáàßÞúhysyÞ Þùm~ppÞÞÜÜðysuÛÙÙÛt×Ò–äãââááýàßÞÞúkwtnÜ ÜûqtdÜÜÛóoxsÙØØ×tÜÓfâááàûáààßÞÞúkvwjÜ Üün{oÜÜÛìk~fÙØÖÙvgÒ~ààßßÞÞßßÞÞÜÞúkwxcÜÜùqsxkÜÜÛÛóiovmÙ×ÕÛxlÕŸÞ ÞÜùouxfÜÛÛûÜn|nÛÛóf}kÙÙ×ÔÛumÖ¹ÞÞÜøÛÜnv€xeÛÛüwykÛÛòÙn{p××ÙÔÙtmÒ¾ÞÞÜÛúlu‚xfÛÛûj}pÛÙÙóvt×ר×ÖÖtmÓ¼ÛÛÜÛújvyfÙÙÛümtwÙÙüqypØØöÖØÒqmÔ·ÙÙÛÛúkxxcÙÙÛüp{kÙÙûsp{רØøÕØÒsmÔ´Ù ÙúfvwfÙÙ×Ù×Ùüpyq××üi{pÖÖùØÒÔrsc¤ û#ÃÜú °èÙyüJäÄútåßÛ>ü çPúeÎZÚÄüàß7ù>Ó“ß|ýeû–åŠø´%¿ÚHýÙpû1ÍÕ8ù³sJÞ»ûÒߌ û}ç¸ø²®Šæ† ûJÐã–ûÝè÷£Ç:ÑÌ* ôFÆã™‡è™ýÆüwäyö!§è©1ÔÜCýmÄüÇØ!ø¡ç¾ÍìýUÂüPáù ”äìß ýUÂû¤Ô%ú(ÞìÐ#ýUÂüJßœøžçãä´*ýUÂü½ÜA ÷‡êÒ.’çÁ*ýbÃü3ဠõáîe¡ç±ýˆÅü¨Ø ó#Ææ}ä¨ý±ÇüpÜ8 ú³ìÏ0üç¢ý³Çü Ç´ ûëâ(ú™á‹ ý´ÇüŠÖHûKÞáHú¤ã–ü¿²üçqûØæœ û!¾ãüMÙaû ¿Ðýê¶ ú8Çßvüpèüdäý¾ ûEÙÙPüpèü>Ñ’þ û\ßÐ#û ¯Ñü¯Èû_ßÀ#ûÞ„üwÐ3ûdã§ üçk üÞ†û ™ä’ ü“ÖF ýÙû(»ÚP üɶ üÐ,ûÓã< üPÙ› üJè?ûFÖÁ3 üŽá üHç?ú‹á—ü(ÐÙ ü:Ûªü˜ètüaèj ü´Ýû»Ô&üÇÖ7 ü›ÝûHÙÁ!ü,Þ™ý—Ûûvç°üœÝ_ü—àMû“äsûFØÅü—å„õ5ÍÓ7’èUü—è«ö8á àÍü—èªøœèkªækü—Û’ø!¿Ø’×Íü—². úZÞççRü—®!üÆèÓý—“!úÓíß û—q>3ù¤èÇß–û—Aø>ßß*¯ÛWý—AöÒã7 ÛÁü°Aö’èkù5ÖAOúsãÂû³Ê ùFÚ5|û%ÙèAüR݈ ùHÁHú±îüÆ×8 ú]˜û­í”ü7à— ýÂûpçÖ#û¨á ýÙsû(ßãKûEÖ§ üÈ(þŒû5Õå] ü¦Ó? ý„Æþ¾úÕè‡ û.åŠü±´þ¼ú,Áå§ ûçü,ÇRþ›ú»çÇ# üKØ–üdäý£?ú#ÁíÑ û«Îû‹µ ý¹ƒú±ìÍ(üJßüàqý „ú²ëÐ!üÂÏ&üEÕFý‡ƒú*®íÎüFá]ýÇ´ý‡ƒ úºìÓ,ü²Æü?Ñdýyƒ ú(ÆèÎü‹Ú,ü˜×ýƒ ú.ÇçÈ,ü.Õ™ü,Ø€ü³õmpnrtswt"ú€ŒŽ‰òrigimppxttr#ú†ŒŽŒ ölprzqxr#ú‡Ž ýlpûs~s#û‰‹ ýlpûj||t#û‰Œ hûko|p"ú…Šünq"ú„‹Žûn{n!û„ŒŽŽúny{xj û„ŒŽŽ ýfhù{psq}p û„ŒŽ óen{tthkr{pú†ˆ òeqtpxht{veú‰‰ ñetpl|hk|usú€‹ˆ ðexij|h{p|ssú€ŒŽ‰ ÷exihhûsw|pú€Œ‹ømkh|lûjvhù…‡ŒŽømth|lûgx{iù…‡Œ‹Žømzh|mûfz}iú}ŠŒŽŠøm~hzpúnx|kyú|‹ŒŽ‰øm~hzoùygy|tnú|‹ŒŽŠøj{thznúextkú|‹Œøewth{múgw~vdý|‹ùuth|l ùku|zrjý‡‹ùutjzl úsp}}pú‡‹ùn|mmzl øyky~wmv ý‡‹ùclm{h ùtqpk ý†‹ùctswhødpz~xrf û†‹ùcrjqhùt|unyû†Œújqnhøsly|smû†Œúgyxtn÷jnx|tijû…Œûr~|t÷tpy}qpyû…ŒŒûf|xðyhtz~{xrhn…ŒŒüx|óypx~{ns‡ŒŒük|ôyoly„ŠŒ‹ûev|sôjrt€ŠŒŒmksül|qô~ˆŒ‡|tptyûcx{lð…ŒŠ„x{~{xvqglp ûwqdö…ŒŒuqr{úztlmrûwtû…‹‹ú{mjt|ú}zttsúl{xkú…ŒŒøgdqttx|ýfttþsû…‹Œ ù{upllvùc{zmxjû…Œþpùkdnxmû…‹øktsvrû†‹øgxukvsû†‹‹øtxugxmû†‹ök|pqyojû‡‹Œ÷}stpynûˆ‹Œõlzlsr{pjû†‹Œüh|nür|pû‰‹ŒŒücrxûks{mû‰‹Œ‹üizqúnq|odú‡‹Œ‹üyurúnr{ptú…‹Œ‹Žüh~lúspxxkú~‹Œ‹üfvxúgv|kyú~‹Œ‰ültúku{tg ú€Œ‹‰üsvqùyn{xls úŠ‹‰üg|mûiz{p úŠ…‹ˆützjùko|xmy úƒ‹Œ‰Žügxp úpv~qkú‹ŒŠüpxq÷yir|ysgnú‹Œ‡ü{tn ùlt~{otú…ŠŒ†ül|j øymy~vrsú‹†‹…ûevyt ÷shsx}ypmû…‹‰ õmpnrtswt Ð #$$&**+./3323789:;€ŒŽ‰DEFJIIMPQrigimppxttr ù "#$&**Ù+/0332389::†ŒŽŒDEEJJIMNPQQSUlprzqxr Í "#%)**+//0033789:‡ŽCDEFFJIMNPQSSlps~sÐ #$&)**.//0323899‰‹@CDDEFJIMNPPRRlpj||t ò "$&))*+//Þ033788‰Œ@BCCEEFJIMNNQRhhko|p ô #%&)*+//Þ03237…Š?@BCDEEFIMMNQQnq õ #%&)*+.//Þ3237„‹Ž?@BCDDEFJIMNQQ n{nè "#$%&)*../0323„ŒŽŽ=>?@BBìCDFJIINN ny{xj ë"$%&)*..//323„ŒŽŽ;>?@@ëBCDEJIIMNfh {psq}pè "#$&))++./032„ŒŽ;=>?@@ëBDEFJIMMen{tthkr{pÒ "$%&)**+//0†ˆ:;=>??@BCDFJJIMeqtpxht{veù"#$%&**Ú.//‰‰9:;=>>?@BDEFFIIetpl|hk|usÏ "$%%))*+./€‹ˆ89:;=>>?BCDEFJJexij|h{p|ss× "#$%&)**+.€ŒŽ‰789:;=>?@BDEEJJexihhûsw|p×"#$$&&)*+.€Œ‹389:;=>?@BCDEFJmkh|lûjvhØ "#&&)*+…‡ŒŽ23789;;=>?@BBEFmth|lûgx{iØ "#%&)**…‡Œ‹Ž23789;;=>?@BBEEmzh|mûfz}iÙ""%%&)*}ŠŒŽŠ032788:;;=?@@BDEm~hzpúnx|ky Ù $$%&*|‹ŒŽ‰/02378::;=>?@@CDm~hzoùygy|tn Ú ##$%)|‹ŒŽŠ/0323799:;=>??BCj{thznúextk Ü""#$&|‹Œ//0233899:=>>?@Bewth{múgw~vdþ ú"$%|‹ç./0323889:;=>>@@uth|l ùku|zrjð "#%‡‹ç./0322889:;=>>?@ut#jzl úsp}}p ñ"$‡‹*.//033ï789:;;??n|mmzl øyky~wmv ù"#‡‹ç*+//0023789:;;??clm{h ùtqpk ú "†‹ç*+.//0223789::>>ctswhødpz~xrfß †‹&)*+.//33237899==crjqhùt|uny册%&**+./00323788;;újqnhøsly|smþ醌$%)**+.//032377::úgyxtnæjnx|tij…Œ$%&)**+//ø032379:ûr~|tètpy}qpy…ŒŒ#$%)**+//ø0323399öf|xßyhtz~{xrhn…ŒŒ"#%&)**+.//023378ùx|âypx~{ns‡ŒŒ"#$&)**++./032377úk|þãyoly„ŠŒ‹ "$%&)**+.//03237öev|s æjrt€ŠŒŒmks$%&)**+.//0323÷l|q é~ˆŒ‡|tpty&)**+.//032÷cx{l ê…ŒŠ„x{~{xvqglp+.//03ùwqdö…ŒŒuqr{÷ztlmr/00ùwtó…‹‹{mjt|ú}zttsøl{xkú…ŒŒô "gdqttx|ýfttýsû…‹Œñ #$%&{upllvøc{zmxjû…Œ÷ "#$%&**ý.pùkdnxmû…‹ò "#$%)**+.øktsvrꆋ "#$&))*+øgxukvsú†‹‹õ "#%&&**øtxugxmú†‹ô #$%%**ök|p qyojú‡‹Œö "$%%)*÷}stpynûˆ‹Œø "#%%õlzlsr{pjû†‹Œø "#$%ûh|n ür|pû‰‹ŒŒ ù""$$ûcrx#ûks{mû‰‹Œ‹ ù ## üizqúnq|odú‡‹Œ‹ ú "" üyurúnr{ptú…‹Œ‹Ž ü üh~lúspxxkú~‹Œ‹þ üfvxúgv|kyú~‹Œ‰õ ðlt#ku{tg ú€Œ‹‰  ùsvqùyn{xls úŠ‹‰  ÷g|mûiz{p úŠ…‹ˆùtzjùko|xmy úƒ‹Œ‰Ž øgxpúpv~qkú‹ŒŠ ûpxq÷yir|ysgnú‹Œ‡ þú{tnùlt~{otú…ŠŒ† úl|j øymy~vrsú‹†‹… ýóevyt÷shsx}ypmû…‹‰ õmp/nrt1swt1 1/1Ð57;==BFGJKOSSVWZ[^_b€ŒŽ‰orsvwwz~rigimp//pxttr1 1/1Ð379;=BFGGJNRSSVW[^__†ŒŽŒorrvvwz{~„†lp//rzqxr1 1Í/113579;?CFGJNORRSWZ[^_‡Žnorssvwz{~„„lp//5s~s11Ð3577;=BCFGKOORSVW[^^‰‹jnoorsvwz{~~lp//5j||t1 1Î/113579=BCCFJNOORSWZ[[‰Œjknnrrsvwz{{hh//5ko|p1 1/Ð13357;?BCFJNNORSVWZ…Šgjknorrswzz{5//51nq1 1/1Ñ357;?BCFJKNNOSVWZ„‹Žgjknoorsvwz{-7/-3n{n11è79;=?BCFKKNRSVW„ŒŽŽcfgjkkìnosvww{{+7/-3ny{xj117ë9=?BCFKKNOSVW„ŒŽŽbfgjjëknorvwwz{fh71-{psq}p11è579;=BCCJJKORSV„ŒŽbcfgjjëkorsvwzzen{1-tthkr{p115Ò79=?BCGGJNOR†ˆ_bcfggjknosvvwzeqt3/pxh1t{ve113Ñ59;=?BFFGKNO‰‰^_bcffgjkorsswwetp3/l|h11k|us11Ï3579=??CCFJKN€‹ˆ[^_bcffgknorsvvexi51j|h11{p|ss11×379;=?BCFGJK€ŒŽ‰Z[^_bcfgjkorrvvexi51hh11ûsw|p11×359;==BBCFJK€Œ‹W[^_bcfgjknorsvmk5+h|l11ûjvh11Ø3579;BBCFJ…‡ŒŽVWZ[^bbcfgjkkrsmt5-h|l11ûgx{i11Ø3579;?BCFG…‡Œ‹ŽVWZ[^bbcfgjkkrrmz3-h|m11ûfz}i11Ù3599??BCG}ŠŒŽŠRSVZ[[_bbcgjjkorm~3-hzp11únx|ky1 1Ù3577==?BF|‹ŒŽ‰ORVWZ[__bcfgjjnom~3/hzo11ùygy|tn1 1Ú357;;=?C|‹ŒŽŠNRSVWZ^^_bcfggknj{t/hzn11úextk1 13Ü599;=B|‹ŒNORVWW[^^_cffgjkewt/h{m11úgw~vd11þ31137ú9=?|‹çKORSVW[[^_bcffjjut1h|l1 1ùku|zrj11ð311/1133579;?‡‹çKNRSVV[[^_bcffgjut;jzl1 1úsp}}p1 1Þ359=‡‹GKNORSWWZ[^_bbggn|mmzl1 1øyky~wmv1 1ù359;‡‹çGJNORRVWZ[^_bbggclm{h1 1ùtqpk1 1ú579†‹çFJKNORVVWZ[^__ffctswh11ødpz~xrf11ß357†‹BCGJKNOSSVWZ[^^cccrjqh11ùt|uny11å31135†Œ?BFGJKNRRSVWZ[[bbújqnh11øsly|sm11þ311é3†Œ=?CFGJKOORSVWZZ__úgyxtn11Üjnx|tij131//1…Œ=?BCFGJNNORSVWZ^_ûr~|t11Þtpy}qpy1/-/…ŒŒ;=?CFGJNNORSVWW^^öf|x351--11ßyhtz~{xrhn1…ŒŒ9;?BCFGJKNORVWWZ[ùx|133//1âypx~{ns‡ŒŒ9;=BCFFJJKORSVWZZúk|1133þ/11ãyoly„ŠŒ‹79=?BCFGJKNORSVWZöev|s/175-11æjrt€ŠŒŒmks=?BCFGJKNORSVW÷l|q-177-11é~ˆŒ‡|tptyBCFGJKNORSV÷cx{l/57/11ê…ŒŠ„x{~{xvqglpJKNORSùwqd3511ö…ŒŒ1uqr{÷ztlmrNRRùwt1511ó…‹‹/13{mjt|ú}zttsøl{xk5-11ú…ŒŒ11ô3579gdqttx|ýfttýs/11û…‹Œ11ñ3577;=?B{upllvøc{zmxj311û…Œ11ò3579;=?BFGGKpùkdnxm11û…‹11ò35579;=?CFFJKøkt/svr11ꆋ11//133579;=BCCGJøgxu1kvs11ú†‹‹1//1õ3579;?BBFGøtxu3gxm11ú†‹1//ô13357;=??FFök|p7+qyoj11ú‡‹Œ1//1ö3579=??CF÷}st)1pyn11ûˆ‹Œ11ø3579;??õlzl/1sr{pj11û†‹Œ11ø3579;=?ûh|n711ür|p11û‰‹ŒŒ1 1ù3599==ûcrx;11ûks{m11û‰‹Œ‹1 1ù3577;; üizq11únq|od11ú‡‹Œ‹1 1ú35799 üyur11únr{pt11ú…‹Œ‹Ž1 13ü577 üh~l11úspxxk11ú~‹Œ‹11þ31135 üfvx11úgv|ky11ú~‹Œ‰11õ311/113355 ðlt;3-1531ku{tg1 1ú€Œ‹‰1 15 ùsvq3-/11ùyn{xls1 1úŠ‹‰1 13 ÷g|m3/-//11ûiz{p1 1úŠ…‹ˆ11ùtzj3//11ùko|xmy1 1úƒ‹Œ‰Ž1 1/øgxp531311úpv~qk11ú‹ŒŠ1 1/ûpxq511÷yir|ysgn11ú‹Œ‡1 1þ/ú{tn1/11ùlt~{ot11ú…ŠŒ†1 1úl|j/+1 1øymy~vrs11ú‹†‹…1 1ý31óevyt//3551//11÷shsx}ypm11û…‹‰1 1õ<¯—RÃ#"úOçèægò#(0<ˆÐ!®®#úæèÔ? ö?ؖέ#úÍçè¿ ý_ûœçä}#ûÜçè² ý]û7Ýà.#ûÜçç“ ýû–ß"úOßçä]üå–"ú‡ãçã.ûçÖO!ûªççáúÏÖÇ ûªççá ýTù”yá} ûªççÇ ó!}®HžØTú0Ëåè ò!”%ÇH(ÕÇ!úMÜæèW ñ!­10ÕHZß³ úbçåèK ð!ÐW8ßH}ÜŠúbçæß? ÷!ÍU?æFû¼ßhúeççÒ1ø„a?Ø7û¿çKù°ççºø„Œ?Ø7û5ÐÙRù¯æç¡øƒÏ?Õ5û×áRúäæç˜ø„ä?Í,úFÐÝ_úçåè˜øã?Î.ù.Ô܈ úèåç”ø]Ù#?Ð0ú%Ìå¦#úèæàjø!ʃ?Ñ0ú3ÁãÇúèæÝUùÁ¶?Ø7 ù¨á×n úhèæÙ>ùø8Î7 úzãà úkèçÓùŒÜT1Ç8 øWÏãÀU úyèçÓùèw.ÒH ù(žççˆ. ú¿èæÐùè¡%»Hø yÕäÏb û¿èçÐù°ç&™Fù¨ÝçÁU ûÁçæÐúdçTHø_Ïçݦ8ûÁçæÐú>ÓÍ©]÷mËæß­7 ûÁææÐûªä߈÷œÒçàžPûÁææ¼û0ßç»ð3œÕåÙÊ\ÁææÄüÐçÞó™ÈãçÕ}nÑææ³üpçÞû,eËççûèæç û#Æß(ôF»ÕèæçÔZ>üzá–ôCÕçåççÛ±˜A ûÍÖHðÁææÝÌÛåçÙбY& ûÊç©öÁææµ“©ÖççùèЩn>ûÊççMûÁææ›úC_™ÛççúãÒ½¼ŽúçÙË!úÃææ€úJ°¾ÈÜççù虤™ûÁçæ” ù!\³ùÛÏEÈTûÁçæ¡þùqçHÏCûÁèæ¡øqçMж!ûÀèç£ø7ϰ½¤û¿èçÁøµÍ!3Ï„û¿èç¡öqÞn*Ó‹û¿èçÍ÷âž R͈û¿èæÐõwÑ(zÕqû¹èåÐüFásüØ|ûkèåÐü¯Ïû‹Õ„ûkèåÎüWÖkú‡Ý–úUèæÏüÓºú|Ø”%ú èçÑüKäbú:ÐÊJúççÙFüÅÊú*ÁÝZúççßnü}æPú%¯Ù úççå˜ü±ÄùeÛÎC úÙçå˜ü?ßeûWÐÕ™ úèå–ü¼Òù’ÞÈ_ újèç¡ü3Ít úqÇå0úaèç²üžÎ÷&†ÞуúaèçàCüÙ¯ ù5©ã×€úOÞçæJüßC ø qÍåÃwú»èæJûÄË ÷ bÎáÒq0û¨èçn ýsuxxüz|}~}~å}|zx}|uoggknx þûyvsqpp÷rtvxyz{|zzxýuqppäqswttv  ÷yvutppnmppûrsuzúkx ô þ$åkx $èkx %én|{t þ$éry}q þ$tën þ%úroó &ùroï %úrqsý û &øt}zmô  þ%ùx|gï &ü|gô  þ &ü|€gó  'ü{qúø &üwwö  'üqyñ  &üg|þû'ûg|yû'ûj}|wô&ûpy~r ù&ûxpr ý(üor ü(ûory (ûq}ws (ûs{|n )üxj)üxjþ(ûvqv:ûuxm:ûp~e:ûfc:ûfd:ûkzt:ûrst;ülu nügir)ükuôspllnz}€wy'ûm}xtþuttýv|þ{ö{vpkijnqtõyuqnjp}xy||}ô~{uttsudh|~ü{xwqqpr÷srsrsrrqppûrvx||ùwplmqxùkgfnvwxxû{|}~ý~}}÷~}~}~}~~ð}|{yx|{tpffhpxûxvtrppñqrvwxwxwxxwwutppöqsuysxq ú{zvusttsuüwx{ ûu~{m;ü}g;ü}g;üxt;üpx;üiy;ûj}zt:ûp{}r:ûxqp;üpp;ûq}wq:ûs|}k:ûxyi;üxo;üvx;üp};üf~;ûj{t:týs:û{nt;ûm~vn ýsuxxüz|}~}~ñ}|zx}|uoggknx……†ø‡ˆˆ‰ŠŠ‹ŒŒöUVXZyvsqpp÷rtvxyz{|zzxýuqppðqswttv€€‚‚ƒƒ„……†ø‡ˆˆ‰Š‹‹ŒŒûUVWXZZþ\__õ`ayvutppnmppìrsuzuvwwyz{{||kx€ƒþ„……ø†‡‡ˆˆ‰Š‹‹öŒSUVWXXZ[^^ý_accìdejlmmnnoqrsuuvwwyz{{òkx~€€‚‚ƒƒ„……†î‡ˆ‰‰ŠŠ‹‹RSVWWXX[\^^þ`aaúcdejlmmãnoqrsuvvwwyz{{kx~~€€‚‚ƒ„„……†û‡ˆ‰‰ŠŠ÷RSUVWWXZ\\ý^_aaÛcdejllmmnoqrssuvvwyyzzn|{t~€‚‚ƒ„……û†‡‡ˆ‰‰úŠRSUVWWÑZ[\\^_a`aacejjllmmnqrrsuuvwwyzzry}q~~€‚ƒ„„……†ý‡ˆ‰‰öŠPQRSUUVWZZÒ[\__``adeejjllmoqqrssuvvwyyttn}}~~€€‚‚ƒ„„……þ†‡‡úˆPQRSUUùWXZZ[\__ã`acdeejjlmnoqqssuuvwwyzro|}~~ø€‚‚ƒ„„……†‡ëNPQRSSUVXZXZ\^^_`acdeeéjlmnoqqrrsuvvwwyro|}}~~ö€€‚‚ƒƒ„……†‡öNPQRRSSVWXXí[\^^_`acddeejlmnoorrôsuvvwyrqs|}}~ý€ƒþ„……†÷MNPQRRSUWWÜXZ\\^^_`acddeejlmnoqqrrsuvvwt}zm{||}}õ~€€‚‚ƒƒ„……цIMNPQRRSVWVWZ[\\^_`accddejlmnnoqqrssuuvx|g{{||ó}~~€€‚‚ƒ„„……ûIMNPQQùSUVVWX[[ú\^_`accëdejlmnooqqrsuuvv|gz{{|ô}~€‚‚ƒ„……öJINPPQQSUVVßXZ[[\^_`aaccdejlmmnooqrssuvv|€gz{{|ó}~~€‚ƒ„„……éJIMNNPPQQRUVVWZZ[\^_``ccâdejjlmmnnoqqrss{qwyyzz{|}}~~€€Î‚ƒƒ„ƒƒFJIMNNPPQRSUVVXZ[\^_``aacdeejjlmmnoqqrsswwwðyzz{||}~~€‚‚ƒƒœEFIMMNNPQRSUVVXXZ[\^__`aacdeejllmnnoqqrrqyvwwyzz{|}}~~€‚‚ƒ‚ƒDEJIIMNNPQRSUUWWXZ[\^^_``acddejllmnooróg|vvwyyzz{|}}~û€‚‚áCDFJJIMNNPQRSUVVWXZ[\\^__`accdjjìlmnnoqqg|yvvwwyz{{||}û~€€²BCEFFJMMNPQRSSUUVWXZ[[\^^_`aaceejllmnnoqj}|wuuvwwyz{{|{||}~€€BCDEFFIIMNPQRSSÛUVWXZ[\\^^_`aadeejlmmnoopy~ruuvvwyyz{{|Þ}~€€@BCDEFIIMNPQRRSSUVWXZZ[\\^_``âdeejllmmnoxprsuvvwwyz{{z{{|}~~€ã@BCDEFJJIMNPQQSSUVWXZZ[[\^_`aacûdeejnnëorrsuuvvwyzzyzz{|}}~~«@BCDEEFJIMNPQQRSSUWXXZZ[[\_``a`aacdeejmmnoryrsuuvwyyzyyz{||}}~~?@BCDDFFJIMNPPQRSUVWXXúZ[\^_``êaccdeelmmq}wsrssuuvwwyyzü{||}}ã>?@BCDEEFJIMNNQQRSUVWWXXZ[\^__`ýacddñjlls{|nqrrssuvwwãyz{{||}}=>?@BBDDEFJIMMNPQRSUVVøWXZ[\^^__å`accdejjlxjoqqrrsuuvvwwyz{{|Ã;=>?@BCCDEFJIINNPQRSUUVVWXZ[\\^^_``accdeejxjnooqqrsuuvvwwyz{{ª|:;>??@BBCDEFJIMMNPQRSSUUVWXZ[[\^^_`aacddeevqvnnoqqrssuvvwyyzz{{:;=>??BBCDEFJJIMNPQRSSèUVWXZ[[\^^_``aacddeuxmnnôoqrrsuuvwwyzzÛ{9:;==>@@BCDEFFIIMNPQRRSSUVWXZZ[\\^_``côdp~emmnnoqrrsýuvwwzÊ89:;==?@BCDEFFJIIMPQQRRSSUWXXZ[[\^^_``aacdfclmmnoqqrrãsuuvwwyy78:;;=??@BCDEEFJIMNPQQáRSUVWXXZZ[\^^__`aacfdllmmnooqqÃrsuuvvwy379::;>>?@BCDDFFJIMNPPQQRSUVWWXZZ[\\^^_``akztjjllmnooqärssuuvw23899:==>?@BCCDEFJIMNNáPQRSUVVWWXZ[[\\^__`rsteejjlmmnnÃoqrrssuv327889;;=>?@BBDDEFJIMMNNPQRSUUVWWXZZ[[\^^_`luddeejlmmnÄoqnngir323788::;=>?@BCCDEFJIIMMNPQRSSUVVWXZZ[\\^^_kuccdeejllâspllnz}€wy2378::;=>?@@BCDEFJIIâMNPQRSSUUVWXXZZ[\\^_m}xtccdeuttýv|þ{ñ{vpkijnqt>??@CDDõFJIIMNPQRRSSðUVWWXyuqnjp}xy||}ô~{uttsudh|~ü{xwqqpr÷srsrsrrqppûrvx||íwplmqxmnooqqkgfnvwxxû{|}~ý~}}÷~}~}~}~~Ú}|{yx|{tpffhpxeejlmmnnoq./033233xvtrppñqrvwxwxwxxwwutppòqsuy\sxq``acddeájllmmno+./003223789::;=?@{zvusttsuèwx{QRSSUVWWXZ[u~{m__`aaccõdejjllmn*+//è03323789::;>?>?BCDDEFJIMMNìPQRRSUVVWXZZ}g^^_`aacõdeejjlm*+.//ô033278899;=>>ß@BCCDEFJIIMMNNPQRRUUVVWXZ}g\^^_``aècdeejll**+.//003237889:==ö>@BBCDEFJIIMýNPQQðSUUVWXXxt[\^__``Ùacddeejl&)**++//032337889:;=>?@@BCDEFFIIåMNPPQRRSSUVWpxZ[\\^^_``acddeù&)**++//Ì03233889:;=>>?@BCDEFFJJIMNNPPQRRSUVViyZZ[\\^__`aacddûe%&)**þ.//€½32237789:;==??@BCDEEFJJIMNNPQQRRSUUj}ztZZ[\\^^_`aaccdd$%&)**+../033233789:;=>>?@BCDDEFFJIMMNPPQQRSUp{}rXXZ[[\^^_``aacc#$%&))*++./003223789::==>?@BCCDEEFJIIMNNPPQRRxqpWWXZZ[[\^__``aa"#$%&&**þ+//Æ03323789:;;=>?@BBCDDEFJJIMMNNPQRRppVVWXXZ[[\^^__`` "#$%&**ý+.//Ð03327889::;=>?@BCCDDEFJJIIMNNPQQq}wqVVWWXZZ[\^^__ø "#$%%)**æ+.//00323788::;=>?@@BCCDEFFIãMNPPQs|}kUVWWXXZ[\\^^__ "#$%%â&)**++//032337789:;==>??@BCDEFFôJIMMNNxyiSUUWûXZ[[\\ñ "#$$%&)**++//Å032337789:;==??@BCDEEFFJJIMMNPxoRSUUVVWXZZ[[\\""$$%&)**þ.//Ô32233778:;;=>>?@BCDDEEFJJIMMNvxRRSSUVVWXZZ[[Ü ##$%&)**+../033223379::;==>?@BCDDêEFFJIIMp}QQRRSUUVWXXZZÅ""#$%&))*++./0033223899:;;=>?@BBCCDEEFJJIf~PPQQRSSUVWWXXö "#$%&&**þ+//03ó27889::;=>?@BBêCDDEFFJj{tNPPQRRSUVVWWô "#$%&**ý+.//0Û3237889::;>??@@BBCDDEEFttsNNPQQRRSUVVþWø "#$%%)**ý+.//0Ý3237899:;=>??@@BBCDEEF{ntMNNPQQRSUUVò "#$%%&)**++//ò032337889:;;=>>ê?@BBCEEm~vnIMPPQQRSUUSSýsuxxüz|}~}~ñ}|zx}|uoggknxÄÄøÅÆÆÇÈÈÉÊÊ÷†‡ŒŽyvsqpp÷rtvxyz{|zzxýuqppðqswttv¿¿ÀÁÁÂÂÃÄÄøÅÆÆÇÈÉÉÊÊû†‡‰ŒŽŽþ‘––õ—™yvutppnmppõrsuz±´¶¶·¹¼¼úkx¿¿ÀÀÂþÃÄÄÅÆýÇÈÉÉöÊ„†‡‰ŒŒŽ””ý–™œœìžŸ¡¤¦¦§§©¬®¯±±´¶¶·¹¼¼ûkx¾¿¿ùÀÁÁÂÂÃÄÄîÅÆÇÇÈÈÉÉ„‡‰‰ŒŒ‘””þ—™™úœžŸ¡¤¦¦ì§©¬®¯±´´¶¶·¹¼¼kx¾¾¿¿ùÀÁÁÂÃÃÄÄûÅÆÇÇÈÈ÷„†‡‰‰ŒŽ‘‘ý”–™™äœžŸ¡¤¤¦¦§©¬®¯¯±´´¶··¹¹n|{t¾¿¿ÀÁýÂÃÄÄÅþÆÇÇúÈ„†‡‰‰ÚŽ‘‘”–™—™™œŸ¡¡¤¤¦¦§¬®®¯±±´¶¶·¹¹ry}q¾¾¿¿ÀûÁÂÃÃÄÄýÅÆÇÇöÈ~„††‡‰ŽŽÜ‘––——™žŸŸ¡¡¤¤¦©¬¬®¯¯±´´¶··ttn½½¾¾¿¿ùÀÁÁÂÃÃÄÄÅúÆ~„††ù‰ŒŽŽ‘––ã—™œžŸŸ¡¡¤¦§©¬¬¯¯±±´¶¶·¹ro¼½¾¾¿ùÀÁÁÂÃÃÄÄÅë{~„„†‡ŒŽŒŽ‘””–—™œžŸŸé¡¤¦§©¬¬®®¯±´´¶¶·ro¼½½¾¾¿ùÀÁÁÂÂÃÄÄÅö{~„„‡‰ŒŒí‘””–—™œžžŸŸ¡¤¦§©©®®ô¯±´´¶·rqs¼½½¾¿ÀÂþÃÄÄ÷z{~„†‰‰ßŒŽ‘‘””–—™œžžŸŸ¡¤¦§©¬¬®®¯±´´¶t}zm¼¼½þ¾¿¿ùÀÁÁÂÂÃÄÄÔwz{~„‡‰‡‰Ž‘‘”–—™œœžžŸ¡¤¦§§©¬¬®¯¯±±´x|g¼¼ü½¾¾¿¿ùÀÁÁÂÃÃÄÄûwz{~ù„†‡‡‰Œú‘”–—™œœëžŸ¡¤¦§©©¬¬®¯±±´´|g¹¼¼ý½¾¿¿ÀÁýÂÃÄÄövw{~~„†‡‡ßŒŽ‘”–—™™œœžŸ¡¤¦¦§©©¬®¯¯±´´|€g¹¼¼ü½¾¾¿¿ÀûÁÂÃÃÄÄévwz{{~~†‡‡‰ŽŽ‘”–——œœâžŸ¡¡¤¦¦§§©¬¬®¯¯{q¶··¹¹¼¼½½¾¾¿¿ÈÀÁÂÂÃÂÂsvwz{{~~„†‡‡ŒŽ‘”–——™™œžŸŸ¡¡¤¦¦§©¬¬®¯¯ww¶¶·¹¹¼¼ü½¾¾¿¿üÀÁÁÂÂÈrswzz{{~„†‡‡ŒŒŽ‘”––—™™œžŸŸ¡¤¤¦§§©¬¬®®qy´¶¶·¹¹¼¼½½¾¾¿¿ÖÀÁÁÂÁÂorvwwz{{~„††‰‰ŒŽ‘””–——™œžžŸ¡¤¤¦§©©®óg|´´¶··¹¹¼¼½½¾¿ÀÁánosvvwz{{~„†‡‡‰ŒŽ‘‘”––—™œœž¡¡î¤¦§§©¬¬g|y´´¶¶·¹¼¼½þ¾¿¿ÀÌknrssvzz{~„„††‡‰ŒŽ‘””–—™™œŸŸ¡¤¤¦§§©¬j}|w±±´¶¶·¹¼¼ý½¾¿¿ñÀknorsswwz{~„„Û†‡‰ŒŽ‘‘””–—™™žŸŸ¡¤¦¦§©©py~r±±´´¶··¹¼¼ý½¾¿¿äjknorswwz{~„„†‡‰ŒŽŽ‘‘”–——枟Ÿ¡¤¤¦¦§©xpr¯±´´¶¶·¹¼¼¹¼¼þ½¾¾¿ãjknorsvvwz{~„„†‡‰ŒŽŽ‘”–—™™œûžŸŸ¡§§ëor®¯±±´´¶·¹¹·¹¹¼¼½½¾¾Æjknorrsvwz{~„„†‰ŒŒŽŽ‘–——™—™™œžŸŸ¡¦¦§ory®¯±±´¶··¹··¹¼¼½¾ëgjknoossvwz{~~„†‡‰ŒŒúŽ‘”–——ꙜœžŸŸ¤¦¦q}ws®¯¯±±´¶¶··¹¼½ãfgjknorrsvwz{{„†‡‰‰ŒŒŽ‘”––—ý™œžžñ¡¤¤s{|n¬®®¯¯±´¶¶ý·¹¼¼½ëcfgjkkoorsvwzz{~„†‡‡ø‰ŒŽ‘””––å—™œœžŸ¡¡¤xj©¬¬®®¯±±´´¶¶·¹¼¼Ãbcfgjknnorsvww{{~„††‡‡‰ŒŽ‘‘””–——™œœžŸŸ¡xj§©©¬¬®¯±±´´¶¶·¹¼¼«_bfggjkknorsvwzz{~„„††‡‰ŒŽ‘””–—™™œžžŸŸvqv§§©¬¬®¯¯±´´¶··¹¹¼¼_bcfggkknorsvvwz{~„„膇‰ŒŽ‘””–——™™œžžŸuxm§§ô©¬®®¯±±´¶¶·¹¹Û¼^_bccfjjknorsswwz{~„„†‡‰ŒŽŽ‘‘”–——œôžp~e¦¦§§©¬®®¯ý±´¶¶¹Ê[^_bccgjknorssvwwz~„„†‰ŒŒŽ‘””–——™™œžfc¤¦¦§©¬¬®®ã¯±±´¶¶··Z[_bbcggjknorrsvwz{~ᄆ‡‰ŒŒŽŽ‘””––—™™œfd¤¤¦¦§©©¬¬Ã®¯±±´´¶·WZ^__bffgjknoossvwz{~~„†‡‰‰ŒŽŽ‘‘””–——™kzt¡¡¤¤¦§©©¬ä®¯¯±±´¶VW[^^_ccfgjknnorsvwz{{á~„†‡‡‰‰ŒŽ‘‘”––—rstŸŸ¡¡¤¦¦§§Ã©¬®®¯¯±´SVZ[[^bbcfgjkkoorsvwzz{{~„††‡‰‰ŒŽŽ‘””–—lužžŸŸ¡¤¦¦§Ä©¬nngirSVWZ[[__bcfgjknnorsvwwzz{~„„†‡‡‰ŒŽŽ‘‘””–kuœœžŸŸ¡¤¤âspllnz}€wyVWZ[__bcfgjjknorsvwwâz{~„„††‡‰ŒŒŽŽ‘‘”–m}xtœœžŸuttýv|þ{ñ{vpkijnqtfggjnooõsvwwz{~„„ð†‡‰‰Œyuqnjp}xy||}ô~{uttsudh|~ü{xwqqpr÷srsrsrrqppûrvx||íwplmqx¦§©©¬¬kgfnvwxxû{|}~ý~}}÷~}~}~}~~Ú}|{yx|{tpffhpxŸŸ¡¤¦¦§§©¬KNRSSVWWxvtrppñqrvwxwxwxxwwutppòqsuy‘sxq——™œžžŸá¡¤¤¦¦§©JKORRSVVWZ[^__bcgj{zvusttsuèwx{„„†‡‰‰ŒŽu~{m––—™™œœÛžŸ¡¡¤¤¦§GJNOORSSVWZ[^__bfgfgknoorsvwzz{ì~„†‡‡‰ŒŽŽ}g””–—™™œçžŸŸ¡¡¤¦GJKNOORSSVZ[[^^bcffßjknnorsvwwzz{{~††‡‡‰ŒŽ}g‘””–——™èœžŸŸ¡¤¤FGJKNORRSVWZ[[^_ccöfjkknorsvwwzý{~ð„††‡‰ŒŒxt‘”––——Ù™œžžŸŸ¡¤BCFGJJNORSVWWZ[[^_bcfgjjknorsswwåz{~~„„†‡‰pxŽ‘‘””–——™œžžŸÃBCFGJJNNORSVWW[[^_bcffgjknorssvvwz{{~~„†‡‡iyŽŽ‘‘”––—™™œžž€?Ÿ?BCFGGKNNOSVVWZZ[^_bccggjknorrsvvwz{{~„††j}ztŽŽ‘‘””–—™™œœžž=?BCFFJKKNRSSVWWZ[^_bcffgjknoorssvwzz{~~„†p{}rŒŒŽ‘””–——™™œœ;=?BCCGJJKORRSVVWZ[^__ccfgjknnorrsvwwz{{~~xqp‰‰ŒŽŽ‘”––——™™9;=?BBFGGJNOORSSVWZ[^_bbcfgjkknoorsvvwzz{{~pp‡‡‰ŒŒŽ‘””––——79;=?BFFGJKNOORSSVZ[[^__bcfgjknnoorsvvwwz{{~q}wq‡‡‰‰ŒŽŽ‘””––Ü79;=??CFFGJKNORRSVWZ[[__bcfgjjknnorsswãz{~~s|}k†‡‰‰ŒŒŽ‘‘””––579;=??âBCFGJJNORSVWWZZ[^_bccfggjknorssôvwzz{{xyi„††‰ûŒŽ‘‘‚3579;==?BCFGJJNNORSVWWZZ[^_bccggjknorrssvvwzz{~xo„††‡‡‰ŒŽŽ‘‘113599==?BCFGGKNNOSVVWWZZ[_bbcffgjknoorrsvvwzz{vx„„†‡‡‰ŒŽŽ/Ü1357;;=?BCFFJKKNRSSVVWWZ^__bccfgjknooêrssvwwzp}„††‡‰ŒŒŽŽ/Ñ13399;=?BCCGJJKORRSSVVW[^^_bbcfgjkknnorrsvvwf~~ø„„†‡‰‰ŒŒ/1ß3779;=?BBFGGJNOORRSSVZ[[^__bcfgjkkênoorssvj{t{~~„†‡‡‰‰/Æ1335579;=?BFFGJKNOORRSVWZ[[^__bfggjjkknoorrstts{{~„†‡‡þ‰1135Ì79;=??CFFGJKNOORRSVWZ[^^_bcfggjjkknorrs{ntz{{~„††‡13â579;=??BCFGJJNNORSVWWZ[[^_bbcffêgjkknrrm~vnwz~~„††„„öb®ÐÐÑ×ßâåççòåããäãââääåääåççðåâßÖÑáçÜžH((ú3e|’™™÷¤®ºÁÊÏÓÙÏÏúÆÂ³¢›™™÷’zb&¡èÁ"÷#,17<11û(#üjçÌ;ügçÌ;ügçÌ;ûOÛÙE:û3Ìák:û±çŽ;ü­ç“;ü­è“;û¤ç :ûmãÐ,:û,ßæA;üÝèC;üÝèE;üÕèp;ü«è´;ükçÌ;üEçÞ;ûEçÞ:û?áà1:û(Éä}:û™ç­;ü“è­;ûæ¯:ûtáÅ&:ûJÙÛO;üËèg;üËèg;ûÇçƒ:û˜ç½:ûAçä :ûçè :ûçç :ûÏçp:û›ç´;üwçÄ ú%0Š)ütçÂôTzz†Ìâèç<'ûdàÎ*ø8“ª»ÃÙæççòÒççæ×­t_\ZC.ã.FWàçÆÉÚàÞãáççä×Á¾ºtÕãççü×É¿¤¤£ð’œƒƒ|zwtƒsƒƒ££ú§¼ÉÜåççöÞÚתŽvM ù!*,?£ÆÑÑûÙÞâåççýåæããöäãäãåãåäåççïåâßÙÔÑáçÔŒF,,%ú5_zŒœœð¡¤µ»Á¼À¾Â¼»±ªœœõ’|e<žæÀ ð##!%% ûCåÕ&;üãç3;üãç3;üÇè‹;ü€çÈ;üTçÕ;ûMâÙ:û8Óâp:û£ç ;üžç¡;ûãÃ%:ûMÜàM:û ÕçW;üËçp;üªç¾;üPçã;ü0çå;û%×çM:û¦æ£:û„ç¹;û|åà úÕ ""#%%&''((+--02277:<<>AACCEGHkmxoKKMMPûô !!"#%%&&ã'(++--2257::<<>>ACEElx}pIIJJKKMüõ !!"##%%&ý'(++ú02257::<ó>AACEr~xnHIIJJKMúã !""##%%&'((++002577::<õ>ACCE{lHHIIJKûä !!""#%%&''((-0025577:ý<>AAúovGGHHIJIúûÝ !!"!""#%&&'(++-02252557::<AACEHúûô !!""#%&&ú'(++-0025ú7p{{k<<>ACEòè !!"#%%&%%&'((++-00þ255ú7uqo<<>þACCùná !!"##%#%%&'((+--025ùm|f::<<>A÷Ctûé !"##"##%&''(++-02ùjwt77::<÷>ipz€ýýó !!"!""#%&&'((+-0úm}vy577:ötp}wôó !! !!"#%%&''(+-úsv~k255ìni{~|pl üû  !û"#%%&&þ'((+ì-qti22fu~to:: ûûõ  !"##&'(+â-t}~girx|rl77: þ !"#%&'(õ+s{x~vf255û úþþ !þ"##%&'(þiû|lo0225ú ñö !!""#%&òsks|tn+--0022 ý  ýú !þ"##%ôtoy€~|~vj(+--0ù  úþ !"ïipx~~yilzk'((++--ú  ñ þî !imuxny%%qw&'((+û   ú úíjt~€|qo"##%j|~&&''((ý   õ èjhzztks!""##vps&&''((ñ øötov€{pp  !"#ùo}wt&&''û    þ òjhtz~~zsjs  !"úkv~l%&&'ø  þ   òykp}uou !"ùrri%%&&ù  ú ñkcru|yjhþ  !ùp}g##%%ó   îskp€€{to ùnts""##ô     ñtrt|€{lntþþújx!!""ûþþ    òklv|~zvqjûoy|p!!ùö non|üxplûqo !!üéjfkuw}~|vhmút|xk  ùspkp}õxsp øzo úkstzò~skl ûnwñpjjv{}|xuoek     þþþñh~|stppx}ú}uoqtþ    åkt~pvx{~~{zumhl    þþþñn~ss|uqruú    õpz{mojmuî   úwk ú    útxk þ    ûfd þ    þúkwrþ   þ þþükv    þüm|yþ þ   þþýs}    ýs    ýt}    þ}    þv    ýhy    ûht{   ùnq}xt"÷tpx{nl %÷yhrz~|ql  '÷ylv€|tr  *ðsfnv~yjs *öqp{€|tq-õpqxvmn*öujs|{tnm(õsoq}{pp%õsgpx|~{ng{#÷slt|€}tr !öoru~€}rkxôyknx}|vrfkúŠ‹ŒŒüŽ’÷“””•––——˜˜ü™šš››œžŸö kmxo££¤¥¥©ª©ûŠŠ‹ŒŒýŽ‘û’“””••ý–—˜˜š›œôžŸŸlx}p¡¡¢¢££¤¥üŒŠ‹‹ŒýŽ‘ü’““””•ý–—˜˜þ™šš›œöžŸr~xn ¡¡¢¢£¤ú‹ŒŠŠ‹‹ùŒŽŽî‘’’““””•–——˜˜™™šš››œžùŸ{l  ¡¡¢£û‹ŒŒŠŠ‹ùŒŽŽ‘’ô“””•––——˜™™šš›þœúovŸŸ  ¡¢¡úŠ‹ŒŠŠû‹ŒŒŽŽ‘õ’‘’’“”••–—˜˜þ™šš›œúh{|fžŸŸ óŠ‹ŒŒŠŠ‹‹ŒŽŽþ‘‘î’“””––——˜˜™™˜™™šš››ûypržŸ úˆ‰Š‹‹ŒŒûŠŠ‹ŒŒýŽ‘’ý“”••ý–—˜˜™šú›p{{kœœžŸòˆ‰ŠŠ‹‹ŒŒŠ‹‹ŒŒûŽ‘ô’“””•””•–——˜˜™šú›uqoœœžùnˆˆ‰ŠŠ‹‹òŒŠŠ‹‹ŒŒŽ‘ô’““”“””•–——˜˜™šùm|f››œœ÷žt‡ˆ‰‰ŠŠ‹‹ûŒŠŠ‹‹ùŒŽŽó‘’““’““”•––—˜˜™šûjwt››œ÷ipz€†‡ˆ‰‰Š‹ýŒŠŠ‹ýŒŽŽ‘ö’‘’’“”••–——˜™úm}vyš››ötp}w††‡ˆ‰‰Šô‹ŒŒŠŠ‹‹ŒŽŽ‘÷‘‘’“””•––—˜ûsv~kššìni{~|pl…†‡‡ˆˆ‰‰ŠŠ‹ŒŠü‹ŒŒüŽ‘û’“””••þ–——˜íqtiššfu~to››…††‡ˆˆ‰ûŠ‹ŒŒûŠ‹‹ŒýŽý‘’““•–—˜ôt}~girx|rl››þ„……†‡ˆû‰ŠŠ‹ŒŒŠþ‹ŒŒŽ‘’“”•–—ö˜s{x~vfššþ„……†‡úˆ‰ŠŠ‹ŒŒŠþ‹ŒŒþŽŽ‘þ’““”•–—þiû|lo™ššýƒ„……†ñ‡ˆˆ‰ŠŠ‹‹ŒŒŠŠ‹‹ŒüŽ‘’“”•÷sks|tn˜˜™šƒþ„……†ý‡ˆ‰‰úŠ‹‹ŒŒŠ‹ŒŽ‘þ’““”õtoy€~|~vj—˜˜™û‚ƒ„„……ú†‡ˆˆ‰ŠŠ‹ŒþŠŠ‹ŒŽ‘’ñipx~~yilzk–——˜˜ú‚ƒ„„……†ô‡ˆˆ‰‰ŠŠ‹‹ŒŒþŠ‹‹ŒŽï‘imuxny””qw•–——˜û‚‚ƒ„„…û†‡‡ˆ‰‰Š‹úŒŠŠ‹‹ŒŽíjt~€|qo’““”j|~••––——ý‚ƒ„„…†‡úˆ‰‰ŠŠ‹‹ŒŠ‹ŒŽèjhzztks‘’’““vps••––——õ€€‚‚ƒƒ„„……†‡ˆø‰‹‹ŒŒŠŠ‹Œötov€{pp‘’“ùo}wt••––û€‚ƒƒ„…†‡ˆ‹ŒŠô‹jhtz~~zsjs‘’úkv~l”••–ø~€€‚ƒƒþ„……†‡ˆŠ‹Œòykp}uouŽŽ‘’ùrri””••ù}~€€‚‚ƒ„…†‡‰Š‹ñŒkcru|yjhŒŒŽŽ‘ùp}g““””}ó~€€‚‚ƒƒ„„……†î‡ˆˆ‰‰Šskp€€{toŠŠ‹‹ŒŽùnts’’““ô|}~~€‚‚ƒƒ„…†‡ñˆtrt|€{lntŒŠŠþ‹ŒŒþŽújx‘‘’’|û}~€€þ‚‚þƒ„„…òklv|~zvqjŠ‹‹ŒŒŠ‹ŒŽûoy|p‘‘ù{|}~~€€‚öƒ„„……non|üxpl‰‰Š‹ŒŠ‹ŒŽûqo‘‘úz{|}}~~€é‚jfkuw}~|vhm‡ˆˆ‰‰ŠŠ‹‹ŒŒŠ‹ŒŽút|xkùz{||}}~~ù€spkp}õxsp……††‡‡ˆ‰‰Š‹ŒŠ‹ŒŽûzoúyz{||}}ú~kstzú~skl„……†‡ˆ‰Š‹ŒŠ‹ŒûŽnwìwyz{{pjjv{}|xuoekƒƒ„…†‡þˆ‰‰Šþ‹ŒŒþŠ‹‹Œñh~|svwtppx}ú}uoqt€€þ‚‚ƒ„…†‡ˆ‰Š‹ŒŠ‹åŒkt~pŽŽvx{~~{zumhl|}~€€‚ƒ„…þ†‡‡ˆþ‰ŠŠ‹þŒŠê‹Œn~ss|uqruyzz{{||~~€ú‚‚ƒƒ„„…†‡ˆ‰Š‹ŒŠó‹pz{mŒojmuwwyyz{î|}}~~€€‚‚ƒƒ„„……†‡ˆ‰Š‹ŒŠï‹wkŒrsuvvwvwwyz{{ú|}}~~€‚ƒ„…†‡ˆ‰Š‹ŒöŠtxkrsuuvvñwyyz{{||}}~~€€‚þƒ„„…†‡ˆ‰Š‹Œìfdqrsuuvuuvwyyzz{||þ}~~€‚ƒ„…†‡ˆ‰Šþ‹ŒŒçkwroqrssusuuvwwyyz{{||}}~€‚þƒ„„…†‡þˆ‰‰þŠ‹‹Œíkvnoqrrsrrsuvvwwyzzþ{||}~€‚ƒ„…†‡ˆþ‰ŠŠ‹ém|ymnoqqrqrrsuuvvwyyzz{{|}~€þ‚‚ƒþ„……þ†‡‡þˆ‰‰Šïs}mmnoqqoqqrsuuvwwyzú{||}}~~€‚ƒ„…†‡ˆ‰úslmnooéqrssuuvvwwyyzz{{||}}~~€‚ƒ„…†‡ˆ‰ït}jjlmnnooqqrrssuuvwúyzz{{||}~€‚ƒ„…†‡ˆø}ejlmmnooqrþsuuþvwwyz{|}~€‚ƒ„…†‡ˆøveejllmnnoqþrssuvþwyyþz{{|}~€‚ƒ„…†‡÷hyddejllmmþnooþqrrsuúvwwyyzz{|}~€‚ƒ„…õht{ccdeejllmnþoqqrsþuvvþwyyz{|}~€‚ƒ„ónq}xtaacdeejjþlmmþnooqrúsuuvvwwyz{|}~€‚étpx{nl…`aacddeejjllmmnnþoqqþrssuvúwyyzz{{|}~€÷yhrz~|ql„„ù_`accdeejlþmnnoqrsuvwyz{|}~€÷ylv€|trƒ„„ù^_``aaccûdejjllmnoqrsúuvvwwyyz{|}ësfnv~yjs€€ƒƒ^^_``aaùcdeejjllmnþoqqþrssuvwyz{|öqp{€|tq€€‚û\^^_``aûcdeejjlmþnooqrþsuuþvwwyþz{{õpqxvmn~~€û[\\^__`ûacddeeþjllþmnnoqúrssuuvvwyöujs|{tnm}}~€ûZ[[\^^_û`accddejþlmmnoþqrrþsuuvõsoq}{ppz{||}~ûXZZ[\\^û_`aaccþdeeþjllmnúoqqrrssógpx|~{ng{yzz{{|}óWXZZ[[\\^^_`aacdejþlmmþnooqôrslt|€}trvvwwyz{|WýXZ[[\ý^_``acdþejjlmnoöru~€}rkxuvvwyz{|óSUVWWXZZ[\\^__`acejlæmyknx}|vrfkrrssussuuvvwwyyzúÊËÌÍÍÎÎüÏÐÐÑÑÓÔúÕÖÖ××ÖÖÕÔÓÒùÓkmxoÖÖØ×Ù×ûÊËËÌÍÍÎýÏÐÑÑÒþÓÔÔÕýÖ×ÖÖÕÔÓÒ÷lx}pÔÔÕÕÖÖØÊþËÌÌÍÎýÏÐÑÑÒþÓÔÔÕýÖ×ÖÖÕÔÓÒør~xnÓÔÔÕÕÖúÉÊÊËËÌÌùÍÎÏÏÐÐÑÑüÒÓÓÔÔùÕÖ××ÖÖÕÕÔÓÒú{lÓÓÔÔÕÖþÉÊÊËÌùÍÎÏÏÐÐÑÑÒÓÔùÕÖÖ××ÖÕÕÔÓÒúovÒÒÓÓÔÕÔýÈÉÊÊËûÌÍÍÎÏÏÐÑÒõÓÒÓÓÔÔÕÕÖ×ÖÖÕýÔÕÔÔÓûh{|fÒÒÓýÈÉÊÊËÌýÍÎÏÏþÐÑÑÒÑÒþÓÔÔÖ×ÖÕþÖÕÕÔùÓyprÓÒ ÒÓúÆÇÈÉÉÊÊËþÌÍÍÎýÏÐÑÑÒÓÔÕýÖ×ÖÖÕÔûp{{kÓÓÒùÆÇÈÈÉÉÊÊüËÌÌÍÍûÎÏÐÐÑÑÒþÓÔÔøÕÔÔÕÖ××ÖÖÕÔûuqoÓÓÒùnÆÆÇÈÈÉÉÊËÌÍÎüÏÐÐÑÑÒþÓÔÔûÕÖ××ÖÖÕÔûm|fÓÓÒøtÅÆÇÇÈÈÉÉÊËÌùÍÎÏÏÐÐÑÑúÒÓÔÔÓÔÔûÕÖÖ×ÖÖÕùjwtÔÔÓÓøipz€ÄÅÆÇÇÈÉÊËÌýÍÎÏÏÐÑÒöÓÒÓÓÔÔÕÕÖ××ÖÕûm}vyÔÔÓötp}wÄÄÅÆÇÇÈþÉÊÊËÌýÍÎÏÏÐÑÒûÑÒÒÓÔÔþÕÖÖ×Öúsv~kÕÔÔíni{~|plÄÄÅÅÆÆÇÇÈÈÉÊÊËüÌÍÍÎÎüÏÐÐÑÑÒþÓÔÔÕþÖ××ÖñqtiÕÕfu~toÓÓÄÄþÅÆÆÇýÈÉÊÊûËÌÌÍÎÎýÏÐÑÑýÒÓÔÔÕÖ×Öðt}~girx|rlÔÔÓÃÄÄÅÆûÇÈÈÉÊÊËþÌÍÍÎÏÑÒÓÔÕÖ×õÖs{x~vfÕÔÔþÃÄÄÅúÆÇÈÈÉÊÊËþÌÍÍþÎÏÏÑÒþÓÔÔÕÖ×þiü|loÕÕÔýÂÃÄÄ÷ÅÆÆÇÈÈÉÉÊÊËÌÍÎüÏÐÐÑÑÒÓÔÕ÷sks|tnÖÖÕÂþÃÄÄýÅÆÇÇüÈÉÉÊÊËÌÍÎÏÐÑÒþÓÔÔõtoy€~|~vj×ÖÖÕûÁÂÃÃÄÄûÅÆÆÇÈÈÉÊËÌÍÎÏÐÑÒÓñipx~~yilzkÖ××ÖÖúÀÁÂÃÃÄÄöÅÆÆÇÇÈÈÉÉÊÊþËÌÌÍÎÏÐÑïÒimuxnyÔÔqwÕÖ××ÖûÀÁÁÂÃÃÄÅþÆÇÇÈÉÊËÌÍÎÏÐÑ÷jt~€|qoÓÔÔøj|~ÕÕÖÖ××ÀýÁÂÃÃÄÅúÆÇÇÈÈÉÉÊËÌÍÎÏèÐjhzztksÒÓÓÔÔvpsÕÕÖÖ×׿øÀÁÁÂÂÃÃÄÄÅÆüÇÉÉÊÊËÌÍöÎtov€{ppÑÑÒÓÔùo}wtÕÕÖÖ¿ÀþÁÂÂÃÄÅÆÉÊËôÌjhtz~~zsjsÑÑÒÓúkv~lÔÕÕÖþ¾¿¿ÀþÁÂÂþÃÄÄÅÆÈÉÊòykp}uouÏÏÐÐÑÑÒÓùrriÔÔÕÕý½¾¿¿þÀÁÁÂÃÄÅÇÈÉñÊkcru|yjhÍÍÎÏÏÐÑÒûp}gÔÔ½þ¾¿¿ÀÁÂÃÄîÅÆÆÇÇÈskp€€{toËËÌÌÍÎÏÐÑùntsÓÓÔÔû¼½¾¾¿¿ÀÁÂÃÄÅôÆtrt|€{lntÊÊËþÌÍÍÎþÏÐÐÑújxÒÒÓÓ¼ý½¾¿¿þÀÁÁþÂÃÃÄòklv|~zvqjÈÉÉÊÊËÌÍÎÏÐûoy|pÒÒ¼ü½¾¾¿¿ÀÁöÂÃÃÄÄnon|üxplÇÇÈÉÊËÌÍÎÏÐûqoÑÒÒú¹¼¼½½¾¾¿ÀéÁjfkuw}~|vhmÅÆÆÇÇÈÈÉÉÊÊËÌÍÎÏúÐt|xkÑÑþ¹¼¼½¾¿úspkp}üxspÄÄÅþÆÇÇÈÉÊËÌÍÎÏûÐzoÑÑý·¹¼¼½ú¾kstzú~sklÃÄÄÅÆÇÈÉÊËÌÍÎûÏnwÑÑì¶·¹¼¼pjjv{}|xuoekÂÂÃÄÅþÆÇÇÈþÉÊÊþËÌÌÍñÎh~|sÐд¶tppx}ú}uoqt¿¿þÀÁÁÂÃÄÅÆÇÈÉÊËÌéÍkt~pÏÏvx{~~{zumhl¼½¾¿¿ÀÁÂÃÄÅÆþÇÈÈÉÊËîÌÍn~ssÎ|uqru·¹¹¼¼¾¿úÀÁÁÂÂÃÃÄÅÆÇÈÉÊËóÌpz{mÍojmu¶¶··¹¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËïÌwkÍ®¯±´´¶´¶¶·¹¼¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊöËtxk®¯±±´´û¶··¹¼¼½¾¿ÀÁþÂÃÃÄÅÆÇÈÉÊífd¬®¯±±´±±´¶··¹¹¼¼þ½¾¾¿ÀÁÂÃÄÅÆÇÈþÉÊÊìkwr©¬®¯¯±¯±±´¶¶··¹¼¼½¾¿ÀÁþÂÃÃÄÅþÆÇÇþÈÉÉÊíkv§©¬®®¯®®¯±´´¶¶·¹¹¼½¾¿ÀÁÂÃÄÅÆþÇÈÈÉém|y¦§©¬¬®¬®®¯±±´´¶··¹¹¼¼½¾¿þÀÁÁÂþÃÄÄÅþÆÇÇÈïs}¦¦§©¬¬©¬¬®¯±±´¶¶·¹¼½¾¿ÀÁÂÃÄÅÆÇús¤¦§©©ñ¬®¯¯±±´´¶¶··¹¹¼¼½¾¿ÀÁÂÃÄÅÆÇït}¡¡¤¦§§©©¬¬®®¯¯±±´¶ü·¹¹¼¼½¾¿ÀÁÂÃÄÅÆø}Ÿ¡¤¦¦§©©¬®þ¯±±þ´¶¶·¹¼½¾¿ÀÁÂÃÄÅÆøvŸŸ¡¤¤¦§§©¬þ®¯¯±´þ¶··þ¹¼¼½¾¿ÀÁÂÃÄÅ÷hyžžŸ¡¤¤¦¦þ§©©þ¬®®¯±ú´¶¶··¹¹¼½¾¿ÀÁÂÃÄõht{œœžŸŸ¡¤¤¦§þ©¬¬®¯þ±´´þ¶··¹¼½¾¿ÀÁÂÃónq}xt™™œžŸŸ¡¡þ¤¦¦þ§©©¬®ú¯±±´´¶¶·¹¼½¾¿ÀÁétpx{nlÄ—™™œžžŸŸ¡¡¤¤¦¦§§þ©¬¬þ®¯¯±´ú¶··¹¹¼¼½¾¿À÷yhrz~|qlÃÃù–—™œœžŸŸ¡¤þ¦§§©¬®¯±´¶·¹¼½¾¿÷ylv€|trÂÃÃù”–——™™œœûžŸ¡¡¤¤¦§©¬®¯ú±´´¶¶··¹¼½ësfnv~yjs¿¿ÀÀ””–——™™ùœžŸŸ¡¡¤¤¦§þ©¬¬þ®¯¯±´¶·¹¼øqp{€|tq¿¿Áû‘””–——™ûœžŸŸ¡¡¤¦þ§©©¬®þ¯±±þ´¶¶·þ¹¼¼õpqxvmn¾¾¿¿Àû‘‘”––—û™œžžŸŸþ¡¤¤þ¦§§©¬ú®¯¯±±´´¶·öujs|{tnm½½¾¿ûŽ‘””–û—™œœžžŸ¡þ¤¦¦§©þ¬®®þ¯±±´ösoq}{pp¹¼¼½¾ûŒŽŽ‘‘”û–—™™œœþžŸŸþ¡¤¤¦§ú©¬¬®®¯¯òsgpx|~{ng{·¹¹¼¼½ó‰ŒŽŽ‘‘””–—™™œžŸ¡þ¤¦¦þ§©©¬ô®slt|€}tr´´¶¶·¹ ¼‰ýŒŽ‘ý”–——™œžþŸ¡¡¤¦§©õoru~€}rkx±´´¶·¹¼ó„†‡‰‰ŒŽŽ‘‘”––—™œŸ¡¤æ¦yknx}|vrfk®®¯¯±¯¯±±´´¶¶··¹*útæÉ:û.Èãw;ûåÃ!;üÕèU;ü|çÀ;û8Ûß.:û›ç­;ûOÚÙH;ûºç þ.ûJçÞ þ½.ûÀç–ûkÔè/ûhâÆú&˜áèÇ/ûÃåyø\ÛåÞ„0ó’æ°0³åèºU2ôâä7mÐèà›4÷ˆçÔÉçãÇ6øUççèÙh4÷,’àèç±!5ö#ŠÐèäÙåÃ%3ôUÇååÍE5ÕåZ1òg»çèÎ} Œç¿0øbºãèÞŠ7ü(Üå-ö!RÙæèÔ£û“ç *÷‡ÀèèÕ“<ûtãÅ&õ(—ØååÙ‡(ûÆãn$ö_™áè迊 ûç¨ õnÃßèçËZ!û#çã!üK“èèü׳Pû©ç”õ#}³ÝèçÕ|KüdçÍõ1M¶Þ忨ÄZû8ÏßbõpŽÚèèçÈŽ5ü›å”ó8¹Ëáçäß±K(ûZáÌ, ôAh–áèèæÎ°q!üÓçe ô.¤¸Õæèèã¨k7#üvçµñ%EU­ÚãçæÜʶH%û<ãÞò8„™Äáèèçã´ˆU)í¶å‡¸ÑÙãèäÛÖ¨R8-óŠå²ççݸ§z!2ö:Õ×Ht_M6üÈçj;ûZç¿ :ûçç:û¿çq;üqçÆ;ü\ßÑ<ý³â<ý æ<ý#â=þá=þ®<ýTÌ:ûªÜè8ù,œáåÍ‹6øƒÉèÖz&4÷qÙåÞž,5ø yÃèß°F4ö\ÇåçÇH4ø(Ùèà¸K5÷Çèç¶a 3ö 8žÜæÙ°>3÷ h¡àèܘJ3õzÊàäØ:2÷ežÜèâ¶q4ö!œÁãèâ]1ô7m¿ãçÜÅ€Pùyg{€wfPPuønPMi{kMKKùEItvfMMùspz€tkM MPìpjMMzpMKKJJIEHurcMMùir}€ukM MPMPMókytMmzmKKJJIGGxýeKKùcs~{qsKKM÷lpusKJJIIøEHCxm0IItü€~hK KMín|z~kJJIIHHAIAzm'HHún|xkJ JKMKMK÷ntqpJIIHHð~m%HHtn€ppI IJKMKMKåt}nJJIIHHG:I<~m%Ehx~}ncGGHHþIHHI JKJèl~}oIHHGECC>>E+tuc+g>>AACEGHGHêst}lEl|gCAA><<>+tu'!<<>ACEGEGèk~sECrstA>><::7sxt+ ::<<>A>ACEGCúEt~wjCCðpx>><::72m~i(::<>ACECæcq|pCCAAqxs<::772ld&5577:<>Aþ>AACûipƒpAAï>xxs<:752ovd0557:<>A> Aùs~rcAA>>î<>Aûexxp>><î:yp:7520qj%"002257:<:<>úew€m><<:î7uqy520-v|i&--00257:7:<ùsu€k<<::7î5kxp20-oxtc&++--025757:øyrpy::775ó2g|k0-+pxp##þ(++-0257ûj{xt775ó2gh0+wspp#(+-025257ûg€{f7752ó0g}h-+kxkh"'(+-0 2ú5h|zg5520ônyh+'rpr#!#'(+-0 2ûk|}g220-ôuqp(wxpp &'(+- 0ûp{}o220-ô+{or'pu##%&'(+-úpx~rs00-+(önwwtk!! #%&'(+ûp|s--+(&önxmyepm"#%&'(úlx}sn++('%ön|xoyjhþ!""#%&'úk|sn(('&#÷nvpmm!"#%&'ùh{}sn'(('&ô%##n~qmn !"#%&úg|~ss&&%&þ%##ô"#!n|s !"#%ù&yj}yn&&%#ú&%%##""÷kxxk !"#ø%sr{{my%%#ú%##""!!÷s€wk !"ùkt~yey##"! ökz~t{k !úeu€wk""! ôwtwulle ùspwwk! ! ól|lohsmcþúpz|ps õx|mtthmmûo}|k ôsxpnzhkk þùmxwpôwp|xjznvk øi{qtôh{qgvmve þ÷kt||pdóovrcjtur þùykvwp óws|tty{hþtøshqzug ój}l x~| þoùoyymy ñk|m z€uþnøyn|rm òpywtt|hö{ksiz~xpjòku{hr~xf øqs|~tn ónzgxsp ÷~~|ljûdn|mø oy|k ù}rtüq}rø ku üzyût|sj  ø vi üx~púq~ri  ø tye üpq  ïr~tc tl ûp|tq  ùop|sc  ø kuvc û x}k    ûp}t  ún}l û xi    ÷io}tf ùgyc ûrs       ùo~s ùx}iùg}   íotcs|tfûk{ ìdm|sids}kúpup ùwo}sjûtpùynt÷qt|sjûo|yfúm~tûkyyrxý|jûq{vy öhy{jyüm~rûst{q ÷pr}wiûn€yc©ùyg{€wf© ©ª©ªõ©uun©¥i{k¤££ùŸ¡tvfn¥¥ùspz€tk¥ ¥©ìpj¥¥zp¤££¢¢¡Ÿ urcn¤¤ø¥ir}€uk¥¥þ¤¥¥©¥©¥ókyt¤mzm££¢¢¡ŸŸxe£ùcs~{qs££¤¥¤¥ö¤lpus£¢¢¡¡øŸ žxm™[¡¡tü€~h£ £¤ín|z~k¢¢¡¡  ¡zm–S  ún|xk¢ ¢£¤£¤£÷ntqp¢¡¡  ðœ¡~m”N  tn€pp¡ ¡¢£¤£¤£åt}n¢¢¡¡  Ÿ›¡œ~m”NŸhx~}ncŸŸ  þ¡  ¡ ¢£¢èl~}o¡  ŸŸžžœy~m‘;m|vpŸŸ ¡ ¡ ¢øct~l  ŸŸžõ›t}k”/}€tkŸ Ÿ  ¡¢¡ùr€ptvjŸŸòžŸ™u|j˜yrdžžŸ þ¡  ¡ô kztvigŸžž÷Ÿ˜tuc˜gžŸ Ÿ öst}lŸl|gžœø˜tu–‘œœžŸ÷k~sŸžrstþœ››÷sxt˜…››œœ žŸžúŸt~wjžžúpxœ››øšm~i—o››œ žŸžócq|pžžqxsœ››öšld•Xšš››œžûipƒpxòsœ››ššovd™=šš›œûs~rcðœypœ››ššg}qc˜+šš›œœ ûexxpœî›yp››šš™qj”’™™šš ›œ›œúew€mœœ›ïuqyšš™˜v|i•Œ˜˜™™š ›œùsu€kœœ››ðškxpš™˜oxtc•|˜˜™ š›š›úyrpy››šðg|k™˜˜pxp““\—˜˜™š›ûj{xt››šïgh™˜wspp“>——˜˜™ š›ûg€{f››šî™g}h˜˜kxkh’Œ+––——˜™ šûh|zgšš™ñnyh˜–rpr“‘“––— ˜™ šûk|}gšš™˜ôuqp—wxpp‚•–— ˜ ™ûp{}ošš™˜ô{or–pu““Ža”•–— ˜úpx~rs™™˜—õnwwtk‘‘ŒM“”•–—˜ûp|s˜˜—•õnxmyepmŒ‹0’“”•–—úlx}sn˜˜—–”ön|xoyjh‹}þ‘’’“”•–úk|sn——–•“önvpmmŽ‹`‘’“”•–ùh{}sn–——–•ó”““n~qmn‹†Q‘’“”•úg|~ss••”•þ”““ó’“‘n|sŽŒ‘’“”ù•yj}yn••”“ú•””““’’õkxxk‹‹{‘’“ø”sr{{my””“ú”““’’‘‘ös€wŽk‹M‘’ùkt~yey““’‘õkz~t{k‹Š)Ž‘úeu€wk’’‘ówtwul‹le‰†Žùspwwk‘ ‘òŽŽl|lohsmc‡eþŒŽúpz|psŽôx|mtthmmˆ†3ŒŽûo}|kŽósxpnzhkk‡…þŠ‹‹ŒùŽmxwpŽówp|xjznvkƒlŠ‹Œøi{qtŽŽŽŽóh{qgvmve…/þŠŠ‹Œ÷kt||pdŽŽŽŒóovrcŒŠjturƒþŒŠùykvwpŒŒ Œ‹òws|tŒ‹‰ty{h€\þtŒŒøshqzug‹‹Œ ‹Šòj}l‹ŠŠƒx~|~„þo‹‹ùoyymyŠŠ ‹ŠñŒk|m‹Š‰ˆ…z€u†€þnŠŠøyn|rmŒ ŠŒñpywtЉˆ‡t|h†Nö{ksiz~xpjŒŒŠŒ‹ñku{h‹Š‰‡‡r~xfyøqs|~tnŠŠ ‹Œ‹ŠñnzgЉ‰ˆ‡xspwd÷~~|lj‰‰ŠŠ‹Šûdn|mˆˆö‡†…oy|kyù}rtˆˆ‰‰Š‰üq}r††…ù„ku}d üzy‡‡ˆ‰ˆût|sj……øƒ‚vi„2 üx~p††‡ˆ‡úq~ri†……ø„ƒtyeq üpq……†‡†ûr~tc……÷„ƒtl~; ûp|tq……†ùop|sc…„„öƒ‚kuvcc û„x}k…… †…ûp}t…„„‚ø€n}ln8 ûƒxi„„…÷io}tf„ƒƒ‚‚÷€}gycq û‚rsƒƒ„…„…„ùo~sƒƒ‚€÷|x}iy; ùg}‚‚ƒƒ„ ƒ‚ìotc€€~~€w}s|tfc û€k{‚ƒ ‚êdm|si€€~~}}€yds}kd0 úpup€€ ‚ùwo}sj€~}ù|tp{Nù}ynt~€÷qt|sj€€~~}|÷{wo|yfn/ú|}m~t~~~ûkyyr~~|{zøyxx|jsC|ûq{vy}} ~öhy{jy}}||zzywùm~rnj{ûst{q} }÷pr}wi}||{{þzwwøvn€yce*×ùyg{€wf× ×Ù×Ùö×uunרi{kÖÖùÒÔtvf§ØØùspz€tkØ Ø×øpjØØzpÖÖÕøÔÒÓurc§ÖÖøØir}€ukØØþÖØØ×Ø×ØókytÖmzmÖÖÕÕÔÒÒxýeŸÖÖùcs~{qsÖ ÖØÖØöÖlpusÖÕÕÔÔøÒÓÒxmÕÔÔtü€~hÖÖín|z~kÕÕÔÔÓÓÒÔÒzmÖ„ÓÓún|xkÕ ÕÖ÷ntqpÕÔÔÓÓñÔÓ~mÔ{ÓÓtn€ppÔ ÔÕÖåt}nÕÕÔÔÓÓÒÓÔÓ~mÔ{Òhx~}ncÒÒÓÓþÔÓÓÔ ÕÖÕøl~}oÔÓÓÒÒÓõy~mÒbm|vpÒÒÓÔÓÔ Õøct~lÓÓÒÒõÔt}kÔO}€tkÒ ÒÓ ÔÕÔùr€ptvjÒÒöÕu|jÖ5yrdÒÒÓþÔÓÓÔ÷ÓkztvigÒÒÓõÒÖtucÖgÓÓÒÒÓÒÓ÷st}lÒl|gÒÒÓùÖtuÖÒÓÓÒök~sÒÒrstÒÓÓøÔsxtÖÄÓ ÓÒÓÒût~wjÒÒýpxÓÓ÷ÔÕm~iשÓÓÒûcq|pÒÒüqxsÓÓÔøÕldÕŒÔÔ ÓÒþÓÒ ÒûipƒpÒÒïÓxxsÓÓÔÔÕovdÕcÔÔ ÓÒÓ Òùs~rcÒÒÓÓïypÓÓÔÔÕg}qcÖJÕÕÔÔÓÒûexxpÓÓñypÓÔÔÕÕqjÔÓ!ÕÕÔÓûew€mÓÓîÔuqyÔÕÕÖv|iÕÊÖÖÕÕ ÔÓÔ Óûsu€kÓÓÔñkxpÕÕÖoxtcÕ¼ÖÖÕ ÔÓøyrpyÓÓÔÔïÕg|kÕÖÖpxpÔÔ‘×ÖÖ ÕÔûj{xtÔÔîÕghÕÖwsppÔÐf××ÖÖ ÕÔÕÔûg€{fÔÔÕïg}hÖÖkxkhÓÍJÖÖ××ÖÕúÔh|zgÔÔÕñnyhÖÖrprÔÒÔ+ÖÖ× Ö Õûk|}gÕÕÖôuqp×wxppÑÎÁÕÖ× Ö Õûp{}oÕÕÖô{orÖpuÔÔÎÏ™ÔÕÖ× Öúpx~rsÕÕÖ×õnwwtkÒÒÍÑzÔÕÖ×Öûp|sÖÖ×ÕõnxmyepmÍÌRÓÔÕÖ×úlx}snÖÖ×ÖÔön|xoyjh̽þÒÓÓÔÕÖúk|sn××ÖÕÔönvpmmÏÉ—ÒÓÔÕÖùh{}snÖ××ÖÕÔön~qÑmnÉÄÑÒÓ ÔÕúg|~ssÕÕÔÕÔóÓÔÒn|sÑÏÍÎÎ/ÑÒÓ ÔùÕyj}ynÕÕÔþÕÔÔÓõkxxÑÐkÌ̼ÑÒÓÔùsr{{myÔ ÔÓÒös€wÐÏkÊÌzÐÑÒÓùkt~yeyÔÔÓÒÑõkz~tÎ{kÉËCÏÐÑÒúeu€wkÓÓÒÑóÐwtwulÌleÇÄ#ÎÏÐÑùspwwkÒ ÒÑòÐÏÏl|lohsmcÅŸþÍÎÎÏÐÑúpz|psÑÑÐÏôx|mtthmmÆÄWÍÎÏÐûo}|kÑÑÐÏóÎsxpnzhkkÅÄ!þËÌÌÍÎùÏmxwpÐÐÏówp|xÊjznvk¤ËÌÍÎøi{qtÏÏÐÐÏÐÏÎóh{qÊÊgvmveÄNþÊËËÌÍ÷kt||pdÎÎÏÏÎÏÎÍóovrcÊËjturÀÂÊËùykvwpÍÍ ÎÍÌòws|tÊÉÇty{h¿‘þtÊÊøshqzugÌÌÍ ÌËòj}lÉÈÈÂx~|¾Ã5þoÉÉùoyymyËË ÌËÊòk|mÉÈÇÆÄz€uÄ¿þnÈÈùyn|rmÊÊ ËÊñpywtÈÇÆÅt|hÄ{ö{ksiz~xpjÊÊË ÊÉñku{hÉÈÇÅÅr~xf·øqs|~tnÈÈ ÉÊÉÈñnzgÈÇÇÆÅxsp¶ž÷~~|ljÇÇÈÈÉÈûdn|mÆÆöÅÄÄoy|k·3ù}rtÆÆÇÇÈÇüq}rÄÄùÃku½ž üzyÅÅÆÇÆût|sjÄÄøÂÁviÃV üx~pÄÄÅÆÅûq~riÄÄøÃÂtye¬ üpqÄÄÅÄûr~tcÄÄ÷ÃÂÀtl¾b ûp|tqÄÄùop|scÄÃÃöÂÁÀkuvcœ ûÃx}kÄÄûp}tÄÃÃÁ¿ún}l§[ ûÂxiÃÃÄ÷io}tfÃÂÂÁÁ÷¿½gyc¬/ ûÁrsÂÂÃÄÃÄÃùo~sÂÂÁÀÀ¿÷¼¿¿x}i·b ùÀg}ÁÁÂÂà ÂÁúotcÀ¿¿¾÷¿¶½s|tfœ û¿k{ÀÀÁ Áúdm|si¿¿¾½÷¿·ds}kžR ú¿pup¿¿ ÀÁúwo}sj¿¿¾½ù¼tp¼{ù½ynt¾¿¿÷Àqt|sj¿¿¾¾½¼ø¶o|yf§Oú¼½m~t¾¾¿¾ûkyyr¾¾¼¹ø·xx|j¯n¼ûq{vy½½ ¾öhy{jy½½¼¼¹¹·¶ùm~r§¡5¼ûst{q½ ½ùpr}wi½¼¼þ¹¶¶ø´n€ycŸFù(ÜêÈ÷©¼\Õ8ü‡ÄùbÙë°øAç]Ùœü ªùáì¤øÍ™†Ö>ü»Ìù§äÚzú|ç>¼¯ý»ƒú3´èãMúaÞÐå7ý˃úwÚæÈ? ú¾è˜ýäƒùƒèè–5"ü½áhýå„ù5Çåã"ûWäàbõåƒgÜèÇe#úµâçöJãváè¾($ùd꪿÷}Ü]Õ„$ø(Ùª \ç*ù¹ÃA%÷©ãCJÜ*ý¸Á)÷d㌯©ü(ʼ(û(âÅý£Ðümä\'û¡ÜTüŠÍüyç&ûœï„üÎYû´è&ûMä«ýÕûã¤%û!ÌÆ,ýÒ›üTçd%û!ÉëTüž¡ü´áU$û¶ëqüHÈ*ûд#úzå„ü8ßEüwȇ$ûHÙÄö8çO¨kg#ûAëÚ# ö5ãO>Ä,"ûMàÙ< ÷#ÉO‡˜."û:Ùâ& ÷˜eÌZA!û0×áT ùŽ}q½"ú(Ããs úˆ®¹O!û*Ûåjøˆ½vÕFú<ÉàŒøˆÝÍ,ú:Üç ùˆçà úOØá‡ùˆåŽúCáäp ü‹áúMâÕCù!ÈÄ5ù|ÚÚOù‡ê¤5ù¡ãÒ%ø&ÙäjúÂë½.÷¯¸µ\pù.Èæ¹÷kà:ŒOƒú}Õáƒ÷Üm®OHMûãÜe÷«Ì&ÐOjqúHÃèÁ?õ}Ú.ÇCºhúa×è©,õÚ8º,Å#ù™á܆õǧ?«”­ùCÃçÇTû ”Ù,û„Î×Oþ1ø Ž×æ©(üPãeüÍåà þvù]ËèÑ]ü<ÜsüØèÀ þˆù }Üç£<û.̾û8ÜèO öÕ* <ÓåÎp û ´ÛûˆäÌ. øç“§Þã²#üŽ×:û ­çœ ùçäåßFûŽÝ>û7Ïáq ûçâü}ãvüaçà üèØûhÚ¡ü´çY üÄäŠûjá›ûæÔ ü›ç¤ûRâ»üzç€ ûbß´úaݳû½Å üÐàPü_á¼ünã|üÐç\újà¼û!Ôæüç—üä± ü¡ãUü*çßûhä°ûUÞ»ü!ÕçúŠÞ° û­ájû¯çEúŠã ü†èœûç—ú¨ßŠ ûÚÓ*ütä¼û>ÍÔe û³Ü]ûHÕÀ úFÑÛ? übãªû¾ÙR útã¿ ûEëÔühzqóonzypl†‹Œ‹ ûo{onõlpx|ys†‹Œ ûcu{qsù|†‹ŒŒˆ üi|röxkxŠ‹Šxtpûm~rkõ‰‹‡~}tkpsüo}rò†‹‹ƒnwzsptyúdp{ss킌ŒŠlgswy}|ywmhnuûgw{pú…‰‹ˆöyppx}}zqúh~yryú‹…‹†ùoklx{}úi{ypsú…‹Œ‰Œ þwûi{sú‡ŠŒ…%úi{{rj ú‰ˆ‹‰&ûiytrû‰‹Œ‰'ùpqtpks úˆ‹ŒŠ(ûktxp ú„Š‹‹‡(nüpxo úЇ‹‡(øhpngxqk ú…‹Œ‰†(ømomluxlú‰ˆ‹…)ömpmplxshyû‡‹Œ‰*÷mntsvoþ‹‹þ+öofqyspsû‰‹ŒŒ0ùkt|sjyú‚ŒŒ‰‰0úykxxpú„‡‹Œ†-þlókqwylgy†‹Œˆ-üjlxônpxyps‰‹ƒ,ûckrqõkoxxs‰‹Œˆ-üpskøqt„Œ‹Š†-ücqtøyr‡‹Œƒs-ûcpveöŒˆ‰ƒ~znkn*ûcrulö…‹‰„px|tp*úcpxqk÷ˆ‹ŠŠlkty,üq}p÷†ŠŒ‰„y,úco|ptúˆ‹ŒŠ1ûkx|jû‡‹Œ…1úgx{ptúˆŠ‹Š‰1ñfrzwhy‹…Š‹†ƒ2ûixxpû…‹†3ôgx|tqk‰‰‹Š5öiv|nm„‰‹6÷eq}xr„‹7øcgw|xp~:ûks};ücgyùhzq óonzypl†‹Œ‹ õo{onõlpx|ys†‹Œ õcu{q sù|†‹ŒŒˆ õi|r öxkxŠ‹Šxtp ÷m~rkõ‰‹‡~}tkps÷o}r ò†‹‹ƒnwzspty÷dp{ss킌ŒŠlgswy}|ywmhnuøgw{pú…‰‹ˆöyppx}}zqúh~yryú‹…‹†ùoklx{}úi{ypsú…‹Œ‰Œ þwûi{sú‡ŠŒ… úi{{rj ú‰ˆ‹‰ úiytrû‰‹Œ‰ øpqtpks úˆ‹ŒŠ ùktxp ú„Š‹‹‡ ÷nnpxoúЇ‹‡ øhpngxqk ú…‹Œ‰†ømomluxlú‰ˆ‹… ömpmplxshyû‡‹Œ‰!÷mn tsvoþ‹‹þ!ôofqyspsû‰‹ŒŒ#ýùkt|sjyú‚ŒŒ‰‰#ý úykxxpú„‡‹Œ†%ílkqwylgy†‹Œˆ%ìjlxnpxyps‰‹ƒ&ùckrqõkoxxs‰‹Œˆ(úpskøqt„Œ‹Š†(úcqtøyr‡‹Œƒs)ûcpveõŒˆ‰ƒ~znkn)ûcrulö…‹‰„px|tp*úcpxqk÷ˆ‹ŠŠlkty,íq}p  †ŠŒ‰„y,íco|ptˆ‹ŒŠ.ïkx|j‡‹Œ…/ðgx{ptˆŠ‹Š‰0ñfrzwhy‹…Š‹†ƒ2óixxp …‹†3ôgx|tqk‰‰‹Š5öiv|nm„‰‹6÷eq}xr„‹7øcgw|xp~:ûks};ücgyùhzq5//1 1óonzypl1†‹Œ‹1 1õo{on-+-/3311õlpx|ys†‹Œ1 1õcu{q1--1331 1sù|†‹ŒŒˆ1 1õi|r531331/1 1öxkxŠ‹Šxtp1 1÷m~rk53//11õ‰‹‡~}tkps11÷o}r7/+-311ò†‹‹ƒnwzspty11÷dp{ss'-511킌ŒŠlgswy}|ywmhnuøgw{p35/11ú…‰‹ˆ11öyppx}}zqúh~yry11ú‹…‹†11ùoklx{}úi{yps11ú…‹Œ‰Œ1 1þwûi{s11ú‡ŠŒ…1 1úi{{rj1 1ú‰ˆ‹‰1 1ú!iytr11û‰‹Œ‰1 1øpqtpks1 1úˆ‹ŒŠ1 1ù-1ktxp1 1ú„Š‹‹‡1 1÷-nnpxo/311úЇ‹‡1 1øhpngxqk1 1ú…‹Œ‰†11ømomluxl11ú‰ˆ‹…11 ömpmplxshy11û‡‹Œ‰11!÷mn71tsvo11þ‹‹þ11!ô/o31fqysps11û‰‹ŒŒ11#ý+511ùkt|sjy11ú‚ŒŒ‰‰11#ý#711úykxxp11ú„‡‹Œ†11%í1l31//kqwylgy1†‹Œˆ11%ì%jlx1/13npxyps‰‹ƒ11&ùckrq//11õkoxxs‰‹Œˆ11(úpsk1-11øqt„Œ‹Š†11(úcqt5-11øyr‡‹Œƒs11)ûcpve11õŒˆ‰ƒ~znkn1)ûcrul11ö…‹‰„px|tp*úcpxqk11÷ˆ‹ŠŠlkty,íq}p5773/73†ŠŒ‰„11y,íco|pt+-5//ˆ‹ŒŠ/11.ïkx|j/3+-/1‡‹Œ…11/ðgx{pt/133ˆŠ‹Š‰10ñfrzwhy51‹…Š‹†ƒ2óixxp73-+…‹†3ôgx|tqk-‰‰‹Š5öiv|nm-„‰‹6÷eq}xr-„‹7øcgw|xp~:ûks};ücgyüHÕŒó%zÐçÍŽ&¨èæÄ û”ØZõ&gÏÞÕ—¸èçß û ÁÔö e¤ßççèß üUÞ§ö Odßèä²qûˆå§õÈèæãäâ§a< ü—áòkèçÆw¿çåÒ¯—?ú Ûaí?çç¾(vÀÒáÝÕ³Z5&û>È×Rú0ÖçÝZöƒ™ÊßçáÏ›úFäÕ(ú £èæmù,C\¼ØáúUÚÒUúŒèæœ þûPçØ]úbÞçÜ%úUÜØƒ úÈèç*&ûYÇ´”û¢çæ¢'ù8E¶  ú>ççÆ(û£¿J úÕçÕH(úbdÇU ú“èç‹(øh 5Ï‹, ú_áç³(ø77ªÇMú¿èæ:)ö :zÍ ûžçæ–*÷ 3²ÂeúáçØ +ö5}О&û²èßb0ù¨Ü–5úMçç±0ú\ÃÌ|ú%ÃçÜM-þ.ókÅËg0äæ“-üeEôyÍÓ— Ñèæ,û mdõ*pÏË Øçç¡-ü›”ø}±àççÑ?-ü¦«øZ­èçÌ0-ûÄ#öÂçæãÑpH*û­ÁöbççÜ’Êß²—*ú¦É]÷¯çÜR!>˜Ó,ü§ß’÷FÛçÁ%,ú”Ý—ú «èçŒ1ûsÍÙTû¹èâC1ú1ÌÛw ú8ÚèÄ#1ñªØ»(|âäˆ2ûYÍÎûˆèç}3ô?ÌÞ´A½èÕ5öaÅÜz1FÖè6÷#©âË”Fá7ø8ÇßÏns:ûn²çÖ;ü:Ò/ûq{|m:ûtuk;ûtqs:ûtym:ûve:ûdm:ûlxu ünpu-ünx ó~}xwuurddkpx$ìjxnsohddqtuvtstx}üzxpkkûquyyõytq}}skpx{õ}yqmkow{û~zxtssùrssttvwwøzwtzzxwvvtýsrssütx|ù|{unkl÷xnjffttuwwúy{|}~~}þ|}}~í~}}{ywz}vtofgksxúxwtrpnnöortutvtxvttpnöpqtxs}|k!ñ{xxuvtvstwxx{{ ût{i;üyr;ütz;ûh|y:ûi|}p:ûqsr;ûnus:ûp|{p:û{wl;ûutt:ût~d:ûfr:ûkyt;ûmwy:ûm}{q:ûvunýpy4ûsssùyxumgm0ût~}gpøt{}umnr.ü{oøpolv}}zttüdfo'üvv ñyrtty}}xjjlpv"øj}{tvt õrmkpx|zuqqürttöyvs}~uqux øtlfentvxxüz{|{{xýwvttþrttüuvwxx{|ù~~zxxûyurpooûrvx{||þ~|úzxutpoo÷q|}lŒûxvrnmmkhþkmmúpsvx{÷yxk‹‰7÷sz‹‰6ökyŒ‹ˆƒ5õptt‰‹‹ˆ5õn}wtˆŒ‹‰‰4ôrx}miv‡‹‹ˆˆ4órtcq‚‹‹‰„y2üt}÷}‰Š…€tip0ýtõjx‡Šˆ…xpq.ýk}ñs‰‹‹‰ƒytvogly(ýjrðt…ŠŒ‰ˆ‡pptxpnry&þnéhox†‹‹‰‰ˆxihtyuuttddmy+çjwƒ‰‹Œ‰…„tssu{wnkkmpy(õkv}†ŠŒ‰…„öspkkpx|ytrrûsuwzúywwts óhr|z…ˆˆ…yz}ìvngfforuuvuuttvxyzz{{úzxxwwuuþvöpwy|~pmmx ù{yussqppùqstuwxõcgirtqignt8öcortvmlnu8õcijp{wttst7côdjtuu{||zwoiiúkmnpptt)÷cjkmmnx}ù}|{zyxwwx.ùcefggfggþqrr?ò"#$$%&)**++.//ü02233ã7889::==>?@@BBDDq{|mIIMMNPQQRRò "##$%&)**Õ+../033232237889;==>?@@BCDtukJIJIIMNPPQQRô ""##$%))**â+.//0033233788:;;=>??@BCCtqsJJøIMNNPPQ ô "#$%&&**ý+.//3ä2337889::;=>>?@BBtymFFJJIMNNþPÏ "#$%%&))*+../03323778899:;==>?@@veEEFFJIMMNMNþÚ "#$$%&&**++.//0332338899:;==??@dmDDEùFJIIMMð "#$%%&)**++.//ö03327889:;;ê>??lxuCBBCDEEFFIMnpu ó ""$$%&))**ú+.//033ê7889::;;=>nx@BCCDEFFJJó~}xwuurddkpxó $$%%&))**Ú+.//002337899:;;==jxnBsohddqtuvtstx}üzxpkkðquyy##$$%&&)**ý+.//ë32237889::ytq}}skpx{õ}yqmkow{û~zxtssùrssttvwwøzwtzzxwvvtýsrssütx|ù|{unkl÷xnjffttuwwúy{|}~~}þ|}}~ë~}}{ywz}vtofgksxCC úxwtrpnnöortutvtxvttpnñpqtx8s}|k;=>>?@@þBÝ{xxuvtvstwxx{{.//00322337t{i:;==>??þ@ ì ##$%&)**++.//0ð322377yr::;=>>??#û$%&)**+þ.//ô0322tz99:;==> ù"#$&&)**ü+..//0ô32h|y889::;;ò"#%%&))**++.//õ03i|}p377899þ:õ"#$%%&)**í+..//0qsr23778899ô"#$$%%&)**ó+..//nus23788þ9ô "##$%&&)**õ+./p|{p22377þ8þô ""#$%%&))**ò+.{wl0332233ü ö"##$%%&))**+øutt/0033% ü"##$$ï%&))**t~d/00322$ì ""#$$%%&))*fr.//0' #$ñ%&&)kyt*++.//$þí ""#$%%&%mwy**+..$ô ""#$$%m}{q**+-õ "##$vun)**ýpy,ý ""ñsss&&))yxumgmä t~}g$$%&ppt{}umnr+î {o#$%%polv}}zttüdfo$÷vv"#$%ñyrtty}}xjjlpv!÷j}{t vt õrmkpx|zuqqürttõyvs}~uqux øtlfentvxxüz{|{{xýwvttþrttüuvwxx{|ù~~zxxûyurpooûrvx{||þ~|úzxutpoo÷q|}lŒûxvrnmmkhþkmmúpsvx{÷yxk‹‰2ôsz‹‰3ôkyŒ‹ˆƒ3ôptt‰‹‹ˆ4õn}wtˆŒ‹‰‰4ôrx}miv‡‹‹ˆˆ4órtcq‚‹‹‰„y2üt}ö}‰Š…€tip0ýtõjx‡Šˆ…xpq.ýk}çs‰‹‹‰ƒytvoglyýjrðt…ŠŒ‰ˆ‡pptxpnryþþnéhox†‹‹‰‰ˆxihtyuuttddmy  çjwƒ‰‹Œ‰…„tssu{wnkkmpy ékv}†ŠŒ‰…„spkkpx|ytrrûsuwzúywwts Ýhr|z…ˆˆ…yz}vngfforuuvuuttvxyzz{{úzxxwwuuþvöpwy|~pmmx ù{yussqppùqstuwxócgirtqigntócortvmlnu ícijp{wttst#côdjtuu{||zwoiiúkmnpptt(öcjkmmnx}ù}|{zyxwwx-øcefggfggþqrr>13ì59;==?BCFGJJKNNORVVWWãZ[[^__ccfgjjkkooq{|mwwzz{~1Å3133579;;=?BCFGGJKKNRSSVSVVWZ[[^bccfgjjknotukvwvwwz{~~11Ô35799;;=?CCFGGJKNORRSSVWWZ[[_bbcfggjknntqsvvøwz{{~~1 1Ï355779;=?BBFFGJKNOOSSVWWZ[[^__bcffgjkktymssvvwz{{þ~11/135Ï79;=??BCCFJKKNRSSVWZZ[[^^_bccfgjjverrssvwzz{z{11/þ133Ú579;==?BBFGJJKOORSSVWW[[^^_bccggjdmoorùsvwwzz11/1ä3579;=??BCFGJJKNNORSSVZ[[^_bbêfgglxunkknorrsswznpu1 1Ò355799==?BCCFFGJKNORSSWWZ[[^__bbcfnxjknnorssvvó~}xwuurddkpx11Ë35577==??BCCFGGJKNORRVWWZ[^^_bbccjxnksohddqtuvtstx}üzxpkkÔquyy355;;==?BBCFFGJKNOOSVVWZ[[^__ytq}}skpx{õ}11yqmkow{û~zxtssùrssttvwwøzwtzzxwvvtýsrssütx|ù|{unkl11÷xnjffttuwwúy{|}~~}þ|}}~ë~}}{ywz}vtofgksxnn1 1/úxwtrpnnöortutvtxvttpnñpqtx[s}|kbcffgjjþk113Ý{xxuvtvstwxx{{KNORRSVVWWZt{i_bccfggþj1 131Ø/1135577;;=?BCFFJJKNNORRSVVWZZyr__bcffgg1;æ=?BCFFGJJKNNOORSVVtz^^_bccf17ã9;=BBCFFGJKKNOORRSVh|y[[^__bb13ä59;??BCCFGJJKNNOORSi|}pWZZ[^^þ_11/ß1359;=??BCFFGGJKKNORqsrVWZZ[[^^11/ä1359;==??BCFFGGJKKNOnusVWZ[[þ^11/1æ3579;;=?BBCFFGGJKNp|{pVVWZZþ[11þ3113ä5799;=??BCCFFGJK{wlRSSVVWW11ü5331137ê9;;=??BCCFGGJJuttORRSS%157ü9;;==ï?BCCFFt~dORRSVV1$13ç57799;==??BCCFfrKNNORR1&1357;=ñ?BBCkytGJJKNN1$1þ/113í799;=??B?mwyGGJKK1$1/15ï799;==?m}{qFGGJJ1,135ï79;;=vunCFFGGpy1,13ý5799ñsssBBCCyxumgm1131ä/113557755t~}g==?Bppt{}umnr1+15î7{o;=??11polv}}zttüdfo1$13÷5vv9;=?11ñyrtty}}xjjlpv1!1÷3j}{t7vt1 1õrmkpx|zuqqürtt11õ/yvs}~uqux1 1øtlfentvxxüz{|{{xýwvttþrttüuvwxx{|ù~~zxx11ûyurpooûrvx{||þ~|úzxutpoo÷q|}l11Œ11ûxvrnmmkhþkmmúpsvx{11÷yxk//‹‰12131ôsz--‹‰31-131ôky1Œ‹ˆƒ33131ôptt1‰‹‹ˆ3141õn}wtˆŒ‹‰‰141ôrx}miv‡‹‹ˆˆ141órtcq‚‹‹‰„y121üt}ö#}‰Š…€tip101ýtõjx‡Šˆ…xpq1.1ýk}çs‰‹‹‰ƒytvogly33//--/13511ýjrðt…ŠŒ‰ˆ‡pptxpnry331þ/11þnéhox†‹‹‰‰ˆxihtyuuttddmy1 1 çjwƒ‰‹Œ‰…„--tssu{wnkkmpy11 ékv}†ŠŒ‰…„1/-spkkpx|ytrrûsuwz11úywwts Ýhr|z…ˆˆ…yz}133vngfforuuvuuttvxyzz{{úzxxwwuuþvöpwy|~pmmx1 1ù{yussqppùqstuwx11ó#/cgirtqignt11ó+3cortvmlnu3351/ 1í!%cijp{wttst1//3311/13#côdjtuu{||zwoiiúkmnpptt(ö!cjkmmnx}ù}|{zyxwwx-ø#cefggfggþqrr>/ûK×àe:ûÃçy;û³ç“:ûtçË:ûçç#:ûçç5:û¼çª ü‹p&-ünçÎ óäàÏÇ¿˜< $ìaæÏ :„°Æt«µÎßççõδmmd<&õ(|ßák„¼Øççôèá7]nºÓççáãÐŹ³²²¨ŽŽƒtRP.83&"øJãÙ* ï:kyŒÇæçÝÒ¸¨¨¢‡\3ö <|â㻨ºÇ ô#%:’°ÎÎÐÓÙÙùÚÛÇ¿³¦ŠŠý€sŠŠ÷‹«´¿ÈÙÛÜÜ÷ßàäçåÕÎÎû:nƒ––ú—£´ÆÔØØüÝÞåççþÝØØúÐÀ±©™––öÞáYAû &588ü>?HJJþ>88ú1!÷ÐçeÍ57÷’çÐç¹6ö3çççç´5õ©çæççµ5únâÇàççýµ#4ùÇãta®ççý¼C4ó™ç° _ÊççÓ2üçâ÷Äâçåå£\%0ý¨çõnÞæççæÂ£s.ýRàñFÑáèççẾ¸R8#(ý ¨ðvÙèçÕ™7]™³Ä’ˆF&þMé>˜àææÐÃ0!JOžÐ¿»Š<+眻çèçÍwEY¢³½×¸tjjZ5(õ q¯ãèçÕ°†öKpqˆÂÙͲ®®ú¤ŽY8ú3PdŒ ó ´ËËßßÍME ì(d£³ÆÂÀ¾½ÃÊÐÒÔ××õÖÒÏÌÇÄÀÂÃÆþpú‹?ˆ ù73(!#!%%(î ]y„„’ÏáèççáÛØÐÏÆ¿¿ýÂÃ-ù!,11011þ¨­­?öypqzynp1ópinwy~~{vnk{0õolu}€zqot0þcttþ|ûxilt.ôpljx€|utt0ópqqx}|xlov+ïyliiuy{|~~yxtjho*øsqnmp{}ú{tppq/ów|~||wohms2üytstt9ýrxúüsgt:ûqp{|8ùsqx€xk6økn|}vrk5øwovxnn4÷ois{|xnk5ùlp|~tp4öogpu{~vks3÷ymn{ytv5súy{ol3õojpz}{vrin2÷tnr|xpo2ôsiquy}|wkmx1ösms||trk3örtx}xomx0óqks{~~yusqkx/ôtppw}zrmq{-ñnjgpvy{|zytklq-ópnmt|~|spqu%þwúohdnuttö{}~~{qilx&öqwumjjlv|ù}yuttv+úpt{t|øzumkntx,ñpqyumjutpeelsx.ùkrywnj6ùkozwqx5÷jptxypoxþj/øpks}tp{þp-øyqu}uljüyq|*÷oit|xsnmúskx|q(øpou~vopùmt|tkc$öyhqvxzsjpöhpz|jfm!÷tmp|{rqxùkm||qgþh÷rtv}xjlq ùrx~rhcþuöjkkx|ytsd ùlo{}tgý{p÷tps}{qnr ùjqxtküpsósjgtxyxxskjx ÷sjryztfc ü|zk ôsqnmt||tppx øjot~vph üvtðqgddstvvz|wpikt ÷jmsv|}iføh}}nyrlkköv|}ztssuxømkt~ysjðt}yty}ztkknpxøqsyzlgõwvzyjffkrôtkmx|{wrfccûp|r÷por|vojúdm~ud øspgktvx{{üogeúyp~tf ôtnlox}{rrk$úyqttt÷x|}wljh#çpommjmy~{vy}~~{xuupjdcc&úz{||}÷zxqmmljg-ørlnggffggýecròSUVVWWXZZ[\^^__`aýcdeejôypqzynpnoqqrsuvwyzòRSUVVWWXXZ[\\^^_`aîcdpinwy~~{vnk{mnnooþqrrsuvwyúQRSUUVVåWXZZ[[\\^^__``olu}€zqotejllmnoqþrssuvùwPQRSSUUVöWXZZ[[\\cttþ|ûxiltddejlmnoqrsuäNPQRRSRSSUVWWXpljx€|utt``aacþdeeùjejjllmmnþoqqürqqrrsNæPQRRQRRSUpqqx}|xlov^^__``acdeúdeejjllmnoqoqrëMNPQyliiuy{|~~yxtjho\\þ^__þ`aacdþeddþejjþlmmnoþqooqøsqnmp{}ó{tppqVVWWXXZ[[\^þ_``þaccdejlmnoqoðw|~||wohmsSSUVVWXZ[\^_`acdejlmnüytsttPQRþSUUþVWWXZ[\^_`þa``acdejlørxJJIIMNNPQRSUVWXZþ[\\^_`acdejòljjDDEFJJIIMMNNþPQQRSúUVVWWXXZ[\^_`acdejùBCDEEFJJIMúNPPQQRRSUVWXþZ[[ú\^^__``acdeöjee@BCDDEFFJIúMNNPPQQRSUVWXZ[\^_`acídsgt@BBCDDEEFFJJIIMMþNPPþQRRSUúVWWXXZZ[\^_`aõqp{|??@BCCDDEFþJIIMNþPQQþRSSUþVWWXþZ[[\^`òsqx€xk=>??@@CDDEFJIMNPQRSUVWXZ[\^ðkn|}vrk_:;=>>?BCCþDEEFJIMNPQRSUVWXZ[øwovxnn\\ñ9:;==>@@BBCCDDEEFJþIMMNPQRSUVWX÷ois{|xnk[[ü9:;==?@BúCDDEEFFJIMNPQRSUV÷Wlp|~tpXZZXô89:;;==>>??@@BCDEFþJIIMþNPPQþRSSõUogpu{~vksWWXW7ö89::;==>>??@BCDEFJIMNPQR÷ymn{ytvUUVUù237788;;þ=>>þ?@@BCúDEEFFJJIMNPQsöy{olSSUURRSU3ü78899:;=>?ý@CDDþEFFJþIMMòIojpz}{vrinPPQ QRû3223778þ9::þ;==>?BCDEFJötnr|xpoMNN PQ/û03223378þ:;;þ=>>?@BCòsiquy}|wkmxIIMM NP/ü03322379:;=>?@ôsms||trkEEFFJI Mþ.//023789:=>?örtx}xomxCCDEF Jý+.//323789;óqks{~~yusqkxBBCD E*ü+..//þ0332378ñtppw}zrmq{=>>??@BC DCý&)**./0ð2njgpvy{|zytklq::þ;==þ>??@B CúB&&))**+.ì/pnmt|~|spqu778899;;=> ?B@ó?Bw%%&&ohdnuttô{}~~{qilx3322þ3779:; =?>öqwumjjlv|ö}yuttv+..//032þ37789 :;ù:pt{t|øzumkntx**+./032378 9þ:99ëpqyumjutpeelsx%%&&))**+./03237 8ñkrywnj32 ##$%þ)**+./032 3ókozwqx2230ù ""##$$ú%&&))**+./03÷jptxypox00÷/j  "#$%&)*+. /øpks}tp{//ý+pþ "ú#$$%%&&)*+.ö/yqu}ulj+**û.yq| ú"##$$%%&)*+óoit|xsnm**&)**úskx|q  "#$%&)÷*pou~vop))&$%ùmt|tkc "#õ$yhqvxzsjp$$#õ"hpz|jfmþ õtmp|{rqx$$"" ókm||qgh÷rtv}xjlq  þ"ørx~rhcþuþôjkkx|ytsd÷lo{}tgý{p÷tps}{qnrþ÷jqxtküpsÞsjgtxyxxskjx sjryztfcü|zk ôsqnmt||tppxñ jot~vph üvtðqgddstvvz|wpiktþñ jmsv|}if øh}}nyrlkköv|}ztssux þómkt~ysjðt}yty}ztkknpxõqsyzlgõwvzyjffkròtkmx|{wrfccûp|rôpor|vojúdm~ud øspgktvx{{ùogeúyp~tfñtnlox}{rrk"ùyqttþttôx|}wljh åpommjmy~{vy}~~{xuupjdcc$úz{||}òzxqmmljg(ørlnggffggûec0<ò„†‡‡‰‰ŒŽŽ‘””––—™ýœžŸŸ¡ôypqzynp§©¬¬®¯±´¶·¹ò„†‡‡‰‰ŒŒŽ‘‘””–—™îœžpinwy~~{vnk{¦§§©©þ¬®®¯±´¶·ú„††‡‡å‰ŒŽŽ‘‘””––——olu}€zqotŸ¡¤¤¦§©¬þ®¯¯±´ù¶~„„††‡ö‰ŒŽŽ‘‘cttþ|ûxiltžžŸ¡¤¦§©¬®¯±ä{~„„„†‡‰‰Œpljx€|utt——™™œþžŸŸù¡Ÿ¡¡¤¤¦¦§þ©¬¬ü®¬¬®®¯{æ~„†pqqx}|xlov””––——™œžŸúžŸŸ¡¡¤¤¦§©¬©¬®ëz{~yliiuy{|~~yxtjho‘‘þ”––þ—™™œžþŸžžþŸ¡¡þ¤¦¦§©þ¬©©¬øsqnmp{}ó{tppq‡‡‰‰ŒŒŽ‘”þ–——þ™œœžŸ¡¤¦§©¬©ðw|~||wohms„„†‡‡‰ŒŽ‘”–—™œžŸ¡¤¦§üytstt~þ„††þ‡‰‰ŒŽ‘”–—þ™——™œžŸ¡¤ørxvvwwz{{~„†‡‰ŒŽþ‘‘”–—™œžŸ¡ò¤¡¡oorsvvwwzz{{þ~„ú†‡‡‰‰ŒŒŽ‘”–—™œžŸ¡ùknorrsvvwzú{~~„†‡‰ŒþŽú‘””––——™œžŸö¡ŸŸjknoorssvwúz{{~~„†‡‰ŒŽ‘”–—™œížsgtjkknoorrssvvwwzzþ{~~þ„†ú‡‰‰ŒŒŽŽ‘”–—™õqp{|ggjknnoorsþvwwz{þ~þ„„†þ‡‰‰ŒþŽ‘”—òsqx€xkcfggjjnoorsvwz{~„†‡‰ŒŽ‘”ðkn|}vrk–_bcffgknnþorrsvwz{~„†‡‰ŒŽøwovxnn‘‘ñ^_bccfjjkknnoorrsvþwzz{~„†‡‰Œ÷ois{|xnkü^_bccgjkúnoorrssvwz{~„†‡÷‰lp|~tpŒŽŽŒô[^_bbccffggjjknorsþvwwzþ{~~þ„„õ†ogpu{~vks‰‰Œ‰Zö[^__bccffggjknorsvwz{~÷ymn{ytv††‡†ùVWZZ[[bbþcffþgjjknúorrssvvwz{~söy{ol„„††„†WüZ[[^^_bcfgýjnooþrssvþwzzòwojpz}{vrin~~ ûSVVWZZ[þ^__þbccfgknorsvötnr|xpoz{{ ~OûRSVVWWZ[þ_bbþcffgjknòsiquy}|wkmxwwzz {~NûORSSVVWZ^_bcfgjôsms||trkrrssvw zùKNOORRVVWZ[^_cfgörtx}xomxnnors vùJKNNOOSSVWZ[^bóqks{~~yusqkxkkno rùFGGJKKOOþRSSVWZ[ñtppw}zrmq{cffggjkn onâBCFFGGKKNNOORRVnjgpvy{|zytklq__þbccþfggjk nàkBBCCFFGJJKKNpnmt|~|spquZZ[[^^bbcf gkjógkw??BBohdnuttô{}~~{qilxSSVVþWZZ^_b cgföqwumjjlv|ô}yuttvJKKNNOORSVþWZZ[^ _bù_pt{t|øzumkntxGGJKNORSVWZ[ ^þ_^^ëpqyumjutpeelsx??BBCCGGJKNORSVWZ [ñkrywnjWV335577;;=?úCFFGGJJKNORSV WókozwqxVVSR1133ù5799;;==ú?BBCCFFGJKNORS÷jptxypoxRR÷Nj//1133779;=?BCFGJKNO÷pks}tp{ONNýJp11þ35579ú;==??BBCFGJKõNyqu}uljJGFFúGKyq|11357ú9;;==??BCFGJëoit|xsnmGGBCGGFskx|q1 13579;=?BC÷Fpou~vopCCB=?ùmt|tkc11/13579;õ=yhqvxzsjp==;õ9hpz|jf#m11þ-//1357õtmp|{rqx==997ó5km||qg+)h11/13÷rtv}xjlq77þ9553ørx~rhc!þu11/1þ311/1ô3jkkx|ytsd133531÷lo{}tg-'ý{p1131/1÷tps}{qnr33þ/1131÷jqxtk5+üps11Þsjgtxyxxskjx11//-+-/3557sjryztfc/ü|zk1 1ôsqnmt||tppx11ñ7531/jot~vph/% üvt11ðqgddstvvz|wpikt11þ311ñ3575jmsv|}if)! øh}}nyrlkköv|}ztssux1 1þ311ó355mkt~ysj5)ðt}yty}ztkknpx11õqsyzlg+%!õwvzyjffkr11ò/tkmx|{wrfcc!1ûp|r11ôpor|voj%#1údm~ud1 1øspgktvx{{ùoge+%1úyp~tf--/53ñtnlox}{rrk91'3ùyqtt/11þ-ttôx|}wljh+'% åpommjmy~{vy}~~{xuupjdcc%$úz{||}òzxqmmljg-)%#!(ørlnggffggûec%#0<ö}£ÔèèËŽY1ó&AÂÕããÙ½R#0õ\€²àèçÒ§y0ú&©¿ÝççûÀ\:.ô.P_Äèèçß¿©>0óC‡¨Èßèçß¼|_ +ï*5C ÒÚÞääÕЧ1#*ø U„Š”ÓàççúÕ°™ƒ%/óÈÚææãááºgM72ùκ°d8ý7úü¢:û1Ùá8ùÏèÂY6ø(kàáÄ\5øŠÆèËk4÷,ŠÙßÌm5ùO›Üã³v4ö 7¶Ùã¼W3÷<}×çж(5øC±ÒçØ„:3õ :sÓáÚºK2÷}¦Ý寗P2ôM«ÒáÝ»O%1ö,hÚèÛµ–3ö}¸ËâçÆyO0ó#K‹ÖäãÒÁ/ô1ˆžÀáçÏž}5-ñ%.Y³ÔÙßÙÒ˜A# -óKq«ØåçÛ­¡s%þ în–¿¿×áååØYE &ö¿KaajªÕççùáÏ¿´ƒ*+ú7˜Ö¯ÛççøÐ¨yg5 ,ñ˺h­y?%% .ù.†ÐÁR6ù:‹ÐÀn5÷*¨ÐÌb!þ/ød¨ãµ]þy-ø†Ââ±_ü mÜ*÷H§ÞÉ„#úMÈÞ¨(ø1»ã¹|ù5®ß»q$ö#Z´ÐÖœ?ö#ˆÕßg!÷m‹Üצ_ ù0yÝݤCþ&÷>®ÆâÃ_C ùzÍä«Mþ®öPaµÙнq ù1z×â¾AýÙ>÷_—±áÖ’m5 ù’Ìç¸püå›ó.8„ÈÑËφ1! ÷<ŽÔÙ¶. üÞÓ7 ôUƒŠ©ÙÛ²›v øv¨åǘH ü±ç£ðq°ÆÄÔÞµpP? ÷™Çßâa*ì5áâ<5_kjj®ÙßѶ³ ]øøk°ÐçÙ€CõȼÓçÊ&ô yûztlyy{ôopw|oszyywwvvýwvuuødp~qcWwûvtuwwyùq|ynyywwvuývussùr€sjj8øuvvwymwwúxp}tovvwvusôusrry|{gjFsúudgvvûk{|quuvusrq÷oq|{h`[*rúsg|guuùpq|wpnssrþqoomødu€k_[2rôuhrroiy|ugrrqonm÷eot}kd[Wþoqqômsrus|xkyrqqoþqoon÷ow~pZjX"nöojvpv}rlqqonml÷ow|vg`^3lmùj€upnnonmñljjeedpwyvjXd?jlút}sfmmledõcax{tmf^S÷jqpxxnlljedcövwyqkRWR"øqs}{q{xjjedcõaowxsphXW.zùqkwtxyddcaô`_owyppmUS8÷teacysyzaacaó`^pwxtWVVRBþt__üqyzaaì`__``__^\^tyqXRRWB_ûq|u`__ý^\^^\ô[furvmSSND\üq|u\\[ZôXxtscnnRU=[úq|u[[ZZXôot{rcnnmQJ#Xúq|vZZXXWôVp{rQrqMMB)Wüq|vWWVô{uxostqnRE& UüqyzUUSôq}xfNtlgJB)!UüqyxRRòQwpztlMttgIC*"þRQQsþxQQPójuyjrNpui?F$#QPìtxxPPNNtuwnPPutiC?&$NíqzxMMjt|pnCNoviB:&%Iîl}vIqvwqEE@mxi@= &FïjxtythDCCmyi>8#'Dðn~yknB@yjzi;3(CïBxxop?>=przi8.)îBnpx~sn>=;evvh0.*ðkxy{~m9>ylxvg8",ñ|touxr;isypg*-òq9kxr3mr}m2+.ô7youru|n.0õ2o{xm{tfc1÷/t|}sc3øm}~}gc4ù|}pf 5ûzk"7üdc8þ¹û¼t}m¼ ¼öpv}tk¼¼¹¹··ý¹·´´ùxz|i¦f·û¹tl··¼ôopw|os¹··¶¶´´ý¶´±±ødp~qc‰/¶ûvtu¶¶·ùq|yn··¶¶´±ý´±¯¯ùr€s¡¡[ø±´´wym¶¶úxp}to´´¶´±¯ô±¯®®y|{g¡s¯ú±dg´´ûk{|q±±´±¯®¬÷©q|{h—G®ú¯g|g±±ùpq|wpn¯¯®þ¬©©¦ødu€k–V®ôuh®®oiy|ug®®¬©§¦÷Ÿot}kd‰þ©¬¬ôms®us|xky®¬¬©þ¬©©§÷ow~pŽ¡Œ9§ö©jvpv}rl¬¬©§¦¤÷ow|vg—”W¤¦ùj€up§§©§¦ñ¤¡¡ŸŸžpwyvjŒžg¡¤út}sf¦¦¤Ÿžõœ™x{tmf”„)÷¡qpxxn¤¤¡Ÿžœövwyqk‰9øqs}{q{x¡¡Ÿžœõ™owxsphŒ‰Kzùqkwtxyžžœ™ô—–owyppm†„[÷te™œysyz™™œ™ó—”pwxt‰‡‡k!þt––üqyz™™ì—––——––”‘”tyqŒ‰k)–ûq|u—––ý”‘””‘ôfurvm„„{o-‘üq|u‘‘ŽôŒxtscnn†c3úq|uŽŽŒôot{rcnnmv;Œúq|vŽŽŒŒ‰ô‡p{rrqzzkC‰üq|v‰‰‡ô{uxostqnrB †üqyz††„ôq}xf{tlgvkC!†üqyxòwpztlzttgwnF"þsþx~ójuyjr{puigs=#~ìtxx~~{{tuwn~~utingB${íqzxzzjt|pnn{ovik_B%wîl}vwqvwqrrjmxijc7&sïjxtythonnmyif[;'oðn~yknkjyjzibS-(nïkxxopgfcprzi[K')îknpx~snfcbevvhRK+*ðkxy{~m^fylxvg[9,ñ|touxrbisypgF'-òq^kxrWmr}mVJ!.ôZyouru|nK30õVo{xm{tfc/1÷Ot|}sc53øm}~}gc34ù|}pf715ûzk9)7üdc#8þ#Âü½ãp úªá¢, û3Éà\ü›çù7ÈÞ ú—å©ûEç ûˆÜÍO üè±û çËú™ã±: ûRÛÙ:ûçç(ûZÒßwûKÛÛOûÛç(ùŽßÉb ûÃêyô£ç,3Õܰúºâyõkç_—ßÏ\û©ä¦÷]çªRÁáž1ú¤ÙÂ&ù]ççèÂeú«Ç¢<ú¡çá¢ú”ÑW8øZËæçÐú¤Êe ø8¦âÕ×Ðù ¢ÁWO÷ØÙ“.´Ðù£ÌR< ÷µ#«Ó ûªÄ3 þü¦Ó üºÈE&ü¦ÚF úÀ®&ü¦ÚF ùR¾³.&ü¦ÚF÷zÓ.&ü¦ÙAùzÑ€U7(ü¦ÙC÷(¤ÏO <(ü¦Ô÷>ÙÉh8)ü¦ÒökÒœ*&ª8)ü­Ðö£Õa .ªR*ü(ÅÐöe¿¾J&©Y+ð8Ð͈ٞ!>¶R,÷Pߪ?½ÉbüAÉW-ø]竘Ч,üCÌP.óqçäÐM\ØR.úÂç1ûŒ×W-ùdÊä¦ û½ÅK-ò\ÂÐÓãq?ÌÆ>.óÜ 7ºÍ1mÓ™3/õ?8Р¢áˆ2÷Šç!E¹ÜŒ3÷1Ó¼n×¾3ùªçßá³4ùƒâåáC5ûÞâ*7ýÙt9ýþ~~??ýýSphereÿ     q¶F¢Aýý¢]A#A/ýý¢©°7ÜÈ@ K)JX Ÿì±¨ÔÐú­]$•9)ÿþ=þ;ü;ü<==<ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü;ü<ý<ý<=ý<ý<=>þ<~ý=:û2`m9ú.Uaqr7ø7\qqmu6÷$Qljenv{5ö:ajamussv3ôV[ajmoqrwz2ó3W[_emoqsuwz0ñ9[l`dmorsuwy{/ð%N\[Zdjorssvwz{.ï+S`[\eeloqrsvyz|-î0WZU\jmjmoqrswz{},í;R\VWel_jmorsvy|{}*ë@USXaeaaelnqruw{}|})êBWVX[^`cjmnqsuuvy{~~(é%=MRVX\_`cjmnqsuuvy{~~'è)IVUUWZ^`adjmnqsuuwz{~~&ç&CRRU[Z\_acdlnoqsuvwz|~~%æ)EPINV\[^`cdemnoruvvwz|~~$å*@QNMVZW\_cdejmooruvvy{|~~#ä&DFINUZ[X_`ceejnooruvwy{}~~"ã$FICESXUW`_adejlnqqruvwy{}~~!â+B=EIPSVX[^`adejlnqruvwwy{}~~ á7CDFIQSVX[^`adjjlnqruvwwy{}~~à#9>CMJMQUVX[^`cejjlnqruvwwy{}~~ß3C@CMINRVWZ\^`cejlmoqruvwwy{}~~Þ/;?BFMMPSVXZ\_acejlmorruvwwy{}~~Ý+@?=ENMNQUWXZ\_adjllmorruvwwy{}~~Ý&8C@?JNIPRVXZ[\_adjllnqrruvwwy{}~~Ü%29>?CJIJPRVXZ[^_adjlmnqrruvwwy{}~~Û37:?CEJMPQSVXZ[^`cdejmoqqssuwyz{|}~Ú*38:?CEJNPRSWXZ[^`cdejmoqqssuwyz{|}~Ú*739;@DEJNQRUWXZ[^`cdejmoqqssuwyz{|}~Ù"39;:=BDFINQRUWXZ\_acdejmoqqssuwyz{|}~Ø 0/3@;>CEFINQRUWZ[\_acdejmoqqssuwyz{|}~×/7/3@=?CFJIPQSVXZ[\_acdejmoqqssuwyz{|}~×#/327:>@DFJMPQSVXZ[\`acdejmoqqssuwyz{|}~Ö/*+:>2>BEJIMPQSVXZ[^`ccdejmoqqssuwyz{|}~Õ&/379:?BEFJMPRVVWZ\^_`adjjllnqrsuvwyz{}~Õ#*038:;@CEFIMPRVVWZ\^_`adjjllnqrsuvwyz{}~Ô#)/28:;>@CEJIMQSVVWZ\^_`adjjllnqrsuvwyz{}}Ô$&+038:;>@CEJINQSVVWZ\^_`adjjllnqrsuvwyz{|}Ó$*+0379:=BCFJINQSVVWZ\^_`adjjllnqrsuvwyz{|}Ò%"*.0278:=BDFIMNRUVVWZ\^_`adjjllnqrsuvwyz{||Ò&$*/0379=?BDFIMPRUVVWZ\^_`adjjllnqrsuvwyz{||Ñ"%)+/338:>@BDJIMPRUVVWZ\^_`adjjllnqrsuvwyz{{|Ò"++/279;>@BDFJIMQRUWZ[[\_aacdelmnnqrsuwyzz||~ý-c:ûV—¦9úK†™¬®7ø#Z‘¬¬¦±6÷=¤¡Ÿ§´¼5ö_™¡™¦±¯¯´3ô'‡™¡¦©¬®¶¹2óW‰–Ÿ¦©¬¯±¶¹0ñ!^¤—ž¦©®¯±¶·¼/ð?{‘Žž¡©®¯¯´¶¹¼.ïJ„—‘ŸŸ¤©¬®¯´·¹¼-îR‰Ž†‘¡¦¡¦©¬®¯¶¹¼½,íb‘‡‰Ÿ¤–¡¦©®¯´·¼¼½*ë)j†„Œ™Ÿ™™Ÿ¤§¬®±¶¼½¼½)ê3k‰‡Œ”—œ¡¦§¬¯±±´·¼¾¾(é?cz‡Œ‘–—œ¡¦§¬¯±±´·¼¾¾'èCw‡††‰Ž”—™ž¡¦§¬¯±±¶¹¼¾¾&çBn†Ž‘–™œž¤§©¬¯±´¶¹¼¾¾%æCr~w{‡‘”—œžŸ¦§©®±´´¶¹¼¾¾$åGj{z‡Ž‰‘–œžŸ¡¦©©®±´´·¼¼¾¾#äBosw{†ŽŒ–—œŸŸ¡§©©®±´¶·¼½¾¾"ã=swnr„Œ†‰—–™žŸ¡¤§¬¬®±´¶·¼½¾¾!âJkcrw~„‡Œ”—™žŸ¡¤§¬®±´¶¶·¼½¾¾ á1Znosw„‡Œ”—™ž¡¡¤§¬®±´¶¶·¼½¾¾à;^fnzvz†‡Œ”—œŸ¡¡¤§¬®±´¶¶·¼½¾¾ß'Wnjnzw{‡‰Ž‘”—œŸ¡¤¦©¬®±´¶¶·¼½¾¾Þ%Nbgkszz~„‡ŒŽ‘–™œŸ¡¤¦©®®±´¶¶·¼½¾¾ÝJjgcr{z{†‰ŒŽ‘–™ž¡¤¤¦©®®±´¶¶·¼½¾¾ÝB[njgv{w~‡ŒŽ‘–™ž¡¤¤§¬®®±´¶¶·¼½¾¾Ü?V^fgnvwv~‡ŒŽ”–™ž¡¤¦§¬®®±´¶¶·¼½¾¾Û3SZ_gnrvz~„‡ŒŽ”—œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾Ú'FS[_gnrv{~„‰ŒŽ”—œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾ÚFZW^bjorv{†‰ŒŽ”—œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾Ù9S^b_ckosw{†‰ŒŽ‘–™œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾Ø7ROWjbfnrsw{†‰Ž‘–™œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾×!NZNSjcgnsvw~„‡ŒŽ‘–™œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾×;OSVZ_fjosvz~„‡ŒŽ‘—™œžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾Ö1NGJ_fVfkrvwz~„‡ŒŽ”—œœžŸ¡¦©¬¬¯¯±¶·¹¼¼½¾Õ-5BNSZ^_gkrsvz~‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼½¾Õ3;GRW[_bjnrswz~‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼½¾Ô/;CNV[_bfjnrvwz„‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼½½Ô=BJRW[_bfjnrvw{„‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼¼½Ó1=FJRWZ^_cknsvw{„‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼¼½Õ+?9FKRVZ[_ckoswz{†‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼¼Õ5B=GNRWZ^cgkoswz~†‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼¼Ô)9?CJNSW[_fjkovwz~†‡‡‰Ž‘”–—™ž¡¡¤¤§¬®¯±´¶·¹¼¼Ò)915JJNVZ^bfjkosvwz†‰Ž‘–™™œžŸ¤¦§§¬®¯±¶·¹¹¼¼~ÿ;þÿÿ:ÿ8þ)ÿÿ7ÿ6ÿ4þqÿÿ3 ÿ1þÿ ÿ0ÿ/ÿ.ÿ-ÿ+þ£ÿÿ*ÿ)ÿ(ÿ'ÿ&ÿ%ÿ$ÿ#ÿ"ÿ!ÿ ÿþqÿÿþIÿÿþÿÿ!ÿ"ÿ#ÿþqÿ"ÿ$ÿ%ÿ&ÿþÿ%ÿ'ÿ(ÿ)ÿ)ÿ*ÿ*ÿ+ÿþÞÿ*ÿ,ÿþ£ÿ+ÿþ£ÿ,ÿoï %'&%-'+<>55ACA'è&-"!&0:<<::A:E>A"ã "(+72'#"'5A727>CAAGGHß "! "%&#%+-('0>EE>:7KJIIHGEGJMí #"(+--' ::7ó>C-027>EIICHç  ! %('('%&-52+2:<<JHIýJMç !"#%&((+-02577ï:<>ACEGGHHIJKKMMÒ !"%&&(++-25577::ACEEGHHIJKKMMâ ! !"#%&'(+-0257::ò<>ACEGGHHIJKKMMþP ß  !!"#%&'(+--0257:<<ô>ACEGHIIJJKMMP Ï    !"#%&'(+-00257:<<>>ACEGHHIJJKMMPú  ùá !##%'(+-00225:<<>>AACGHHIJJKMMPï  ö!"#%&'(-00ú257:<>>õACEGHIIJJKMMPþRØ  !""%&&'(+-02257:<>>CCøEGHHIKKMMPRÍ  !""%&&'+--02257:<>ACCEEGHIIKKMMPRÌ  !"#%&'(+-002557<>>ACCEGGHIIKKMMPRË  !""#&&'(+-00557:<>AACEEGHHIIKKMMPRÌ  !"##&''(+002557:<>AAEEGGHIIJKKMMPRÊ  !"#%&'(+-022577:>AACEEGHHIJJKKMMPRþË  "##%''(+-02257:<>ACCEEGHIIJJKKMMPRÎ  !"##%''(+-02277:<>ACCEGGHIJJKMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÓ  !"#%&''(+-02257:<>ACCEùGHIIJKMMPRÌ  !"#%&&''(+-022577:<>>AEGGHIJJKMPRÇ  !"#%&&''(+-022577:<>>AEEGHIIJJKKMMPRÇ  !"#%&&''(+-022577:<>>AEEGHHIJJKKMMPRÇ  !"#%&&''(+-022577:<>>AEEGGHIIJKKMMPRÇ  !"#%&&''(+-022577:<>>ACEEGHHIIKKMMPRÇ  !"#%&&''(+-022577:<>>ACCEGGHIIKKMMPRÇ  !"#%&&''(+-022577:<>>ACCEEGHIIKKMMPRÑ  !"#%&&''(+-022577:<>>ACCøEGHHIKKMMPRá  !"#%&&((ì+-002557:<>AACCEEGHIIJýKMPPRË  !"#%&&'((+-002557:<>AACCEEGHIIJýKMPPRÓ  !"#%&&''(+--00257:<>AACõEGHHIIJJKMPPRÒ  !"%%&''(++-002557:>>AAôCEGGHHIJJKMPPRÄ  !"#%%&''(+--02257:<>>AACCEGHHIJJKMPPRÓ  !"#%%&&'(++--0257:<>>AõCEGGHIJJKMPPRÒ  "##%&&'((+--0225:<<>>ôACEEGGIJJKMPPRÒ  !"#%&&''(+--02257:<>>ôACEEGGIJJKMPPRÊ  !"##%&&'(++--2257::<<>ACEGHHIIüJKMPPRÊ  "##%&&'((+--22577:<<>AACGHHIIüJKMPPÉR  !"#%&&''(+--22557:<<>>ACEGHIIüJKMPPÃR  !"##%&&'(++-02257::<>>ACEGHHIIJKMPPÃR  !""#%%&''(++002557::<>>CEGGHIIJKMPPÃR  !"#%%&&'(++002257::<<>ACEGHIIJKMPPÃR  !""#%%&'((+-002577:<<>ACEGGIIJKMPPÛR  !""#%%&'((ú-002577<ô>ACEGGIIJKMPPÊR  !"##%%&'((+--0257:<<>ACEGGûHIJMPPÉRT  !"##%%&'((++-0257:<<>ACEGGûHIJMPPÉRT  !!"##%&''(++-02577:<>ACEGGûHIJMPPÂRT  !!""#%&&''(+-02577:<<>AEEGGHIJMPPÂRT  !""##%&''((+-0257::<>ACEEGHIJMPPÂRT  !""#%&&'((+-02557:<>ACEEGHIJMPPÂRT  !!"#%%&&'(+-02557::ACEGHIJMPPßRT !!á"#%%&''(+-02277:<>ACCGHJJKMPRRT2ò*9=:CWcdmvur)ê+JXev…Ž”–•”˜–˜œššž$å/IsŒ•˜’Š‘•™›œœ›››œŸŸŸà*Fl„ŒŽ‹’—˜›š–“’–š›š›žŸŸ à)Pa}’‘’”•“”˜˜—–™ŸŸ››£¢¡¡ ŸŸý¢¤ðDw…†‹‹Š‹“Ž’—˜˜ý–››óž˜™š›Ÿ¡¡ž ä;eƒŠ‹ŠŒ‘”—–—–”•˜šš˜š›œœ¢ ¡ý¢¥æ=|…†‰Š‹‹‘’“”•——˜˜™šš››ûœžŸŸ ù¡¢££¤¤é/sŒ‰‡‰‹Œ‹‘’”••—˜˜š›ûœžžŸŸ÷ ¡¡¢££¤¥ ð#Iy…~{…ŽŠŒŠ‹Œù‘’“”•–˜˜ü™šš››ûœžŸŸ ø¡¢££¤¥¥ à*J{€€ƒˆ‡‚Œ‹Ž‘‘’“”•–—˜˜™šš››ûœžŸŸ ÷¡¢££¤¤¥©ã2[z„s„‹‡„‰‹ŒŒŠŒŽ‘‘’“”•–—˜˜ú™šš››œœñžŸŸ ¡¡¢¢£¤¥¥©©Ù9d‡„~…‡……Š‹‹ƒ‹ŒŽ‘’“”•–—˜˜™™šš››œœ𞟟  ¡¢¢£¤¥¥©ªª÷=Wu|y~……ù†Š‹ŠŒŽŽó‘““”–—˜˜™™ššü›œœ𞟠 ¡¢¢£¤¤¥©©ªªë3msz€„†ƒ…ˆŒŒ‹Œö‘’“”•–—˜™™š›þœÉžŸŸ ¡¡¢¢£¤¥¥©©ª«9jzs{|~€‚„……ˆˆ‰‹ŒŠ‹ŽŽ‘’’”••–—˜˜™šš›üœžžŸ Ò¡££¤¤¥©ªª««+Mdwzw|}ƒ……†ˆ‰Š‹ŒŠ‹ŽŽ‘’’”••–˜˜þ™šš›úœžžŸŸÌ ¡¡££¤¤¥©ªª««dwwv{~€‚„…†‡‰‰Š‹Š‹‹ŽŽ‘’“”•–—˜˜™™ššý›œžŸÇ ¡¡££¤¤¥©ªª««usrw}€‚„…†‡ˆ‰Š‹Œ‹ŒŒŽ‘’’“••–—˜˜™™šš››œþžŸŸ ¡£¤Ô¥©ªª««su{€€|‚‚„…†‡ˆ‰ŠŠ‹Š‹Œ‘’““•––—˜™™šš›þœŸÍ ¡¡¢££¤¤¥©ªª««zz{~}ƒƒ„…†‡ˆ‰‹‹Œ‹Œ‘’“”•–—˜˜™šš›þžŸŸ Û¡¢¢££¤¤¥©ªª««|yv{ƒƒ„…†‡ˆˆ‹ŒŠ‹ŒŽõ’““”––—˜˜™šš›úœžžŸŸÊ ¡¡¢¢££¤¤¥©ªª««wy}‚‚ƒƒ„……‡‡ˆ‹ŒŠ‹ŽŽ‘’““”––—˜˜™šš››úœžžŸŸý ¡¢¢£¤ã¥©ªª««|}~‚„„……‡ˆ‰ŠŠ‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««é|}~ƒ„„…†‡ˆ‰ŠŠ‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««é}~~ƒ„……†‡ˆ‰ŠŠ‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««é}~€‚„„……†ˆ‰ŠŠŠ‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««ù~€ƒ„……ò†ˆ‰Š‹Š‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««ú€€ƒ……ñ†‡ˆ‰Š‹Š‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««ú€‚„……ñ†‡ˆŠ‹‹Š‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««ú€‚„……ñ†‡‰Š‹‹Š‹Žô‘’“”•––—˜˜™šš›üœžžŸô ¡¡¢£¤¤¥©ªª««Û‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœŸý ¡¢¢£¤Õ¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœŸÌ ¡¡¢¢££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœŸ Î¡¢¢££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœŸÍ ¡¡¢££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœþžŸŸ ¡£¤Õ¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœžŸÎ ¡¡££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœžŸÎ ¡¡££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™šš›þœžŸ Ö¡££¤¤¥©ªª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••——˜™š›þœžŸþ ¡¡¢Ó£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••–——˜˜™™šš›þœžŸþ ¡¡¢×£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“”••––—˜˜™š›þœžŸ ¡¢â£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ÷‘’””•––—˜˜™š›þžŸŸ ß¡¢¢£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽö‘’“””•––—˜˜þ™šš›þœžŸ Ó¡¢¢£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽ‘’“””••–—˜˜ù™šš››œþžŸŸÝ ¡¢¢£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽö’““”••–——˜˜þ™ššü›œœþžŸŸÞ¡¢¢£¥©©ª««‚ƒ„……†‡ˆ‰Š‹ŒŠŠ‹ŽŽö‘’“”••––—˜˜þ™šš›þœþžŸŸÓ¡¢¢£¥©©ª««€‚ƒ„††‡ˆ‰Š‹‹Š‹ŒŽŽ‘’““”••–—˜˜š›œúžŸŸ  ¡¡à¢£¥©ªª«¬€‚ƒ„††‡ˆ‰Š‹‹ŒŠ‹ŒŽŽö’““”••–——˜˜š›œûžŸ  ¡¡û¢£¥©ªªÛ¬€‚ƒ„…†‡ˆ‰Š‹‹ŒŠŒŽ‘’“”••––—˜˜š›œûžŸŸ ¡¡û¢£¥©ªªÛ¬€‚ƒ„…††‡ˆŠŠ‹ŒŒŠ‹Œ‘’““”••–—˜˜þ™šš›þœôžŸŸ  ¡¡¢£¥©ªªÖ¬€‚ƒ„……†‡ˆ‰ŠŠŒŒŠ‹ŒŽ‘’’“””•––—˜˜™™šš›ûœžŸŸø ¡¡¢£¥©ªªÖ¬€‚ƒ„……†‡ˆ‰ŠŠ‹ŒŒ‹ŒŒŽŽ‘’“””••–—˜˜™™šš›œõžŸŸ ¡¡¢£¥©ªªø¬€‚ƒ„……݆ˆ‰‰Š‹‹ŒŠ‹ŒŽŽ‘’’“””•–——˜˜™™šš››œþžŸŸ¡û¢£¥©ªªø¬€‚ƒ„……冇ˆ‰Š‹‹ŒŠ‹ŒŒŽŽ‘’’“””•–——ú˜™™šš››œþžŸŸ¡û¢£¥©ªªø¬€ƒ„„……ↇˆ‰‰Š‹ŒŠ‹‹ŒŽŽ‘’““””•–——˜˜õ™šš››œœžŸŸÐ ¡¢¤©ªª«­€‚ƒ„„……†‡ˆ‰‰Š‹‹ŒŠ‹‹ŒŽ‘’““””•–——˜˜õ™šš››œœžŸŸï ¡¢¤©ªª«­~€‚ƒ„„……㇈ˆ‰ŠŠ‹ŒŠ‹ŒŽ‘‘’““”•––—˜˜ü™šš››ûœžŸŸÊ ¡¢¤©ªª«­~‚ƒƒ„„……†‡ˆˆŠŠ‹ŒŠ‹‹ŒŽ‘‘’’“”••––—˜˜™šš››œŸÉ ¡¢¤©ªª«­~€‚ƒƒ„„……†‡ˆˆ‰ŠŠŒŠŠ‹ŒŒŽ‘’’““”•––——˜˜™šš››ûœžŸŸÛ ¡¢¤©ªª«­}€‚ƒƒ„„…†‡‡ˆ‰‰Š‹ŒŠ‹ŒŒŽò‘’’“”••–——˜˜™šš›ûœžŸŸÛ ¡¢¤©ªª«­}~€‚‚ƒƒ„……†‡ˆ‰‰Š‹ŒŠŠ‹ŒŽ‘ô’“””••–—˜˜™šš›ÕœžžŸŸ ¡¢¤©ªª«­}~€‚‚ƒƒ„……†‡‡‰‰Š‹ŒŠŠ‹ŒŽ‘ô’“””••–—˜˜™šš›ÒœžŸŸ ¡¢¤©ªª«­}~€ƒ„„……†‡ˆ‰‰Š‹ŒŠŠ‹‹ŒŽ‘‘ò’“””•––—˜˜™šš››ñœžžŸ ¢¢£¤ª¬«­2ò#F^c_n‰œž¦´±®)ôJvŒŸ´ÄÏÔÖÕÔÖÖÓÔÒ%ôOw¯ÊÕÖÓËÒÕÕÓÓüÒÓÓÒÒûÓÒÓÒæFs¤ÃÍÑÑÏÌÎÓ×ÖÔÕÖÔÓÖÔÒÔÕÔÓÒÒþÓàC~™½ÊÑÓÒÑÓÔÕÔÔÖÖ×ÖÕÓÒÒÓÓÔÖÕÔÔÓÒÒýÕÖðo¶ÄÄÊÌÎÌËÌÐÔÏÓ×ÖÖþÑÓÓÔóÓÒÖÕÕÔÓÒÔÔÒÓå1bŸÂÈÉËÍÊÎÑÒÑÑÔ×Ö×ÖÔÕÖÔÕÖÕÓÓÕÓÔýÕØçc¼ÄÄÇÈÉÊÌÎÐÐÑÒÓÔÔÕ××ÖÖÕÕÔÔÓÒÓýÔÕÖÖéO¯ÊÇÀÅÇÉÊÊÌÎÐÐÑÑÒÓÔÕÕ×ÖÖþÕÔÔÓÒûÓÔÔÕÖÖþØ ð;w·Ä¾¼ÄÏÈÊËÌÍÎÐÑÑúÒÓÔÔÕÖÖÕÔÓÒÓýÔÕÖÖØ ßFv¼¿À¿ÂÆÅÁÊÊÌÎÎÏÑÒÑÒÓÔÔÕÖ×ÖÖÕÕÔÔÓÓÒÓýÔÕÖÖýØ×ãV¹Ã¯ÃÉÅÃÇÌÍÊËÍÎÎÏÑÒÒÓÔÔÕÖ×ÖÖÕÔÓÒôÓÔÔÕÕÖÖØØ××á^žÀÅþÄÅÄÄÈÌÉÂÊÌÍÎÎÏÑÒÓÔÔÕÖ×ÖÖÕÕÔÓÒÓõÔÕÕÖÖØØ×ÙÙ÷5c‰±¿¼·¾ÄÄúÈÊÌËÍÏÏüÐÑÒÔÔûÖ×ÖÖÕÕþÔÓÓÒÓüÔÕÕÖÖúØ××ÙÙëS¦¯¹¿À¿ÀÃÄÂÄÆÊÊÉÊÎÍÎÐÐöÑÒÓÔÔÕÖ×ÖÕÕÔÓÒÍÓÔÔÕÕÖÖØØ××ÙÙ^¡¹¯¼¼¾¿ÁÃÄÄÆÆÇÉÊÊËÌÏÏÐÑÑÒÓÓÔÕÕÖ×ÖÖÕÕÔÓÒÓþÔÖÖýØ×ÙÙôJzž¶¹¶¼½¿ÀÂÄÄìÆÇÈÉÊÊËÌÏÏÐÑÑÒÓÓÔÕÕÖÖÕÔÓÒüÓÔÔÖÖýØ×ÙÙÛž¶¶´¼¿¾¿¿ÁÃÄÄÅÇÇÈÉÊËÌÌÏÏÐÑÑÒÓÔÔÕÖ×ÖÖÕÕÔÓÒüÓÔÔÖÖýØ×ÙÙÙ±¯®¶½¿¿ÀÁÃÄÄÅÆÇÈÉÊÊÌÍÍÏÐÐÑÒÓÓÔÕÕÖ×ÖÖÕÕÔÔÓÒÓÔÖýØ×ÙÙܯ±¼¿¿¼ÁÁÃÄÄÅÆÇÈÈÉÊËÌÍÎÐÐÑÑÒÓÔÔÕÖÖ×ÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙ¹Þ¼¾¿½ÂÂÃÄÄÅÆÇÉÉÊÊÌÍÎÎÐÐÑÑÒÓÔÔÕÖ×ÖÖÕÕÔÓÒÓüÔÕÕÖÖýØ×ÙÙè¼·´¼¿ÀÂÂÃÄÄÅÆÆÉÊÊËÌÍÎÏÐÑÑþÓÔÔÖü×ÖÖÕÕÔÓÒúÓÔÔÕÕÖÖýØ×ÙÙä¶·½ÁÁ¿ÂÂÃÄÄÅÅÆÉÊÊËÌÎÏÏÐÑÑÒÓÔÔÖü×ÖÖÕÕÔÓÒýÓÔÕÕÖýØ×ÙÙé¼½¾¿ÀÁÃÃÄÄÅÆÇÈÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙé¼½¾¿ÀÂÃÃÄÄÅÆÇÈÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙø½¾¾¿ÀÂÃÄÄóÅÆÇÈÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙø½¾¿¿ÁÃÃÄÄóÆÇÈÈÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙù¾¿¿ÀÂÃÄÄóÆÇÈÉÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙ¿ýÀÂÄÄòÅÆÇÈÉÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙ¿üÀÁÃÄÄòÅÆÈÉÉÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙ¿üÀÁÃÄÄòÅÇÈÉÉÊÊËÌÎÏÐÐÑÑõÒÓÔÔÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒýÓÔÕÕÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒúÓÔÔÕÕÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒÓüÔÕÕÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒûÓÔÔÕÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒÓÔÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒüÓÔÔÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒüÓÔÔÖÖýØ×ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÕÔÓÒÓþÔÖÖýØ×ÙÙú¿ÀÁÂÃÄÄéÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕ××ÖÕÔÓÒþÓÔÔÕûÖØ××ÙÙú¿ÀÁÂÃÄÄäÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖ××ÖÖÕÕÔÓÒþÓÔÔÕûÖØ××ÙÙú¿ÀÁÂÃÄĿůÇÈÉÊÊËËÌÎÏÏÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÔÓÒÓÔÕûÖØ××ÙÙú¿ÀÁÂÃÄÄñÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑ÷ÒÓÔÔÕÖÖ×ÖÖÕÔÓÒÓøÔÕÕÖØ××ÙÙú¿ÀÁÂÃÄÄñÅÆÇÈÉÊÊËËÌÎÏÏÐÑÑýÒÓÔÔûÕÖÖ×ÖÖÕÔÓÒÓøÔÕÕÖØ××ÙÙú¿ÀÁÂÃÄÄìÅÆÇÈÉÊÊËËÌÎÏÏÐÐÑÑÒÓÔÔÕýÖ×ÖÖÕÔÓÒ÷ÓÔÕÕÖØ××ÙÙú¿ÀÁÂÃÄÄðÅÆÇÈÉÊÊËËÌÎÏÏÐÐÑÑþÓÔÔÕüÖ××ÖÖÕþÔÓÓÒøÔÕÕÖØ××ÙÙú¿ÀÁÂÃÄÄðÅÆÇÈÉÊÊËËÌÎÏÏÐÐÑÑöÒÓÔÔÕÕÖÖ×ÖÖÕÔÓÒøÔÕÕÖØ××ÙÙ¿æÀÁÂÃÄÄÅÆÇÈÉÉÊÊËÌÍÎÏÏÐÑÑÒÓÔÔÕýÖ×ÖÖÕÔÓÒÓÔûÕÖØ×ÙÙçÛ¿¿ÀÁÂÃÄÄÅÆÇÈÉÉÊÊËÌÍÎÏÏÐÑÑþÓÔÔÕüÖ××ÖÖÕÔÓÒÓÔûÕÖØ×ÙÙðÛ¿¿ÀÁÂÃÄÄÅÆÇÈÉÉÊÊíËÍÎÎÏÐÐÑÑÒÓÔÔÕÕÖÖ×ÖÖÕÔÓÒþÓÔÔûÕÖØ×ÙÙøÛ¿¿ÀÁÂÃÄÄúÅÆÈÈÉÊÊôËÌÍÎÎÐÐÑÑÒÓÔÔÕýÖ×ÖÖÕÔÓÒÓÔûÕÖØ×ÙÙøÛ¿¿ÀÁÂÃÄÄúÅÆÇÈÈÊÊóËÌÍÎÎÏÐÐÑÒÓÓÔÔùÕÖÖ×ÖÖÕÕÔÓÒøÓÔÔÕÖØ×ÙÙøÛ¿¿ÀÁÂÃÄÄùÅÆÇÈÈÉÊÊôÌÍÍÎÏÏÐÑÑÒÓÔÔÕûÖ×ÖÖÕÕÔÓÒøÓÔÔÕÖØ×ÙÙøÛ¿¿ÀÁÂÃÄÄëÆÇÇÈÉÉÊÊËÌÍÎÏÏÐÑÑÒÓÓÔÔùÕÖ××ÖÖÕÕÔÓÒÔûÕÖØ×ÙÙøÛ¿¿ÀÁÂÃÄÄëÅÆÇÈÉÉÊÊËÌÍÍÏÏÐÑÑÒÓÓÔÔýÕÖ××þÖÕÕÔÓÒÔûÕÖØ×ÙÙøÛ¿¿ÀÂÃÃÄÄëÅÆÇÇÈÉÊÊËÌÌÍÎÏÏÐÑÑÒÓÔÔûÕÖ××ÖÖÕÔÓÒúÓÔÕÖ×ÙÙ÷Û¿¿ÀÁÂÃÃÄÄëÅÆÇÇÈÉÉÊËÌÌÍÎÎÏÐÑÑÒÓÔÔûÕÖ××ÖÖÕÔÓÒúÓÔÕÖ×ÙÙ÷Û¾¿ÀÁÂÃÃÄÄêÅÆÆÇÈÈÉÊÊËÌÍÎÎÏÐÑÑÒÒÓÔÔûÕÖÖ×ÖÖÕÔÓÒúÓÔÕÖ×ÙÙöÛ¾¿ÀÁÂÂÃÃÄÄßÅÆÆÈÈÉÊÊËÌÌÍÎÏÐÑÑÒÒÓÓÔÔÕÕÖÖ×ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙöÛ¾¿¿ÁÂÂÃÃÄÄêÅÆÆÇÈÈÊÊËËÌÍÍÎÏÐÑÑÒÓÓÔÔôÕÖÖ××ÖÖÕÕÔÔÓÓÒúÓÔÕÖ×ÙÙãÛ½¿¿ÀÁÂÂÃÃÄÄÅÅÆÇÇÈÉÊÊËÌÍÍÎÏÐÑÑñÒÓÓÔÔÕÕÖ××ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙõÛ½¾¿ÀÁÁÂÂÃÄÄðÅÆÇÇÈÉÊÊËËÌÍÎÏÐÑÑÒþÓÔÔÕùÖ×ÖÖÕÕÔÔÓÒúÓÔÕÖ×ÙÙõÛ½¾¿ÀÁÁÂÂÃÄÄÅÇôÈÉÊÊËËÌÍÎÏÐÑÑÒþÓÔÔÕûÖ×ÖÖÕÕÔÓÒúÓÔÕÖ×ÙÙõÛ½¾¿¿ÀÀÂÃÃÄÄíÅÆÇÇÈÉÊÊËËÌÌÍÎÏÐÑÑÒÒþÓÔÔùÕÖÖ×ÖÖÕÕÔÓÒ÷ÓÕÕÖÖÙÛÙÛ2þ)ÿ ÿ*ÿ%ÿ ÿþÿ!ÿ%ÿ)ÿ+ÿ.ÿ 1ÿ 3ÿþÿ4ÿ7ÿ:ÿ;ÿ >ÿ?ACô>:JIHJH- /ëCHKMPPMKJPTWTPJRR]R *åIJJIJJKMKKJKPRPRIRWRYRRTI$MçJR[\WPMMRWPUTP\Y\TPRYP& þKMMáPRTRMHIP[bPYT\[RWRPY^YUW]^Wa["PÝMPRMPRUWWTPW]T[\W^YUYYWY^\UY\WWb\þMPPRTUWþY[[\þ]^^þ`\\]ýW2þMPPRTUWY[\]^`^`ùamgWk PRTþUWWY[\]^`bc÷MeU]jfUPRUWY[\]^`aceõnr^`cagWaþPRRTUWY[\]^`abceó][^ukR]u]jk> RTþUWWYþ[\\]^`abceñgmaT`xt[iYT`b< RTUWþY[[\]^`abceîfbemkiicefnurmf^WRüTUUWWY[þ\]]þ^``aþbccefígfkbbjfgjjc\`knfnYûRTTUWWûY[\\]]þ^``abcefgi jüan^ûRTTUWWûY[\\]]þ^``aþbcceþfggi jùeijcaMûRTTUWWûY[\\]]þ^``abcefgijkñmqqgit\ RTTUWWûY[\\]]þ^``abcefgij kñtbepkgmqWRTTUWWûY[\\]]þ^``þabbcefgijkmñkjnmiqqcrpRTTUWWûY[\\]]þ^``øabbcceeffgijknòrxpagrpjWRTTUWWûY[\\]]þ^``ýabccþeffgþijjkmnñwae{€ukbiuRTTUWWûY[\\]]þ^``ùabcceeffgijkmnñrntqeguwqqRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqpqùrqRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqpqrûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqpqrûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqrûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqrûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqrtrûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqrtûRTTUWWúY[\\]^^`aþbccþeffgþijjkþmnnpqrtûRTTUWWûY[\\]]^õ`abbcceeffggijkmpqrtûRTTUWWûY[\\]]ó^``abbcceeffggijkmpqrtûRTTUWWûY[\\]]ø^`aabbceeþfggiþjkkmnpqrtûRTTUWWûY[\\]]^ú`abbceefgijkmnpqrtûRTTUWWëY[\\]]^^`aabcceeffggiijkmnpqrtûRTTUWWðY[\\]]^^`abbcceffþgiijþkmmnpqrtûRTTUWWñY[\\]]^``abcceffgijkmnpqrtûRTTUWWùY[\\]]``úabcceffgijkmnpqrtòRTUWWYWWY[\]^``ûabceffgýijkkmþnpprpqrtuáRTUWWYWYY[]^^``aabeffgfggijkkmnnpqrþpqqrtuúRTUWWYYò[\]^``aabcefgiijûkmnnppqrþtr r tuäRTUWWYY[\]^`aabbcefgiijkkmnppqþrtt uáRTUWWY[[\]^`abccefgijkmmnpqqrrqqþrttuwuáRTUWWY\\]^`abbeefgijkkppqqrttuttuw xw uãRTUWWY\]]^abbcffgijkmmqqrttuwwxz {zx wuéRTUWWY\]^`abccffgijkmnrrútuwwx{{}þ€}}þ{zzx wuUèWY[\]`aabegfikmmnqrttwxzz}ý€‚‚€ô€‚‚€}}}{{zzxtUWáY\\^`abcfgikmnpqtuwxz{}}€‚ƒƒ……ƒú‚ƒ……‚€€ü}}{{zxûwttUWWèY\\^abcegiknqrrtwzz{€‚ƒƒü…†ˆ‰‰þˆ††ˆê†ƒ…ƒƒ‚€€{{zzxxwwuuUWWâ[]]`bcefikmprtuwz}}‚ƒ††ˆˆ‰‹ŒŽŽüŒ‹‰‹‹ðˆ†ˆ††…ƒ‚€€}}{{zxxwäUWWY\^]`befgjmmpruwx{€‚ƒ†‰‹‹üŒŽ‘‘ÅŽŽŽ‹ˆ‹‰‰†…ƒ‚‚€€}{zzxzxUWWY]^^acfgimpnquwx{‚ƒ…ˆ‰ŒŽ‘’”––ê”’’”’ŒŽŒ‹‰ˆ†…ƒƒ‚€}{{ÝzUWW[]`^aefijnqqtxz}ƒ††‰‹Ž‘’”––—™ššýžœššÈ™–’–”’‘ŽŒ‹‰††…ƒ‚€}{{UWY[]`^aegiknqtwz}‚†‰‹Œ’–—™™ššœžŸŸý£¡ŸŸÉžš—š™—–’‘ŽŽ‰ˆ†…ƒ‚€}}WWY[]`begjknqtux{‚…ˆ‹Œ”—™šœŸ¡£¥§§ý¬ª§§û¥¡Ÿžššú—”‘Œ‰††Ø…‚€€WWY[]`beijmnrux{‚…ˆ‹”—šœž¡¥§§¨ª¬¬Â±®¬ª¬ª¨§£¡Ÿžžš—”Ž‹‰‰ˆ…‚€€WYY\^acfikmptw{ƒ†ˆ‹’–™ž¡£¥¨ª®®¯³³µµý¶µ±±É¯¬ª¨¥££Ÿœ™–’ŽŽŒ‰†ƒ‚WY[\`acfjmnqux}€…ˆ‹’—™ž£§¨ª®±³µ¶º¼¼ý½¼¸¸Èµ³¯®ªª¨¥¡œš—”’‘Ž‹ˆ……WY[]`begknqtx{‚†‹Ž‘–™œ¡§ª®¯³¶¸º½¿ÁÃÃýÅÿ¿Ã¼º¶µ±¯®ª§¡Ÿœ™–”‘Œ‰ˆ†WY\]acegkpruz}€…‰Œ”™ž¡¥¬¯³¶º½¿ÁÃÇÈËÌÌÎËÈÈÃÅÿ¼º¶µ±¬¨¥¡œ™—”Œ‹‰W[\^befimprw{ƒˆŒ‘”™ž¡§¬±¶¸¼ÁÃÇÈËÎÒÔÔÖØÖÒÒÃÐÌÈÇÿ½ºµ±¬¨£Ÿœ—’Œ‹W[\^befimqtw}€†‹”—œ¡§ª¯µº½ÁÅÈÌÎÐÔØÚÚÜàÜÚÚ½ÖÔÐÌÈÇÿº¶±¬§£Ÿš–’ŽŒW[]`cfgjnruz€…†‰”™ž¥¨¬¯¶º¿ÃÈÎÒÔÖÚÜàâäâäååäàÚØÐÐòÌÇ¿¸ºµ¯ª¥¡œ™–’ônmle`\M>+3žð›¢¡ ¢ ˜‹}ƒn8þ çž £¥©©¥£¢©­¯­©¢¬«³¬wJ3&â¡¢¢¡¢¢£¤££¢£©«©¬¡«¯¬±«¬­¡Žj3!¥¤ä¥¢«±²¯ª¥¤«°ª®­ª²±²­©«±ª•…w/þ£¤¤ß©«­«¤ ¡©±·ª±­²±«°«ª±´±®°³´¯¶±’ZªÛ©¥ª«¥©«®°°­©°³­±²¯´±®±±¯±´²®±²°°·²Ž[ñ¥©©ª««¬¬­­®®¯¯°°±²þ³´´þµ²²³û°šDô¥©ªª««¬­­®®¯¯°±²³´µ´µø¶¾»°½"©ûª«¬¬­­þ®¯¯þ°±±²³´µ·¸ö¥¹®³¼º®‡ü©ª«¬¬®¯°±²³´µ¶¸¹ô¿Â´µ¸¶»¯¶Š9 󪫬¬­­®®¯¯°°±±²³´µ¶·¸¹ò³±´Ã½«³Ã³¼½\ «û¬­­®¯¯°±²³´µ¶·¸¹ï»¾¶­µÈ±»±­µ·œq9ø«¬­­®®¯°°±²³´µ¶·¸¹ìº·¹¾½»»¸¹º¿Ã¾º´°c&ù«¬­®®¯°°±þ²³³þ´µµ¶þ·¸¸¹ºì»º½··¼º»¼¼¸²µ½¿º¿±zû¬­­®¯¯°±²³þ´µµ¶·¸¹º» ¼û¶¿´qû¬­­®¯¯°±²³þ´µµ¶þ·¸¸¹þº»» ¼ø¹»¼¸¶¤lû¬­­®¯¯°±²³þ´µµ¶·¸¹º»¼½ñ¾ÁÁ»»Â²*¬­­®¯¯°±²³þ´µµ¶·¸¹º»¼ ½ñ·¹À½»¾Á¯n¬­­®¯¯°±²³þ´µµþ¶··¸¹º»¼½¾ñ½¼¿¾»ÁÁ¸ÂÀ¬­­®¯¯°±²³þ´µµø¶··¸¸¹¹ºº»¼½¿òÂÈÀ¶»ÂÀ¼¯¬­­®¯¯°±²³þ´µµý¶·¸¸þ¹ºº»¼½¾¿ñǶ¹ÉÌý·»Ã¬­­®¯¯°±²³þ´µµù¶·¸¸¹¹ºº»¼½¾¿ñ¿ÂÁ¹»ÃÇÁÁ¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÀÁùÂÁ¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÀÁÂû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÀÁÂû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÂû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÂû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁÂû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁ Âû¬­­®¯¯°±²þ³´´µ¶þ·¸¸þ¹ºº»¼½þ¾¿¿ÀÁ Âó¬­­®¯¯°°±±²²³³´õµ¶··¸¸¹¹ºº»»¼½¾ÀÁ Âó¬­­®¯¯°°±±²²³³ó´µµ¶··¸¸¹¹ºº»»¼½¾ÀÁ Âó¬­­®¯¯°°±±²²³³ø´µ¶¶··¸¹¹þº»»þ¼½½¾¿ÀÁ Âó¬­­®¯¯°°±±²²³³´úµ¶··¸¹¹º»¼½¾¿ÀÁ Â嬭­®¯¯°°±±²²³³´´µ¶¶·¸¸¹¹ºº»»¼½¾¿ÀÁ Â謭­®¯¯°°±±²²³³´´µ¶··¸¸¹ºº»¼þ½¾¾¿ÀÁ Â鬭­®¯¯°°±±²²³³´µµ¶·¸¸¹ºº»¼½¾¿ÀÁ Âñ¬­­®¯¯°°±±²²³³µµú¶·¸¸¹ºº»¼½¾¿ÀÁ Âò¬­®¯°±°°±±²³´µµû¶·¸¹ºº»þ¼½½¾þ¿ÀÀÂÀÁ ÂÃø¬­®¯°±°±±ò³´´µµ¶¶·¹ºº»º»»û¼½½¾¿¿ÀÁÂþÀÁÁ ÂÃú¬­®¯°±±ô²³´µµ¶¶·¸¹º»»¼û½¾¿¿ÀÀÁÂÃú¬­®¯°±±ô²³´µ¶¶··¸¹º»»ú¼½½¾¿ÀÀÁ Ãú¬­®¯°±±é²³´µ¶·¸¸¹º»»¼½¾¾¿ÀÁÁÂÂÁÁÂÃÇÃ嬭®¯°±²²³´µ¶··¹¹º»»¼½½ÀÀÁÁÂÂþÃÂÂÃÇ ÈÇ Ã笭®¯°±²³³´¶··¸ºº»»¼½¾¾ÁÁÂÂþÃÇÇÈÉÈ ÇÃ鬭®¯°±²³´µ¶·¸¸ºº»»¼½¾¿ÂÂûÃÇÇÈÉÉÊËþÌÊÊÉÈ ÇÃ®í¯±±²³µ¶¶·¹»º»½¾¾¿ÁÂÂýÇÈÉÉÊýËÌÍÍÌöËÌÍÍÌÊËÊÊÉÉÈ®¯ã±²²´µ¶·¸º»»½¾¿ÀÁÂÃÇÈÉÉÊÊËËÌÍÎÎþÍÎÎþÍÌÌüËÊÊÉÉÈëÇ®¯¯°±²²´¶·¸¹»»½¿ÁÂÂþÇÉÉüËÌÍÎÎýÏÐÑÑþÐÏÏÐþÏÎÎúÍÌÌËËÉÉÈÇÃÞ®¯¯°±³³µ·¸¹º»½¾ÀÂÂÃÇÉÊÊËÍÎÏÏÐÐÑÑÒÓÓþÒÑÑóÐÏÐÏÏÎÎÍÌÌÊÊÉÉÈÇ宯°±²´³µ·¹º»¼¾¾ÀÂÃÇÈÉËÌÍÎÏÑÑüÒÓÔ××øÔÓÓÔÓÑÐÑÑöÏÎÎÍÍÌÌËÊÉÉÛÈÉÈ®¯°±³´´¶¸º»»¾À¿ÁÃÇÈÉËÍÎÎÐÑÒÓÔÔ×ÕØÙÙñØÕÕØÕÔÒÔÓÒÑÑÐÏÎÎûÍÌËÊÉÉÞ®°°±³µ´¶¹º»¼¿ÁÁÂÈÉÊËÎÏÏÑÑÓ×ÕØÙÙÚÛÜÜþÝÜÜÌÛÙÕÙØÕ×ÓÒÑÑÏÏÎÎÍÌËÊÉÉ®°±±³µ´¶¹»»½¿ÁÂÇÉÊËÍÏÑÑÒÔÕÙÚÛÛÜÜþÝÞÞþßÞÞÉÝÜÚÜÛÚÙÕ×ÓÓÑÐÏÎÎÍÌËÊʯ°±±³µ·¹»¼½¿ÁÂÃÈÉËÍÎÐÑÒÔØÚÛÜÜÞÞßàââäâûàÞÞÝÜÜúÚØ×ÒÑÏÏÙÎÍÌÌ˯°±±³µ·¹»¼¾¿ÂÃÈÉËÍÎÐÑÔÔØÚÜÜÝÞàââãääýæåääóãâßÞÞÝÝÜÚØÔÓÑÑ×ÐÎÍÌ̯±±²´¶¸º»½¾ÀÂÇÉËÎÏÐÑÔÕÙÛÝÞßàãäååæççééýèéææäÍãàßßÞÜÛÙÕÔÓÓÒÑÏÎͯ±±²µ¶¸º¼¾¿ÁÃÈÊÌÎÐÑÔÕÚÛÝßâãäåæçéèëëýìëêêÈéçæåääãàÞÜÜÚØÕ×ÓÑÐÎί±±³µ·¹»½¿ÁÂÈÉËÍÏÑÓ×ÙÛÜÞâäåæçèêëìííîîýðîííëÉèéææåäâÞÞÜÛÙØ×ÒÑÐϰ±²³¶¸¹»½ÀÂÃÉÊÌÎÑÒÔØÛÝÞàäæçèëìííîðññòòñÈðîíëëèéæäãàÞÜÛÚØÔÒÑѰ±²´·¹º»¾ÀÂÇÉËÎÐÒרÛÝÞâäæèêëíîðññòóõõýöõóóÈôòñðîíìëéæäãßÞÜÚÕÔÒѰ±²´·¹º»¾ÁÂÇÊÌÏÑÔØÚÜÞâäæéëìíðñòòôõö÷÷þø÷÷õÉôòñðîíëèæäâßÞÜÙÕÓÒ°±³µ¸º»¼¿ÂÃÉÌÎÏÑÔØÛÝàãäæèëíîñòóõõ÷÷øùùúûùø÷öôôòòðíêëéæäàÞÜÛÙÕô§¦¤Ÿ—‘zfJ3%3ÒÓòÕÔÓÕÓÖɽ§[5!þ# çÒÓÖØ×רÖÕ×ÛÜÛ×ÕÛÙàÛѶvW-&ùÔÕÕÔÕÕÖÖìÕÖ×Ù×ÛÔÙÜÛÞÙÛÛÔÏ¡W!ØÖäØÕÙÞßÜÙØÖÙÞÙÜÛÙßÞßÛ×ÙÞÙÕĶOÖß×ÙÛÙÖÓÔ×ÞãÙÞÛßÞÙÞÙÙÞáÞÜÞàáÜâÞÓŽ/ÙÛרÙÙØ×ÙÜÞÞÛ×ÞàÛÞßÜáÞÜÞÞÜÞáßÜÞßÞÞãßÏüØ××ÙÙÛÜÞßþàááßàûÞÕoýØ×ÙÙÛÜÞßà áøâèæÞèÑ9×ÙÛÜÞßàáãäöØäÜàçåÜÅ!ü×ÙÙÛÛÜÞßàáâäôéëááäâæÜâÈ^ ÙÛÜÞßàáâãäòàÞáìèÙàìàçèÓ‘ ÙÛÜÞßàáâãäïæèâÛáíëÞæÞÛáãÓ¬^þÙÛÛÜÞßàáâãäìåãäèèææääåéìëèåáÞœBüÙÛÛÜÜÞþßààáâþãääåìæåèããçåæççäßáèéåéÞ¹ÛÜÞßàáâãäåæ çûâéá¬ÛÜÞßàáâþãääþåææ çøäæçäâÖ¤ÛÜÞßàáâãäåæçèêæúëßÑGÛÛÜÞßàáâãäåæç èõëãäéèæèêܧÛÛÜÞßàáþâããäåæç èöçéèæêêäëéÛÛÜÞßàáüâããääåæçèéöëíéâæëéçÜÛÛÜÞßàáýâãääåæçèéõìâäîïìèãæìÛÛÜÞßàáýâãääåæçèéõëéëêäæììêêÛÛÜÞßþàááâþãääåæçèéêéêýëêÛÛÜÞßþàááâþãääåæçèéêéêëÛÜÞßþàááâþãääåæçèéêéêëÛÜÞßþàááâþãääåæçèéêëÛÜÞßþàááâþãääåæçèéêëÛÜÞßþàááâþãääåæçèéêëÛÜÞßþàááâþãääåæçèéê ëÛÜÞßþàááâþãääåæçèéê ëÛÜÞßàáüâããääåæç èéê ëÛÜÞßàáüâããääåæç èéê ëÛÜÞßàáâãäþåææþçèèéê ëÛÜÞßàáüâããääåæçèéê ëÛÜÞßàáâþãääåæçèéê ëÛÜÞßàáüâããääåæçèéê ëÛÜÞßàáýâãääåæçè éê ëÛÜÞßàáýâãääåæçè éê ëÛÜÞýßàááûâãääååæþçèèéëéê ëìÛÜÞþàááâùãäååæåææþçèèéêëþéêê ëìÛÜÞýßàááâûãääåææçèéêëìÛÜÞôßàááââããääåææþçèèéêë ìÛÜÞùßàááâãääûåææçèèéêëêëìÛÜÞßíàááâããääåææçèèééêêëëþìëëì íìÛÜÞòßààáâããäååææçèèêëìí îí ìÛÜÞïßàááâãääååææçèèéëëìþíîîþïîîí ìÜÞõßàáââãäæåæèèýéêëëþìííîïþîïïî íëÜêÞßßááâãäåææèèééêëììííîîïðþïððïîíüìëëÜÜÞßõáâãääææèéêëëøìííîîïïððñòñðïîíìÜÞàñáãääåæèèéëëììíîîýïðññòóòñðïîíìÜÞéßáàáãäåæçèèéëììíîîïïðñòòóôóûôóòñòòüñððïïîíÜÞçàááâäåææèééêììíîîïððñòóóôô õöôóôóóòòññððïîýíÜÞÞèàááâäåæçéêêëííîîðññòòóôõõö ÷þöõõôôóóòòññððïïîîþÜÞÞèàááâäææèéêëìíîîïñòòóôõõöö÷ø÷ïö÷ööõõôóóòññððïïîîþÜÞÞèàáãäæçèéêëìíîîïðñòóôõöö÷÷øùø÷úöõôóòññþðïïýîÜÞÞêàáãäæçèéëìíîîïðñòôôõö÷÷øùþúùùø÷ûöõôóòòýñðïïæÜÞÞßáâäåæèèéëìîîðññòôõõö÷øøùúþûúúùø÷ûöõõôóóáòñðïÜÞÞßáâäåçèéêìíîïðñòôõöö÷øøùùúûþüûûúùø÷ÙöõõôóòñððÜÞÞàáãäæèéêëíîîïñòóôõö÷øøùùúúûû üûúùø÷ÚöõõôóòññÞÞßàâääæèéëìíîïðòóôõö÷øøùúúûûüüýýüýýþüýýüûúùøÞ÷ööõôóòòÞÞßáãäåæèéëìîîðñóôõö÷øøùúûûüýýüý ýüØûúúùùø÷÷öõôóòÞÞßáãäåæèêëìîïñòôõö÷øøùúúûüüýüûÙúùøø÷÷õõóóÞÞàáäåæçéëìíïðñòôõö÷øùùúûûüüý ýþýüûúúùøø÷öõõ ÿþI3ÿþþ) ÿ'ÿþ!ÿ#ÿ%ÿ(ÿþ+ÿ-ÿþ0ÿ2ÿ 5ÿ 7ÿ8ÿ:ÿ<ÿ>ÿþÿ ÿ‡þ-:üet8ûtkjK7ùminpbR5øqpnnmm[4öqppnnmj…2qpnü^}M1þrqqpúnp`qr0rqøzuqjtq.r÷a{€ea}m--tö…ucmƒparC,tuõqpxzqquprb+þtuutrûnjt )þtuutrúqwac#(þtuutùqnrqxG'þtuutøprfzwbP&þtuuwut÷wkˆgk€g+%þtuuwuö†jpW{wp<$þtuuwuõrƒq[ŽiwmxA#þtuuwuôtp{€cwtrre"uwuùtrqixJ!uwuõwuutrj]ˆ uwuwöuttziu{nuwþuwwõuttwwjj{n%u wöutxjutkkwu wxôwuu{e‰kpqgbuwxówuuk’cmƒb…kauwxwuöqtqprqqkptuwþuttûrtiWuwþuttúrwcnuwþuttúrnmtfwþuwwþuttùrprrjixwþuttørg}mx&üzxxwwþutt÷rxj{rgzû{zxxwwþutt÷rkxpktcrû{zzxwwþuttrø}qkzi}^ü}{zxxwutùrqnmk<ý}{zzwutùrqnmkcü€}{zzwutørqpmmw^ü‚€}{{xwutrùpnmmuó…‚€}}zzxxwwu utørqpnikn󆃂€{{zxwwu ut÷rqqppmmMóˆ…ƒ€€{{zxxwu utørqqtm`w󉆃‚€€}{{zxwu ut÷rqqrfpn\ôމˆ…‚€€}zxwwþuttþuttrqùrpfpc+‡ý˜@9û¹Â7ú½¼£W6ù¾»¿À·«5÷ÁÀ¿¿¾¾±[3õÁÀÀ¿¿¾¼Î‹1ÁÀ¿û´Ê¥.0þÂÁÁÀù¿ÀµÁÂs/ÂÁõÉÃÁ¼ÂÁ‡+Âö¶É̹¶Ê¾˜;,ÂõÎø¾ÎÀ¶Âž#+ÂÃôÁÀÈÉÁÁÃÀ·Q*þÂÃÃÂû¿¼Â…)þÂÃÃÂúÁǶ¸“û þÂÃÃÂùÁ¿ÂÁÈŸ'þÂÃÃÂ÷ÀºÉÇ·©%þÂÃÃÇÃÂ÷ǽл½Ì»˜%þÂÃÃÇÃöϼÀÔ°ÉÇÀœ$þÂÃÃÇÃòÂÎÁ±Ó»Ç¾È þÂÃÃÇÃùÂÀÉ̸ÇÂÂü¹Š!ÃÇÃÂûÁ»È¢!ÃÇÃõÇÃü˳Є ÃÇÃÇöÃÂÂÉ»ÃÉ¿‰ÃÇþÃÇÇõÃÂÂÇǼ¼É¿”à ÇòÃÂȼý½Çjà ÇÈóÇÃÃɹѽÀÁ»·^ÃÇÈòÇÃýո¾Î·Î½¶RÃÇÈÇÃõÁÂÁÀÂÁÁ½ÀÂÃÇþÃÂÂü»¯ÃÇþÃÂÂûǸ¿ŠÃÇþÃÂÂú¿¾ÂºcÇþÃÇÇþÃÂÂùÀ¼»ÈÇþÃÂÂøË»Ê¾È•üÉÈÈÇÇþÃÂÂøÈ¼É»É~ÉÈÇþÃÂÂ÷½ÈÀ½Â¸ÂQÉþÈÇÇþÃÂÂøÊÁ½É»Ê´üÊÉÉÈÈÇÃÂúÁ¿¾½œþÊÉÉÇÃÂùÁ¿¾½¸dýÌÊÉÉÇÃÂøÁÀ¾¾Ç´üÍÌÊÉÉÈÇÃÂùÀ¿¾¾Ã‹óÎÍÌËÊÊÉÉÈÈÇÇà ÃÂøÁÀ¿»½¿ZùÏÎÍÌËËÉÉüÈÇÇà ÃÂÁÀ¾ý¥ùÐÎÎÌÌËÉÉÈþÇà ÃÂÁú¾µÇyøÑÏÎÍÌÌÊÉÉýÈÇà ÃÂÁùºÀ¿²*ôÓÑÐÎÍÌÌËÊÉÈÇÇþÃÂÂþàÂÁùÂÀºÀ¸˜‡ýÖj9ûäëÐ-7úëèçÖ‰6ùèæééãÙ5þêééèýÞ3þêééúèçðÉ1êéûáîØK0þëêêéûáêë¯/ëêõíìêçëêÅ!+ëöâîïäâîèÖb,ëõðìäèðéâëÒ;+ëìôêéííêêìéëã*þëììëûéçëÄ)þëììëúêìâäÔû# þëììëùêéëêíÒ'þëììë÷éëåíìã×!%þëì ìë÷ìèñæèïæÖ%þëì ìöñçéôÞîìéÓ$þëì ìòëðêÞóæìèíÒ# þëì ìùëéîïäìëëüäÈ+!ìëûêæíÕ!ìëúçîàñà ìëùíæìîéÇìëìçüîéÔìóëíçìëèèì¡+ìíìöîäòèéêæã”ìíìõèõäèðãðèâìíìõêëêéëêêèé5ëìëüæÜ+ìëûìäéÈìëúéèëåœìëùéëëçæ!íìëøîæîèíÕ!íìëøíçîëæí¾þîííìë÷èíéèëäëþîííìëøîêèíæîáîíìëúêéèèÓîíìëùêéèèäžüïîîííìëøêéèèìá5ïîíìëéèýìÉüðïïîîíìëøêééæèéŽûñðïïîîíìëêéèýØ-úñððïïîîíìëêúëèáì·üòñðïïîíìëêùëåééßGûóòñðïïîíìëþìë ëêùëéåéäÖ‡ÿ:ÿ8ÿ7ÿ6ÿ4ÿþ1 ÿ1 ÿ0 ÿþ+ÿ-ÿ,ÿ+ÿ*ÿû) ÿ(ÿþ%ÿ&ÿ%ÿþ) ÿþÞ!ÿ"ÿ!ÿ ÿÿþÞÿÿ ÿ ÿþÞ!ÿ"ÿ"ÿþ#ÿþ$ÿ%ÿ%ÿ&ÿ'ÿ(ÿ(ÿ)ÿ*ÿ*ÿ+ÿ+ÿ>þ=þÐ #*+/279;>@BDFJIMQRUVX[[\_aacdejmnnqrsuvyzz{|Ï"&*+/289;>@BDFJIMQRSVXZ[\_aacdejlmnqrsuvwyz{|Ï%**./28:;>@BDFJIMQRSVXZZ\_`aacdjlmnqqrsvwyz{{ Î"&+*./38:=?BBDFJIMQRSUWZZ[^``acdjlmmoqrsvwyy{{ Î"&++.039:=?BBDFJIMQRRUWXZ[^``acdejlmoqrsuvwyz{ Í"%*./039:=?BBDFJIMQRRUWXX[^_``adejlmooqsuvwyzz Í#%*//079;=@BBDFJIMQRRUWXXZ\_``acejlmooqruvwyzz Ì $)+./0389;=?DDFJMNPQRUWXZ[^_``adejlmmorssuvyyz Ì $)+./0389;=?DDEJMNPQRUWXX[^_``adejlmmorrssvyyz Î $)+./0389;=?CDEJINPQRUWXXZ\_``acejllmoqrrsvyy Ë $)+./0389;=?CDEFINPPRSVWXZ\__`acdjllmnqrrsvwyy Ê $)+./0389;=?CCDFIMNPQSVWXZ\^__`cdejllnqqrruwwy Í $)+./0389;=?BCDFJMNPQSVWWX[^__`adejjlnoqqruww É $)+./0389;=?BCDEJMNNQRUWWX[^^_`acejjlmoqqruvwwÉ  $)+./0389;=?BCDEJINNQRUVWX[^^_`acejjlmoqqruvwwÈ  "#&*.03789:=?@BCEFIMNQRSUWX[[\^`aacejjlmnorssuvÈ  "#&*.03789:=?@BCEFIMNQQSUWX[[\^`aacejjlmnoqrsuvÓ "#&*./3388:=?@BCDFIMMQQRUWXZ[[^`aacdjj÷lnoqrsuuÇ "#&*./33789=>@@CDFJIMPQRUVXZ[[^``aadjejlmoqrruuÇ "#&*./03789;>?@BDEJIMPQRSVWZZ[\_``adeejlmnqrrsuÒ "#&*./02779;>?@BCEJIIPPQSVWXZZ\_``acee÷jmnoqrssÑ  "#&*./02378;=??BCEFIINPQSUWXZZ\__``cee÷jlnoqqssÆ   "#&*./02378;=??BCEFJINPQSUWXZZ\^__`cedejlnoqqssÅ"$&*+./3378:==?BCDEJINNPQSUVWZZ[\_`accdejlnooqrí"$&*+./33Ú8:==?BCCEJINNPQSUVVZZ[\_`aacdejlmnoqrüË $&**./3237:;=?BCCDFIMNPQRUVVXZ[\^`aaccdjlmnoqqüÎ #&**./32379;=>@BCDFIMMNQRSUVXXZ\^_`aacdelmnnqqÏ #%**+/02279;;>@BCDFJMMNPRSUVXXZ[^_`aacdejmnnoqüÍ#%)*+/03239:;>@BBCEJIMNPQSUUWXZ[\_``aacejlmnooüÌ"%)*+/03238:;=?BBCEJIMNPQRSUWXZ[\^_`aacdjlmmooû Ì"%)*+.03238:;=?@BCEJIIMPQRSUWWX[\^_``acdjlmmooýÐ"$&**+/03279;=>?BDEEIIMNQRSSVVWZ[\^_`acdejlmmnýÐ"$&)*+/00279;;>?BCDEJIMNPRSSVVWX[\^^``adejlmmnýÐ $&)*+//0378:;=?@CDEJJINPQRSUVWXZ[\^_`acdjllmmþÐ #&)*+//0338::;>@BCDFJIMNQRRSUVWZ[\\__`adejllþ Ð #%))*.//3389:;=?BCCEFJINPQQSSUVXZ[\^^_acdejjlü" Ð#%&)*.//03789:=>@BCEEFIMNPQRSUVWXZ[\^_`adeejjü$ Ñ"%&)*.//02789:;>?BBDEFJINPPRRSUWXZZ\\^`acdeejü%Ð"$&)*.//027889;>?@BDEFJIMNPQRSUVXZZ\\^_acddeeü Ê"%&&*+//027789;=?@BDDEJIMNPPRUUVVX[\\^_`accej Ì"$&&*+.//23789:=?@@DDEFIMNNPQSUUVX[\\^_`accej Ì"$%%)+.//33778:=>?@CDEFJIMNNQSUUVWZ[\\^`aacee Ì #$%)*+./323789;=??BCDEJIMMNPRSSUWX[[\^_`aadd Ë"#$&*++/022379:=>?BBCDFJIMMPQRSSVXZZ[\^_``cd Ì"#$%**+./32238:;=>@BCDEFJIINQRRSVWXZZ[^__`ccÇ "#%)**+/332379;==@@BCEFJJINPQQRUWXXZ[\^__acÇ "#%)**+/032379:==?@BCDFJJIMPQQRUVXXZ[\^__aa Ê"$)**+/033279:;=?@BCDEFJIMNPQSUUVWXZ[\^^`` Ê"$&**+/003278:;=??@CDEFJIMNPQRSUVWWX[\\^`` Ê"$&)**./002389:;>?@BCEFFIIMNQRSSVVWXZ[\\_` Ê #%&)*.//03379:;>>?@CDEFJJINPQRSUUVWXZ[\__ ó"$&)*+//Ù02389:==>@BCDEFJIMNQRRSUVWXZ[[^^ Ê"$%&)*.//033799;=>?@CDDFFJINPQQSSUVWXZZ\^ Ê #%%)*..//32789;;=?@BCDEFJIMNPQRSSUWXXZ\\ Ê #$%&*..//02788;;=>@BCCEEFIMNPQRRSUVWXZ\\Ñ #%&)*+.//3377::;=?@BBDDEJIMNPQQRSUVWWZ[Ô #$&)*++//32379:;=>@BBDDEFIMNNQQRSUVWWZ[ýÑ "$%&)*+./023799:=>?@BCDEFJIMNPQQRUVVWZZÑ"#%&)**+/032389:;=?@@BCDEJIMMPPQRSUVVXXÏ "$%&**+./322789:=>??BBCDFJIMNNPQRSUUWXÏ"#%%)**./032778:;=>?@BCDEFJIMNNPRSSUWW ñ #$%)**+//33à789:=>>@@BCEFJJMMNPQRSSVW Ð #$$))*+//033789:;=>?@BCDFJJMMNPQRSSVVÙ #$%&**+./332378:;;>?@BCEFFJIMNPQRRUUÐ+75;GJOVZ^bfjkosvwz†‡Œ‘–™™œžŸ¡¦§§¬®¯±´·¹¹¼¼Ï!/59BGJOV[^bfjkosvwz„‡ŒŽ‘–™™œžŸ¡¤¦§¬®¯±´¶·¹¼¼Ï133?GGKOV[_bfjkosvwz„‡ŒŽŽ‘–—™™œž¡¤¦§¬¬®¯´¶·¹¼¼ Î'953BJGKOW[_cgkkosvwz„†‰ŽŽ”——™œž¡¤¦¦©¬®¯´¶··¼¼ Î-955BJJKRW^_cgkkosvwz†‰ŒŽ”——™œžŸ¡¤¦©¬®¯±´¶·¹¼ Í)/359?GKNRW^_cgkkosvwz†‰ŒŒ”–——™žŸ¡¤¦©©¬¯±´¶·¹¹ Í3//5;?FNNRZ^bcjkkosvwz†‰ŒŒŽ‘–——™œŸ¡¤¦©©¬®±´¶·¹¹ Ì-/137=CJKNRW[^bcgoosvz{~†‰ŒŽ”–——™žŸ¡¤¦¦©®¯¯±´··¹ Ì1/137=CJKNRW[^bcgoorvz{~†‰ŒŒ”–——™žŸ¡¤¦¦©®®¯¯´··¹ Î#5/137=CJKNRW[^bcgnorvw{~†‰ŒŒŽ‘–——™œŸ¡¤¤¦©¬®®¯´·· Ë/5/137=CJKNRW[^bcgnorsw{~~„‡‰ŒŽ‘––—™œž¡¤¤¦§¬®®¯´¶·· Ê#51/137=CJKNRW[^bcgnnoswz{~„‡‰ŒŽ‘”––—œžŸ¡¤¤§¬¬®®±¶¶· Í+5//137=CJKNRW[^bcgknosvz{~„‡‰‰Œ”––—™žŸ¡¡¤§©¬¬®±¶¶ É15//137=CJKNRW[^bcgknorvz{{†‰‰Œ””–—™œŸ¡¡¤¦©¬¬®±´¶¶É)751/137=CJKNRW[^bcgknorvw{{†‡‰Œ””–—™œŸ¡¡¤¦©¬¬®±´¶¶È5317/379;BGKRSZ[^_cgjknrswz{„†‰Œ‘”—™™œŸ¡¡¤¦§©®¯¯±´È#51/7/379;BGKRSZ[^_cgjknrswz{„†‰Œ‘”—™™œŸ¡¡¤¦§©¬®¯±´Ó+3//5/379;BGKOSW[[_cgjknoswzz†‰ŒŽ”—™™œž¡¡÷¤§©¬®¯±±Ç!13-/5/379;BGKOSWZ[^cfjjnosvwz~†‡ŒŽ”——™™ž¡Ÿ¡¤¦©¬®®±±Ç+51//3/379;BGKORWZ[^bfgjkorvwz~„‡‰ŽŽ‘–——™žŸŸ¡¤¦§¬®®¯±Ò35/13//379;BGKNRVZZ^bfgjknrvww~~„‡‰ŒŽŽ‘–——™œŸŸ÷¡¦§©¬®¯¯Ñ!73/55-/379;BGKNRVWZ[bcggknrsww{~„†‰ŒŽŽ‘––——œŸŸ÷¡¤§©¬¬¯¯Æ#71/77+/379;BGKNRVWZ[bcggknrsvw{~„†‰ŒŽŽ‘”––—œŸžŸ¡¤§©¬¬¯¯Å)+/3531/3359=BGJKOSWZ[_ccgknorvw{{~„†‡‰ŽŽ‘–—™œœžŸ¡¤§©©¬®Å)+/3531/3359=BFJKOSWW[_ccgknnrvw{{~„†‡‡ŽŽ‘–—™™œžŸ¡¤¦§©¬®ü+-/33Ë1/1357=BFGKOSVWZ_bcgknnoswz{~†‡‡ŒŽ‘”—™™œœž¡¤¦§©¬¬-ü/1311Î357;BFGKOSVWZ^bcfjknoswzz{„†‡ŒŒŽ‘”–—™™œžŸ¤¦§§¬¬/1Ï37;?FGJNRVVZ^bbfjknosvzz{~„†‡ŒŒŽ”–—™™œžŸ¡¦§§©¬ü)11//1Í/135;?CFJNRSVW^_bfjkknrvwz{~„††‰ŒŽ‘–——™™œŸ¡¤¦§©©ü311//Ì1/1359?CFJNRSVW[_bcgkknrvwz{~„†‰ŒŽ‘”–—™™œž¡¤¦¦©©û7311//Ì1//159?CFJKRSVW[_bcgjknrvwwz~„†‰‰Œ‘”–——™œž¡¤¦¦©©ý%3113Ð59=BFFJNRSVZ^bcfgkorrwwz{„„‡‡‰Ž‘”–—™œžŸ¡¤¦¦§ý'3113Ð59=BCFJNRRVZ^bbfgknorvwz{~„„‡‡‰Œ‘””——™žŸ¡¤¦¦§ý+3113Ð57=BCFJNORSZ[_bcgjnorvvw{~„†‡‰ŒŽ‘”–—™œž¡¤¤¦¦þ/11Ð31337;BCFJNORSW[__bfjknosvwz{„†‡‰Ž‘‘––—™žŸ¡¤¤þ51 1Ð37;?CCGKOOSW[^_bcgknnrsvw{~„„†‡ŒŽ‘””–™œžŸ¡¡¤ü#9/1 1Ð35;?BCGKNORWZ[^_cfjknrrswz{~„†‡‰ŒŽ‘”–—™žŸŸ¡¡ü)=/1 1Ñ59?BCGKNORVZ[^_bfgkkorsvw{~~„†‰ŒŽŽ‘‘”—™œžŸŸ¡ü-?/11/Ð159=BCFKNORVZ[[^bfgjkorsvwz{~„†‡ŒŽŽ‘‘”–™œžžŸŸü1//1 1Ê359?BBFJNNRVZZ[^bcgjkoorvwz{~~††‡‡Œ‘‘”–—™œœŸ¡1//1 1Ì59=BBFJKNOVWZ[^_cgjjoorswz{{~„††‡Œ‘‘”–—™œœŸ¡!1/1 1Ì59=??CJKNOSWZZ[_cfgjnorsvwz{{„††‡‰Ž‘‘”—™™œŸŸ'3-1 1Ì37;=?CGJKNSVWZ[^bcggknorvwzz{~„„†‰Œ‘”–—™™žž+3-1 1Ë359;=BFJJNRVVWZ^_cfgkknosvwzz~„„‡ŒŽŽ‘”–——œž/5-31 1Ì59;=?FGJKOSVVW[_bcfjknorsvww{„‡‰ŒŽŽ”––—œœ35+311Ç31//1379;?CFGJOSSVWZ^bccjjknrsvvw{~†‰ŒŒŽ‘”––™œ55+311Ç31//1379;?CFGJNRSVWZ^_ccgjknosvvwz~†‡ŒŒŽ‘”––™™'135/1 1Ê/11359=CFGJNRSSVZ^_bcgjknorsvwz{~„††‡‰ŒŽ‘””——)135/1 1Ê/11359=BFFJNRRSVZ[_bcggjnorsvwz{~„†‡‰‰Œ‘‘”——+115/1 1Ê/11359=BCFGKORRVW[^_bfgjknrsswwz{„„‡‡‰ŒŽ‘‘–—-113/1 1Ê/11357;?BCGKOORSWZ^_bffgjnorsvvw{~„††‡‰ŒŽ‘––/3/3/1 1Ê/113559=BCFJNNORVW[^_ccfjknorsvwz{„†‡‰ŒŽ””33/1/1 1Ê/113559=?BCGKNORSWZ^^bcfgjnoossvw{~„„†‡‰ŒŽŽ‘”53/1/1 1Ê/113537;??CGKKNOSVZ[^bbcgjknorsvwz{~„„†‰ŒŒŽ‘‘55-1/1 1Ê/113537;=?BGKKNORVZ[[bbcfjknnrrswz{~„†‡‰ŒŽ‘‘/133+115Ñ7;?BCFJKNOSWZZ__bcgjkkoorvwz{~„†‡‰‰Ž/135+11Ô357;=BCFJJNOSVWZ^_bcfjkkoorswz{{„†‡‰‰Ž11ý5-113Ñ79=?BCGJKORVWZ^^_cfgjknorsvwz{~†‡‡‰ŽŽ3115/11Ñ359;?BCGGJNRSVW[^_bcgjjknorvwzz~~„†‡‡ŒŒ31/511Ï/1379=?BFGJKOSVVZ[^_cfggkknosvwz{{~„††‰Œ51/5311Ï/1359;??CFGKNRSVZZ[_bcfgjknorsvwz{{~„„†‰‰71/5311Ï-/157;=?CFGJNOSSWZ[^_cffjjknrsvvzz{~„„‡‰!71/5511Ð-/137;==CCFJNORSWZ[^_bcfgjknosvvzz{~„„‡‡5//511/Ù1357;=?BFGJKOSSVWZ[_bbfgjknrssvwz{~††þÞÿ,ÿþÿ-ÿ/ÿþqÿ.ÿ0ÿ þ£ÿ/ÿ 1ÿ 2ÿ 2ÿ þ)ÿ1ÿ 3ÿ þ)ÿ2ÿ þÞÿ2ÿ þÿ3ÿ þ£ÿ3ÿþÿ4ÿþ)ÿ4ÿþÞÿ4ÿþÿ5ÿþÞÿ5ÿ7ÿþÿ6ÿþ)ÿÿþÞÿ0ÿý£Þÿ6ÿý£Þÿ6ÿþÞÿ7ÿ9ÿ9ÿþ£ÿ8ÿ:ÿ:ÿþIÿ9ÿþqÿ9ÿþÞÿ9ÿ;ÿ;ÿþ)ÿ:ÿþ£ÿ:ÿ<ÿ<ÿþÿ;ÿþÿ;ÿþqÿ;ÿþÞÿ;ÿ=ÿÿþÞÿ9ÿÿþÞÿ9ÿýqÿ<ÿý£ÿ<ÿýÞÿ<ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿÿþÞÿ8ÿþÿÿþÞÿ8ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿ«  !!"#%%&''(+-02257:<>ACCGHJJKMPRRT €¾ !"##%%&'(+-022577:>AACGHIJKMPRRT  !""#%%&''(+002557:<>AAEHIJJMPRRT  !"##%&&'(+-00557:<>AAEGIIJKPRRT €È !""##%&'(+-002557<>>AEGHIJKPRRT  !!"##%&&'+--02257:<>ACGHIIKMPRT  !"##%&&'(+-02257:<>>CGHIIKMPRT Œ !!"##%&'(++00257:<AAEHJMMPR  !""#%&'(++-02577>AAEHJMMPRÄ  !""#%&&'((+-0255:AAEHJMPÅ  !"##%%&'(+-0027:>>ACHJKMä ú !"##&ï'(+-0057<>>AGIJMó Ö !"##%%&'(+-027:<EHIJé ß !""#%%&(++-257:<>EHHJÇ  !!"##%&'(++0057<>ACCHÇ  !!"##%&'(++0027<>ACCGÈ  !!"##%'((+-025:>AACGå ú  "ï#%&'((+-057<>AAEî úè !!"#%&''++027:<>AEÉ  !!"%&&'(+-05:<<>C Ê  !"#%&&((+057:<>C Ê  !"#%&&'(+027:<>A Þ î !"#%%&&'(-022:: Ê  "##%%&'(+0227: Ì  !"##%%&(+-0277 ú ô ûï !"##%&'(-0055 ò ôú !""ö#%&(+--22 Ï  !!""#&'(+-00 ä ð !!"#%&(++-0 ã ï !!"#%&'(+--ó  ß !""#%&&'(-Ð !!"#%%&&(+üú   à!!""#%%&'+Ñ  !"##%%&(õ  ì ú !"##ý%'ö   ä  !"##þ&þú  ß  !!""#%Û  !""þ#Õ  "#×  ""Ù  !"ì ð !ýú   è Ù Ý Þ þß ß ã þå î ûä þä  à  ã ã}~€ƒƒ„……†‡ˆ‰‰Š‹ŒŠŠ‹‹ŒŽ‘ô’“””•––—˜˜™šš›ÜœžžŸ ¢¢£¤ª¬«­|}€€ƒƒ„……†‡‡ˆ‰Š‹ŒŠŠú‹ŒŽó‘’““””•–—˜˜™šš›מŸ ¡¢£¤ª¬«­|}~€€‚ƒ„……†‡‡ˆ‰‰Š‹ŠŠ‹‹Œò‘’’“””•––—˜™™šš›þœן ¡¢¢¤©««­|}~€€‚‚ƒ„……†‡ˆˆ‰Š‹ŒŠŠ‹ŒŽí‘’““”••–—˜˜™™šš››œŸ¡å¢£©««­{|~€‚‚ƒ„……††‡ˆ‰Š‹ŒøŠ‹ŒŽò‘’’““”•–—˜˜™™ššý›œŸÙ ¡¢£©««­{|}~€‚ƒ„……††‡ˆˆ‰‹ŒŒŠŠ‹ŽŽ‘ø’““”••–˜˜þ™šš›èœžŸ ¡¡£¥ª«­{|}~‚ƒ„……ˆˆ‰Š‹ŒŠŠ‹ŒŽó‘’““”••–—˜˜™šš›ÔœžŸ ¡¡£¥ª«­{|}~~€‚ƒ„……††‡ˆ‰Š‹‹ŒŒŠ‹Œ‘¸’““”•–—˜˜™™šš››œœžžŸ ¡¤©ª«­z{}~~€€‚ƒ„……††‡ˆ‰Š‹‹ŒŒŠ‹ŒŽ‘‘’““”•–—˜˜â™šš››œœžžŸŸ¡£¥ª«­z{|}~€€‚ƒ„……ú†‡ˆ‰Š‹‹õŒŠ‹ŒŽŽ‘ù’“”•–—˜˜™þš››èœžžŸŸ¡£¥©«­z{|}~~€‚ƒ„……†ï‡ˆŠŠ‹‹ŒŒŠŒŒŽŽ‘ø’““”•——˜˜ü™šš››èžžŸ¡£¥©«¬y{|}}~€‚ƒ„……톇ˆ‰ŠŠ‹‹ŒŠ‹ŒŒŽŽñ‘’’“”•–——˜˜™šš››㞟 £¤©ª¬yz{|}~€‚ƒ„„……†‡ˆ‰ŠŠô‹ŒŠ‹ŒŒŽ÷‘’“”•–——˜˜ý™š››鞟 ¢¤¥ª¬yz{|}}~€‚ƒ„„……톈‰‰ŠŠ‹‹ŒŠ‹‹ŒŽ÷‘’’“•––—˜˜ú™šš››꟠¢¤¥ª«yz{|}}~€‚ƒƒ„……톇ˆ‰ŠŠ‹‹ŒŠ‹ŒŽŽ÷‘’’“”•–—˜˜ú™šš››ÕŸ ¢¤¥©«wyz{{|}~~€‚ƒ„„……†‡ˆˆ‰‰Š‹ŒŠŠŒŽò‘’’“”••–——˜˜™ššÂ›œžžŸ¡£¥ªvwz{{|}}~€‚ƒ„„……†‡ˆˆ‰‰Š‹ŒŠŠŒŒŽ‘‘’“””••–—˜˜™ššá›œžŸ¡£¥ªvwyz{|}}~€‚‚ƒ„……†‡ˆˆÞ‰Š‹ŒŠŠŒŒŽ‘‘’’“””•––—˜˜™šš›œŸ ¢¤©vwyz{{|}~€‚‚ƒ„„……‡‡ˆˆ‰‰Š‹Š‹‹ŒŽŽ‘’““””•–—˜˜™™š››מ ¢£¥uwyzz{||}~€‚ƒƒ„……†‡‡ˆˆ‰Š‹ŒŠ‹‹ŒŽŽý‘’““•ö–—˜˜™™š›œ矡¢¤uvwyz{||}~€‚ƒ„……†‡‡ðˆ‰Š‹ŒŠŠ‹‹ŒŽŽ‘’““””•–—˜˜™š››œœŸ ¡£uvwyzz{|}~€‚ƒƒ„…††‡‡ˆˆ‰‹ŒŒŠŠ‹ŒŒ‘’”ü•–—˜˜š›ÜœŸ ¡¢uvwyzz{|}~€€‚ƒƒ„……†‡‡ˆˆ‰Š‹Œ÷Š‹‹Œ÷‘’’“””•—˜˜š›ÑœŸ  ¢suvwwy{{|}~€€‚‚ƒ„……††‡ˆˆ‰Š‹‹ŒŠŠ‹ŒŒ‘™’““”•–—˜˜™™š›œžž rsvwwy{{|}~€€‚ƒ„……††‡‡ˆ‰ŠŠ‹‹ŒŠ‹ŒŒŽ‘‘’““”•–—˜˜™™š›œžžŸrsuvwyz{{|~€‚ƒ„……‡ˆð‰ŠŠ‹ŒŒŠŠ‹ŒŒŽŽ‘ò’““”–——˜˜™šš›ꞟrsuvwwzz{|}~€‚ƒ„……†ô‡ˆ‰‰ŠŠ‹ŒŒŠ‹‹ûŽŽ’ó“”•–——˜˜™š›œêŸqsuvvwyyz{|}~~€€‚ƒ„……†ý‡ˆ‰‰‹úŒŠŠ‹ýŽ‘Ú’“”•––˜˜™š››œŸqrsuvwwyyz|}}~€‚ƒ„……†í‡ˆ‰‰ŠŠ‹ŒŒŠŠŒŒŽŽ‘Ú’”••–—˜˜™š›œœžqrsuvvwwyz{|}}€‚ƒ„„……놇‡ˆˆ‰ŠŠ‹ŒŠ‹ŒŒŽÙ‘’“”••——˜™š››œžqrsuvvwwyz{|}}~€‚ƒƒ„……†®‡ˆˆ‰ŠŠ‹ŒŒ‹ŒŒŽŽ‘’“”••–—˜™š››œoqrsuuwwyz{|}}€€‚‚ƒ„„……†‡ˆˆŠŠ‹‹ŒŠ‹‹ŒŽÁ‘’“””••–—˜™šš››norssuwwyz{|}}~€‚‚ƒ„„……†‡ˆˆ‰ŠŠ‹ŒŠ‹‹ŒŒŽŽž’““””•–—˜™šš››noqrssvwwy{||}~~€€‚‚ƒ„„…†‡‡ˆ‰‰Š‹‹ŒŠŠ‹ŒŽŽ‘’““””•—˜˜™š››mnoqrsvvwyz{||}~~€ƒô„……†‡‡ˆ‰‰Š‹ŒŒŠû‹ŒŽŽá‘’““”•–—˜™™ššmnoqrruuvwyz{{}}ò~€€‚‚ƒ„……††ˆˆô‰Š‹‹ŒŠŠ‹ŒúŽ‘’’û“”•—˜˜šålmnoqqsuuvyzz{||}~~€€‚‚ƒ……Á†‡‡ˆ‰‰Š‹‹ŒŠ‹‹ŒŒŽ‘‘’’“•–—˜˜™™jlnooqssuvwyzz{||}~€‚ƒ„……ñ†‡‡ˆ‰ŠŠ‹ŒŒŠ‹ŒŒþŽ‘ú’“”•—˜˜ã™jlmnoqssuvwyzz{||}~~‚ƒ„……ð†‡‡ˆ‰‰ŠŠ‹ŒŒŠ‹‹ŒŒòŽ‘‘’“”•–—˜˜ûlmnoqqërsuvwyyz{{|~€€‚„……솇ˆˆ‰‰‹‹ŒŠŠ‹‹ŒŽÙ‘’’“”••–—˜jlnooqqrrsvwwyzz{|}~€€‚ƒ„……ˆ‡‡ˆ‰‰‹‹ŒŠ‹‹ŒŒŽ‘‘’“””••—˜jlmnooqqrsuvwwyz{|}~ú€‚ƒ„……Û†‡ˆˆ‰Š‹‹ŒŠŠ‹ŒŒŽ‘‘’’“””•–˜ejlmnooéqrsuvwyyz{|}~~€‚ƒ„„……݆‡ˆˆŠŠ‹‹ŒŠŠ‹‹ŒŽŽ‘’““””•—ejlmnnéoqrsuvvwyyz{|}~~€‚ƒ„„…†‡‰ôŠ‹ŒŒŠ‹‹ŒŽŽý‘’““á”–dejlmmnnoqrsuuwwyz{|}}~~€‚ƒƒ„…†î‡ˆ‰‰Š‹ŒŒŠŠ‹‹ŒŽŽý‘’““é•cdjllmmnnorssuvvwyz{|}}ú~€‚ƒƒþ„……†ˆð‰ŠŠ‹ŒŒŠŠ‹ŒŒ‘’ø“”cdejlmmÏnoqrsuvvwyz{||}}~€‚‚ƒƒ„„……††ˆˆ‰‰Š‹ŒŒŠ‹‹Œþ‘’’Ü“acdejjmmnoqrssuuvwyz{{|}}~€€‚ƒƒ„……ꆇ‡ˆˆ‰ŠŠ‹ŒŒŠŠ‹ŒŒŽñ’“acdejjlmnoqrssìuvwyz{{||}~€€‚‚ƒ„……ꆇ‡ˆ‰ŠŠ‹ŒŒŠ‹‹ŒŽ’Ü`adeejllmnoqrrssuvwyzz||}}~€‚‚ƒƒ„……†ì‡ˆˆ‰ŠŠ‹‹ŒŠŠ‹‹ŒŽÙ‘’`acdeejlmnoqqrrsuvwyyz{{|}~~‚ƒ„„……†ý‡ˆ‰‰‹ôŒŠŠ‹ŒŒŽã‘_`acddjjlmnoqqrrsuvwyyz{{|}~~ú€‚ƒ„„…Û†‡ˆˆ‰ŠŠ‹‹ŒŠŠ‹‹ŒŽŽ^_accdeejlmnoqqérsuvwyzz{{|}~~€€‚ƒ„„……†Ã‡ˆˆ‰ŠŠ‹ŒŒŠ‹‹ŒŽŽ^_`acceejlmnooqqrsuvwwyzz{||}}€€‚‚ƒƒ„……†‡‡ˆ‰‰ŠŠ‹ŒŠŠ‹ŒŒŽŽ^_`accdeejmnnooqqruvvwyyz{{|}}€‚ƒƒ„……†‡ñˆ‰‰Š‹ŒŒŠŠ‹‹ŒŽŽÕ\^_`aacddelmmnooqrsuvvyyzz{||}~~€€‚‚ƒƒ„……†ð‡ˆˆ‰Š‹‹ŒŠŠ‹ŒŒÖ[\_``accdejlmmooqrsuvvwyyz{||}~~€‚ƒƒ„……†‡òˆ‰ŠŠ‹‹ŒŠ‹ŒŒÕ[\^_``acdejlmmnooqsuuvwwyzz{||}}~€€‚ƒƒ„……ð†‡‡ˆˆ‰ŠŠ‹ŒŒŠŠ‹ŒŒãZ[\^_`aacdejllnnoqrsuuvwwyz{{}õ~€€‚‚ƒƒ„……†ô‡ˆ‰‰ŠŠ‹ŒŒŠ‹‹ŒéZ[\^__`aacdejlmmnoqrssvvìwyzz{||}}~€€‚ƒ„„……†ý‡ˆ‰‰‹ûŒŠŠ‹‹ÒXZ[\^^``acdejjlmmnqrrsuuvwwyzz{||}~~€‚ƒ„„……†õ‡ˆ‰‰ŠŠ‹ŒŒŠŠÐ‹WX[\\^__`acdejllmnoqrrsuuvwyyz{{||}~€€‚‚ƒ„„……󆇇ˆˆ‰ŠŠ‹ŒŠŠÑWXZ[\^__`acdeellmnoqrrsuuvwwyyz{{|}~~€€‚ƒ„„……†å‡ˆˆ‰ŠŠ‹ŒŒŠŠVWXZ[[\^`a`adeeßjlmnooqqrsuvwwyzz{|}}~€€‚‚ƒ„„……ô†‡‡ˆˆ‰Š‹‹ŒŒö½¾¿¿ÀÀÂÂÃÄÄïÅÆÇÇÈÉÊÊËËÌÌÍÎÏÐÑÑÒþÓÔÔùÕÖÖ×ÖÖÕÕÔÓÒôÓÕÕÖÖÙÛÙÛ¼½¿¿ûÀÂÂÃÄÄÅùÆÇÈÉÊÊËËúÌÍÎÏÐÑÑýÒÓÔÔúÕÖ×ÖÖÕÕÔÓÒóÓÔÕÖÖÙÛÙÛ¼½¾¿¿üÁÂÃÄÄÅðÆÇÇÈÉÊÊËËÌÌÍÎÐÐÑÑüÒÓÓÔÔúÕÖÖ×ÖÕÕÔÓÒóÓÔÕÕÖ×ÙÙÛ¼½¾¿¿ÁýÂÃÄÄùÅÆÆÇÈÉÊÊËùÌÍÎÏÐÐÑÑýÒÓÔÔÕùÖ×ÖÖÕÕÔÔÓÒÔöÕÖ×ÙÙÛ¼¼¾¿¿ÁýÂÃÄÄúÅÆÇÈÉÊÊøËÌÍÎÏÐÐÑÑüÒÓÓÔÔúÕÖ×ÖÖÕÕÔÓÒíÓÔÕÖ×ÙÙÛ¼¼½¾¿¿ÀÁÂÃÄÄúÅÆÆÇÉÊÊËúÌÎÏÏÐÑÑÒþÓÔÔÕÖÕÔÓÒíÓÔÔÖØÙÙÛ¼¼½¾¿¿ÀÁÂÃÄÄùÅÆÆÇÈÉÊÊËúÌÍÎÏÐÑÑýÒÓÔÔÕûÖ×ÖÖÕÕÔÓÒëÓÔÔÖØÙÙÛ¼¼½¾¾¿¿ÀÀÁÂÃÄÄùÅÆÇÈÉÉÊÊúËÌÍÎÎÐÐÑÒþÓÔÔúÕÖ×ÖÖÕÕÔÓÒóÓÔÖ×ÙÙÛ¹¼½¾¾¿¿ûÀÁÂÃÄÄùÅÆÇÈÉÉÊÊòËÌÍÎÎÏÐÐÑÑÒÒÓÔÔüÕÖ×ÖÖÕÔÓÒôÔÖØÙÙÛ¹¼¼½¾¿¿ûÀÁÂÃÄÄûÅÆÇÈÉÉÊ÷ËÌÍÎÎÏÏÐÑÑÒùÓÔÔÕÖ×ÖÖÕþÔÓÓÒíÔÖØ×ÙÛ¹¼¼½¾¾¿¿ÀÁÂÃÄÄùÅÆÈÈÉÉÊÊøËÍÍÎÏÏÐÑÑÒþÓÔÔüÕ××ÖÖÕÔÓÒóÔÖØ×ÙÛ·¼¼½½¾¿¿ûÀÁÂÃÄÄîÅÆÇÈÈÉÉÊÊËÌÍÍÎÏÏÐÑÑîÒÓÓÔÔÕÖ××ÖÖÕÕÔÔÓÓÒÒóÓÖÖ×ÙÛ·¹¼¼½¾¿¿úÀÁÂÃÃÄÄüÅÆÇÈÈôÉÊÊËÌÍÍÎÎÏÐÑÑ÷ÒÓÔÔÕÖ××ÖÖþÕÔÔþÓÒÒëÓÕÖØÙÛ·¹¼¼½½¾¿¿ÀÁÂÃÃÄÄîÆÇÇÈÈÉÉÊËÌÌÍÎÎÏÐÐÑÑ÷ÒÓÓÔÕÖÖ×ÖÖÕÔÓÒëÓÕÖØÙÙ·¹¼¼½½¾¿¿ÀÁÂÂÃÄÄîÅÆÇÈÈÉÉÊÊËÌÍÎÎÏÏÐÑÑ÷ÒÓÓÔÔÕÖ×ÖÖÕÔþÓÒÒöÓÕÖØ×Ù¶·¹¼¼õ½¾¾¿¿ÀÁÂÃÃÄÄïÅÆÆÇÇÈÉÊÊËËÍÎÎÏÐÑÑíÒÓÓÔÔÕÕÖ××ÖÖÕÕÔÔÓÓÒÒøÔÖØÙ´¶¹¼¼½÷¾¿¿ÀÁÂÃÃÄÄéÅÆÆÇÇÈÉÊÊËËÍÍÎÏÐÐÑÑÒÒÓÔÔÕõÖ×ÖÖÕÕÔÔÓÓÒÒëÔÖØÙ´¶·¹¼¼½½¾¿¿ÀÁÁÂÃÄÄþÅÆÆìÇÈÉÊÊËËÍÍÎÎÏÐÐÑÒÒÓÓÔÔùÕÖÖ×ÖÖÕÕüÔÓÓÒÒ÷ÓÕÖ×´¶·¹¼¼Ü½¾¿¿ÀÁÁÂÃÃÄÄÅÅÆÆÇÇÈÉÊÊËÌÌÍÎÏÏÐÐÑÑÒÓÔÔúÕÖ×ÖÖÕÕþÔÓÓÒöÓÕÖØ±¶·¹¹¼¼ö½¾¿¿ÀÁÂÂÃÄÄÅÆüÇÈÉÊÊúËÌÌÍÎÏÏÑýÒÓÔÔÕ÷Ö×ÖÖÕÕÔÔÓÓÒ÷ÔÕÖ±´¶·¹¼¼ö½¾¿¿ÀÀÁÂÃÄÄÅûÆÇÈÉÊÊËÌûÍÎÏÏÑÑýÒÓÔÔ÷ÕÖ×ÖÖÕÕÔÓÓÒêÓÔÖ±´¶·¹¹¼¼½¾¿¿ÀÀÁÂÂÃÄÄÅÆýÇÉÊÊËùÌÍÍÎÎÐÑÑÒÓÔüÕÖ×ÖÖýÕÔÓÓñÒÓÔÕ±´¶·¹¹¼¼½¾¿¿úÀÁÂÂÃÄÄÅÆüÇÈÉÊÊ÷ËÌÌÍÎÎÐÐÑÑüÒÓÓÔÔýÕ×ÖÖüÕÔÔÓÓõÒÓÓÕ¯±´¶¶·¼¼ý½¾¿¿ÁýÂÃÄÄøÅÆÆÇÈÉÉÊÊËùÌÍÍÎÐÐÑÑÒþÓÔÔôÕÖ×ÖÖÕÕÔÔÓÓÒÒøÓ®¯´¶¶·¼¼ý½¾¿¿ûÀÁÂÃÄÄÅùÆÇÈÈÉÉÊÊòËÌÍÍÎÏÐÐÑÑÒÒÓÔÔúÕÖ×ÖÖÕÕüÔÓÓÒÒø®¯±´¶·¹¼¼þ¾¿¿ÀüÁÂÃÄÄÅÆûÇÈÈÉÊÊËùÌÍÍÏÏÐÑÑÒþÓÔÔõÖ××ÖÖÕÕÔÓÓÒÒ󮯱´¶¶¹¹¼¼½¾¿¿ûÀÁÂÃÄÄøÅÆÇÇÈÈÉÊÊþËÌÌûÎÏÏÐÑÑÓÔôÕÖ××ÖÖÕÔÔÓÓÒÒ묯±´´¶··¹¼¼½¾¾¿¿ÀÁÂÃÄÄýÅÆÇÇÉÊËþÌÎÎýÏÐÑÑÒûÓÔÔÕÖÖÕþÔÓÓÒñ¬®¯±´¶¶··¹¼½½¾¿¿ûÀÁÂÃÄÄøÅÆÇÇÈÈÉÊÊËÍûÎÏÏÐÑÑÒõÓÔÕÕÖ×ÖÖÕÔÓÓðÒ¬®¯±´´¶¶·¹¼¼½½¿¿úÀÁÂÃÃÄÄÅÆûÇÈÈÉÊÊ÷ËÌÍÍÎÏÐÐÑÑóÒÓÔÔÕÕ××ÖÕÔÔÓÓïÒ¬®¯±´´¶¶·¹¼¼½½¾¿¿ûÁÂÂÃÄÄøÅÆÆÇÈÈÉÊÊéÌÍÍÎÏÏÐÐÑÑÒÓÔÔÕÕÖ×ÖÕÕÔÓÓðÒ©¬®¯±±¶¶·¹¼¼½½¿¿ùÀÁÁÂÃÃÄÄøÅÆÆÈÈÉÉÊÊøËÌÌÍÎÎÏÐÐÑýÒÓÔÔÕüÖ×ÖÕÕÓð§©®¯¯±¶¶·¹¼¼½½¾¿¿ùÀÁÁÂÃÃÄÄøÅÆÆÇÈÈÉÊÊõËÌÌÍÍÎÏÏÐÐÑÑþÓÔÔûÕÖ×ÖÕÕóÔÓ§©¬®¯¯´¶¶·¼¼ü½¾¾¿¿ïÀÁÁÂÃÃÄÄÅÅÆÇÇÈÉÉÊÊËóÌÍÎÎÏÏÐÐÑÑÒÓÔÔìÕ×ÖÖÕÕÔÔ¦§©¬®¯´´¶·¹¼¼ú½¾¾¿¿ÀÀÂþÃÄÄÅúÆÇÇÈÉÊÊËûÌÍÎÎÏÏúÐÑÑÒÓÔÔéÕÖ×ÖÕÕÔÔ¦§©¬®®±±´¶·¹¼¼½½þ¾¿¿úÀÁÁÂÃÄÄÆûÇÈÉÉÊÊËýÌÍÎÎúÏÐÑÑÒÓÓÔýÕ×ÖÖÕò¤¦§©¬¬¯±±´·¹¹¼¼ü½¾¾¿¿ûÀÁÁÂÄÄÅùÆÇÇÈÉÉÊÊÚËÌÌÍÍÎÎÏÐÑÑÒÒÓÓÔÕÖ×ÖÖÕÕ¡¤§©©¬¯¯±´¶·¹¹¼¼ý½¾¿¿ÀüÁÂÃÄÄÅúÆÇÈÈÉÊÊýËÌÍÍÎþÏÑÑÒúÓÔÔÕ×ÖÖðÕ¡¤¦§©¬¯¯±´¶·¹¹¼¼õ½¾¾¿¿ÀÀÁÂÃÄÄÅùÆÇÇÈÈÉÊÊüËÌÌÍÍòÎÏÐÑÑÒÒÓÔÔÕÖ×ÖÖû¤¦§©¬¬÷®¯±´¶··¹¼¼þ¾¿¿ÀýÁÃÄÄíÅÆÆÇÇÉÉÊÊËËÌÌÍÎÎÏÐÑÑáÒÓÓÔÔÕÕÖ×Ö¡¤§©©¬¬®®¯´¶¶·¹¹¼¼½¾¿¿ûÀÁÂÃÄÄÅúÆÇÇÉÉÊÊñËÌÌÍÍÎÏÐÐÑÑÒÒÓÔÔÕé×Ö¡¤¦§©©¬¬®¯±´¶¶·¹¼¼½¾¿¿ûÀÁÂÃÄÄçÅÆÆÇÈÉÉÊÊËËÌÍÍÎÎÏÐÐÑÒÒÓÓÔÔ÷ÕÖÖŸ¡¤¦§©©ñ¬®¯±´¶··¹¼¼½¾¾¿¿úÀÁÂÃÃÄÄèÅÆÆÈÈÉÉÊÊËËÌÌÍÎÏÏÐÐÑÑÒÓÔÔùÕן¡¤¦§§ï©¬®¯±´´¶··¹¼¼½¾¾¿¿üÀÁÂÃÃÄÅÇýÈÉÊÊúËÌÌÍÎÏÏÑýÒÓÔÔâÖžŸ¡¤¦¦§§©¬®¯±±¶¶·¹¼¼½½¾¾¿¿ÀÁÂÂÃÄùÅÆÇÇÈÉÊÊËÌûÍÎÏÏÑÑýÒÓÔÔéÕœž¡¤¤¦¦§§©®¯¯±´´¶·¹¼¼½½ú¾¿¿ÀÁÂÂþÃÄÄÆûÇÈÈÉÊÊËùÌÍÍÎÎÐÑÑÒÓÔúœžŸ¡¤¦¦ô§©¬®¯±´´¶·¹¼¼½õ¾¿¿ÀÁÁÂÂÃÃÄÄÆÇýÈÉÊÊ÷ËÌÌÍÎÎÐÐÑÑþÒÓÓêÔ™œžŸ¡¡¦¦§©¬®¯¯±±´¶·¹¼¼½þ¾¿¿úÀÁÂÂÃÄÄÅÆûÇÈÈÉÊÊËøÌÍÍÎÎÏÐÑÑñÓÔ™œžŸ¡¡¤¦§©¬®¯¯ú±´¶·¹¼¼ý½¾¿¿ÁýÂÃÄÄÅúÆÇÈÈÉÊÊöËÌÌÍÎÎÏÐÐÑÑÓä—™žŸŸ¡¤¤¦§©¬®®¯¯±´¶·¹¹¼¼½½¾¿¿ÁÂþÃÄÄìÅÆÆÇÈÈÉÉÊÊËËÌÌÍÎÎÏÐÑÑçÒÓ—™œžŸŸ¡¤¦§©¬¬®®¯±´¶··¹¼¼ô½¾¾¿¿ÀÀÁÂÃÃÄÄýÅÆÇÇÉÊËøÌÍÍÎÎÏÐÑÑçÒ–—™œžž¡¡¤¦§©¬¬®®¯±´¶··¹¼¼þ½¾¾ú¿ÀÀÁÂÃÃÄÜÅÆÆÇÈÈÉÉÊÊËËÌÌÍÎÏÏÐÐÑÑ”–™œœžŸŸ¡¤¦§©¬¬÷®¯±´¶·¹¹¼¼ô½¾¾¿¿ÀÀÁÂÃÃÄÄøÅÆÆÇÈÈÉÊÊÜËÌÌÍÎÏÏÐÐÑ”–—™œœŸŸ¡¤¦§©©¬¬®¯±´¶¶·¹¹¼¼½¿ùÀÁÁÂÂÃÄÄÅùÆÇÇÈÈÉÊÊËÞÌÍÍÎÏÏÐД–—™œœžŸŸ¡¦§§©©¬¬®±´´¶··¹¼¼½¿ÀûÁÂÂÃÄÄÅúÆÇÇÈÉÊÊËÌýÍÎÏÏäБ”–—™™œžžŸ¤¦¦§©©¬®¯±´´··¹¹¼¼ü½¾¾¿¿ùÀÁÁÂÂÃÄÄøÅÆÆÇÈÉÉÊÊËüÌÍÍÎÎå‘–——™œœžŸ¡¤¦¦©©¬®¯±´´¶··¹¼¼ü½¾¾¿¿ÀûÁÂÂÃÄÄÅùÆÇÈÈÉÉÊÊûËÌÍÍÎÎä‘”–——™œžŸ¡¤¦¦§©©¬¯±±´¶¶·¹¹¼¼½þ¾¿¿ÀûÁÂÂÃÄÄÅÆûÇÈÈÉÊÊËþÌÍÍãÎŽ‘”–—™™œžŸ¡¤¤§§©¬®¯±±´¶¶·¹¼¼½þ¾¿¿ùÀÁÁÂÂÃÄÄøÅÆÇÇÈÈÉÊÊþËÌÌÍ鎑”––—™™œžŸ¡¤¦¦§©¬®¯¯´´û¶·¹¹¼¼½þ¾¿¿ÀûÁÂÃÃÄÄýÅÆÇÇÉÊËÌጎ‘””——™œžŸ¡¡¤¦¦§¬®®¯±±´¶¶·¹¹¼¼ü½¾¾¿¿ÀûÁÂÃÃÄÄøÅÆÇÇÈÈÉÊÊËà̉Œ‘‘”––—™œžŸ¡¤¤¦§©¬®®¯±±´¶··¹¼¼ý½¾¿¿ùÀÁÁÂÃÃÄÄÅÆûÇÈÈÉÊÊËà‰ŒŽ‘”––—™œžŸŸ¤¤¦§©¬®®¯±±´¶¶··¹¼¼ü½¾¾¿¿ÀûÁÂÃÃÄÄøÅÆÆÇÈÈÉÊÊËò‡‰ŒŽ‘”—™—™žŸŸé¡¤¦§©©¬¬®¯±´¶¶·¹¹¼¼½½¾¿¿ùÀÁÁÂÃÃÄÄÅÆûÇÈÉÉÊÊÿšW[]`cfiknru{€…ˆŒ’—œ¡¨¬±µº¿ÃÈÎÔÖØÚÞâåçéçéëëéåâÞÚØÖÔÒÌÅ¿¿º³®ª¥¡ž—”W[]`cfikprw{‚†‹Ž”šŸ¥¬¯¶ºÁÇËÐÖÜÜÞâçëíïññóÅñíëéçäàÜØÔÌÇÇÁºµ¯¬§£š—W[]`cfjmqtw}ƒ†‹–šŸ§®³º¿ÅËÐÖÜâäåëïõ÷ùùûÃù÷õóóíçäàÚÔÐÌÇ¿ºµ±¬¨ŸšW[]`cfjmqux}ƒˆ‹–𡧝³¼ÁÇÎÒÚàåéíóùýýÿýÿÿýÊûùõïéåâÚÖÒÌÅ¿ºµ¯¬¥ŸW[]`cfknruz…‰‹–œ£ª±¶½ÃËÐÖÜäéïóùýÿ ÿÌýùõñíçâÜÚÔËÅ¿ºµ¯ª¥W[]`cfkprwz€…‰Ž’™Ÿ§®µºÁÇÌÔÚâçíóõûÿÿþýÿÿÍýûù÷ñçââÜÒËÅ¿ºµ®¨W[]`cfmptw{€†‹”𡍝¸½ÃÈÐØÞäëñó÷ýÿÿýýûÿÿýÿÓý÷íååàØÐËýº¯ªWY\^bfimquz†‹‘–œ£ª±º¿ÅËÒÚàåëïÿÿÔûõóíçÞÖÎÈÁ½µ¯WY[^bfjmquz€†‹‘–œ£ª±º¿ÇÌÖÞäéñõÿÿþýÿÿÔý÷õñëâÚÒËý¶³WY[^bejnrw{€ˆŒ‘–œ£ª±º¿ÈÐØâçï÷ûÿÿýÿÕýûù÷ñçàØÐÇÁ¼¶WW[]beknrw{‚ˆŒ‘–œ£ª±º¿ÈÎØâéóûÿÿýûýÿÿýÙ÷ïåÞÖÌÇÁ¼UWY]aejmrw{€ˆŒ‘–œ£ª±º¿ÇÌØâéñûÿÿýÿÙûóíåÜÒËÅÁUWY]acimquz†‹‘–œ£ª±º¿ÇÌÖàéñùÿÿÙý÷ñëâØÐÈÃUWY\acgkptx}…‰‘–œ£ª±º¿ÈÎØâéñùÿÿÙýùóíåÜÔËÅTWY\acgjnrw}ƒˆ‘–œ£ª±º¿ËÐÚäëñùÿÿØûùõïçÞÖÌÇRUW[`bgjnrw}ƒˆŒ‘—Ÿ§¯¸¿ÅËÔÜåí÷ýÿÿÚûóéàÚÖÎRUW[^bfinrw{ƒˆŽ‘—Ÿ§¯¸½ÅËÒÜäí÷ýÿÿÚýõëâÜÖÌRTWY]aegmquz‚†Œ‘—ž¥®¶½ÃÈÒÜäíõýÿÿØý÷ïåâÔÌPRUW\`cfjnrxƒŒ‘–œ£¬µºÁÇÐÚâëóûýýÿÿØùñéåÖÎPRTW[^aeimqw}‚‹Ž”šŸ¨±¶½ÅÌÖÞçñ÷ûûýÿÿØûóëçÚÒMPRUY]`bgkpt{€ˆ‹‘—œ£¬±º¿ÈÒÚäëó÷ùýÿÿþýÿÿØùóëåÜÔMPRTY\^afjnrz…‰Ž”™Ÿ¨®¶¼ÅÎÖàçïõùýÿÿþýÿÿØùñéäÜÔMPRTW\^aeimrx}ƒˆŒ‘—ž¥ªµºÃÌÔÞåëõ÷ýÿÿþýÿÿ×ý÷ïçâÚÒJMPRUW\^bfintx}‚‰–œ£¨¯¶¿ÇÌÒÜåïõýÿÿýÿýÔùñçÞÚÔJMMPTW[]aeimrw}‚ˆŽ”𡧬³½ÃÈÎÚâëñùýÿýýÿÿýÕùñçàÚÔIKMPRUY]`cfkptz…‹–œ¡¨¯¸¿ÃËÔÜåëóùûýÿÿÓýû÷ïåÞØÔIJMMRTW[^aeimqtx…‰–𥬵¼¿ÇÐØàåïõùýÿÿÑûùõíäÞØÒHJJMPRWY]`bfjnrw}ƒˆŒ’—Ÿ§±¶¼ÃÌÔÚàéïõùÿÿýý ÿÐýùõñéâÚÔÎGIIKMPUW[]`cgkrw}‚†Œ‘–š¡ª±¶¼ÅÎÒØàçíóùýûûþýÿ ÿÊýûõñíåÞØÐËGHIJMPTWY\^afiptx‚ˆŒ‘”š£ª®µ½ÅËÐØÞäéñõùûûýýÿ ÿÊû÷óíçâÚÔÌÈEHHIKMTUY[]aeijntx{‚†‹–ž¥ª¯¸¿ÅËÐÖÜäéïùùûûýÿ ÿÈûõïëåàØÒËÅ>CGHJJPRWY\`bfimrw{€†‹’™Ÿ§®µº½ÃÌÔÜâéíéïó÷ùûýÿÿÃýù÷õóïéåàÚÐÌÅÁAEHHJMPRTW[]acikptx}‚…‹‘–š¡§®³º¿ÃÇÌÐÒÖÜÞàâåççÂéççåäâÜØÔÒÐËÅÁ¼¸7<>CGGJMPRRUY\^bfjmqux}‚ˆŒ‘–œŸ£§¯µº¿ÅÈÈÎÒÖØÚÜààâÃàÞÜÜÚÖÐÎËŽº¸µ5:CCÖGIKMMPRUY]`beimptx}‚†‹”—œ¡£¥ª¬³¶¼¿¿ÁÅÇÈÈËËȵÁ¿½¼º¸³¯¨¥0025:>>CGHJMPRUW[]`bgjmptx{€†‰Œ‘–šœŸ£§±³¶º¼½¿¿½¿¿ÁÁ¿¿½¼º¸µ±®¬ª§£00Â2:>>AEHIKPRRUW[]`egimqux}‚…‰Œ‘–™šž¡¨ª®±µ¶¶¸¸ºº¼¼ºº¸¶µ³¯¬ª¨§£ž--×27<<>CGHJMPPRUWY]aceimqtw{€ƒ†‹’”—šžŸ£§¨¬¬±³±õ¯®¬¨§£¡Ÿœ™++Ò05::>AEHKMPRTUW\^`cfjmptwx{€…ˆ‰Œ’”—™œžŸŸ££¥¥£¡÷Ÿžœ™™—”‘''Ö+0527:<AACEGIKMPRTW[\^`cfiknpqrwzz{}€‚ƒ……‹‹Œ‹‰Îˆ…ƒ‚€#%&'((--027:<AEHIKKMPRTTWY\\]abcegjmnprtuwwxxz{Îzxwutt !#%%&''(+0257:<>AEGHIKMPRRTWYW[]`abegijmnqrrtuwuÐtrqq "##%&&'+-0257:<>ACEGIKMPPRTUUW[]]`beefijmnnpqrqpmû !"##Ø%&'(+-057:<>ACCGIJKMMPRRUWY[\^aabcfgijjkkmkmkÑjii !"#!"#%'(++557:<>ACCGHIJJMPPRUWWY]^]^abeffijÃgiijiiggff ##%&''((00257:<>CEGHIJKKPPRRTUWW\\]]^`aacceeffgßec ##%%&''(+-0257::AACEGHIIPPRîTUUYY[[\]]^``aabbccaá ""#%%&''((+-0255<<>ACEGGMMPRUWüY[[\\] ^Þ!!"##%&&''(+-022::<>ACEEJJKMMPPRTþUWWY[ \Ü !""#%%''(+-02277:<>ACCGHHIKMMPRTUW YÕ !!"##&&'(+-00557:<>AACCEGHIJKMMPPRRTU WÖ !!""##%&'(+-00257:<<>ACEGHHIJKKMMPRTUTÝ !""!"#%&'((++-0257:<>ACEGHHùIJKKMMPP Rüô "##%&''-ú02557<<ò>ACCEGGHIIJKKMMPRP°±³µ¸º»½¿ÂÃÉÌÎÐÒÕÚÜÞãäæéëíîñòõõö÷øùúúûúûüüûúùø÷öõõóòðííëçåäàÞÝÚØ°±³µ¸º»½ÀÂÇÉÍÏÑÓØÜÞàäæèëíðñôõ÷÷øùúüüýüÉûúùø÷öõòððíëéæäâßÜÚ°±³µ¸º¼¾ÁÂÇÊÎÏÑÔÙÜÞâåçëíðñôõ÷ùùúüüýþþýÍüúùø÷õôòðíëéæäãÞܰ±³µ¸º¼¾ÁÃÈÊÎÐÑÔÙÜÞâæçëíðòó÷øúûüýþþýÿþÿÿþÌýüûúù÷õóòðíëéæäàÞ°±³µ¸º½¿ÂÃÉËÎÑÑÔÙÜßäæèìîñôõ÷ùûüýþþÿ ÿþÎýüüúù÷÷õñðíëéæäà°±³µ¸º½ÀÂÇÉÌÎÑÓÕÛÞâåéëíðòõ÷ùúüýýþÿÿþþÿÿþÑüúùù÷óñðíëéåã°±³µ¸º¾ÀÂÇÉÌÏÑÔØÜÞãæêìîñôöøùüüýþþÿÿþÿþÿþÕüúúøöôñîìëæä¯±²´·º»¾ÁÃÉËÏÑ×ÙÜßäæëíðñó÷øúüüÿÿÔþýýüúøõòñíì鿝±±´·º¼¾ÁÃÉÌÏÑ×ÙÜßäæëíðòõøùûüýÿÿþþÿÿþÖýüüù÷óñîìè篱±´·¹¼¿ÂÇÉÌÐÒ×ÙÜßäæëíñôöùúüþþÿÿþÿþÙüúøöôðíë诰±³·¹½¿ÂÇÉÍÐÒ×ÙÜßäæëíñòöùûýþÿÿþÿþÚüúøõòðíë®°±³¶¹¼¾ÂÇÉÌÐÒ×ÙÜßäæëíðòöùûüþÿÿþÿÙþýüú÷óñðí®°±³¶¸»¾ÁÃÉËÏÑ×ÙÜßäæëíðòõøûüþÿÿþüÝùöôñ±²¶¸»½ÀÂÈÊÎÑ×ÙÜßäæëíñòöùûüþÿÿþÛýüú÷õñ𭯱²¶¸»¼¿ÂÇÊÎÐ×ÙÜßäæëíñô÷ùüüþÿÿþÚýüúøõò𬮰±µ·»¼¿ÂÇÊÎÐÒ×ÚÞâæêíðñõ÷úüþþÿÿÚþýûø÷õò¬®¯±´·º»¿ÂÇÉÎÐÓ×ÚÞâæêìðñó÷ùüþþÿÿÚþýüù÷õò«­¯±³¶¹»¾ÁÃÉÍÏÒ×ÚÝàåèìîñó÷ùüýþÿÿþÝüúùõòª¬®°²µ¸º¼¿ÂÈËÎÒ×ÙÜßäéëíðô÷ùüýþþÿÜþüûúõò©«­¯±´¶¹»¾ÁÇÊÍÑÓØÜÞãæèìðòõøúüþþÿÛþýüú÷󥪬®±³µ·»½ÀÂÉÌÐÑ×ÚÜßäæëíñó÷ùüýþþÿþþÿÿØþýüú÷õ¥©«­±²´¶º¼¿ÂÉËÎÑÓØÛÞãåèëðòõøúüýþþÿÿþþÿÿØþüûù÷õ¤©«­°²´¶¹»¾ÂÈÊÎÐÒ×ÚÝàäéëîòõøúüýþþÿÿþþÿÿþÙüúù÷󢤩«®°²´·º»¿ÂÈÊÍÑÔÙÜßãæèíðòó÷úüýþÿÿþÿþÕüúø÷õ¢¤¥ª­¯±³¶¹»¾ÂÇÊÍÐÓØÜÞâäçìîñò÷ùüüþþÿþþÿÿþÙüúø÷õ¡£¥©¬®±³µ¸º½ÀÂÉËÎÑÔÙÜÞãæêíîñõ÷úüýþþÿþÖüúøöõ¡¢¤¥«­°±´¶¹»¾ÁÂÈËÎÑÔÙÜàäéëíðôöøúüýþþÿÿþÓýüùøöó ¢¢¤©«¯±³µ·º¼¿ÂÇÊÎÐÒÕÚÞâæèëîòõ÷øûüýþÿÿþþ ÿþÔýüûù÷õòŸ¡¡£¥ª®°±³µ¸»½ÂÇÊÍÏÒ×ÙÜÞäæèëðòóöøúüýþþ ÿþÑýüüúøöôñŸ ¡¢¤©­¯±²´¶º»ÀÂÈËÍÐÒרÜßäåéìðñôöøùûüýþþ ÿþÑýüúù÷õòñŸ  ¡£¥­®±±³¶¹»¼¿ÂÈÉÍÏÑÔÙÝàäæêíðñôõ÷ùûüþþ ÿÌþýüüúøöóñ𞟠¢¢ª¬¯±²µ·º»¾ÂÇÉÌÏÑÔÕÛÞâåéëìîòõ÷ùûüûüýþþÿþýÊüûúø÷ôòð휟 ¡¢¥ª­°±³µ¸º¼¿ÂÈÊÍÏÑÔÙÜÞãæééëíñòóöøùúüüýýþþþýüüËúùø÷õôñî윞Ÿ¡¡£¥«­¯±³µ¸º½ÀÂÈÊÍÏÑÔÙÜÞãåçêìîðñôõ÷øùúûüüûÉùø÷öõóòðí뛟  ¢¤ª¬­¯±³¶¸»½ÀÂÈÊÍÎÑ×ÙÜÞâåçëíîðòôóõ÷øøùúúþûúúùÈ÷öõóôñðíëꛜžŸŸ¢¤©«¬®±²´·º¼¾ÁÃÈÊÍÐÒ×ÙÜÞßâæéëíðññòóõö÷÷øøùø÷Èõôòñðìëêéš›œŸŸ¡£¥ª«¬¯±²µ¸º»¾ÁÃÈÊÍÐÑÔÙÛÝßäæéëíðíðñòòôõõööõÍôòñðíêççæš›œžŸŸ¡£¥©ª¬®°²µ·¹»¾ÀÂÇÊÍÎÑÔÕÜÞâäæçêëêëíððþñòòôòññðîíìëéæåãšš›žžÝŸ¡£¤¥ª¬®±³µ·¹»¾ÀÂÈÊÍÏÑÔØÚÜÞßàääçèëííðñíÈìëëêçæãà™™šš›žŸ ¢¤ª¬®°±³µ·»¼¾ÀÂÈÉÌÏÑÒ×ÙÜÜÞßâæçèëëìííìííôìëëêéæåääâß™™ýš›ØŸ ¡£©«¬®°±³µ¹»»¾ÁÃÈÊÍÎÑÒ×ÙÛÜÝÞãäåæéèèêêëëôêèéçæääãâßݘ˜×š›œœžŸ ¢¤ªª¬®¯±³¶¸¹»¾ÁÂÇÉÌÎÏÑÔÕØÚÜÝÞßâãääæçæöåäãâßÞÞÜÛ˜˜Ô™š››œžŸ £¥¥ª¬®¯±´¶·¹»¾ÀÂÇÉÊÌÏÑÒÔÕÙÚÛÜÝÞßààääõãâàßÞÝÜÜÚØ——ý˜š››ÚŸ £¥©«­®°²´µ¸º¼¾ÀÂÇÈÉÌÎÐÑÒÔÕØÚÛÜÝÞÞßßààßÞøÝÜÛÛÚØ×––Ö˜™šš››œœŸ £¥ª«¬®±²³µ¸º»½ÀÂÂÃÉËÍÎÐÑÒÔרÚÛÜÜÝÜòÛÚÙØØÕÔÒ•––—˜šš›ÚœžŸ¡£¤¥©«®°±²µ·¸º¼¾¾ÀÃÈÉËÍÎÏÐÑÓÔ×ÕÕØØÙÙØõÙØØÕ×ÔÓÓÑЕ•ú—˜š™š››ÚœŸŸ¡¢£¤©¬®¯±³µ¶¸º»»¾ÁÂÇÉÊÌÌÍÎÐÑÒÒÓÔÔ××Ôú×ÔÔÓÒÑÑòÏΔ•–——˜™šš››螟Ÿ¡£¥ª«­¯±²´µ¸º»½¿ÀÁÂÇÉÉüÊÌÍÎÎÑÒÑÎÐÎÎÍÌË“”•–——˜˜™š››œœžŸ¡£¥©ª«­°±²³¶¸¹»¼½¾ÀÂÃÇÇÉÊËÌÌÎÏÐÏÎõÍÌËÊÉ’“•––——˜š›䟠¡£¥¥©«­¯°±³µµ·¹º»»¾¿ÁÂÂÇÈÉÉËÌôËÊÉÉÈÇ‘’”••––Ù—˜™šš›œŸ ¡££¤©«­­¯±²²³¶·¸¹»¼¾¿ÀÂÂÃÇÇÈÈÉÏÈÇÑ“””•––—˜™šš››œŸŸ ¡£¥ª«¬­¯±°±³µ¶·¹»»¼¾¿ÁÂÂÃÇÃÂÁÖ’““”••–˜˜™šš››œžŸŸ¡£¥©ª«­®®°±³³µ·¹¹º»¼¾¿¿ÀÁÂÁÀ¾ý‘’““Ø”•–—˜˜™š››œžžŸ¡¢£¤¥ª«¬®°±±²´¶¶·¸º»»¼¼½½¾½¾½Ñ¼»»‘’“‘’“”–—˜˜šš››œžžŸ ¡¢¢¤©ª¬®¯°±³´³´¶·¹ºº»¼»þ¼»»ºýޓՔ•––——™™šš››œžŸŸ ¡¢££ªª«¬­®¯¯²²³³´µ¶¶¸¸¹¹ºº»ú¹¸Ž“”ö•––—˜˜™šš››ñžŸŸ ¡¡©©ª«¬­®®±±õ²³³´µµ¶¶··¸¸¶üŽ’ô“””•––——˜˜™ššœþžŸŸ¤ô¥©ª«¬¬®®¯¯°±±²³ ´ÕŽ‘‘’““”••––—˜˜™šš››œžŸŸ¢¢£¤¥©ªª¬¬­­®¯°°± ²éŒŽŽ‘’’“””––—˜˜™šš››ìœžžŸ  ¡£¤¤¥ªª«¬­­®®¯þ°± ±ù‹ŒŽŽ‘ï’““••–—˜˜™™šš››œžŸó ¡¢£¥¥©ª««¬¬­­®¯ °ø‹ŒŒŽŽ‘’“ᔕ–—˜˜™™šš››œœžŸŸ  ¡¢££¤¥¥©©««¬­®­‹ùŒŽŽô‘’’‘’“”•–——˜˜ô™šš››œžŸŸ  ó¡¢££¤¤©©ªª««¬¬«Šü‹ŒŒýŽú’““”•––˜þ™ššþ›œœžŸó ¡¡¢££¤¤¥¥©©ªª«ªÞæàáäåæèéëìîïðñóõö÷øùùúúûüüýýþýüÞûúùùøø÷öõÞÞàáäåæèéëìîïñòóõ÷÷øùúûûüüý þýüàûúúùøø÷öÞÞàáäåçèêëìîðñòôõ÷÷øùúûüüýþýüßûúúùù÷÷ÞÞàáäåçèêìíîðñòôõ÷øøúúûüüýýþýÿþÿÿþýüãûúúùø÷ÞÞàáäåèéëìíîðòòôõ÷øùúûüüýþ ÿþýüâûúúùøÞÞàáäåèéëìíïðòóõö÷øùúûüüýýþÿþþÿÿþýüäûúùùÞÞàáäåèéëìîïñòôõ÷øùúûüüýýþÿþÿþÿþýüçûúùÜÞßáãåæèêìíîñòôõ÷øùúûüüýþÿþýüúèÜÞÞáãåçèêìíïñòôõ÷øùúûüüýýþÿþþÿÿþýüçûúÜÞÞáãäçéëìîïñóôõ÷øùúûüýýþÿþÿþýüûéÜÞÞàãäèéëìîïñóôõ÷øùúûüýýþÿþÿþýüçûÜÞÞàâäçèëìîïñóôõ÷øùúûüüýýþÿþÿþýüèÜÞÞàâäæèêìíîñòôõ÷øùúûüüýýþÿþýèüÜÜÞßâäæèéëíîðòôõ÷øùúûüýýþÿþýüèÛÜÞßâäæçéëìîðñôõ÷øùúûüüýýþÿþýéüÛÜÞÞáãæçéëìîðñóôö÷øúûüüýþÿþýêÛÜÜÞáãåæéëìîðñóôö÷øúûüüýþÿþýèÙÛÜÞàâäæèêìíïñóôö÷øùûüüýýþÿþýçÙÛÜÞßáäåçéëíîðóôõ÷øùúûüüýýþÿþýç×ÙÛÜÞáâäæèêìîïòóõ÷÷ùúûüüýýþÿþýçØÙÛÜÞàáãæèéëîïñòôö÷øùúûüýýþÿþþÿÿþýæØ×ÙÛÞßáâåçéëíîðòóõö÷ùùûûüýýþÿþþÿÿþýæÖ×ÙÛÞßáâäæèëíîðñóôö÷øùúûüýýþÿþþÿÿþýåÕÖ×ÙÜÞßáãåæéëíîïòôõ÷øùúûüüýýþÿþÿþýåÕÖØÙÛÜÞàâäæèëìîïñóõ÷øøùúüüýýþüÿþþÿÿþýæÔÖØ×ÛÜÞàáäåèéëíîðòôõ÷øùúûüüýþÿþýãÔÕÖØÙÛÞÞáâäæèêëíîðòôõ÷øùúûüüýýþÿþýãÓÕÕÖ×ÙÜÞàáãåçéëìîðñóõö÷øúûûüýýþÿþ ÿþýâÒÔÔÖØÙÜÞÞàáäæèëìîïñóôõ÷øùúûûüýýþ ÿþýâüÒÓÔÕÖ×ÛÜÞßáâåæéëíîïñóôõ÷øùùúüüýþ ÿþýâÒÓÓÔÖØÛÜÞÞàâäæçéëíîïñòôõ÷øùúûüüýþ ÿþýüßÓÒÒÓÕÕÙÛÜÞßáãåæèëìîïñòôõö÷øùúûüüýýþÿþýüãÓÒÒÓÔÕØÙÛÞÞàáäåçéëíîïñòôõ÷øùúúýûüýýþýüþÓÒÒÔåÖØÙÛÜÞàáäåèéëíîïñòôõ÷øùùúûüüý þýüÝûÓÓÒÒÓÓÕÖÙÛÛÜÞàâäæèéëíîïðòôõ÷øøùúûüüýþýüûüÔÓÓÒÒàÕÖ×ÙÛÜÞßáãåçèêìíîïñóôõ÷÷øøúúûüüýýüûûúÔÓÓÒÒáÔÖØÙÙÛÜÞßáäåæèêìíîïñòôõö÷øùúúûüüýüþûúúüÕÔÓÒÒâÔÖØ×ÙÛÜÞßáãäæèéëìîïðòôõ÷÷øùúúûûüýüöûúúùùÕÔÓÓÒÒæÔÖÖØÙÛÜÞàáãäæèéëíîïñòôõö÷øøùüúûûüüýüýüûúýùøÕÕþÔÓÓÒçÓÕÖÙÛÜÞÞàáãæçèéëíîïñòóôõ÷÷øúû üûúùøÕÓÒâÓÔÖ×ÙÛÜÞÞàáäææèêìíîïðòóôõö÷÷øùùú ûúùøþ÷ÖÖýÕÔÓÓÒäÓÕÖÙÙÛÜÜÞàâääæèêëìîïðñòôõõö÷÷øùúùø÷þöÖÖýÕÔÓÓÒàÓÖØØÙÛÜÜÞáâãäæèéëìîîïñòóôõõöö÷÷øøùø÷ýöõ××ûÖÕÔÔÓÓÒáÓÖØ×ÙÛÜÞßááäåçèéëìíîïðñòóôõõöö÷÷ ø÷öýõôÖÖûÕÔÕÔÓÓÒàÓÖØÙÙÛÜÞßàáäåæèéëëìîîïðñòóôôõöö÷ ÷öõôôóÕÖÖ×ÖÕÕÔÔÓÓÒáÔÖÖØ×ÙÜÞÞßáãäåçèèéìíîîïðññòóôôõ õôóýòñÕÕý×ÖÕÕÔþÓÒÒéÔÕÖÖ×ÛÜÜÞàáâäåææèêëìíîïïüðñòóó ôóòññðÔÕÖ××ÖÕÕÔÔÓÓÒÒåÔÖØÙÙÛÜÞßááäåæèééêëìííîîïïððòóòîñððïïîÔÔÕÖ××ÖÖÕÕÔÓÓÒëÔÖØ×ÙÙÛÞÞßàâääæçèèéëììüíîîïïðñðïîúÓÔÕÖÖ××ÖûÕÔÔÓÒÒäÓÔÖØØ×ÙÛÜÞÞàááãäåææèéêëëìííîîïîíùìÒÓÔÕÕÖÖó×ÖÕÕÔÔÓÓÒÒÓÔÖÖë×ÙÛÛÜÞßßàâãääæçèééëëììíîíìëýÑÒÔÔöÕÖÖ×ÖÕÕÔÔÓÓÒöÓÔÖØÙÙÛÛÜÞÞôàáâãäææçèéêëë ìëêÑþÓÔÔÕÖÕÔÓÒêÔÖØ×ÙÙÛÜÜÞÞààáãääåæçèééêëêéèÑýÒÓÔÔ÷ÕÖ×ÖÖÕÔÔÓÓÒöÔÕÖÖØÙÙÛÜÞÞôßáââãäåææççè èîçææÐÑÑÒÓÔÒÓÔÔÖ×ÖÖÔÔÓÒìÓÔÕÕÖ×ÙÛÜÜÞÞàáàáâãäååæçæþçææåýÏÐÑÑÔúÕÖÖ××ÕÕÔÓÒúÓÔÕÖÖÙÙÛÜßàáâäåæäüÏÐÐÑÑÔóÕÖÖ×ÖÖÕÕÔÔÓÓÒÒôÓÔÔ××ÙÙÛÛÜÜÞÞüßààááâã äâüÎÏÐÑÑÓÔôÕÖÖ××ÖÖÕÕÔÔÓÓÒÖùØ×ÙÙÛÛÜÜÞßà áÎøÏÐÑÑÒÒÓÔÔÕÖü×ÖÖÕÕÓÒÕÖûØ×ÙÙÛÛÜÞ ßôÍÎÏÏÐÐÑÑÒÓÓÔÔÖü×ÖÖÕÕÔÓÒÓþÔÖÖþØÙÙÛÜ ÞùÌÍÎÏÏÐÑÑÒôÓÔÔÕÕÖ×ÖÖÕÕÔÔÓÒøÓÔÕÖØØ×ÙÙÛÜ ÞøÌÍÍÎÏÏÐÑÑÒÓÔúÕÖ×ÖÖÕÕÔÓÒÓýÔÕÖÖØ×ÙÛÜÛÌùÍÎÏÏÐÐÑÑôÒÓÓÒÓÔÔÕÖ××ÖÖÕÔÓÒÓýÔÕÖÖ×Ù ÛÙËüÌÍÍÎÎýÏÐÑÑþÓÔÔþÕÖÖÕÔÓÒûÓÔÔÕÖÖØ× Ùÿô‹‰†ƒ€€}zxwwþuttþuttrqùkrmitbó‘Ž‹‰…ƒ‚€{zxwwþuttþuttrqøpqternRò–‘Œˆ…ƒ‚€}zxxwwþuttþur rqøujrmf\wîš–’‹ˆ…ƒ‚{zxxwwuttþur rqøfrrbewW îž™–’Ž‹†…‚{zxxwwuttþur rqömptmczer ™”‘Žˆ†ƒ€}zxxwwuttþur rqöntpgfw\eH ™–‘މˆƒ€}zxxwwuttþuqqrqöpkjkmigjn òª£Ÿš”މ…‚€{xxüwutrrqþrqqp÷nmkkjji\ 쬧¡œ–‘Ž‹†ƒ‚{zxxwutrrqp÷nmkkjjik 챪¥Ÿ™”Œˆ…‚€}zxxwutrrqpönmkkjjenH 쵯ª£œ—’މ†ƒ€}{xxwutrrqpqpónppnmkkjjegc 캳®§Ÿš”‘‹ˆ…‚{xxwutrrqpþqppnpõnmkkjjgjc ì¼µ¯¨¡œ—’Œ‰†ƒ}xxwutrrqpnpõnmkkjjepcb ì½¶¯¨¡œ™”Ž‹ˆƒ€}xxwutrrqpnpnpônmkkjjbkgiì½¶±ª¡œ™–‹ˆ…€}xxwutrrþqppnpnñmppnmkkjjigmWn뎺³ª£ž™’Ž‹†‚}{zwtrqqp nmkjùkqa]jëý¸±¨¡ž™’Ž‹†‚}{zwtrqqp nmkjùgfbgj<éü¸±¨¡ž™”Ž‹†ƒ€}{zwtrqqppn mþkjjøijccm^e鎺³ª£Ÿš”‹ˆƒ€}{zwtrqqppn mkjiøkiejWi çÈÁ½¶®§Ÿš”Œˆƒ€}{zwtrqqppnn mkjiøfmffbaUéËÿ¸¯¨Ÿš–Œˆ…‚}{zwtrqqnnm kþjiigùkibgTréËý¸¯§¡œ–‘Œ‰…‚}{zwtrqqnnm kjig÷mbkcbWc"éÈÁ½¶®§¡œ–‘Œ‰…‚}{zwtrqqnnm kjig÷pUmiaiY`äËüµ¬§¡œ–‘Œ‰…‚{wutrpnnmmkkj jigþfeeüca^éËüµ¬§¡œ–‘Œ‰…‚{wttrpnmmk jigþfeeûca^êËüµ®¨Ÿš–Œˆ…‚{wtrrpmmþkjjþijjig÷feccb`]aêËüµ®¨Ÿš”Œˆƒ€zwtrqpmmkjijigfþeccûb`]`éÇ¿º³¬§Ÿš”‹ˆƒ€}zutrqnmkkj igfþeccúb`]Pêý¸±ª¥ž™”Ž‹†ƒ€}zurqqnkkþjiiþgiigföecbba^\WRêÁºµ¯¨£ž™’Ž‹†‚}xurqpnkkjigigfþcbbúa^\]^꿸³®§¡ž™’Ž‹†‚}xurqpmkkjigigfeþcbbúa^\WP庵¯¨£ž™”‹ˆ…‚zwrqpnmkkjiiggfecbøa`^]\TIæ¶±¬§Ÿœ—”މˆ…€}xurppnmjkjiggfecbøa`^]cWRêµ®ª¥ž™–’Œˆ†ƒ{xuqpnnkjjýigf fecbøa`]]bTU汬¨£œ™”‹†ƒ€}zwtqnnmkijigff ecb÷a`^]\[YT寪¥¡š—’މ…‚{xwrpmmkjiigffeecþeccba÷`^]\UcRꪥ¡ž—”Œ†ƒ€}xuurnmkkiggýfeccþec cba÷`^\\PeMC棟œ—’Ž‹…‚{wttqnkkjifgfeccbcbaö`^]\\T^MR៚—”ŒŽ‰…€}zwttqnkkjgfgfeccbccbbcbaö`^]\[^]RWìžš—”‹‰†‚}zwunmkjiggc ba`óa``^]]\\TY`Jé™–”‹ˆ†ƒ{zwtrnmkiggffccb a`Ýa``^]\\[YT`M”‘‹ˆ…ƒzxutqpmkjigffb a`ß^]]\[[]P[RH‘Ž‹ˆ…‚€}xutrpnkjigfeeba `^à]\[[Y\WRT[Œ‹ˆ†‚}zwtrqpmjigfecca `^]ú^]]\[YYåWaJUT‰†…ƒ{{wtqqpnkigfecbb` ^]ß\[[YWWTaJWJ…‚€zxwtpnnmkjggecbaa` ^]\ú]\\[YWWçUPWJ€}{wttqmkkjiggfecaa`^ ]\[þYWWà\JWWP}{xwutqpnmjigfeccba`^]^^]] \]\[YWìRWWI(zxutrqnmkjgfeccúba`^^]] \]\[þYWWíRUUI5utqpnnkjigecbbûa``^]]\[\[YWìUPRRHCrqnmkkiigfcbaa`^]\ [þ\[[YWUPîHJpnmkjjggfecbaa^^]\[ Y[YWUòTPPMIMmkjiigeeøcbaa`]]\\[YWþUTTíRPRJJKigffeebbaa`^^\[Y WYWUTRëPRGMGeeccbb``^^]]\\[[YWUTRëPTEPCcbaa``^^]\[YYWYYWUTRMêPAU<a`^^]]^]]\[YWWYYWWUWUTRíMKPERE]]\\[[\\[[YW WUWUTRPùJRIKJ[[Yü[YYWWþUWWUTUTRPùIRKAKYYWUþTUUTRPùIPK:GWWUTRTRPýMPKKü<>TTUT%RPMúGKE7RRþPRRPMøJMAJJ5P-PMKùMEIE<:ôÔÑÑÏÎÌÌËÊÉÈÇÇþÃÂÂþàÂÁø½Â¾»Â·dó×ÓÑÑÎÎÍÌËÉÉÈÇÇþÃÂÂþàÂÁøÀÁ¹¿¬òÙ×ÔÒÐÎÎÍÌÊÉÈÈÇÇþÃÂÂþàÂÁ÷ü¾º²Ç_ îÜÙÕÔÑÐÎÎÍËÉÉÈÈÇÇÃÂÂþàÂÁ÷ºÂ·¹Ç¯3 îÝÛÙÕÓÑÏÎÍËÉÉÈÈÇÇÃÂÂþàÂÁö¾À¾¸É¹Â îÞÜÛØ×ÓÐÏÎÌÊÉÈÈÇÇÃÂÂþàÂÁõ¿ÂÀ»ºÇ²¹  îßÝÛÙ×ÓÑÐÎÌÊÉÈÈÇÇÃÂÂþÃÁÁÂÁõÀ½¼½¾»»¼¿@ òäßÞÜØÔÓÑÎÍÌËÉÈÈýÇÃÂÂÁþÂÁÁÀ÷¿¾½½¼¼»² íäâÞÜÙ×ÓÑÏÎÍËÉÉÈÈÇÃÂÂÁÀö¿¾½½¼¼»½_ íæäàÞÛØÔÒÐÎÍÌÊÉÈÈÇÃÂÂÁÀõ¿¾½½¼¼¹¿  íéæäßÜÚÕÓÑÏÎÌÊÉÈÈÇÃÂÂÁÀÁÀò¿ÀÀ¿¾½½¼¼¹»¸B íëçåâÞÜØ×ÑÐÎÍËÉÈÈÇÃÂÂÁÀþÁÀÀ¿Àõ¿¾½½¼¼»¼¸ íëéæãÞÜÚÕÒÑÏÎËÊÈÈÇÃÂÂÁÀ¿Àô¿¾½½¼¼¹À¸·3íìèæãÞÜÛØÓÑÐÎÌÊÈÈÇÃÂÂÁÀ¿À¿Àô¿¾½½¼¼·½»»‹íìèæäÞÜÛÙÔÑÐÎÌÊÈÈÇÃÂÂþÁÀÀ¿À¿ñ¾ÀÀ¿¾½½¼¼»»¾°¿ëðìëçäßÝÛÕÓÑÏÍËÊÉÉÇÂÂÁÁÀ ¿¾½¼ù½Á¶³¼|ëîìêæãÞÝÛÕÓÑÏÍËÊÉÉÇÂÂÁÁÀ ¿¾½¼ø»º·»¼œéîëêæãÞÝÛØÓÑÏÎÌÊÉÉÇÂÂÁÁÀÀ¿ ¾þ½¼¼÷»¼¸¸¾´¹JéðìëçäßÞÜØÔÑÐÎÌÊÉÉÇÂÂÁÁÀÀ¿ ¾½¼»ø½»¹¼°»ƒçñíìèåâÞÜØÔÒÐÎÌÊÉÉÇÂÂÁÁÀÀ¿¿ ¾½¼»÷º¾ºº·¶® éñîíêæãÞÜÙÔÒÐÎÍÊÉÉÇÂÂÁÁ¿¿¾ ½þ¼»»ø½»·»­ÂaéñîìêæâÞÜÙ×ÒÑÎÍÊÉÉÇÂÂÁÁ¿¿¾ ½¼»÷¾·½¸·¯¸’éñíìèåâÞÜÙ×ÒÑÎÍÊÉÉÇÂÂÁÁ¿¿¾ ½¼»÷À®¾»¶»±µäñîëéäâÞÜÙ×ÒÑÎÍËÉÇÃÂÂÀ¿¿¾¾½½¼ ¼»þº¹¹û¸¶´QîñîëéäâÞÜÙ×ÒÑÎÍËÉÇÂÂýÀ¿¾¾½ ¼»þº¹¹û¸¶´îñîëéåãÞÜÙÔÒÐÎÍËÉÇÂÂþÀ¾¾þ½¼¼þ»¼¼»öº¹¸¸·µ³¶êñîëéåãÞÜØÔÒÐÎÌËÉÇÂÂÁÀ¾¾½¼»¼»ºþ¹¸¸ú·µ³µBéðíëçäâÞÜØÔÑÐÎÌÊÉÃÂÂÁ¿¾½½¼»ºþ¹¸¸ú·µ³ª‡êîìêæäàÝÛØÓÑÏÎÌÊÉÃÂÁÁ¿½½þ¼»»ºö¹¸··¶´²¯«êíëéæãßÝÛÕÓÑÏÍËÊÈÃÂÁÀ¿½½¼»ºþ¸··ù¶´²³´)êíêçåâÞÝÛÕÓÑÏÍËÊÈÃÂÁÀ¾½½¼»º¹þ¸··ù¶´²°ªWçëéæãßÝÛØÔÑÐÎÍËÉÇÂÁÀ¿¾½½¼»»º¹¸·ø¶µ´³²­¡çèæäâÞÜÚØÓÑÐÎÌÊÈÃÂÀÀ¿¾¼½¼»»º¹¸·ø¶µ´³¸¯¬êéåäàÝÛÙÕÒÐÏÎËÉÈÃÁÀ¿¿½¼¼» º¹¸·÷¶µ³³·­®"ææäãßÜÛØÔÑÏÎÌÊÉÇÂÁ¿¿¾½»¼»»ºº ¹¸·ö¶µ´³²±±­SêæäàÞÜÚÕÓÑÎÍËÉÈÇÂÀ¾¾½¼»»º¹¸þ¹¸¸·¶÷µ´³²®¸¬‰ëäàÞÝÚØÔÒÏÎÌÊÈÃÿ¾½½»»ýº¹¸¸þ¹¸ ¸·¶÷µ´²²ª¹¥žæßÞÜÚÕÔÓÑÎÍËÉÇÂÂÁ¿½½¼»º»º¹¸¸·¸·¶Õµ´³²²­´¤«&ÞÜÚØÔÒÓÑÎÌÊÉÇÂÂÁ¿½½¼»º»º¹¸¸·¸¸··¸·¶áµ´³²±´³«°JÝÜÚØÔÑÑÏÍËÊÉÇÿ¾½¼»»¸ ·¶µß¶µµ´³³²²­±µ¢dÛÙØÔÑÐÏÎËÉÉÇ¿¾½»»º¸· ¶µÝ¶µµ´³²²±±­µ¤ˆØ×ÔÑÐÎÎËÉÈÃÂÁÀ¾½¼»»ºº· ¶µß´³³²±±³ª±« ×ÓÑÐÎÍÌÊÈÃÂÂÀ¿½¼»»º¹¹·¶ µ´ý³²±±å²¯«­±ÒÑÐÏÍËÊÉÇÂÂÁÀ¾¼»»º¹¸¸¶ µ´³û´³³²±±å¯¶¢®­"ÑÏÎÎËÉÉÇÂÁÁÀ¿½»»º¹¸··µ ´³þ²±±°å­¶¢¯¢DÎÍÌËÉÈÇÂÀ¿¿¾½¼»»¹¸·¶¶µ ´³²ä³²²±±°°¯°®ª¯¢^ÌËÊÉÇÂÂÁ¾½½¼»»üº¹¸¶¶µ´ ³²±°ß¯²¢°¯ªlÊÉÈÇÃÂÁÀ¿¾¼»»º¹¸¸·¶µ´³´´³³ ²³²±°ë¯¬¯¯¡—ÉÈÃÂÂÁ¿¾½¼»º¹¸¸ú·¶µ´´³³ ²³²±°¯í¬®®¡šÃÂÁÀ¿¿½¼»»¹¸··û¶µµ´³³²±²±°¯ò®ª¬¬ žÂÁ¿¾½½»»üº¸·¶¶µ´³² ±þ²±±°¯®ë©ªª ¢À¿¾½¼¼»»º¹¸·¶¶´´³²±°¯®õ­©ª¤¡¤¾½¼»»¹ø¸·¶¶µ³³²²±°¯þ®­­í¬©«¢¢£%»»ºº¹¹··¶¶µ´´² ± °±°¯®­é¬«©¬Ÿ¤ŸF¹¹¸¸··µµ´´³³²²± ±°¯®­¬î«ª­Ÿ©ž_¸·¶¶µµ´´³²±±þ°±±°¯®­¬«¥ê©®œ>¶µ´´³³´³³²±±°°±±°°¯®¯®­¬«ð¥£ªŸ«ŸP³³²²±±²²±±ü°¯¯°°¯®¯®­þ¬««÷ª©¢¬¡£¢e±±°¯þ®¯¯®­®­¬«ªø©¡¬££z±±°¯®þ­®®­¬«ª©øª¡ª£›Ÿ~°°®­¬­¬«ª©ý¥©££üœ|­­®­¬«¬«ªþ©¥¥ö¤¥Ÿ£Ÿ›y««¬ ¬«þª««¬«ª©¥ø¢¥¢¢švªª©ª©ª©¥¤£ù¥Ÿ¡Ÿœ›lôôòòñðïïîîííììëþìë ëêøèëèæëãžóôóòòððïïîîííììëþìë ëêøéêëäëéÛõõôôóñððïïîííìëþìë ëê÷ìçëèåßì– ô÷õõôòñððïîîííìëþìë ëê÷åëëãäìÜW ô÷öõõóòñðïîîííìëþìë ëêöèéëèäíäëÀ ôø÷öõôóññðïîííìëþìë ëêõéëéæåìßäÓ) ôø÷öõôóòñðïîííìëþìêêëêõéèçèèææçéj òùø÷÷õôóòðïïîîííìëêþëêêéèçýæß òùøø÷õôóòñðïîîííìëêéèçüæè– òúùø÷öõôóñðïïîííìëêéèçûäéÓ! úïùø÷öõóòñðïîîííììëëêéêéèçûäæäk íûúùø÷÷õôòñðïîîííììëëêéþêééèçûæçäÎ íûúúùø÷öõóòñðîîííììëëêéèçúäéäãSíüûúùø÷öõóòñðïîííììëëêéèçúãèææÉíüûúùø÷öõôòñðïîííììëëþêé éþèééèçæüèÞéüôûúùø÷öõóòñïîîûíìëëêê éèçùèêâàç¼üôûúùø÷öõóòñïîîûíìëëêê éèçøæåãæçÓ1éüûûúùø÷öõóòñðïîîíìëëêêéé èç÷æçääèáävüëûúùø÷÷õôòñðïîîíìëëêêéé èçæøèæäçÞæÂéýüüûùø÷÷õôóñðïîîíìëëêêéé èçæ÷åèååãâÜ7üìûúù÷÷õôóñðïîîíìëëêêéé èþçææøèæãæÛë™üìûúøø÷õôóòðïîîíìëëêêéé èçæ÷èãèäãÜäÓéýüüûùøø÷õôóòðïîîíìëëêêéé èçæ÷éÜèæâæÞáüíûúùøø÷õôóòðïîîììëëééè çæþåääüâáüðûúùøø÷õôóòðïîîìëëéè çæþåääüâáÐüðûúùù÷÷õôóñðïîîìëëþéèèçþæççæþåääúãáàâ#üìûúùù÷÷õôóñðïîíìëëêéèèçæçæåäúãáàáküìûúùø÷÷õôòñðïîíìëëêéèèçæåäúãáàÙÅüìûúùø÷öõóòñðïîíìëêêéèèþçææåäãúâáßÜÙêüûúúùø÷öõóòñïîîíìëêééèèçæåþäããùâáßàáCëüûúùøø÷öõóòñïîîíìëêéèèçæåäãùâáßÞÙ‰ëûúúùø÷öõôòñðïîíìëêééèèþçææåäãøâááàßÛÔîûúùø÷÷öõóòñðïîíìëééûèçèçææåäãøâááàäÜÛîúùùø÷öõõóññðîîíìêééþèççæ åäã÷âáààãÛÜ9æúùùø÷öõôòñðïîíìëêééèèæçææååäãöâááàßÞÞÛ„îúùøø÷öõóòðïîîíìëéèèþçææåäãâáùàßÜäÛÇîùøø÷öõôóñðïîíììëéèèæþåääãâáßûÙäØÒçø÷÷öõôóòðïîîìëëêéèèçæåæåääãäãâáÝàßßÛáÖÙB÷÷öõôóóòðïîíìëëêéèèçæåæåääüãääããäãâáãàßÞáàÙÞv÷÷öõôòòñïîîíììéèèçææä ãâáþâááàßçÛÞáÕžöõõôòññðîîíìëëéèèææåäã âáþâáááàßßÞÞÛáÖÆõôôòñððîííìëêéèèçææååã âáàâßÞÞàÙÞÙÓôóòñðïïîíìëëééèçææåääãâáýàßÞÞæßÜÙÛÞóòññïîîíìëëêéèçææåääâáàûáààßÞÞôÜâÕÜÛ9òñððîîóìëêêééèææåääããáàþßÞÞðÛâÕÜÕoðïïîííìëééèùçææääãââáàßüàßßÞÞöÜÞÜÙÜÕ”ïîîûìëëêèèþçææüåääââá àßÞéÜßÕÞÜÙ¤îîíììëêééèçææåääøãâááàááàà ßàßÞìÜÛÜÜÔ×ííìëëêéèèçæåääýãâááà ßàßÞÜöÛÜÜÔÔìëêééùèçææääããþâááàßÞßÞÜöÙÛÛÓÒëêéèèæüåäãââáàß ÞþßÞ ÞÜë×ÙÙÓÕééèèççææåääãââááàßÞÜõÛ×ÙÖÔÖèèçææäùãââáààßßÞÜÛï×ÙÕÕÖ?ææååääããââááßÞÜÛøÙ×ÛÒÖÒsääãáàßÞÜÛÙöÛÒ×Ò–äãââááýàßÞ ÞÜÛÙØù×ÒÜÓfâááàûáààßÞÞÜÛÙðØÖÙÒÙÒ~ààßßÞÞßßÞÞÜÞÜÛÙø×ÕÛÔÖÕŸÞ Þ ÜÛÜÛÙø×ÔÛÖÒÖ¹ÞÞÜþÛÜÜÛÙ×øÙÔÙÖÓÒ¾ÞÞÜ"ÛÙ×ýØ×ÖÖÓþ¼ÛÛÜ ÛÙÛÙþרØöÖØÒÖÒÔ·ÙÙÛ ÛÙÛÙרøÕØÒÕÕÔ´ÙÙ×Ù×ÙרÖùØÒÔÒÓÓ¤,ÿ,ÿ-ÿ.ÿ .ÿ .ÿþ£ /ÿ /ÿ 0ÿ 0ÿþ 1ÿ 1ÿ 2ÿ 2ÿ 2ÿ 3ÿ4ÿ4ÿ4ÿ5ÿ5ÿ5ÿ5ÿ6ÿ6ÿ6ÿþ)7ÿ7ÿ7ÿ8ÿ8ÿ8ÿ8ÿ9ÿ9ÿ9ÿ9ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ;ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿÛÿúÔ #$$&**+./3323789:;>?@BCDEFJIIMPQQRUUù "#$&**Ý+/0332389::>>?@CDEEJJIMNPQQSUÑ "#%)**+//0033789:==>@BCDEFFJIMNPQSSÔ #$&)**.//0323899;=>?@CDDEFJIMNPPRRò "$&))*+//â033788;;=>@BCCEEFJIMNNQRô #%&)*+//â032378:;=>?@BCDEEFIMMNQQõ #%&)*+.//â32378::;>?@BCDDEFJIMNQQ è "#$%&)*../0323799:=>?@BBñCDFJIINN  ë"$%&)*..//323399:;>?@@ðBCDEJIIMN è "#$&))++./0323889;=>?@@ñBDEFJIMM Ù "$%&)**+//032778:;=>??@BCDFJJIMù"#$%&**û.//033é79:;=>>?@BDEFFIIØ "$%%))*+.//022389:;=>>?BCDEFJJÙ "#$%&)**+.//323789:;=>?@BDEEJJÙ"#$$&&)*+.//332389:;=>?@BCDEFJô "#&&)*+.//è0323789;;=>?@BBEFô "#%&)**.//é023789;;=>?@BBEEÛ""%%&)*+..//032788:;;=?@@BDEó $$%&**++//ê02378::;=>?@@CD÷ ##$%)**.ê/0323799:;=>??BCä""#$&)**+.//0233899:=>>?@Býþ ç"$%&)*++./0323889:;=>>@@Ý "#%&))++./0322889:;=>>?@ü#ø"$%%&**û.//033÷789:;;??ü#ø"#$%%**ð+//0023789:;;??ü  ç "#$%))*+.//0223789::>>þ!ç "$$&&)*+.//33237899==ýå #$%%&**+./00323788;;ýþé"#$$%)**+.//032377::þï ##$%&)**+//ø032379:ýï "##$%)**+//ø0323399÷"ï#%&)**+.//023378ù"ï#$&)**++./032377þ ï"$%&)**+.//03237ù ï #$%&)**+.//0323÷ ï"#$%&)**+.//032÷ ï "#$%&)**+.//03ù"í "#$%&)**.//00ù#ï "#$%%&**+.//0ø#"ñ "#$%&**++//û"ñ #$%&)**+//ù#÷ "#$%&**ý./ú  #ò "#$%)**+.ú  !ò "#$&))*+ú õ "#%&&**ûýô #$%%**û ýö "$%%)* ü)ø "#%% ü)ø "#$% ü *ù""$$ ý#*ù ## ý"+ú "" þ+ü þ&þ 'õ ÷#&ú (ø(ú'ù&ü )þú(û&ýõ"!ú5//511/1Ô57;==BFGJKOSSVWZ[^_bfgjknorsvwwz~††5//511/1Ô379;=BFGGJNRSSVW[^__ffgjnorrvvwz{~„†5//511Ñ/113579;?CFGJNORRSWZ[^_ccfjknorssvwz{~„„5//511Ô3577;=BCFGKOORSVW[^^bcfgjnoorsvwz{~~5//511Ò/113579=BCCFJNOORSWZ[[bbcfjknnrrsvwz{{5//511/Ô13357;?BCFJNNORSVWZ[_bcfgjknorrswzz{5//511/1Õ357;?BCFJKNNOSVWZ[__bfgjknoorsvwz{-7/-311è79;=?BCFKKNRSVWZ^^_cfgjkkñnosvww{{+7/-3117ë9=?BCFKKNOSVWW^^_bfgjjðknorvwwz{)71-311è579;=BCCJJKORSVW[[^bcfgjjñkorsvwzz'71-3115Ù79=?BCGGJNORSVZZ[_bcfggjknosvvwz#53/3113Ù59;=?BFFGKNORSWWZ^_bcffgjkorssww!53/311Ø3579=??CCFJKNORVVW[^_bcffgknorsvv551311Ù379;=?BCFGJKNOSVWZ[^_bcfgjkorrvv351311Ù359;==BBCFJKNOSSVW[^_bcfgjknorsv35+511Ú3579;BBCFJKNOORSVWZ[^bbcfgjkkrs15-311Ú3579;?BCFGKNNOORVWZ[^bbcfgjkkrr/3-311Û3599??BCGJKKNORSVZ[[_bbcgjjkor)3-311Û3577==?BFGJJNNORVWZ[__bcfgjjno%3/311Ý357;;=?CFGGKKNRSVWZ^^_bcfggkn!1/113ä599;=BCFFJKNORVWW[^^_cffgjký1/11þ31137ç9=?BCFJJKORSVW[[^_bcffjj1Ý311/1133579;?BCCJJKNRSVV[[^_bcffgjü+;+11æ359=??BFFGKNORSWWZ[^_bbggü';-11æ359;=??FFGJNORRVWZ[^_bbggü!7/1 1ç579;=?CCFJKNORVVWZ[^__ffþ31!1ç3579==BBCGJKNOSSVWZ[^^ccý/311å311357;=??BFGJKNRRSVWZ[[bbý)311þ311é359;==?CFGJKOORSVWZZ__þ%11å31//137;;=?BCFGJNNORSVWZ^_ý!/11å31/-/379;;=?CFGJNNORSVWW^^÷/+/351--1139ï;?BCFGJKNORVWWZ[ù'/1133//139ï;=BCFFJJKORSVWZZ313þ/1137ï9=?BCFGJKNORSVWZ5ù1/175-1135ï7;=?BCFGJKNORSVW÷-33-177-113ï59;=?BCFGJKNORSV÷!/5//57/1131ï379;=?BCFGJKNORSù+91+35113í/13579;=?BCFGKNNRRù);3+15113/ï1379;=??BFGJKNORø!;1'15-1"1ñ3579;=?BFGJJNO3û-13/1"1ñ3577;=?BCFGJNNù'53//31#1ò3579;=?BFGGKNú37--71#1ò35579;=?CFFJKú+7/-71!1/ò133579;=BCCGJú!31/31 1/1õ3579;?BBFGû+53/11ý31//ô13357;=??FFû'77+11ý31//1ö3579=??CF ü15)1)1ø3579;?? ü+3/1)1ø3579;=? ü/71*1ù3599== ý);1*1ù3577;; ý!91+1ú35799 þ/1+13ü577 þ%1&1þ31135 '1õ311/113355 ÷'5;3-1531&15ú-73-/1(13ø13/-//1(1ú+53//1'1/ù#353131&1/ü+751)1þ/ú351/1(1û/3/+1&1ý31õ59//3551//1!1þÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ=ÿýÞÿ<ÿý£ÿ<ÿýqÿ<ÿý)ÿ<ÿýÿ<ÿýÿ<ÿýÿ<ÿÿþÞÿ9ÿ=ÿ=ÿþ£ÿ;ÿþIÿ;ÿþÿ;ÿ<ÿ<ÿüÞÿÞÿ8ÿþqÿ:ÿþÿ:ÿ;ÿ;ÿþ£ÿ9ÿþIÿ9ÿþÿ9ÿýÿÞÿ7ÿþqÿ8ÿ9ÿ9ÿ9ÿþÿ7ÿûÞÿÿÞÿ3ÿû£ÿÿÞÿ3ÿûÿÿqÿ3ÿ7ÿþqÿ5ÿ6ÿþÞÿ4ÿþÿ4ÿ þÞÿ3ÿ ûqÿÿÞÿ0ÿ ÿþ£ÿ0ÿ þÞÿ2ÿ þÿ2ÿ þ£ÿ1ÿ þÿ1ÿ 2ÿ þIÿ0ÿ 1ÿ þqÿ/ÿ0ÿþÿ.ÿþÞÿ-ÿþ)ÿ-ÿþÞÿ,ÿþÿ,ÿÿþÞÿ(ÿ,ÿ!é þ!ç #ú ô þ$è $ê &ì þ%ì þ'ì þ'þó )üï )þý û +ô  þ+ï -ô  þ -ó  0úø /ö  1ñ  1þû3û4ô6ù7ý9ü9:;=>þ¿÷VWXZ[[\^``öacedejlmnooæqrsuvwwyyz{||}}~€‚‚ƒ„„……†ø‡ˆˆ‰ŠŠ‹ŒŒõUVXZZ[[^_``þcddÞejlmnnooqrsuvvyyzz{||}~~€€‚‚ƒƒ„……†ø‡ˆˆ‰Š‹‹ŒŒûUVWXZZþ\__ß`adcdejlmmnnoqrsuuvwwyz{{||}~~€ƒþ„……ø†‡‡ˆˆ‰Š‹‹öŒSUVWXXZ[^^ý_accìdejlmmnnoqrsuuvwwyz{{}õ~€€‚‚ƒƒ„……†î‡ˆ‰‰ŠŠ‹‹RSVWWXX[\^^þ`aaúcdejlmmãnoqrsuvvwwyz{{||}~~€€‚‚ƒ„„……†û‡ˆ‰‰ŠŠ÷RSUVWWXZ\\ý^_aaÛcdejllmmnoqrssuvvwyyzz{||}~€‚‚ƒ„……û†‡‡ˆ‰‰úŠRSUVWWÑZ[\\^_a`aacejjllmmnqrrsuuvwwyzz{||}~~€‚ƒ„„……†ý‡ˆ‰‰öŠPQRSUUVWZZÒ[\__``adeejjllmoqqrssuvvwyyzz{|}}~~€€‚‚ƒ„„……þ†‡‡úˆPQRSUUùWXZZ[\__ã`acdeejjlmnoqqssuuvwwyzz{||}~~ø€‚‚ƒ„„……†‡ëNPQRSSUVXZXZ\^^_`acdeeéjlmnoqqrrsuvvwwyzz{|}}~~ö€€‚‚ƒƒ„……†‡öNPQRRSSVWXXí[\^^_`acddeejlmnoorrôsuvvwyyzz{|}}~ý€ƒþ„……†÷MNPQRRSUWWÜXZ\\^^_`acddeejlmnoqqrrsuvvwwyz{{||}}õ~€€‚‚ƒƒ„……цIMNPQRRSVWVWZ[\\^_`accddejlmnnoqqrssuuvwwyz{{||ó}~~€€‚‚ƒ„„……ûIMNPQQùSUVVWX[[ú\^_`accëdejlmnooqqrsuuvvwyyz{{|ô}~€‚‚ƒ„……öJINPPQQSUVVßXZ[[\^_`aaccdejlmmnooqrssuvvwwyz{{|ó}~~€‚ƒ„„……éJIMNNPPQQRUVVWZZ[\^_``ccâdejjlmmnnoqqrssuvvwyyzz{|}}~~€€¼‚ƒƒ„ƒƒFJIMNNPPQRSUVVXZ[\^_``aacdeejjlmmnoqqrssuuvwwyzz{||}~~€‚‚ƒƒœEFIMMNNPQRSUVVXXZ[\^__`aacdeejllmnnoqqrrsuvvwwyzz{|}}~~€‚‚ƒ‚ƒDEJIIMNNPQRSUUWWXZ[\^^_``acddejllmnoorôsuvvwyyzz{|}}~û€‚‚áCDFJJIMNNPQRSUVVWXZ[\\^__`accdjjìlmnnoqqrrsuvvwwyz{{||}û~€€²BCEFFJMMNPQRSSUUVWXZ[[\^^_`aaceejllmnnoqqrssuuvwwyz{{|{||}~€€BCDEFFIIMNPQRSSÛUVWXZ[\\^^_`aadeejlmmnooqqrsuuvvwyyz{{|Þ}~€€@BCDEFIIMNPQRRSSUVWXZZ[\\^_``âdeejllmmnooqrssuvvwwyz{{z{{|}~~€ã@BCDEFJJIMNPQQSSUVWXZZ[[\^_`aacûdeejnnëoqrrsuuvvwyzzyzz{|}}~~«@BCDEEFJIMNPQQRSSUWXXZZ[[\_``a`aacdeejmmnoqqrrsuuvwyyzyyz{||}}~~?@BCDDFFJIMNPPQRSUVWXXúZ[\^_``êaccdeelmmnoqqrssuuvwwyyzü{||}}ã>?@BCDEEFJIMNNQQRSUVWWXXZ[\^__`ýacddñjllmnooqrrssuvwwãyz{{||}}=>?@BBDDEFJIMMNPQRSUVVøWXZ[\^^__å`accdejjlmnnoqqrrsuuvvwwyz{{|Ã;=>?@BCCDEFJIINNPQRSUUVVWXZ[\\^^_``accdeejlmmnooqqrsuuvvwwyz{{ª|:;>??@BBCDEFJIMMNPQRSSUUVWXZ[[\^^_`aacddeejlmmnnoqqrssuvvwyyzz{{:;=>??BBCDEFJJIMNPQRSSëUVWXZ[[\^^_``aacddejllnôoqrrsuuvwwyzzÛ{9:;==>@@BCDEFFIIMNPQRRSSUVWXZZ[\\^_``côdejjlmmnnoqrrsýuvwwzÊ89:;==?@BCDEFFJIIMPQQRRSSUWXXZ[[\^^_``aacdeejjlmmnoqqrrãsuuvwwyy78:;;=??@BCDEEFJIMNPQQáRSUVWXXZZ[\^^__`aacdeejllmmnooqqÃrsuuvvwy379::;>>?@BCDDFFJIMNPPQQRSUVWWXZZ[\\^^_``acddejjllmnooqärssuuvw23899:==>?@BCCDEFJIMNNáPQRSUVVWWXZ[[\\^__`accdeejjlmmnnÃoqrrssuv327889;;=>?@BBDDEFJIMMNNPQRSUUVWWXZZ[[\^^_`aacddeejlmmnÄoqqrrsu323788::;=>?@BCCDEFJIIMMNPQRSSUVVWXZZ[\\^^_`aaccdeejllmänoqqrss032378::;=>?@@BCDEFJIIëMNPQRSSUUVWXXZZ[\\^_``cûdejjllæmnooqqrs032337889:;=>??@CDDõFJIIMNPQRRSSúUVWWX[[ô\^__`aaccdejjlýmnoorï/03233889:;=>>?@CCõDEJJIIMPQQRRêSUVVWWZZ[\^^__`aacdeejjÛlmmnooqq//32237789:;==>?BCBCEFFJIMNPQQRëSUVVWXZZ[\^^_``aacddeeÛjlmmnnoq./033233789:;==>@B@BDEFFJIMNPPQìRSUUVWXXZ[\\^__``acddeÜjllmmno+./003223789::;=?@?@CDDEFJIMNNPëQRSSUVWWXZ[[\^^__`aaccõdejjllmn*+//è03323789::;>?>?BCDDEFJIMMNìPQRRSUVVWXZZ[\\^^_`aacõdeejjlm*+.//ô033278899;=>>ß@BCCDEFJIIMMNNPQRRUUVVWXZZ[[\^^_``aècdeejll**+.//003237889:==ö>@BBCDEFJIIMýNPQQúSUUVWXX[û\^__``Ùacddeejl&)**++//032337889:;=>?@@BCDEFFIIåMNPPQRRSSUVWWXXZ[\\^^_``acddeù&)**++//Ì03233889:;=>>?@BCDEFFJJIMNNPPQRRSUVVWXXZZ[\\^__`aacddûe%&)**þ.//€½32237789:;==??@BCDEEFJJIMNNPQQRRSUUVWWXZZ[\\^^_`aaccdd$%&)**+../033233789:;=>>?@BCDDEFFJIMMNPPQQRSUUVVWXXZ[[\^^_``aacc#$%&))*++./003223789::==>?@BCCDEEFJIIMNNPPQRRSUUVWWXZZ[[\^__``aa"#$%&&**þ+//Æ03323789:;;=>?@BBCDDEFJJIMMNNPQRRSSUVVWXXZ[[\^^__`` "#$%&**ý+.//Ð03327889::;=>?@BCCDDEFJJIIMNNPQQRSSUVVWWXZZ[\^^__ø "#$%%)**æ+.//00323788::;=>?@@BCCDEFFIãMNPPQRRSSUVWWXXZ[\\^^__ "#$%%â&)**++//032337789:;==>??@BCDEFFôJIMMNNPQQRSUUWûXZ[[\\ñ "#$$%&)**++//Å032337789:;==??@BCDEEFFJJIMMNPPQRRSUUVVWXZZ[[\\""$$%&)**þ.//Ô32233778:;;=>>?@BCDDEEFJJIMMNNPQRRSSUVVWXZZ[[Ü ##$%&)**+../033223379::;==>?@BCDDêEFFJIIMNNPQQRRSUUVWXXZZÅ""#$%&))*++./0033223899:;;=>?@BBCCDEEFJJIIMNPPQQRSSUVWWXXö "#$%&&**þ+//03ó27889::;=>?@BBêCDDEFFJIIMNNPPQRRSUVVWWô "#$%&**ý+.//0Û3237889::;>??@@BBCDDEEFJJIMNNPQQRRSUVVþWø "#$%%)**ý+.//0Ý3237899:;=>??@@BBCDEEFFJIMMNNPQQRSUUVò "#$%%&)**++//ò032337889:;;=>>ú?@BBCEEòFJIIMPPQQRSUUSS÷‡‰ŒŽ‘”——ö™œŸžŸ¡¤¦§©©õ¬®¯±´¶¶··¹¼¼½þ¾¿¿ùÀÁÁÂÃÃÄÄøÅÆÆÇÈÈÉÊÊö†‡ŒŽŽ”–——þœžžíŸ¡¤¦§§©©¬®¯±´´··¹¹¼¼ü½¾¾¿¿ùÀÁÁÂÂÃÄÄøÅÆÆÇÈÉÉÊÊû†‡‰ŒŽŽþ‘––è—™žœžŸ¡¤¦¦§§©¬®¯±±´¶¶·¹¼¼ú½¾¾¿¿ÀÀÂþÃÄÄÅÆýÇÈÉÉöÊ„†‡‰ŒŒŽ””ý–™œœìžŸ¡¤¦¦§§©¬®¯±±´¶¶·¹¼¼½þ¾¿¿ùÀÁÁÂÂÃÄÄîÅÆÇÇÈÈÉÉ„‡‰‰ŒŒ‘””þ—™™úœžŸ¡¤¦¦ó§©¬®¯±´´¶¶·¹¼¼ü½¾¾¿¿ùÀÁÁÂÃÃÄÄûÅÆÇÇÈÈ÷„†‡‰‰ŒŽ‘‘ý”–™™éœžŸ¡¤¤¦¦§©¬®¯¯±´´¶··¹¹¼¼ý½¾¿¿ÀÁýÂÃÄÄÅþÆÇÇúÈ„†‡‰‰àŽ‘‘”–™—™™œŸ¡¡¤¤¦¦§¬®®¯±±´¶¶·¹¹¼¼ü½¾¾¿¿ÀûÁÂÃÃÄÄýÅÆÇÇöÈ~„††‡‰ŽŽÜ‘––——™žŸŸ¡¡¤¤¦©¬¬®¯¯±´´¶··¹¹¼¼½½¾¾¿¿ùÀÁÁÂÃÃÄÄÅúÆ~„††ù‰ŒŽŽ‘––ç—™œžŸŸ¡¡¤¦§©¬¬¯¯±±´¶¶·¹¹¼¼þ½¾¾¿ùÀÁÁÂÃÃÄÄÅë{~„„†‡ŒŽŒŽ‘””–—™œžŸŸé¡¤¦§©¬¬®®¯±´´¶¶·¹¹¼¼½½¾¾¿ùÀÁÁÂÂÃÄÄÅö{~„„‡‰ŒŒí‘””–—™œžžŸŸ¡¤¦§©©®®ô¯±´´¶··¹¹¼¼½½¾¿ÀÂþÃÄÄ÷z{~„†‰‰àŒŽ‘‘””–—™œžžŸŸ¡¤¦§©¬¬®®¯±´´¶¶·¹¼¼½þ¾¿¿ùÀÁÁÂÂÃÄÄÔwz{~„‡‰‡‰Ž‘‘”–—™œœžžŸ¡¤¦§§©¬¬®¯¯±±´¶¶·¹¼¼ü½¾¾¿¿ùÀÁÁÂÃÃÄÄûwz{~ù„†‡‡‰Œú‘”–—™œœëžŸ¡¤¦§©©¬¬®¯±±´´¶··¹¼¼ý½¾¿¿ÀÁýÂÃÄÄövw{~~„†‡‡ßŒŽ‘”–—™™œœžŸ¡¤¦¦§©©¬®¯¯±´´¶¶·¹¼¼ü½¾¾¿¿ÀûÁÂÃÃÄÄévwz{{~~†‡‡‰ŽŽ‘”–——œœâžŸ¡¡¤¦¦§§©¬¬®¯¯±´´¶··¹¹¼¼½½¾¾¿¿ÈÀÁÂÂÃÂÂsvwz{{~~„†‡‡ŒŽ‘”–——™™œžŸŸ¡¡¤¦¦§©¬¬®¯¯±±´¶¶·¹¹¼¼ü½¾¾¿¿üÀÁÁÂÂÈrswzz{{~„†‡‡ŒŒŽ‘”––—™™œžŸŸ¡¤¤¦§§©¬¬®®¯±´´¶¶·¹¹¼¼½½¾¾¿¿ÖÀÁÁÂÁÂorvwwz{{~„††‰‰ŒŽ‘””–——™œžžŸ¡¤¤¦§©©®ô¯±´´¶··¹¹¼¼½½¾¿ÀÁánosvvwz{{~„†‡‡‰ŒŽ‘‘”––—™œœž¡¡î¤¦§§©¬¬®®¯±´´¶¶·¹¼¼½þ¾¿¿ÀÌknrssvzz{~„„††‡‰ŒŽ‘””–—™™œŸŸ¡¤¤¦§§©¬¬®¯¯±±´¶¶·¹¼¼ý½¾¿¿ñÀknorsswwz{~„„Û†‡‰ŒŽ‘‘””–—™™žŸŸ¡¤¦¦§©©¬¬®¯±±´´¶··¹¼¼ý½¾¿¿äjknorswwz{~„„†‡‰ŒŽŽ‘‘”–——枟Ÿ¡¤¤¦¦§©©¬®¯¯±´´¶¶·¹¼¼¹¼¼þ½¾¾¿ãjknorsvvwz{~„„†‡‰ŒŽŽ‘”–—™™œûžŸŸ¡§§ë©¬®®¯±±´´¶·¹¹·¹¹¼¼½½¾¾Æjknorrsvwz{~„„†‰ŒŒŽŽ‘–——™—™™œžŸŸ¡¦¦§©¬¬®®¯±±´¶··¹··¹¼¼½¾ëgjknoossvwz{~~„†‡‰ŒŒúŽ‘”–——ꙜœžŸŸ¤¦¦§©¬¬®¯¯±±´¶¶··¹¼½ãfgjknorrsvwz{{„†‡‰‰ŒŒŽ‘”––—ý™œžžñ¡¤¤¦§©©¬®®¯¯±´¶¶ý·¹¼¼½ëcfgjkkoorsvwzz{~„†‡‡ø‰ŒŽ‘””––å—™œœžŸ¡¡¤¦§§©¬¬®®¯±±´´¶¶·¹¼¼Ãbcfgjknnorsvww{{~„††‡‡‰ŒŽ‘‘””–——™œœžŸŸ¡¤¦¦§©©¬¬®¯±±´´¶¶·¹¼¼«_bfggjkknorsvwzz{~„„††‡‰ŒŽ‘””–—™™œžžŸŸ¡¤¦¦§§©¬¬®¯¯±´´¶··¹¹¼¼_bcfggkknorsvvwz{~„„놇‰ŒŽ‘””–——™™œžžŸ¡¤¤§ô©¬®®¯±±´¶¶·¹¹Û¼^_bccfjjknorsswwz{~„„†‡‰ŒŽŽ‘‘”–——œôžŸ¡¡¤¦¦§§©¬®®¯ý±´¶¶¹Ê[^_bccgjknorssvwwz~„„†‰ŒŒŽ‘””–——™™œžŸŸ¡¡¤¦¦§©¬¬®®ã¯±±´¶¶··Z[_bbcggjknorrsvwz{~ᄆ‡‰ŒŒŽŽ‘””––—™™œžŸŸ¡¤¤¦¦§©©¬¬Ã®¯±±´´¶·WZ^__bffgjknoossvwz{~~„†‡‰‰ŒŽŽ‘‘””–——™œžžŸ¡¡¤¤¦§©©¬ä®¯¯±±´¶VW[^^_ccfgjknnorsvwz{{á~„†‡‡‰‰ŒŽ‘‘”––—™œœžŸŸ¡¡¤¦¦§§Ã©¬®®¯¯±´SVZ[[^bbcfgjkkoorsvwzz{{~„††‡‰‰ŒŽŽ‘””–—™™œžžŸŸ¡¤¦¦§Ä©¬¬®®¯±SVWZ[[__bcfgjknnorsvwwzz{~„„†‡‡‰ŒŽŽ‘‘””–—™™œœžŸŸ¡¤¤¦ä§©¬¬®¯¯RSVWZ[__bcfgjjknorsvwwëz{~„„††‡‰ŒŒŽŽ‘‘”–——œûžŸ¡¡¤¤æ¦§©©¬¬®¯RSVWWZ[[^_bcfggjnooõsvwwz{~„„ú†‡‰‰Œô‘”––—™™œœžŸ¡¡¤ý¦§©©®ïORSVWW[[^_bcffgjnnõorvvwwz~ꄆ‡‡‰‰ŽŽ‘””––—™™œžŸŸ¡¡Û¤¦¦§©©¬¬NOSVVWZZ[^_bccfgknknrssvwz{~넆‡‡‰ŒŽŽ‘””–——™™œžžŸŸÛ¡¤¦¦§§©¬KNRSSVWWZ[^_bccfjkjkorssvwz{~~섆†‡‰ŒŒŽ‘‘”––——™œžžŸÜ¡¤¤¦¦§©JKORRSVVWZ[^__bcgjgjnoorsvwz{{~ë„„†‡‰‰ŒŽ‘””––—™™œœÛžŸ¡¡¤¤¦§GJNOORSSVWZ[^__bfgfgknoorsvwzz{ì~„†‡‡‰ŒŽŽ‘‘””–—™™œçžŸŸ¡¡¤¦GJKNOORSSVZ[[^^bcffßjknnorsvwwzz{{~††‡‡‰ŒŽŽ‘””–——™èœžŸŸ¡¤¤FGJKNORRSVWZ[[^_ccöfjkknorsvwwzý{~ú„††‡‰ŒŒû‘”––——Ù™œžžŸŸ¡¤BCFGJJNORSVWWZ[[^_bcfgjjknorsswwåz{~~„„†‡‰‰ŒŒŽ‘‘””–——™œžžŸÃBCFGJJNNORSVWW[[^_bcffgjknorssvvwz{{~~„†‡‡‰ŒŒŽŽ‘‘”––—™™œžž€?Ÿ?BCFGGKNNOSVVWZZ[^_bccggjknorrsvvwz{{~„††‡‰‰ŒŽŽ‘‘””–—™™œœžž=?BCFFJKKNRSSVWWZ[^_bcffgjknoorssvwzz{~~„††‡‡‰ŒŒŽ‘””–——™™œœ;=?BCCGJJKORRSVVWZ[^__ccfgjknnorrsvwwz{{~~„††‡‰‰ŒŽŽ‘”––——™™9;=?BBFGGJNOORSSVWZ[^_bbcfgjkknoorsvvwzz{{~„„†‡‡‰ŒŒŽ‘””––——79;=?BFFGJKNOORSSVZ[[^__bcfgjknnoorsvvwwz{{~„„†‡‡‰‰ŒŽŽ‘””––Ü79;=??CFFGJKNORRSVWZ[[__bcfgjjknnorsswãz{~~„„†‡‰‰ŒŒŽ‘‘””––579;=??âBCFGJJNORSVWWZZ[^_bccfggjknorssôvwzz{{~„††‰ûŒŽ‘‘‚3579;==?BCFGJJNNORSVWWZZ[^_bccggjknorrssvvwzz{~~„††‡‡‰ŒŽŽ‘‘113599==?BCFGGKNNOSVVWWZZ[_bbcffgjknoorrsvvwzz{{~„„†‡‡‰ŒŽŽ/Ü1357;;=?BCFFJKKNRSSVVWWZ^__bccfgjknooêrssvwwz{{~„††‡‰ŒŒŽŽ/Å13399;=?BCCGJJKORRSSVVW[^^_bbcfgjkknnorrsvvwwz{~~„„†‡‰‰ŒŒ/1ß3779;=?BBFGGJNOORRSSVZ[[^__bcfgjkkênoorssvwwz{{~~„†‡‡‰‰/Æ1335579;=?BFFGJKNOORRSVWZ[[^__bfggjjkknoorrsvvwz{{~„†‡‡þ‰1135Ì79;=??CFFGJKNOORRSVWZ[^^_bcfggjjkknorrssvwzz{{~„††‡13â579;=??BCFGJJNNORSVWWZ[[^_bbcffúgjkknrròsvwwz~~„††„„ÿúØ ""#%%&''((+--02277:<<>AACCEGHHIIJKKMPûô !!"#%%&&ã'(++--2257::<<>>ACEEGGHHIIJJKKMüõ !!"##%%&ý'(++ú02257::<ó>AACEEGGHHIIJJKMúã !""##%%&'((++002577::<ú>ACCEGGHIJKûä !!""#%%&''((-0025577:ý<>AAúCEEGGHHIJIúûÝ !!"!""#%&&'(++-02252557::<<>AACCEEGHóá !! !!"#%%''((+-00-002577:<<>ACEHúûô !!""#%&&ú'(++-00257:<>ACEòè !!"#%%&%%&'((++-00þ2557þ:<<>þACCüá !!"##%#%%&'((+--0257:<>ACùûé !"##"##%&''(++-0257:<>Aüýýó !!"!""#%&&'((+-0257:<>ýôó !! !!"#%%&''(+-0257:<ó üû  !û"#%%&&þ'((+þ-002þ577:û ûûõ  !"##&'(+-0257ð: þ !"#%&'(+-025û úþþ !þ"##%&'(+-025ú ñö !!""#%&'(+-02 ý  ýú !þ"##%þ&''(þ+--0ù  úþ !"#%&'(+-ú  ñ þþ !!"þ#%%&þ'((+û   ú ú !"#%&'(ý   õ  !"#%&'(ñ ø !"#%&'û    þ þ !"#%&'ø  þ    !"#%&ù  ú þþ  !þ"##%ó   ø !"#ô     þþþ !!"ûþþ    ú !ùú   !üú        þ ýþ    þù     þþþþýþ     ù    þþþþ ú     î    ú     þ    þ    þþ   þ þþ    þþ þ   þþ                        !    #   &  '  * +.þ027:<?úŠ‹ŒŒüŽ’÷“””•––——˜˜ü™šš››œžŸ ¡þ¢££þ¤¥¥©ª©ûŠŠ‹ŒŒýŽ‘û’“””••ý–—˜˜š›œþžŸŸ ¡¢£¤¥üŒŠ‹‹ŒýŽ‘ü’““””•ý–—˜˜þ™šš›œþžŸŸ ¡¢£¤ú‹ŒŠŠ‹‹ùŒŽŽî‘’’““””•–——˜˜™™šš››œžŸ ¡¢£û‹ŒŒŠŠ‹ùŒŽŽ‘’ô“””•––——˜™™šš›þœþžŸŸ ¡¢¡úŠ‹ŒŠŠû‹ŒŒŽŽ‘õ’‘’’“”••–—˜˜þ™šš›œžŸ óŠ‹ŒŒŠŠ‹‹ŒŽŽþ‘‘î’“””––——˜˜™™˜™™šš››œžŸ úˆ‰Š‹‹ŒŒûŠŠ‹ŒŒýŽ‘’ý“”••ý–—˜˜™š›œžŸòˆ‰ŠŠ‹‹ŒŒŠ‹‹ŒŒûŽ‘ô’“””•””•–——˜˜™š›œžˆü‰ŠŠ‹‹òŒŠŠ‹‹ŒŒŽ‘ô’““”“””•–——˜˜™š›œžù‡ˆ‰‰ŠŠ‹‹ûŒŠŠ‹‹ùŒŽŽó‘’““’““”•––—˜˜™š›œü†‡ˆ‰‰Š‹ýŒŠŠ‹ýŒŽŽ‘ö’‘’’“”••–——˜™š›œ†ý‡ˆ‰‰Šô‹ŒŒŠŠ‹‹ŒŽŽ‘÷‘‘’“””•––—˜™š›œó…†‡‡ˆˆ‰‰ŠŠ‹ŒŠü‹ŒŒüŽ‘û’“””••þ–——˜™š›û…††‡ˆˆ‰ûŠ‹ŒŒûŠ‹‹ŒýŽý‘’““•–—˜™š›þ„……†‡ˆû‰ŠŠ‹ŒŒŠþ‹ŒŒŽ‘’“”•–—˜™šþ„……†‡úˆ‰ŠŠ‹ŒŒŠþ‹ŒŒþŽŽ‘þ’““”•–—˜™šýƒ„……†ñ‡ˆˆ‰ŠŠ‹‹ŒŒŠŠ‹‹ŒüŽ‘’“”•–—˜™šƒþ„……†ý‡ˆ‰‰úŠ‹‹ŒŒŠ‹ŒŽ‘þ’““”þ•––—˜™û‚ƒ„„……ú†‡ˆˆ‰ŠŠ‹ŒþŠŠ‹ŒŽ‘’“”•–—˜ú‚ƒ„„……†ô‡ˆˆ‰‰ŠŠ‹‹ŒŒþŠ‹‹ŒŽ‘’þ“””•þ–——˜û‚‚ƒ„„…û†‡‡ˆ‰‰Š‹úŒŠŠ‹‹ŒŽ‘’“”•–—ý‚ƒ„„…†‡úˆ‰‰ŠŠ‹‹ŒŠ‹ŒŽ‘’“”•–—õ€€‚‚ƒƒ„„……†‡ˆø‰‹‹ŒŒŠŠ‹ŒŽ‘’“”•–û€‚ƒƒ„…†‡ˆ‹ŒŠ‹ŒþŽŽ‘’“”•–ø~€€‚ƒƒþ„……†‡ˆŠ‹ŒŠ‹ŒŽ‘’“”•ù}~€€‚‚ƒ„…†‡‰Š‹ŒŠ‹ŒþŽŽ‘þ’““”}ó~€€‚‚ƒƒ„„……†ø‡ˆˆ‰‰ŠŠ‹‹ŒŠ‹ŒŽ‘’“ô|}~~€‚‚ƒƒ„…†‡ˆ‰Š‹ŒŠþ‹ŒŒþŽ‘’|û}~€€þ‚‚þƒ„„…ú†‡‡ˆˆ‰‰Š‹ŒŠ‹ŒŽ‘ù{|}~~€€‚üƒ„„……†‡ˆ‰Š‹ŒŠ‹ŒŽ‘úz{|}}~~€ú‚ƒƒ„„……†‡ˆ‰Š‹ŒŠ‹ŒŽùz{||}}~~€‚ƒ„…†‡þˆ‰‰Š‹ŒŠ‹ŒŽúyz{||}}~ý€‚‚þƒ„„…†‡ˆ‰Š‹ŒŠ‹ŒŽúwyz{{||þ}~~ù€‚‚ƒƒ„…†‡þˆ‰‰Šþ‹ŒŒþŠ‹‹ŒþŽŽúvwyzz{{|}ý~€€þ‚‚ƒ„…†‡ˆ‰Š‹ŒŠ‹ŒŽúuvwyyzzþ{||ù}~€€‚ƒ„…þ†‡‡ˆþ‰ŠŠ‹þŒŠþ‹ŒŒuývwyyz{|~€ú‚‚ƒƒ„„…†‡ˆ‰Š‹ŒŠ‹Œüsuvwwyz{î|}}~~€€‚‚ƒƒ„„……†‡ˆ‰Š‹ŒŠ‹Œôrsuvvwvwwyz{{ú|}}~~€‚ƒ„…†‡ˆ‰Š‹ŒŠûrsuuvvñwyyz{{||}}~~€€‚þƒ„„…†‡ˆ‰Š‹ŒŠðqrsuuvuuvwyyzz{||þ}~~€‚ƒ„…†‡ˆ‰Šþ‹ŒŒìoqrssusuuvwwyyz{{||}}~€‚þƒ„„…†‡þˆ‰‰þŠ‹‹Œðnoqrrsrrsuvvwwyzzþ{||}~€‚ƒ„…†‡ˆþ‰ŠŠ‹ìmnoqqrqrrsuuvvwyyzz{{|}~€þ‚‚ƒþ„……þ†‡‡þˆ‰‰Šmónoqqoqqrsuuvwwyzú{||}}~~€‚ƒ„…†‡ˆ‰ülmnooéqrssuuvvwwyyzz{{||}}~~€‚ƒ„…†‡ˆ‰jólmnnooqqrrssuuvwúyzz{{||}~€‚ƒ„…†‡ˆùejlmmnooqrþsuuþvwwyz{|}~€‚ƒ„…†‡ˆeûjllmnnoqþrssuvþwyyþz{{|}~€‚ƒ„…†‡dûejllmmþnooþqrrsuúvwwyyzz{|}~€‚ƒ„…†cûdeejllmnþoqqrsþuvvþwyyz{|}~€‚ƒ„…aûcdeejjþlmmþnooqrúsuuvvwwyz{|}~€‚ƒ„…ñ`aacddeejjllmmnnþoqqþrssuvúwyyzz{{|}~€‚ƒ„ù_`accdeejlþmnnoqrsuvwyz{|}~€‚ƒ„ù^_``aaccûdejjllmnoqrsúuvvwwyyz{|}~€ƒ^ü_``aaùcdeejjllmnþoqqþrssuvwyz{|}~€‚û\^^_``aûcdeejjlmþnooqrþsuuþvwwyþz{{|þ}~~€û[\\^__`ûacddeeþjllþmnnoqúrssuuvvwyz{|}~€ûZ[[\^^_û`accddejþlmmnoþqrrþsuuvþwyyzþ{||}~ûXZZ[\\^û_`aaccþdeeþjllmnúoqqrrssuvwyz{|}óWXZZ[[\\^^_`aacdejþlmmþnooqrsuvwyz{|WýXZ[[\ý^_``acdþejjlmnoqrsuvwyz{|óSUVWWXZZ[\\^__`acejlömllmmnnooqqrsöussuuvvwwyyzúÊËÌÍÍÎÎüÏÐÐÑÑÓÔúÕÖÖ××ÖÖÕÔÓÒÓÔþÕÖÖØ×Ù×ûÊËËÌÍÍÎýÏÐÑÑÒþÓÔÔÕýÖ×ÖÖÕÔÓÒÓÔÕÖØÊþËÌÌÍÎýÏÐÑÑÒþÓÔÔÕýÖ×ÖÖÕÔÓÒÓÔÕÖúÉÊÊËËÌÌùÍÎÏÏÐÐÑÑüÒÓÓÔÔùÕÖ××ÖÖÕÕÔÓÒÓÔÕÖþÉÊÊËÌùÍÎÏÏÐÐÑÑÒÓÔùÕÖÖ××ÖÕÕÔÓÒÓÔÕÔýÈÉÊÊËûÌÍÍÎÏÏÐÑÒõÓÒÓÓÔÔÕÕÖ×ÖÖÕýÔÕÔÔÓ ÒÓýÈÉÊÊËÌýÍÎÏÏþÐÑÑÒÑÒþÓÔÔÖ×ÖÕþÖÕÕÔÓ ÒÓúÆÇÈÉÉÊÊËþÌÍÍÎýÏÐÑÑÒÓÔÕýÖ×ÖÖÕÔÓÒùÆÇÈÈÉÉÊÊüËÌÌÍÍûÎÏÐÐÑÑÒþÓÔÔøÕÔÔÕÖ××ÖÖÕÔÓÒÆüÇÈÈÉÉÊËÌÍÎüÏÐÐÑÑÒþÓÔÔûÕÖ××ÖÖÕÔÓÒùÅÆÇÇÈÈÉÉÊËÌùÍÎÏÏÐÐÑÑúÒÓÔÔÓÔÔûÕÖÖ×ÖÖÕÔÓÒüÄÅÆÇÇÈÉÊËÌýÍÎÏÏÐÑÒöÓÒÓÓÔÔÕÕÖ××ÖÕÔÓÄýÅÆÇÇÈþÉÊÊËÌýÍÎÏÏÐÑÒûÑÒÒÓÔÔþÕÖÖ×ÖÕÔÓÄÅÆÇÈþÉÊÊËüÌÍÍÎÎüÏÐÐÑÑÒþÓÔÔÕþÖ××ÖÕÔÓÄþÅÆÆÇýÈÉÊÊûËÌÌÍÎÎýÏÐÑÑýÒÓÔÔÕÖ×ÖÕÔýÓÃÄÄÅÆûÇÈÈÉÊÊËþÌÍÍÎÏÑÒÓÔÕÖ×ÖÕÔþÃÄÄÅúÆÇÈÈÉÊÊËþÌÍÍþÎÏÏÑÒþÓÔÔÕÖ×ÖÕÔýÂÃÄÄ÷ÅÆÆÇÈÈÉÉÊÊËÌÍÎüÏÐÐÑÑÒÓÔÕÖ×ÖÕÂþÃÄÄýÅÆÇÇüÈÉÉÊÊËÌÍÎÏÐÑÒþÓÔÔþÕÖÖ×ÖÕûÁÂÃÃÄÄûÅÆÆÇÈÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ÖúÀÁÂÃÃÄÄöÅÆÆÇÇÈÈÉÉÊÊþËÌÌÍÎÏÐÑÒÓÔÕþÖ××ÖûÀÁÁÂÃÃÄÅþÆÇÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ÀýÁÂÃÃÄÅúÆÇÇÈÈÉÉÊËÌÍÎÏÐÑÒÓÔÕÖ׿øÀÁÁÂÂÃÃÄÄÅÆüÇÉÉÊÊËÌÍÎÏÐÑÒÓÔÕÖ¿ÀþÁÂÂÃÄÅÆÉÊËÌÍþÎÏÏÐÑÒÓÔÕÖþ¾¿¿ÀþÁÂÂþÃÄÄÅÆÈÉÊËÌÍÎÏÐÑÒÓÔÕý½¾¿¿þÀÁÁÂÃÄÅÇÈÉÊËÌÍþÎÏÏÐÑÒþÓÔÔ½þ¾¿¿ÀÁÂÃÄøÅÆÆÇÇÈÈÉÉÊËÌÍÎÏÐÑÒÓÔû¼½¾¾¿¿ÀÁÂÃÄÅÆÇÈÉÊËþÌÍÍÎþÏÐÐÑÒÓ¼ý½¾¿¿þÀÁÁþÂÃÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒ¼ü½¾¾¿¿ÀÁüÂÃÃÄÄÅÆÇÈÉÊËÌÍÎÏÐÑÒú¹¼¼½½¾¾¿ÀúÁÂÂÃÃÄÄÅÆÇÈÉÊËÌÍÎÏÐÑþ¹¼¼½¾¿ÁÂÃÄÅþÆÇÇÈÉÊËÌÍÎÏÐÑý·¹¼¼½¾¿þÀÁÁþÂÃÃÄÅÆÇÈÉÊËÌÍÎÏÐÑü¶·¹¼¼þ½¾¾¿ÀÁÂÃÄÅþÆÇÇÈþÉÊÊþËÌÌÍþÎÏÏÐú´¶·¹¹¼¼½þ¾¿¿þÀÁÁÂÃÄÅÆÇÈÉÊËÌÍÎÏú±´¶··¹¹¼ý½¾¿¿ÀÁÂÃÄÅÆþÇÈÈÉÊËþÌÍÍαý´¶··¹¼¾¿úÀÁÁÂÂÃÃÄÅÆÇÈÉÊËÌÍü¯±´¶¶·¹¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍô®¯±´´¶´¶¶·¹¼¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËû®¯±±´´û¶··¹¼¼½¾¿ÀÁþÂÃÃÄÅÆÇÈÉÊËñ¬®¯±±´±±´¶··¹¹¼¼þ½¾¾¿ÀÁÂÃÄÅÆÇÈþÉÊÊ𩬮¯¯±¯±±´¶¶··¹¼¼½¾¿ÀÁþÂÃÃÄÅþÆÇÇþÈÉÉÊ𧩬®®¯®®¯±´´¶¶·¹¹¼½¾¿ÀÁÂÃÄÅÆþÇÈÈÉ즧©¬¬®¬®®¯±±´´¶··¹¹¼¼½¾¿þÀÁÁÂþÃÄÄÅþÆÇÇȦ󧩬¬©¬¬®¯±±´¶¶·¹¼½¾¿ÀÁÂÃÄÅÆÇü¤¦§©©ñ¬®¯¯±±´´¶¶··¹¹¼¼½¾¿ÀÁÂÃÄÅÆÇ¡ó¤¦§§©©¬¬®®¯¯±±´¶ü·¹¹¼¼½¾¿ÀÁÂÃÄÅÆùŸ¡¤¦¦§©©¬®þ¯±±þ´¶¶·¹¼½¾¿ÀÁÂÃÄÅÆŸû¡¤¤¦§§©¬þ®¯¯±´þ¶··þ¹¼¼½¾¿ÀÁÂÃÄÅžûŸ¡¤¤¦¦þ§©©þ¬®®¯±ú´¶¶··¹¹¼½¾¿ÀÁÂÃÄœûžŸŸ¡¤¤¦§þ©¬¬®¯þ±´´þ¶··¹¼½¾¿ÀÁÂÃÄ™ûœžŸŸ¡¡þ¤¦¦þ§©©¬®ú¯±±´´¶¶·¹¼½¾¿ÀÁÂÃÄñ—™™œžžŸŸ¡¡¤¤¦¦§§þ©¬¬þ®¯¯±´ú¶··¹¹¼¼½¾¿ÀÁÂÃù–—™œœžŸŸ¡¤þ¦§§©¬®¯±´¶·¹¼½¾¿ÀÁÂÃù”–——™™œœûžŸ¡¡¤¤¦§©¬®¯ú±´´¶¶··¹¼½¾¿À”ü–——™™ùœžŸŸ¡¡¤¤¦§þ©¬¬þ®¯¯±´¶·¹¼½¾ ¿Áû‘””–——™ûœžŸŸ¡¡¤¦þ§©©¬®þ¯±±þ´¶¶·þ¹¼¼þ½¾¾¿Àû‘‘”––—û™œžžŸŸþ¡¤¤þ¦§§©¬ú®¯¯±±´´¶·¹¼½¾¿ûŽ‘””–û—™œœžžŸ¡þ¤¦¦§©þ¬®®þ¯±±´þ¶··¹¼½¾ûŒŽŽ‘‘”û–—™™œœþžŸŸþ¡¤¤¦§ú©¬¬®®¯¯±´¶·¹¼½ó‰ŒŽŽ‘‘””–—™™œžŸ¡þ¤¦¦þ§©©¬®¯±´¶·¹ ¼‰ýŒŽ‘ý”–——™œžþŸ¡¡¤¦§©¬®¯±´¶·¹¼ó„†‡‰‰ŒŽŽ‘‘”––—™œŸ¡¤ö¦¤¤¦¦§§©©¬¬®¯ö±¯¯±±´´¶¶··¹ÿ-PMKùEIGA>MMPMKJøIEHGGAMMPMPMKJþIGGûCG<KKMKJIøEHC2E%HHIJKMKMKJIH÷G:I<0G%EEGHþIHHI JKJIHôGECC>-<%CCEGH IJIHòGEECAAE0:-++AACEGHþIHHIHGòECCA>>E+:2&+>>ACEGHGHGEòCAA><<>+<7'!<<>ACEGEGECðA>><::72<2+ ::<<>A>ACEGCECA>ô<::72:5&(::<>ACECþECCAð><::772A0 &5577:<>Aþ>AA CA>ó<:7527:�557:<>A>A><ò:75227%#+22557:<><> A><:ò7520(5"%"002257:<:< ><:î7:77520-'2"&--00257:7: <:75ò20-+&-"&++--025757 :75ó25220-+(%(##þ(++-025 7520ø+(("##(+-02525 7520÷-+('! "'(+-0 2520-÷+'&%"#!#'(+-020-ü+('%%ü &'(+- 020-+ü('&##ý%&'(+ -0-+(÷'&#"!! #%&'( +-+(&ø#"! !"#%&' (+('%÷#"!"þ!""#%& '('&#ø"! !"#%& '('&ô%##""! !"#% &%&þ%##ü"#!  ú !"#% &%#ú&%%##""÷!  !"# %#ú%##""!!÷  !" #"! ÷ ! "! ö ! þ÷þ ÷ ö þô  ô  þô  þ õþ ö   þ ñ   òþ÷ þ ô  ù þø  þ ø  þ  ú  þ     ÷       ø  þ      ü      ýþ        þùþ  û ü þþþþþ "!©ª©ª©¥¤£ùŸ¡Ÿn¥¥©¥¤£¢ø¡Ÿ ŸŸn¤¤¥þ¤¥¥©¥©¥¤£¢þ¡ŸŸûžŸœe££¤¥¤¥¤£¢¡øŸ žœŸ™[¡¡£¤£¢¡ ø¡šŸ–S  ¢£¤£¤£¢¡ øœ¡šŸ”N  ¡¢£¤£¤£¢¡ ÷Ÿ›¡œ™Ÿ”NŸŸ þ¡  ¡ ¢£¢¡ ŸžøœŸš ‘;ŸŸ ¡ ¡¢¡ Ÿžù›˜œ”/žžŸ  ¡¢¡ ŸùžŸ™›˜˜þžŸ þ¡  ¡ ŸžøŸ˜›š•˜žŸ Ÿ Ÿþžœø˜œ›–‘œœžŸžþœ››÷šœš˜…››œœ žŸžŸžþœ››øš›š•—o››œ žŸžþŸžžþœ››öš™•Xšš››œ žóœ››šš››•“™=šš›œœ›šù›”“˜+šš›œœœ›šõ™—š’”’™™šš ›œ›œ œ›šô™˜–š’•Œ˜˜™™š › œ›šõ™˜˜•˜’•|˜˜™ š›š›šó™˜˜—”—““\—˜˜™š ›š™ó˜——’““>——˜˜™ š ›š™˜ô—–‘’Œ+––——˜™š™˜õ–•”’“‘“––— ˜™š™˜ý—–””ü‚•–— ˜ ™š™˜ü—–•““üŽa”•–—˜™˜—ö–•“’‘‘ŒM“”•–—˜—•÷“’‘‘Œ‹0’“”•– —˜—–”÷“’‘’‹}þ‘’’“”• –—–•“÷’‘Ž‹`‘’“”• –—–•ó”““’’‘Ž‹†Q‘’“” •”•þ”““ü’“‘úŽŒ‘’“” •”“ú•””““’’þ‘ù‹‹{‘’“ ”“ú”““’’‘‘úŽ‹‹M‘’ “’‘ŽùŒŠ‹Š)Ž‘ ’‘õŽŒ‹Š‹‰†Ž ‘þŽŽöŒ‹ŠŒ‰‡eþŒŽŽöŽŒŠ‹ˆ†3ŒŽŽõŒŒŠŒŠ‡…þŠ‹‹ŒŽŽóŒŠŠŠ„ˆƒlŠ‹ŒŽŽŽ󌋊…‡ˆ……/þŠŠ‹ŒŽŽŒô‹ŠŒŠ‡…‹ŠƒþŒŠ‹Œ Œ‹ôŠŒ‹‰ŒˆŒ‚€\þ‹ŒŒŠ‹Œ ‹Šõ‹ŠŠƒŽ†ƒ~„þŠ‹‹ŒŠ ‹ŠñŒŒŒ‹Š‰ˆ…„€†€Š‹Œ ŠŒñ‹ŒŒ‹Š‰ˆ‡‰††€†Nþ‰ŠŠ‹ŒŠŒ‹öЉ‡‡ˆ~Š}yþˆ‰‰Š ‹Œ‹Šò‰ŠŠ‰‰ˆ‡†…‚…wdˆ‰Š‹Š‰ˆö‡†……„„zyþ‡ˆˆ‰Š‰ˆ†…ù„ƒ‚}d þ†‡‡ˆ‰ˆ‡…øƒ‚{{„2 þ…††‡ˆ‡†…ø„ƒ€z{q …†‡†…÷„ƒ€~; …†…„öƒ‚}|~c þ„…… † …„‚ø€}{zn8 ƒ„…„ƒ‚÷€}{zwsq þ‚ƒƒ„…„…„ƒþ‚€÷|ww|y; þ‚‚ƒ„ ƒ‚€~÷€w}~ruwc €‚ƒ ‚€~}÷€y|zqwd0 € ‚þ€~}ù|{uv{Nþ}~~€€~}|÷{w}vqzn/þ|}}~~~|{zøys{oosC|} ~}|zywùsyjnj{|}|{þzwwøvsroze*×Ù×ÙרÖùÒÔÒÒÓ§ØØ×ØÖÕüÔÒÓÒÒþ§ÖÖØþÖØØ×Ø×ØÖÕþÔÒÒýÓŸÖÖØÖØÖÕÔøÒÓÒÓÒÕÔÔ)ÖÕÔÓøÒÔÒÔÒÖ„ÓÓÕÖÕÔÓùÔÓÕÒÔ{ÓÓÔÕÖÕÔÓ÷ÒÓÔÓÕÒÔ{ÒÒÓþÔÓÓÔ ÕÖÕÔÓÒÓúÒÕÓÒbÒÒÓÔÓÔÕÔÓÒùÔÓÖÓÔOÒÒÓ ÔÕÔÓÒýÕÓÖÖþ5ÒÒÓþÔÓÓÔÓÒÓøÒÖÓÕÕÖÓÓÒÓÒÓ ÒÓùÖÓÔÖÒÓÓ'ÒÓøÔÕÓÕÖÄÓ ÓÒÓÒÓ÷ÔÕÓÔÕשÓÓÒÓÔøÕÒÕÑÕŒÔÔ ÓÒþÓÒÒÓÔ÷ÕÔÓÕÔÕcÔÔ ÓÒÓÒÓÔÕÔúÖJÕÕÔÔÓ Ò ÓÔÕø×ÔÓÔÓ!ÕÕÔÓýÔÓÔÔÕÖ÷ÕÓÕÊÖÖÕÕ ÔÓÔÓÔÕÖøÕÖÓÕ¼ÖÖÕ Ô ÓÔýÕÔÕÕÖö×Ô×ÔÔ‘×ÖÖ ÕÔÕóÖ××ÓÔÔÐf××ÖÖ ÕÔÕÔÕÖô×ÖÒÑÓÍJÖÖ××ÖÕÔ ÕÖöÕÔÓÔÒÔ+ÖÖ× ÖÕÖý×ÖÔÔüÑÎÁÕÖ× ÖÕÖü×ÖÕÔÔüÎÏ™ÔÕÖ×ÖÕÖ×öÖÕÔÓÒÒÍÑzÔÕÖ×Ö×Õ÷ÔÓÒÑÒÍÌRÓÔÕÖ ×Ö×ÖÔøÓÒÑÑÓ̽þÒÓÓÔÕ Ö×ÖÕÔ÷ÓÒÑÐÐÏÉ—ÒÓÔÕ Ö×ÖÕÔÓøÒÑÐÏÉÄÑÒÓ Ô ÕÔÕÔüÓÔÒÑÑúÏÍÎÎ/ÑÒÓ Ô ÕÔþÕÔÔÓþÒÑÑùÐÎÌ̼ÑÒÓÔÓÒÑÐúÏÌÊÌzÐÑÒÓ ÔÓÒÑÏùÎÍËÉËCÏÐÑÒ ÓÒÑÐõÑÏÎÍÌËÉÇÄ#ÎÏÐ Ñ ÒÑþÐÏÏöÐÎÍÌËÊÇÅŸþÍÎÎÏÐÑÐÏÎöÏÍËÊÊÉÆÄWÍÎÏÐÑÐÏÎõÍÎÍËÊÊÈÅÄ!þËÌÌÍÎÏÐÏóÎÍËËÊËÑÊÃÆÂ¤ËÌÍÎÏÐÏÐÏÎóÍÌËÊÊÄÅÊÆÄÄNþÊËËÌÍÎÏÎÏÎÍôÌËÊÊËÅÄÌÈÀÂÊËÌÍ ÎÍÌôËÊÊÉÇÍÆÊÁ¿‘þÉÊÊËÌÍ ÌËÊõÉÈÈÂÏľÃ5þÈÉÉÊË ÌËÊõÉÈÇÆÄÊÿĿÈÉ Ê ËÊñÉÊÊÉÈÇÆÅÇÄÄ¿Ä{þÇÈÈÉ ÊË ÊÉöÈÇÅÅÆ¾È½·þÆÇÇÈ ÉÊÉÈòÇÈÈÇÇÆÅÄÄÁĶžÆÇÈÉÈÇÆþÅÄÄÃü¹·3þÅÆÆÇÈÇÆÄùÃÂÀÁ½ž þÄÅÅÆÇÆÅÄøÂÁÀ¼¼ÃV ÄÅÆÅÄøÃÂÀ¿¹¼¬ ÄÅ Ä÷ÃÂÀ¿¿À¾b #ÄÃöÂÁÀ¿½¼¾œ þÃÄÄÃÁ¿ú½¼¹§[ ÂÃÄÃÂÁ÷¿½¼¹¶¯¬/ þÁÂÂÃÄÃÄÃÂþÁÀÀ¿÷¼¿¿¶¶¼·b þÀÁÁÂà ÂÁÀ¿¾÷¿¶½¾®±¶œ ¿ÀÁ ÁÀ¿¾½÷¿·¼¹¬¶žR ¿ ÀÁÀ¿¾½¼û±´¼{þ½¾¾¿À¿¾½¼ø¶½´¬¹§Oþ¼½½¾¿¾¿¾¼¹ø·¯¼©©¯n¼½ ¾½¼¹·¶ù¯·¡§¡5¼½¼þ¹¶¶ø´¯®©¹ŸFžÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ:ÿþÿ9ÿýÿ9ÿ:ÿ:ÿ:ÿ:ÿ9ÿüÞÿ8ÿ9ÿ9ÿ9ÿ8ÿ8ÿ8ÿ8ÿ7ÿþ7ÿ7ÿ6ÿþ)6ÿ6ÿ5ÿþ5ÿ5ÿ4ÿ4ÿ4ÿ3ÿ3ÿ2ÿ 2ÿ 2ÿ 1ÿ 1ÿ 0ÿ 0ÿ /ÿþ /ÿ /ÿ .ÿ -ÿ-ÿ,ÿ,ÿ+ÿ+ÿ*ÿ@ú&ö#!ö!ö  ø!÷  ø ù ú!ú  û ý !ü ý þ ÷ ù"ù#  ú""!ü# !û#ý#ý %ù%÷ 'ú (ú)û")û+ý ,þ-õ  .ø"ø.ï0÷ ü1ò 2ó  4õ5ö 7ø 9ú$:û <€ú)55//1&1ö-;1-+-/331!1ö551--1331!1ö%7531331/1 1ø/3553//1!1÷+57/+-31 1ø#35-'-51 1ù53/35/1 1ú!35/-1!1ú)7-)31 1û)//31 1ý-71!1ü!3/1 1ý-1 1þ-1 1÷-373-+/311ù'591+-11ù-;71-/11 ú1993-11!ü1;711!û/5311#ý+511#ý#711%1ù31//1311%÷%-571/1311'ú/73//11(ú+331-11)û195-11)û#15311+ý)711,þ311-õ)+/5773/73//1.ø591+-5//ø1331/11.ï#//-/3+-/1331/110÷+73)/13311ü3111ò)1/5751--15112ó13573-+17114õ#+35/-/3115ö!/73--/117ø-773-+-9ú)5=1/:û)773</€þ£ÿ*ÿÿþÞÿ%ÿþÿ)ÿþIÿ(ÿ)ÿýÞÿÿþÞÿ"ÿþ)ÿÿþqÿ"ÿ'ÿþÿ%ÿû£ÿÿ£ÿ!ÿþ£ÿ#ÿ$ÿþÿ"ÿþÿ!ÿ"ÿÿþÞÿÿþqÿÿþÞÿÿÿ ÿ!ÿ!þÿÿ#þÞÿÿ#þ)ÿÿ%ÿ%þIÿÿ'ÿ(þÞÿÿ)ÿ)þ)ÿÿ+þ£ÿÿ,ÿ-ý£Þÿÿ.þÿÿþÞÿ ÿ/þ)ÿÿþÞÿÿ1ûÞÿÿ£ÿÿ2þ£ÿ ÿ3þÿÿþÞÿÿ5ý)Þÿÿ6þÿÿ8ÿýÞÿ9þ£ÿÿ;þ£ÿÿ=ÿ€@ò"#$$%&)**++.//ü02233ã7889::==>?@@BBDDEFJJIIMMNPQQRRò "##$%&)**Õ+../033232237889;==>?@@BCDDEFJJIJIIMNPPQQRô ""##$%))**â+.//0033233788:;;=>??@BCCDEFFJJøIMNNPPQ ô "#$%&&**ý+.//3ä2337889::;=>>?@BBCDEEFFJJIMNNþPÏ "#$%%&))*+../03323778899:;==>?@@BCDDEEFFJIMMNMNþÛ "#$$%&&**++.//0332338899:;==??@@BCDDEùFJIIMMð "#$%%&)**++.//ö03327889:;;ú>??@BCCB÷CDEEFFIMó ""$$%&))**ú+.//033ê7889::;;=>??@@BCCDEFFJJó $$%%&))**ã+.//002337899:;;==>??@BBCDDEFFþJ #$û%&&)**ý+.//é32237889::;;=>>?@@BCCDEEþF þØ ""#$%%&))**+.//00323377899:;==>??@@BCCDD Ô ""#$$%&&**++.//00323377899:;;=>>?@@BBCC ò "##$$%&)**+.//í0332337789::;;=>>?@@þBÝ ""##$%&)**+..//00322337899::;==>??þ@ ì ##$%&)**++.//0ð322377889::;=>>??#û$%&)**+þ.//ô032233899:;==> ù"#$&&)**ü+..//0ô322377889::;;ò"#%%&))**++.//ü03322û377899þ:õ"#$%%&)**ø+..//0033÷23778899ô"#$$%%&)**ü+..//32ý3788þ9ô "##$%&&)**õ+.//00322377þ8þô ""#$%%&))**ü+..//ø0332233ü ö"##$%%&))**+./03% ü"##$$ï%&))**+..//00322$ò ""#$$%%&))**+þ.//0' #$ü%&&))*+ü.//$þó ""#$%%&%&&)**ü+..$ô ""#$$%%&))**+-õ "##$$%%&)**/ý ""#ù$%&&))$í  ""#$$%&4 ù"##$%%4÷ ""#$%6 #5þý "4}5ù8ü8ù;þ8ù 8ü9ü8ý8ú # û ÷ þ  ûô  ø%ñ ø" !ø!ú !ô  ÷ #ýý (û ý,û>13ì59;==?BCFGJJKNNORVVWWãZ[[^__ccfgjjkkoorsvvwwzz{~1Å3133579;;=?BCFGGJKKNRSSVSVVWZ[[^bccfgjjknoorsvvwvwwz{~~11Ô35799;;=?CCFGGJKNORRSSVWWZ[[_bbcfggjknnorssvvøwz{{~~1 1Ï355779;=?BBFFGJKNOOSSVWWZ[[^__bcffgjkknorrssvvwz{{þ~11/135Ï79;=??BCCFJKKNRSSVWZZ[[^^_bccfgjjknoorrssvwzz{z{11/þ133Û579;==?BBFGJJKOORSSVWW[[^^_bccggjjknoorùsvwwzz11/1ä3579;=??BCFGJJKNNORSSVZ[[^_bbúfggjknnk÷norrsswz11Ò355799==?BCCFFGJKNORSSWWZ[[^__bbcfggjjknnorssvv1Ô35577==??BCCFGGJKNORRVWWZ[^^_bbccfggjkknoorssþv1 1/135;=Ý?BBCFFGJKNOOSVVWZ[[^__bbcffgjjknnorrþs1 1þ-//1Ø799;=??BCCFGJKNNRRSVWWZZ[^^_bccfggjjknnoo 1/Ô155799;==?BBFGJJKOORRSVWWZZ[^^_bbcffgjjkknn1 1/35Ý79;;==?BCFGJKNNORSSVWWZZ[^__bbcffgjjþk113Ý5799;;=?BCFGJKKNORRSVVWWZ[^^__bccfggþj1 131Ø/1135577;;=?BCFFJJKNNORRSVVWZZ[[^__bcffgg1;æ=?BCFFGJJKNNOORSVVWW[^^_bccf17ã9;=BBCFFGJKKNOORRSVVWZZ[[^__bb13ë59;??BCCFGJJKNNOORSSVVûWZZ[^^þ_11/ê1359;=??BCFFGGJKKNORRSS÷VWZZ[[^^11/ä1359;==??BCFFGGJKKNOOSSVVWZ[[þ^11/1æ3579;;=?BBCFFGGJKNNRRSVVWZZþ[11þ3113ä5799;=??BCCFFGJKKNOORSSVVWW11ü5331137ñ9;;=??BCCFGGJJKKûNORRSS%157ü9;;==ï?BCCFFJKKNORRSVV1$13ç57799;==??BCCFGGJJKNNORR1&1357;=ü?BBCCøFGJJKNN1$1þ/113í799;=??B?BBCFGGJKK1$1/15ï799;==??BCCFGGJJ1,135ñ79;;==??BCFFGG1.13ý5799;ù=?BBCC1$131í/113557755799;==?B14157ù9;;=??1413÷57799;=?161357;51þ/113ý79141/15}1/5131-ù15531-181/ü133181ù/-+-131;1/þ-181ù'1751/181ü%/5591ü#-3181ý!-181ú-7;71//13/-û/1351 1÷#)/37//133131þ/1 1 û)1/133ô1/-113531/-1 1 ø)+/131/--/%1ñ%-15531/-/1351 1ø)15975113!1ø'+/35531!1ú#/7751!1ô+33557531/3351/ 1÷!%+/357331/31/13#ý!%//ý135531/- /(û!'+/11 3ý13,#ù%')+-/113> BÿþÞÿ{ÿþqÿ=ÿýIÿ<ÿþ)ÿ:ÿþÿ9ÿ7ÿý)£ÿ3ÿ þ£ÿ1ÿ ý£Þÿ.ÿýIÿ,ÿý£ÿ*ÿýqÞÿ&ÿþ)ÿ%ÿýÞÿ!ÿûIÞÿÿ#ýIÿÿ(üqÞÿÿ-)ûIq£Þÿ ÿ>@òSUVVWWXZZ[\^^__`aýcdeejlmnþoqqrsuvwyzòRSUVVWWXXZ[\\^^_`aþcddþejjlmnoþqrrsuvwyúQRSUUVVëWXZZ[[\\^^__``aaccddeeþjllmnoqþrssuvùwPQRSSUUVóWXZZ[[\\^^__``acdejlmnoqrsuëNPQRRSRSSUVWWXZZ[[\\^^_`acþdeeùjejjllmmnþoqqürqqrrsNîPQRRQRRSUVVWXZZ[[\\^_`acdeúdeejjllmnoqoqrüMNPQQóRSSUVVXXZZ[[\\þ^__þ`aacdþeddþejjþlmmnoþqooqñIMMNPPQQRRSSUUVVWXþZ[[\^þ_``þaccdejlmnoqoùJIMNNPQQRSþUVVWXZ[\^_`acdejlmnùFJIMMNPPQRþSUUþVWWXZ[\^_`þa``acdejløEFJJIIMNNPQRSUVWXZþ[\\^_`acdejòljjDDEFJJIIMMNNþPQQRSúUVVWWXXZ[\^_`acdejùBCDEEFJJIMúNPPQQRRSUVWXþZ[[ú\^^__``acdeöjee@BCDDEFFJIúMNNPPQQRSUVWXZ[\^_`acdcñ@BBCDDEEFFJJIIMMþNPPþQRRSUúVWWXXZZ[\^_`a÷`a??@BCCDDEFþJIIMNþPQQþRSSUþVWWXþZ[[\^`a_ø=>??@@CDDEFJIMNPQRSUVWXZ[\^_ø:;=>>?BCCþDEEFJIMNPQRSUVWXZ[\ñ9:;==>@@BBCCDDEEFJþIMMNPQRSUVWXZ[ü9:;==?@BúCDDEEFFJIMNPQRSUVWXZXô89:;;==>>??@@BCDEFþJIIMþNPPQþRSSUVWXW7ö89::;==>>??@BCDEFJIMNPQRSUVUù237788;;þ=>>þ?@@BCúDEEFFJJIMNPQRSURSU3ü78899:;=>?ý@CDDþEFFJþIMMþIMMNP QRû3223778þ9::þ;==>?BCDEFJIMN PQ/û03223378þ:;;þ=>>?@BCDEJIM NP/ü03322379:;=>?@BCDEFJI Mþ.//023789:=>?@BCþDCCDEF Jý+.//323789;=>?@BCD E*ü+..//þ03323789:;=>?@BC DCý&)**./02þ377þ877þ899:þ;==þ>??@B CúB&&))**+./0323789;=> ?B@ö?B@%%&&))**+./þ0332þ3779:; =?>ö=?>$$%%&&**+./032þ37789 :;:ú;:"##$$&)*+./032378 9þ:998ð7 ""#$$%%&&))**+./03237 87÷32 ##$%þ)**+./032 3þ7332û30ù ""##$$ú%&&))**+./0 30÷/.  "#$%&)*+./ý+*þ "ú#$$%%&&)*+./.þ+**û./%% ú"##$$%%&)*+*ý&)**ú&$"*&  "#$%&)*)&$%ù$# $ "#þ$%%&þ%$$#ö" "þ "#$" ô  þ"ú" þþý þþýþî  %û ý þú ù þó#÷þ÷õ÷þü"ù÷$#  üû$ü÷(ñ0<ò„†‡‡‰‰ŒŽŽ‘””––—™ýœžŸŸ¡¤¦§þ©¬¬®¯±´¶·¹ò„†‡‡‰‰ŒŒŽ‘‘””–—™þœžžþŸ¡¡¤¦§©þ¬®®¯±´¶·ú„††‡‡ë‰ŒŽŽ‘‘””––——™™œœžžŸŸþ¡¤¤¦§©¬þ®¯¯±´ù¶~„„††‡ó‰ŒŽŽ‘‘””––——™œžŸ¡¤¦§©¬®¯±ë{~„„„†‡‰‰ŒŽŽ‘‘””–—™œþžŸŸù¡Ÿ¡¡¤¤¦¦§þ©¬¬ü®¬¬®®¯{î~„†‡‡‰ŒŽŽ‘‘”–—™œžŸúžŸŸ¡¡¤¤¦§©¬©¬®üz{~󄄆‡‡ŒŒŽŽ‘‘þ”––þ—™™œžþŸžžþŸ¡¡þ¤¦¦§©þ¬©©¬ñwzz{~~„„††‡‡‰ŒþŽ‘”þ–——þ™œœžŸ¡¤¦§©¬©ùvwz{{~„þ†‡‡‰ŒŽ‘”–—™œžŸ¡¤¦§ùsvwzz{~~þ„††þ‡‰‰ŒŽ‘”–—þ™——™œžŸ¡¤ørsvvwwz{{~„†‡‰ŒŽþ‘‘”–—™œžŸ¡ò¤¡¡oorsvvwwzz{{þ~„ú†‡‡‰‰ŒŒŽ‘”–—™œžŸ¡ùknorrsvvwzú{~~„†‡‰ŒþŽú‘””––——™œžŸö¡ŸŸjknoorssvwúz{{~~„†‡‰ŒŽ‘”–—™œžœñjkknoorrssvvwwzzþ{~~þ„†ú‡‰‰ŒŒŽŽ‘”–—™÷—™ggjknnoorsþvwwz{þ~þ„„†þ‡‰‰ŒþŽ‘”—™–øcfggjjnoorsvwz{~„†‡‰ŒŽ‘”–ø_bcffgknnþorrsvwz{~„†‡‰ŒŽ‘ñ^_bccfjjkknnoorrsvþwzz{~„†‡‰ŒŽü^_bccgjkúnoorrssvwz{~„†‡‰ŒŽŒô[^_bbccffggjjknorsþvwwzþ{~~þ„„†‡‰Œ‰Zö[^__bccffggjknorsvwz{~„†‡†ùVWZZ[[bbþcffþgjjknúorrssvvwz{~„†„†WüZ[[^^_bcfgýjnooþrssvþwzzþwzz{~ ûSVVWZZ[þ^__þbccfgknorsvwz{ ~OûRSVVWWZ[þ_bbþcffgjknorvwz {~NûORSSVVWZ^_bcfgjknorsvw zùKNOORRVVWZ[^_cfgjknþonnors vùJKNNOOSSVWZ[^bcfgjkno rùFGGJKKOOþRSSVWZ[^_bcfgjkn onñBCFFGGKKNNOORRVVþWZZþ[ZZþ[^^_þbccþfggjk nókBBCCFFGJJKKNNRSVWZ[^bcf gkjögkj??BBCCGGJKNOþRSSVþWZZ^_b cgföcgf==??BBFFGJKNORSVþWZZ[^ _b_úb_9;;==BCFGJKNORSVWZ[ ^þ_^^[ðZ57799;==??BBCCGGJKNORSVWZ [Z÷WV335577;;=?úCFFGGJJKNORSV WþZWWVûSR1133ù5799;;==ú?BBCCFFGJKNOR SR÷NK//1133779;=?BCFGJKNONýJG11þ35579ú;==??BBCFGJKNKýJGFFúGKN??11357ú9;;==??BCFGJGõBCGGFB=9FB1 13579;=?BCFCB=?ù=;73=311/13579;þ=??Bþ?==;ö9533579#11þ-//13579;=97ô577551/+)11/1357þ95531ú597/!1/1þ311/1313þ133531/1ý-' 131/1þ3113þ/1131/ý5+1þ/11/î-+-/35577--/3573/%1û7531//13ý/% 1þ311ú35751//ù133/)! 1þ311ó355//113355)#13÷13551+%!1þ/11÷/--551+!1õ-/331-)%#1÷+/351+%1þ/--/53-/1ü91'3ù1/--//11-/1÷=;73/+'% 1ü/--//13531û-+%$3ü1//553÷531-)%#!(ñ35331/1/-+)'%#0< ¾ÿý)ÿ:ÿûÞ£ÿ9ÿþ8ÿþq6ÿþÞ%ÿþÞÿ ÿ 2ÿþI /ÿý£ -ÿþ£*ÿüÞI(ÿýÞ#ÿû£I)ÿþÞÿÿüÞIÿþqÿüÞqI ÿüÞI$ÿû£I)(ÿúÞ£qI)0< rz {|{zyýzyvvùsqlrm>yzy{úzyywwvvýwvuuøsqnevWwywywvuývussùqnljj8þuvvwvwvusýusrrùoldjFsuvuvusrq÷oqomd`[*rsusrþqoomølmld_[2rsrqonmeüa[Wþoqq rqoþqoon÷m`jcZjX"no qonmløaodX`^3lmnonmúljjeeddù_m[Xd?jl mledþcaaùcXR^Sj ljedcöa`__dRWR"e jedcõa`_^\\[XW.þcd dcaô`__\[ZXXUS8acacaó`^^\ZXWVVRB_caì`__``__^\^ZX[XRRWB_`_ý^\^^\ô[ZW^^WSSND\þ^\\[ZôXWVV\XPRU= [ZXôWVUSWSIFQJ#XZXWVöSRQRNMMB)WXWVUöSQPNEMRE& UþVUUSRöQPNIJDJB)!UþSRRQöPNMJFEIC*"þRQQþPQQPöJFNPF@?F$#QPNMöJPPD@CC?&$NMIJ÷CNI=;B:&%IJIýJFEEø@B?=@= &FEJóFEDDCCB=;>8#'DCEûDCB@??û>;3(CBô@?>=;::98.)B@>ö=;98770.*?ó>;99>=2/288",=ô;98;83399*-9ô:97373/02+.7ö8723.33.02ù0/..*1/*ý.3ø+**)$"4ù)&%# 5û)&"7ü"8þ¹¼¹·ý¹·´´ù¯¬¤®¦f·¹·¼ú¹··¶¶´´ý¶´±±ø¯¬§Ÿ´‰/¶·¶·¶´±ý´±¯¯ù¬§¤¡¡[þ±´´¶´¶´±¯ý±¯®®ù©¤ž¡s¯±´±´±¯®¬÷©¬©¦ž—G®¯±¯®þ¬©©¦ø¤¦¤ž–V®¯®¬©§¦Ÿü™‰þ©¬¬ ®¬©þ¬©©§÷¦—¡œŽ¡Œ9§© ¬©§¦¤ø™©žŒ—”W¤¦§©§¦ú¤¡¡ŸŸžžù–¦Œžg¡¤ ¦¤Ÿžþœ™™ùœŒ”„)¡ ¤¡Ÿžœö™—––ž‰9Ÿ ¡Ÿžœõ™—–”‘‘Œ‰Kþœž žœ™ô—––‘ŽŒŒ†„[™œ™œ™ó—””‘ŽŒ‰‡‡k!–œ™ì—––——––”‘”ŽŒŒ‰k)–—–ý”‘””‘ôމ””‰„„{o-‘þ”‘‘ŽôŒ‰‡‡‘Œ~†c3 ŽŒô‰‡†„‰„wsv;ŒŽŒ‰‡ö„{zzkC‰Œ‰‡†ö„~{rzrB †þ‡††„ö~{wvovkC!†þ„ö~{zvsrwnF"þþ~~övs{~sjgs=#~{zöv~~ojnngB${zwv÷n{wcbk_B%wvwývsrrøjkgcjc7&srvósroonnkcbf[;'onrûonkjggûfbS-(nkôjgfcb__^[K')kjföcb^[ZZRK+*gófb^^fcVOV[[9,côb^[b[SS^^F'-^ô_^ZWZSORVJ!.Zö[ZVSKSWK30VùRNKKF/1OúNGFK53øJGFC=934ùCB?;715ûCB9)7ü9/#8þ#Â)ÿ)ÿ(ÿ'ÿþ'ÿ&ÿ%ÿ%ÿ$ÿ#ÿ"ÿþ£"ÿ!ÿ ÿÿþÿþ£ÿÿÿÿ ÿ!ÿ"ÿ#ÿ$ÿ%ÿ&ÿ'ÿ(ÿ)ÿþq)ÿþÞ*ÿ- ÿþq- ÿþ. ÿ1 ÿ2ÿ4ÿ5ÿ6ÿþ£7ÿþ)8þ)Â~~?? Backgroundÿ     LAêÂÂB GGG&ÂÂCC&C6CFCVCfCvC†C–C¦C¶CÆCÖCæCöDDD&D6DFDVDfDvD†D–D¦D¶DÆDÖDæDöEEE&E6EFEVEfEvE†E–E¦E¶EÆEÖEæEöFFF&F6FFFVFfFvF†F–F¦F¶FÆFÖFæFöGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿÿÿÿÿáápp88pgsphere/doc/img/sbox.jpg000066400000000000000000000121151332443031700156710ustar00rootroot00000000000000ÿØÿàJFIFHHÿþoCreated with The GIMP CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄD!1AQa"2q‘¡#BR±Ñb’Á$3STrs‚Ò&4c£²t¢ðÿÄÿÄ0!1AQq‘"a¡2BR±SÑáðÿÚ ?ß袊¢Š(Š+œ’$H^FTE,ÇP(¤­Ú G`¶ÝÊÀ²ˆWÑ`1’ˆSŒô&¸K®Ê¡‹>›l™šïˆh:ÃEVluMWSg6·i„z¬cn#ç {p|ªLú…ý“ðÜ\iM‘²´¦ùñf€{E"ƒ´6§+tVÙ” ñ°á=6oWÝœÓ ]JÊíÊ[ÝÃ+Žj²G¸Ph¢Š¢Š(Š(  (¢€(¢©úî°·R~ζ¹h£o륈ún? c}ðyyûÀŸÚÞ›].Ù¯náw_ê¢ñËdti©ä»¹¹!ìf¾º Í3§$ø nã|g>'•HµŠê;UŠÎÞ+8pÇôƒí$ùЉ¥¬éÐwf{û¹PK*wÅcGa–ãÆÃ~„å@«ÚýP½ø¸Šî2$…®Ôø‡OD”ò9èy×8ûMg«ÞǤFH`Uu‡¸xðX($…ä}Î0 p›E‹ZÔΜ‚1 òKxÄh§˜q»1êI8òåRt½´kKë[(fc2Û²ƒÞ úÊOªàuëÈø€KZƒ+ßA}vÊr‚;s©òÉ ñ4hÓµŒ×ZxÓgþŽU•‘c QáâÃnrdsÆNæ†’Ò îìu¸Ä›G&bíø8'> *é§JÁ¦ºÔlÄÒÜ•iÔñÀPðð7ä[rh©[:2\[]ª°ÁWµvyàñ¥©&›5ôv=½Ý¼ÙîUÈg…ÀÏû€FHðÁêÒöÞö3%´Ë  Žj|摨ZÜ÷ c Ñ$…îã ® òÉ?ýA =µ½îž ÙÈ÷PŽvó>\Üsù6}¢¥YÞÁ–$d‚¤a”ˆ#˜>F¹~Îxl®¥‡þÜ„ËÀœq¾{·Óïk¸>­Ç‚iQ³qè¹m¸OCœsœP*)U¦¢³]½¤±43€]ˆ!Ó8âR6#–ÜÇšÐQ@QJ5íU4m&[£ÂdÙ!C÷¤;(øü öƒ\’k¶Ñì0\õ‰:(?wõøx‘ A·mÚé°óJíÅ)¡ˆÈ` ª—t„³‘ؼ’77c¹&9…ÅÜšc¸¨î댎ýKWؤqÏn™ ¤²êg†ÙÚ+NM:ìÒy'€ýï‡AÔb›D[è³–öNí]x”zN5Ç3ÌySÈÊ¢J {«CTÔn5¹ÙœÁhHÁÝ¿Ô*F“k©i61ÚEaføÉy~¶Ùv<Øýžrk惩?gôà. ¶‡êéƒ|rÂ:¶Àû< vlÿ˶>¬!~*#ék¡ÝZÕrF/8ý)ž„ub:d °Å8ñ ,tQEVÛ«³.§ijc€«0ýö?ÈüU VK­]BkËÂØË—ŒžO¡ò€”ŽÒ”´Š–‘ÝSõ<‡¼ô§&ÆÞæÙ!dáXñݲŒŽEHåHtG[÷ÇúÉ—Tòá÷r«µ̦ö—´ÚÍŽ¢Ú£AxϤV3ߌç+èœqpŒòê6©ŸI+¤wVWýŸº²Š8Gv¼|N@Øz,mŽùæ*7eöÏÒ­«0…ã·ÊÆÈsœú ÞrˆÙ9ëZb…<Ö¹aâT¼£++ò7q/ ‡P¥:{Í%wvÚ¿Ob‹'Òî–°±O½yžnôñ<e/Òû_Ú»«+;M³ÙL6&‘]‘†IoEF7““Zr¢¸¿ … Ž[˜ùp^NðF#äjÍɽeÙ‹„м(çêÛ]•ŠìŸn{@èu`ÚÂèQãn}ŠG„lçñr>X©“}X®§¯kb^QK;E$ŒÓèß´ó¤¯ÙMIx.­8Ò&.ªØ1óÜ®øáÛ„tÆNœ=µ–}'hk,ª°nîâÞHÄÄ*àÞ„›ó!¸W9äÍ»Jí]¶©¤YÜÛDÓ^\EÄ-bÝ•¹Ä… â8f¼¥'á-V>œjÂ8ªJÊY5Ê\{ꇷ×ÐéöÆixŽHTDiòUI¤ði÷–.°ŽúãÒº¶LarU?‰G_¼sâ1:ÏO—ë"ûQKw‚T}œôO?;Ÿ!µ55y˜F·¸Šîš&âÆAÿ÷#åPf/¯ïíäÏtÐE#˜l¹ØøŽ%5âå×F¸{Òxl%9¸"n’àyqñ®úLr V¸JOtægSÍs²©ó {¨º\ò\éñ™±ß!1Éħæ*}*ÓK.§ªÇÂB ÁSÓxБñ$ûé­áóÀØçƒXÊ}¥µœXõ•Y‡þx­ ò5‹Ûz7²ÄÄeD’~{P#ŠXå3Ú‘Þ^68Y?Cç]µ.ÑGe¢ÝË—‚í"!#eAŽÀŒìÀÙÚ¼ÆÜ/IûrÜZü•ÿÕªªÒq§&ŽíŸJ510Œ´º¸óèêÀYvt\2-܆BJ`ð”g¨Ø‘þ*»FÕV°ÒÖÖ­®î­Ê \$œKœx6E0K}Q}MUù–ÀŸ‘*q´äW¬ëâ%S›×±aV¨:9à¼Õ¡?vïˆ{4?™585“ÏT¶ËCþú‹kezuÛØeÕ§RñE)0ĉÇë/PqŽʦr–¾ £$€SP__±Y Vì÷“ Œv«Þí#aï"£®ƒ`ä•–í†ÿÒ¥ið“Ãò¦‘G($TAÉT`u¶æÏPÖíf¶¼ ei2’!åu#õW#Ã>ÚÏ;ssØÞÚÜöwQ%`ºn¤a†xzXÆFOèkZ-•¬ïéOEžâÎ×[²B&²b$xט~ s„#;râ'l¢´ZJqÕ}¸š›6ª›–£´g—F´}Í01G*¯vcZÇe¬õ)€™{ŸEU”•ln}ƒŒžX®<ÚçÙÚ3ç}û‘³L<#ð½ðñ«¢Ô’hΩMÓ›„µM§Õäà×nZØ€úlMöǤî>àñPw>{t5'L‘ãÙLÅ¥¶ c»Æ}F>x⦦CVð¤0Ʊă…UF£[•ìç´¹€ªÏ3}PdóãõOŸ }„פ 6#]Hä’n%‘“–Á0™ù|é½&R×WÓm#õÚU;àwx§4Â2¬`@ÆI—<3Ã'OB,ŠÚ+2íšéݨºA²]rƒ¦NCnA>úT7F1¸îæÐþcÄR^ÙÜ'ì›x }£MÆ9€¤ý…<šçP$\ãpFÄ#Ò«züNº–’’0¸C1 ×by…sâ>—û3OcÙb¢ß ¾Éš4r©ñIUhuUüÅâJÍ2ƒZÓÉÇ×`Áœ/ç]3§ñ2ÅÔVaim›¤Ö²'½YHù¨ÑêöÏ×­±þjþµÿYÓ’óMo`cä0I¬Œ:yâ„Kbµt H×^·s‹xnîý¨ù×Aw«ÜmŒ6Ëøîdâ?Ÿî ƒJ5BÎú 6^ýåFŠX`;Fg仸WÁ¤5Îú•ì×C¬KöQ î}äÓ8"ŠÞ%ŠÒ(×`¨ î=M§te]€‰l»E}ÙX»wrŽÝ°±È㉲¡FãšØ.U’öô¿gûw¥kÑ…D‘Gt »…8|ƒ±%(9ÎÝ0+N¸¾‚ÒØÏq D©' ©òE.ôy?n–ÒŽû†!|ë>«&Išxíáy¦p‘ âfc°žâ o,®õ ‘’A }V&Ƥ ˆ–ñ®±A6¡2\ß!Žó<ºj÷ŸUÓ¥á¥te|N Éò$û*ó0õ`ÆëY¸ºî–5Š3Ðã%¾lúiÍ(ÐaHô¸{±è ¤ó>~ý7  ©vßMúΟ òƒÅjÄ1Â67÷§Ùš¶×)"IchäPÈà«ȃÌPsÂ)°²t=ÙúRÔL¶÷ÚLî Xåg sÀ(jÝ«iGL¼k׎Ë@í÷ÓýÃlûZ«v’Âêm0,¥Hß¼*ØâPë×Ù¹ª+¦àí©¥²§â¢å£ºyÛTÑcÊ›¤€UohÍR!ícÚŒ‘±^ È1žØVéçž”ÞÏ´šdĺTn"%ô1å“¶}†½h>'µöV&û­®k5ì["ŠØœ÷gü¾jHžH£PÑpÌ8@£þT¦-wMõ Aí™Z“ûsI–&õ;>R§íב÷Ô÷ãÌåü¡öež)ƒ(e9dT•“5G±íŽgam Þ òƸœmèóP|3QfúQÓÒ&6öWrI· ÉŠwêA8øTeZ Y"ê{3?‘ö·ÜÑÕꩯiš,BMFò8AõC³náQ¹ÆFp6¬ú]k¶Ý i °Ó›M€•VvT‚¤ØÈær«‘·¿¾Ÿôn.$úÖ¿¨IspÌ¥–'8 m†vô˜Û‡:‹­9eþï$_>lMD½oøB®ÐöŽï·óÁ¤hú[´q¿|8Ø8\dï€q¹9ôyr:/f,³£é÷·rËszm“2NÜEÈ<Ï3ÔÔ­7N±Ò­VÞÆÚ("c'dždà Îæ Øj iö1«MqÄ!NaIâ?ta¹Ÿ ¼)J”¢Ü¦îÙV3N¤#F”wc×ÛÕ·ëÈ}sw¤&YIÆp –'©4—QŽií%Úöü}]wî£>°|9$õ8ß lÿQ™ ˆ Ï܈x(ñóæ~UßFµšîáµ[´(ÄpA}Äóó<ϸt«Ìáݼ+om(TP«½PQ@.Õô›}fÅ­n7âG²0äEfÚΕtö—ÉÄ1´Š2|Hþ•kT«WÒmõ‹nê\¤‹¼r¯¬§ù@eZyI-ÙÊÈ#&3Ã/Ov+œÚ—;†{(Á(>Š›¯h×zÚÏs*g…¦‡!$z0ð>xÍxQ1@ÑN’!—Ÿ¼~•B2Õ\¾ž*µ7ä›]DøkHþçÿ‘ÿZïf´3ëXÿåÖ¤qÜŽpFÃ'ê+ç?÷Vþ5¨xPúWbïÌq¨ûžtÝGƒP»Ca‘ÂÉÞåÇ ‘ÍNüêÏgµœF;X" â+øà{U%¸º†òÄ ¼@Äx¤ñÜgÄ|é‚\^¿9aˆy!cñ$~U8Â1ÑX¦xªõ>9·Õ²Ò“ç&­o÷aÌ’ÿgâo€åï¤+ÉÿQq4Ãð—á_‚à}LK›k8p;¨cTŠ=åõÞÌßSˆôRCïä¾ìûEG²žßN“PQ²›€d³;wi‘âMA›X"2c È<€ŒŸ¼ÉøT½³ww¼Wzš<ÈÅ™IsÈЏÆÝq½ËL¶›[nf6ñ· ¹Øyù·Ÿ!ÓÄÛU*€ :WÈ¢Ž–(”*(À¥t  (¢€(¢Š¢Š(RF’ÆÑÈŠÈÃXdìªv§ØPd3h÷"ÐÍ»ŒÄO—U÷f®ÔPdú»f{§÷ }èOø Ÿˆ¹®LnRHø\}Þ ÀàÖÉ\'Š W‚x’Eðe >t?;›w¹q‘±,»‡xŠòFBA‰³ñÉŒc—¾µƒ hÍëiÛlŸ¥{‹EÒàn(´Û8ÛÅ P**„\^7 »Mp|-!-óßùSËÈj—2,’GšžrNÝä¾àßÑ‚…P@Wª“Ù{ -ÄáZâëûyðÌ?Â9/ºžÑEQEEPÿÙpgsphere/doc/img/scircle.jpg000066400000000000000000000115221332443031700163430ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄB!1AQaq‘"2¡#3BRb±r‚ÁÑSs’¢$&4TÒcáðÿÄÿÄ+!1QaA#2q"¡±áÿÚ ?ïôQEQEE‹È‘!yQd³@eEVµ.è:aÙ{®¹È%DxÃcŽ‘5Zo¦= þ ›X‡lŽì}Þ´Õ¢Ôܹ«­µá2.IugJ¢¹þô‰»rñYêºR.ÐD3DêÎdžoxóc›T¾³a×\i.È )„‘Ú3µš®Ú,¥òÙŸ•ƒÔÓè=¢’ÁÒKVȺ+lÊK°Ù<·7ÃåœÔû]NÆñÊ[ÝÃ#Ž*²GªItQEQEEPQ@QU.kkvÿVÚÜ´Q7ßKÆãò¦7ïÁáßæýC¤Ee6ºU»^ܲî¿un[ úAñ"¹WMzk<—_RéñË{«9ÃHåJÂxaIU=üyg5vÔe»Óº3vö6‘[E»GLw~Pp©îŸÝ”Tº”{.}(iðˆ-uKL–'k‰š÷+šO@ô®„´:Žl×&EÁ‘CI³ùÓ°Ä#¿{†Xç…%‰Õãu ¬§ ƒÀ׋IêŒÞˆæm:鉄IŠ^%Èn#G1\Û¯²éóÛ&ß’i%²^i–×-ר.n¸‰¶]G1Ür;©¥üÏ~š†¡™4øGmx‰„bxÈã;†7áÄîS#ou­ãÛ#km?³ö“™Ž úG}”à*ª…»Qéâ•u ¤# Ž—kñÇ&‰r²Tmý¡0+³›Jc6œ†KlæK0xv˜ûéà{Wwpê¦ÆÖÖM´šA4¸ÜV8È$Ä­•Áïì 0½Ò¤*ö>âE–@$ÅÛŽe5óÀÏM¿Q±Žâ27Œ2ä’7»¼“HOª5ù£DU²¸(ìcbW$d÷1O\vÐ(¢€*Ó˳.§ijc€«0ýl ýU®K­ÝF{ËÂØË—ŒžAO¹ò€”ŽÒ”´Š–‘Þ©ýÏæyS“cosl²l¬xêÙÉŒŽHáHtG[õÇï$b\sSÃgË…X }ÔÍf}ZÖÄièñÝ5áê"qîJ3Ç#á;³¿wsg©Cek ·ÕÚ„)„Uåðzf—[né\’ñØBÌ}ç庬¨h£]·åm¨ )õ¨:¥r4x"¶ÒîeØ.»lÉnr9œü©òš_ û¶·1ðØ¼œØ ŒGÈЖ-fïï® ±Œñ[qÖIþ¦ôšÞ:?§5¼ÑËLó.ËÏ+—ø1Þ;F0KS[•¨:EÜβØÞ6omHWnj†Aâþði(Ö"x Zµ²žÔ±Œ°Ÿ‰{Èø‡xï­·Ý´b$µÍåÌÈ(a9,§ƒÁW¼Ðo¯¡ÓíŒÓm¨ˆ2Ò1àª9“IàÓ¯lž]`({ëzêÙ1†AÁTþeÿÏhÄë-:_iúŒ‹-æE_»€IßÚÇyî©‘ 4ÛÜEwn“ÂÛQ¸È?þà{ª¥õþ£o'Ý5¼Q8†ËÝãiMavë¢Ü=é;6œÜQ7)ì<‘í­úLr F¸JOtægSÅs¹T÷… <¨ ºMÄ—|fluÈLrcó)ÁùŠ›J´ÂË©ê±ì‚pTòß=I>tÖ€Åó°Øãƒ\a>ÒÚÎ,|J¬Ã¸|Wh< q{ovöX˜Œ¢‚£¸’OÏu1"–9Lö¤u‡ãŽOì{齞­nÇ«”˜&&9}ÓåÈùRÈÛeë=ZHƉrÒ"¾ ´3‚wó ôc-§=ÛŒ=ÜÏ1ó8!V(ÚªöZP··‰ ¼º·e@I6—<ýÖzTô·ÕàÕPÿ™l ù@XUª¼½ ÓtR;û•{J¼Nç9õ¨ Õu]Jk¹uflì¢ R6‰j¬ôw¢óô“Uš÷]že‘ãY(`IÉÙª,¶J\YgWG¡ªU=Nª\µ­–:·Ùoø¥¥XZ]² ûÁ27wÓ‹è·û1Ú<Óܶ1q’Äã†x|ëÛ~ˆhpÅÕµ§\¹É9aŸáÎ>U\éGA–úÓ@^¢æ¶Ñ§?íéQnø.g†_\xf¦^’R­¾¼¯Éu «ê#:é¶çŠDCÌý¾òÏkÐí`Ñ/®t˜ã ÿÌ[¾7ºÌ¤ñ%Oo&³¡(ni®· »s³ }9Öc“Ù’öÝK\Ù·\€quǾžkŸÁú½;jEslk×-l}6ûcÊw€v¨;Ï~îF¤é’t¨nŒcqÕÌ8¡ýÇh¯5'Û³Žñ'~ýVrÁꋜon ÷Tºù.!6¿i× ¸B¡†;ùðùP8$áSâ’ªÐê«:ø'‹´”,=W4Ê kO'Û=Œáz?O žûHµiŒpÉ'¿Ø1έ‘,vºí’ÆG%›Æ6FºÊGȵT:jm5 *;‹{›i'·`À $všß¥ô¶Æö*Y§ so.ĪۉRŒ¹ÇŽ+4ZÒOߡ۾»†U:÷PmKÃo)‹un˜ë¶º¶£g±@·eVèÛ’–À>ɾȒÇxÏøäu¬‚ xƒUV}àÊ#ÑVìÊýd›ûýâXNöÞO3ÛXk½)»Òlw´Š×#Üö‰C9þEÈÿu{ʼÊrØ«UmZ×]ZZ±.›%»Âì¼?ï®r§¢Ñ‹¤mRÒÞ}«vBä.ç=Ýœ*í6·•­ìÑïnFãŸÔß ùœ÷U  z ÔžóXÔÑÛÚáw nÜÄwgÕÒ Š+x–(#Hã]ÁQ@ÊšeòóÜ÷É=W.râ’oÊ[ˆt5¤¹šÃT`ÉlD°Ú#f ŽIÜ àäoÜ07U¤ M¨ŸeÔ,/Ç÷ìÒÿ ãŽÔÔû›Ø, 3O D™'™î äæž;x^iœ$h6™˜î“ÜA-å•Þ¡22H!oe‰†øÀ÷#óîÀµ¶(&Ô&K›ä1‡jRxLý§°pç†Í^óÙtév@i]c^Ó‚r{€É>Z{­fâègªXÖ(Ï#Œ–ù°ËNiWGáHô¸z±î ¤ñ=þ{5  ªtçLö>åjÕˆb8„loò!O†j×XÉKÇ"†GYHÜAâ(?Ä0Šl,œ'ðþÕ£Rø-›’Ü!>¸þ´ÛXÒN—|Ö3®Ü-–Ûñ§þÃv|:I¨[̶2urm¢¼>ò0s¸ùs Æå MÒ@ª·ˆÍ%KèÊ+H’Fd\Q‘R ¼…¾îdaÜÀÐcŠØñ‚#₪ÚÿDÌM.§¥J!(:ÆŒn·äzSègÍLÛY¢hÛáu*| Weq±bF½&¶í$œª}z®©ýÑ[Žó§"Ñ¢XËoY‰îÅo°èeþ¥¨%î¿yÖ…!Ä@ü»·þû©Î•©Á•oí71#¢õl]ÀÞ§dñð©‹®Z·Üu×—S0õÆ>u_ÃEýM¿¹µñ›bš¦ƒ~éoþ~¬pıD¡FT`[ŒT³$žˆ]jw¢¶ŠÕ<í¶ÃùWwû«bi‘JÁ漣ñÈYp#7zäÖƒŽÞwgº…çÖö7zlFàºöŒìć‘ øˆ8;³Ãy¿G….m­õ;‰âêXÃqFõUཽ¦¦+… 9 Ma¨-¤sØÆ­5Äw…8…'hdþ†â{7vP®nâ´„Ë)8Î%‰àæM%Ôcš{FIw^ßgD]ýTgâ¿g$žg²·ámƒ_ê3!‘9üŽüOʤ薳]ܶ«v…ˆ"oÀýç‰ò¨vð­µ´p Q@p­´Q@QEWÒmõ›µ¸ß´Ž>$aÀŠæšÎ•tö—É´1ºE ½¤_ÚºÕ/Õô{}bÓª›)"ïŽUøÿQÚ(M¦H ¹‡h1…¶2r9J’öðË÷ÆÿĠךöw¡Ý¬÷1²¦vZhrAÈç“ÃßŒÖ &()ÒD# ²ñóÚ€ÆÕND<*Dvv-»hÛø†kFÝÈãgødþâ¼ë§ÿÅoõ­7LK{{Û¸V— %B|,8zƒO£Ÿw§Iqu ä3ˆvˆíIÛ¼g´|é‚\^¿aˆw!cêHý¨ JN;k\šµ¼OÕ‡2KþCi½:B±¬Ÿ÷L?)}•ô\çSæÚΪÇ!…²úïs7±Äy) !óà¾YñÊ{}:MAFå7(ÉfvêÓ#´šƒ6°DdÆ6€y=x“éSz=Ñ‹Ëí«½MäbÌ$¹à%\cw‡ðŽ åN¨¢€(¢Š¢Š(ÿÙpgsphere/doc/img/sellipse.jpg000066400000000000000000000113741332443031700165440ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄA!1AQa"2q‘¡#3BRb±Ñr‚’Á$ScsÒ&4¢áðTÿÄÿÄ+1Q!q"¡23A‘±bÁÿÚ ?ïôQEQEE‹È‘!yQd³@eE(nÑY4먖îV”B¾«ŒÌBœg‘5]~U YôÛ`¼L×{D{ÀùÐèªÝŽ«ªênæÖãL0eŒm´|vCä~…HŸR¿²}›‹%·nV”Âß=¬Ð(¤°v’Õ².ŠÛ2’ì6O-Íìùg5>×S±¼r–÷pÈ㊬€‘ä( tQEQEEPQ@QU.Ðkkvÿ»mnZ(›ë¥‹Ûq÷S÷àðñó~¡Ú"²›]*ݯnÙw_ª‹®[ øA÷‘IÞK»›’Ækë¨ðÌÓ:lBOD ³œoÆsÔð©±]Gj±YÛÅg.8Úcü à{É>"¢ikútÙžþîTÊñXÑØe¶ñ¸oäA>ª½¯¢¿]ÆDµÚƒÐåê’€<×i¬õ{Øâ´ˆÉ ®°ì6ÎÞ˼ïÞq€kDÚ,ZÖ¦täˆ``×’[Æ#EËÏŸÔÊX"Ô^ú ë¶S”Û˜O†Ho‰¬´k–±’ëOdÿáʲ²,aŠ0;;Xmç!†Gdï44–XÇwc¨ÝÄ$Ý ™‹·ÜØ|œõŒxVÍ;÷ƒMw¨Ù‰¥¹*Ò5©Ú1€ Ø;ð7ð-¼šƒêvÌŒ—×j¬0Uí]8|ijI¥Í}„owo6{•ráp3³¿xdŽ˜#¥;´½¶¾Œ½´Ë  Ž*zÄPuØmîÆ¢I ÝÆ]Aá’ñ€Í­ïtà^ÎGº„q·™òà~?“gÞ*e•ôð `lŒTŒ2‘¸‚8ƒàj?îçƒ}•Ô°ÿ§!2Çð'#ÈŠ=Ûé÷É5Ü>Œ“‰¥FÌYǪå·lžG8â7œP )}ž¨·oi,M ÀRê¬A&q´¤n#†î#áL(Š(  (¥šö¬š6‘-ÙÁ“rB‡íHw(øü ö\’[¶Ñì0\é2rP~ÏëðêD Þ5·k¦ÃÍ+¶Ô¤J† €7T.é f/#±y¸»äš4æriŽàZ£»®2;õ,I_r’AÇܳ@?IeÔÎͳ´VœuÜÒx'Aø¾j£Ú ŠßE˜$·²lGjë´ ãÖpx®8ž#žFUpUÜ¥Z:¦£q­È>Œæ @yFöþcùP4›]KI±ŽÒ+ 7ÆKËém—cÅÑç&¼ÐbÕ'ìþœÔÑz:`ÇÜ„lŽm¸#O¨›?ôí€Ï³_†ïí@F}-4;£«Z£ÎHÅæß­#¯ßSÈŽ`n#–@« 2Ç<),N¯¨ee9¼ZH÷PöfôG3lé×LL LRñ(ÞCqàr9Š¥æ™mrÝùÚ‚áF눛eÔ{ù‘áH­/æ{ôÔ5 ɧÀ;kÄL#ÆGÜ1¸7'p"™{­o™ü}Ÿ¤›ýÌp_Â8óéNª¨PP0±@x¥]C)HÈ#¥ÚüqÉ¢\¬€[PÀ˜ƒÙÍ¥1›NC%¶s%˜<:˜úÃÀø:®îáÕM­¬›i4‚iq¸¬qH#ˆ;[+ƒãÒ€Â÷J6«Øú‰Z5“\s(y¯˜Þ¦zmüzŒw‘¼a— ì‘¸Þ Ôš@’~è׿VÊࣰQ‰\‘“àÅ>8ë@Xh¢Šªo.̺¥¨9ެÃñ±þÀê«ýr]nìê3Þ^Æ\¼dò }O¤v”¥¤lT°ÌŒõOÔðg•966÷6É &ÊÇŽíì˜ÈàTއDq%¿|~²F%Ç5<6|¸UŠÝ@,ÖgÕ­lFžÓ^â'¤£æ;ÇQŒRÔÖåj‘w3¬¶7›ÛRÛ‡z‡Ù{Àßâ 3¥ÄO‹V¶BÓÚƒÞ"ñ–í/‰Ðñ5¶ã[¶ŒD–¹¼¹™Å '%”ðbx*øšMõô:}±šm£’ZF<G2i<uí“ˬ}që][&0È8*Ÿ¼£ŸÚ9ê1:ËN—ÒEþ£"Ëy‚Wêà’xõc¼ø ÔÈÐmî"»·Iám¨Üdþà|*¥õþ£o'Õ5¼Q8†ËÞ#iMavë¢Ü=é;6œÜQ7)èx#Ö·é1È-âu)=Ó™OÎåSâ(ò 6é7\iñ™±ß!1ɼ§æ*m*Ó .§ªÇ²B ÁSË|hHø’|é­‹ça±Ç¸Â}%µœXö•Y‡€þx®ÐxâöÞ­ì±1EG$ŸžêbE,r™íHï·,Ÿ¡ñ¦özµ»îR`˜ ˜åõO—#åK#m—¬õi#%ËHŠøL.ÐÎ Ü΀kÙŒ¶œ÷n0÷s<ÇÌà|…4Ôu«="Ù¦»™W J¦w¶:UwÑcÒt®ù/n­û˜†BHKc’¾G•XÒ4}C¶Wo¨_Þ .Üy ÓÕåPÕªâÔb²Ù§ae ±•zòå§wod:~Ýk:´Ö‡¦6Ë6È•‡"7ò¨ö'kµI¦Š}KÑDsæ`­† Ê ;¸ñm±Ó5++t‚ ûH£Q€Ïóõë [+Ó®ÞÃ.­:—Š)I†4M¿iyƒŒlŽáPrú’oØž\V'‹Z1ŠÝ®gî,=†Ö@ÉíMÈ™¥ ý¯ÓG£éú²ê$ß•¿™±…«úè6A¹YnØoÿ+H?¤Ÿ•4Š8á@‘"¢ £yW]´>ͯìñ5q¥HÆKgþ`æ‡öƒ­G*[kvÒØ@ÄíÉxr8 Ü£<ñçW.ÊO¦ÛËqa§¼onÿâ uöŠœm+$©#&)–¥¥Ùk­m}Ë|Gr­NÊ÷ö}Ú;k›Y –M&Ú/‡¸ñò yr©Eúžcú,F§‹T#Óª»ãí/3¶f±&£A{Å”w‘ȦŒHÛ$g4±®&×>ŽÑž;íÜÍ0éAø¾jÑ‚ÓO Îmzå­€¦ÂßLyNãìªó㻑©:d–Æf--±3ïöøàOU5*¢·…!†5Ž$*ª0¥:ÜÏg5¥ÌDó7¢ ž;~ÉñÙ`¸š$ØLw#’I¸–FN‚a3òùÓjM¥®¯¦ÚGì%´ª2wàwx§4FAÅÄ d™s³<2läò AðÈ®Ñ\Ë´Vk§v¢éä»å,œ†ü‚|èPÜ Æã»˜qCùŽ¢¼ÔŸnÎ8Ìž5ùÿê³–çP$\ãx#qÀò¥×Éq µúNù 0ÙßχʀkÚ¶/Ù›•’q¸{é§dg¶~ÏÛ `¨ÃÅî¥fþ)mÞ»yãWR­”,>+š­iºÄ”Ôž.ñg±s’——*«Qôê*M<–Tþ2ÊV~´ù’ß¶òŽ»ÔVaim›”Ö²'š²‘ò-Kl;I¥Þ@²­ô W<+ýgNKÍ6u½ŒsÁ$ B²0å㊲šk(Æ©Ntäã5†Œû:5¨u1ûÎK¹l»¦ŠÅÛeÛbq€ÂM…L ᘃm H×^·s‹xnîúP6>$ó­‚ïW¸ÝŒ6Ë÷îdÚ?ÒŸò¯0*ÆInkõçÏÊ—`Õ ö“«ésh/d\]í¬#>$n53Y¿ÓôËf›ZÕ$½8Ï£DÂ4#øWyÄMV4Û ÎÛkqÜIÚé6êD @?û¯J†â¢k§íšœ&ÒP¨¯+ziþw{-Ë7cìZçM†ÏS‘¤ŽÒXmsôe$ûØ`ÃpÀÝW€@)%øWÚ}ê "·¢Éü€¿ ñ4Ææö ( ÓÈÀæIäæ|XŠÂHÇ«>¥IOvÙ¾iã·…æ™ÂFƒi™Žà)=ÄÞY]ê#$‚ôX˜oŒX>ñ  Ö¶ÅÚ„És|†8PíCjOÉŸ©è8Ãf¯yèºt» 4®Œ±¯S‚r|É>êé–žÆëY¸ºî–5Š3Èã%¾lòÓšUÙøR=.ìz©8ÇÎŽß:ɈñnNôèÁ=ñŸÛb};öuc‹.¡s%ÜŠÄàœýô«´K ¬!cTŠ$à¤ÂëS¸Ý´V«÷çm¶Ê»¿ò­‰¦E+¾šKÆ!eÀŒ{nøäÔ¥|¨¥u}qtóZYÇãð{¨^~÷±¸³Ób7Я¤gf$<ˆo´AÁݞȭú<)smo©ÜH×RÆ;Œò7ª¯éש©Šá@B“Xj iö1«MqÄ!N!IÚ?da¸ž›ºT…QõÍÜV™e'Àd±<ɤºŒsOhÉ.ëÛñèè‹¿ºŒû@xìä“Ìàt­ø[`×úŒÈd@N~ÄC¢Ž¾'‰ò¨vð­µ´p Q@p­´Q@QEWÒmõ›µ¸ß´Ž=¤aÀŠæšÎ•tö—É´1ºE ½Hþÿ•uª_«èöúŧu6REß«í!þ㨠96™ 6æ ÆØÈ9Èä~%íá—ë!ÿ‰A¯5íïC»YîceLì´Ðä$ƒ‘Ï&Ž3X(˜ h§IŒ‚ËÇÌ~”¶6ªr Aî©Ùض6í£oâ­w#ŒŸá“õç}?ÿ•¿­h ºb[ÛÞݰD¸a*ƒÙaÃâ >Ž}Üj%ÅÔ7Î UÚ#µ']ã8GΘ%Åëñ–‡‚?Gå@ZRqֵɫ[ÄýØs$¿åÄ6›à8yÒdÿ¸¸ša÷Kì¯ÁpLK›k8p;¨c†P {Ëë½ÌÞ‡ä¤4‡Ï‚ùgÞ*=”öútš‚ÊnQ’ÌíݦGRj ÚÁ“Ø^ädô ÄŸ…Mì÷f//¶®õ4x#‘‹26’ç€<•qÜñ¾€a¦Zͭη3 ›xÛÔ\î>-ãÀrêmȪˆ@ «¢Ž–(”*(À•g@QEQEEPÉKG"+£ aGº©Ú¯`Õ¤3è·"ÐæÙÆb'Úùf®tP¶ãB׬ï´þôµ Ú“ñ–µÉÊI˳´øì•®X!6&‰$^Ž Ç'csnñ÷.27˸ò§lÈÉqmvªÃ^ÕØç€GÖ–¤š\×ÑØHö÷vóg¹W!ž<;î#ÃxS»KÛkèËÛL²pØæ§ÀŽ`ùƒ®Ãop–0ÍH^î0ªê,“ÿ´6·½Ó{9êÎÞgËûŽ“gæ*e•ôð `lŒTŒ2‘±sÈÔÍÏöWRÃÿ.BeèNG¡{·Óï’k¸}™&<J˜³uËmÂzã˜Ü‰QKìõE¸»{Ibhn—Ub‘3Ž%#b9mÌ})…QEE³^Õ“FÒ%»82l¡üR”}~ÀÐ {G®I-Ûhö.ö™:(?‡úý~ºQ´…^ÇÜH²Ñ¨˜¼qÔ¡ê¾£p3ÓoãÔlc¸ŒÆr ·˜5&$Ÿš5ù£DU²¸(ìc‚W$dù1O®­kb4ôxîšð÷8÷%ç‘ð³¾ÜéÍž¥ •¬6ß›µR5ª-Ëà4Í.¶>ÝÚ¹$;ÇaEÿ÷?m©hOû­«ÿä¦ÿàj$ð›:UÒq‡›H”5Û~–ÚùYKþšƒ êW#G‚+m.æ^ëÆÌ‘¦ÎGSŸµq¡ÞÁ¦YêóZÉ6›6Y¤„ü ?V8! #bAŽ{Šì¿“íGO»ìà·°•Ù-etîå#¼T,Jq¶ã¨Û øVj5=¤¹ZÁíqN ø*•µÏe¦ÒèšóêüG«³wúëˆ,c<ÖÜw’ðšÞ;?§5¼ÑËLó/ Ï+—ü˜îŸK W–³[N¼p̆9$eHÁF«vZP··‰ ¼º·e@I8—=}Ö}*z[ê‹ðj¨Ķýˆ¡)´ò†¶:]†–ºm½º‹ ¬½Ë’à†$x³ry×5¼ìv«¤êzŽ¡Ùk™c6’on®xÊŽloð·>ñоDzyê–Ãåh×Qml¯N»{ º´ê^(¥&Ñ8þ%ê1Â9W+)„Ö†Þ†ý'Ôils‹Ï7ÄŸU/¾ä.Ë~QaÔ®—KÖaöO“á+0;.ç*ÜÆQÏ$ µ>¿b²­Ùï&íW¼#æFÃÔŠ­kŸ“Í/Z…äO ÅI¼v2l2’ðÁØtÚ«hûAù=¸‹K×­MΞF da²†Ý‘±ïl~ÁïÂ9ñVΞ–õ^sЖ‡OÄi îÏÆ·üò¿éý#¦…Õõ‰tÛsÍ"!æaæß úgçZô;X4Kë&8ÂÆÿíïÝN̤ó%OF³=§nѽó¦Ÿ,P¿ µËá¹\°â\¨Æ8FFøÎ)†³žÌ—¶êZæÍ»ä›®=ôõ\úâ´ÆJK+cľ‹(±×bÄç5‰5;¨eµ[•‘{–A rp8HÎ~”­®&×?GhÏøîFÍ0ðÀ~÷ÓÆ¬r3›ƒ^¹k`é°·éIÜ~â î|öèjN™#Æ%±™‹Kl@ ÇwŒü |ð'ÅMJ†(­áHac‰ ªŒ)N·3ÙÍisQ<Íìƒ'ŸÂ|øXò&€“a25ÜŽI&âY9l Ÿ·Þ›RhÕ-u}6Ò?-¥Q“¾wŠs@d\\@ÆI—<3Ã'OB,ŠíÌ»Efºwj.l—`\ é“ÃçO­ª#Üwsh˜ñæ¤üvqÃý¤ñ¯ßÿªÎX#@‘sÁ|J]|—›_ÒwÈ.¨a†Îýy}¨ œr©ñIUhuUüÅâJUÍ2ƒZÓÉǶÀƒ8_ç@X£zŠÌ#í-³tšÖDõVR>Ū4z½†3íÖØÿ­D¿Ötä¼Óg[ØÇ9 @Ä+#žx -ŠÔŸµZ¦ÑÆž—íf½êÈìˆ8û¤dm’Ì ^·s‹xnîü¨RûÖÁw«ÜmŒ6Ëûw2qáOõUe%Êö:Ótè±[[Ä—Uþc7O´Ò,"±±‹º¶‹< Ä[$É'™5¦mn+[Ù£ÞÜŒpnþó|+êsåQÆ×;êW³]ì—ôQ î}I¦pE¼K¤q®ÁQ@Ò¥$–IJS“”ž[é:kIs5†¨Á’؉a´FÌA’3°/ƒ‘¾Ãj´‚ÀåIµ캅…øøxýš_î¾1ôp¿SSîo`²€Í<¤ž€§ÈT•7ÍåŠÕˆb9„loèBŸ–j×XÉKÇ"†GYH؃ÌP~9ˆaØY:òþ•£Rø-›¢Ü!?\6Ö4“¥ß5ŒëÇ e vüiþ¡¶}Z¤vòÅŸ²Ò¹™™-äI[žIáçÔaõ­J¢øRÞ9šYßr$ð²\cr†¦Æé Õ[æ3\ÂËò“Ýâ=[M’7àâãƒñg}ÖÆSœäýêÓeÛ ä·uª@¼ÏzL\ü8±ŸJשàúí?Ç[Çšê¾hª²/f\¢ŠØœ÷gû‚¼Õ&‘<‘F¡¢á˜p€> þU Öí&%ÕÑÔ2²œ†‘·Ýê6V¶„ßÝAo Ÿ£ãš@€’Ù=qŸ¥yÊ2o•.¥ËSPÀä‘UÞÙvãþÆþn–]2[»[™%š7áîq,Ab#<'ÑE¯å ³z}•´š¼]òÄwJÒ‰^jéŸPzÒ›ÏË•u´±Ðïoå¸näÛNVE`F6ãâ'aÃó^¶ƒ…êgbœèr‡Š}Üþïoõ9ÊqÆçDìßjôžÔÙ5ΗsÞw|"Xœp¼DŒá‡Ôdd Å<2RÌ@d’yWÉ×VúΕ®[IŸq¤_\(kh-Œ‹ ˜ýÐX¸,ClNNvØŠú;IÓ¦ŸL²“]’K«îå ñÊW»Y8G ¾éÁÎû×n5ÂkÐòÙTólºe|º?r+±Ë£D½Bóó½Åž›¸.…}£<1!èC~"Ù广G….m­õ;‰âêXÃqFê«É|<|MLW tšÃP[Hç±Zkˆî$ s OÉü# Ìømá^ Ô}sw¤&YIÆp,O Ri.£ÓÚ2KµíøötEߺŒü@yðä“ÔàxVü-°kýFd2 '?‚!à£ÇÏ™ûTÖk»–ÕnУÁMøÏÌó>ƒ¥îÞ¶¶Ž*(U¶Š(Š(  júM¾³bÖ·ñ#‰r"¹†¯¦=”²iú¥ºOÁÉN%q‰œüºW^¥ú¾o¬ZwSe$]ã•~$?æDU“Žäs‚3ýÙ?¨¯;éÿá[øÖ¶>7Ä_ë2½”<ˆ:_c»5oªO*'hÈx„®Ò/ .0U‰pÜÅ\4û{-:•¬±â)ažYÀë°úU^K‹¨o!œ@«Ä GŠOÆp–ûïþTòñڥˬ’GšžrNÝä¾€¾µÑÂ…(@W´]'²ú~• œ+\]o>‡÷G%ô§TQ@QEQEÿÙpgsphere/doc/img/spath.jpg000066400000000000000000000115771332443031700160500ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄA !1AQa"2q‘¡B#3Rbr±ÁÑ$Ss‚’&¢Ò4TcáðÿÄÿÄ+1!AQaq‘"±23R¡ÿÚ ?ïôQEQEE‹È‘!yQd³@eE(nÑY4먖îV”B¾ëŒÌBœg¡5]~U YôÛ`¼Ì×|D|ÀûÐèªÝŽ«ªênæÖãL0…ŒmÄ|øCäž•HŸR¿²~‹%¶ÙZS }ø³@<¢’ÁÚKVȺ+lÊK°á=6o‡Ó9©öºã”·»†GÕdA@K¢Š(Š(  (¢€(¢Š¢Š©vƒ[[·üÛkrÑDß®–/Çì¦7ß—Ÿ¨õÑ”ÚéVí{p ºþª/¶@'÷Aù‘IÞK»›’Ækë¨ðÌÓ:pBO‚áÎ7ÆsâyT‹X®£µX¬íâ³q1ÿh82O˜¨šZÁ>vg¿»•²§|V4vnTª½¯²¿]ÆDµÚƒéî’€G=:×i¬õ{Øâ´ˆÉ ®°ð7˼€ï¹Æ­h±kZ™ÓF!ƒ^Ioó®7f=I'\ªN— Ái}ke Ìc[vP{ÁŸ‰Iø\½y)`‹Pe{è/®ÙNPGn`U>Y!¾¦²Ñ®ZÆK­\Üsü›?1S,¯ ¿€Kdd‚¤a”ˆ#˜>F£þnx7²º–þ9 –?¡9„T îßO¾I®áöd˜ðM*6bÎ=×-· èsŽcsŠÁE/³Õâíí%‰¡¸ ]Uˆ"DÎ8”ˆå·1ô¦EPRÍ{VMH–ìàɲB‡ñHvQõû@%í¹$·m£Ø`¸Údè þïôñ"ƒoÛµÓaæ•ÛŠR%CÀT.é f/#±y¹»É4iÌ..äÓÀµGw\dwêX’¿%$ƒŽ{tÍý%—S<6ÎÑZri×f“É<ï}–šÑÕ­Qç$bóÞ‘×öÔô#¨Ó U†cž–'WÔ2²œ‚#^-${¨{3z#™¸të¦&&)y”nCsär:Š¥æ™mrÝùâ‚áF×7 ¨ùõG#Ê‘Z_Ì÷é¨j“O€4v׈˜F'œŽ3°ÆÁ¹s;)‘·ºÖñ푵¶ŸÏÙ‰ý$ßêc’þèçלUP  `6Åâ•u ¤# ŽF—kñÇ&‰r²TmüC>àVg6”Æm9 –ÙÌ–`òñ1øÝä|=Wwpê¦ÆÖÖN4šA4¸Ø¬qH#˜<\+ƒçá@a{¥HUì}Ä‹-€I‹ÇJ«ê7S=6þ=FÆ;ˆÈÜa— ð‘±yƒRiIù£_š4E[+‚ŽÁF8%rFO“úãÆ€°ÑETÞ]™u;KPsY‡ï±þ€ùUþ¹.·vuï/ c.^2z>çØ R;JRÒ6*XfFuOîySÒœ›{›d…“…cÇvÈxLdr*G*C¢8’ß¾?¬‘‰qÕO.NUbö k3êÖ¶#OGŽé¯qrQžy Û;íΜÙêPÙZÃmù»P…#PТܾóLÒëcíÝ«’C¼v„_õsöÚ¬¨h£]·ém¨•”¿øÔR¹<[iw2ð^6d6r:œý©¼Wö’^=š]@×Q¯À$Ôm¹^`n>¢£h>í­Ì|¸/'x#ö4ÎIqqÝ–-fïõ×XÆy­¸ï$ÿ“üMoŸÓšÞh剦y—…ç•ËÈ~Lw#¥©­ÊÔ ƒ¤]Ìë-ãföÔ…våÞ¡ød07ó™Òb'€Å«[!iíAïyË ø—̈y:Ûq­ÛF"K\Þ\Ì→Êy1<•|Í&úú>ØÍ7É ˆƒ-#J£©4ž :öÉåÖ‡¾¸÷®­“d•Oí(ëøŽ|F'YiÒûH¿ÔdYo0B*þ®z'Ÿ‹ÏÚ™M½ÄWvé<-ÅŒƒÿîGÊ I __ê6ò~©­âˆ‘Ì6\íæ8”Önº-ÃÞ“Ãa)ÍÀétÈúß¤Ç ´k‰Ô¤÷Nfu<×;*Ÿ0¡G¥·I¸’ãOŒÍŽù ŽL~Òœ¸©´«L,ºž« 'OMãBGÔ“ëMh _< Žx5Æô–ÖqcâUf@üñ] ò5Åí½ÛÙbb2Š "I?}¨ ‰±Êgµ#¼?lp²cçMìõkv=ܤÁ01ËîŸN‡Ò–FÜ/YêÒF4K–‘ð˜^!œ°?z¯f2ÚsݸÃÝÌóSöÃ]Õÿ2蚈^7…=ÅÆAbB®wdŒùf”ÙiBÞÞ$‚òêÝ•!$â\õ÷Xô©éoª/Áª¡ÿRØö"¢I´Ò,ªQŒã)¬¤ù®ë±Ì{1«ëý”¹‡Xí™%À¾ Å|î^G…”PÁ¸3îgq`c cG²Ý–²šŒ¶rCr$àm™"œó åpMflõkˆž)µ G‰Ô«!³È`v ‚ûŠ¡Þ~OïmuiŽƒ|bº‚•3FHn0B6IÝþ#¸ªõX핱ŠÃyáŠÂ^ÈìÕ=º »äábXRo‰?íî¹}Ž¿Ädêj ëö+!ŠÝžòa±ŽÕ{Â>dl=H®)Ù®×ö‡YÓ³²k,Ž—I¥E9ËPJ“‚¼¸qÌç5r†oÊF -RÚÎÇG€©n%D ‚28•‹°=0Üïåv²Ò^ôöEñ,g÷Yßn¦¦ŸÓ%ujïÄ„bó†åŒãÆþܳà½Õõ‰tÛsÍ"!æaæß úgçZô;X4Kë&8ÂÆÿâ-ߺ™IæJŸŒ+œi‘ö»Oü¯é–úÖ¼÷PÜBò¼ÎâwR( Í3Ëžüë¦ë1ÉìÉ{n¥®lÛ¾@9ºãßOUÏ®+;#ZQp—RoÃþ/Ê4ï¢tK†}v}Û+Ãæ±&£Çu ¶«r²/rÈ$N ÏÒ•µÄÚçèíáÓ¿ÈÙ¦øÞúxÕe&spk×-l}6ý1é;À)*­ª±ã¿‚x¼IBÃ깦PkZy8öØðg üè oQY„}¥¶n“ZÈžªÊGصFW°Æ}ºÛê¯÷¤ú¿l4 -oK†mR\¹Ü•²ºä¸#p6Î~µeuN×Ã\[~Hm-Ëʵl TûŸÊg- Úf`9C7ß—Þ“]þV-ÂZZHTïÞ8ÉíÈþu¬ïª;É ý/[oèª_&ûh$½ü·]Hó· °‘·1*ðö·Ï>9«¬ÚÜV·³G½¹àÜ)ýæøWÔçʹOc5[nÖþSõf•f’fX—ýS઒1哜 ×a‚(­âX #v Š•kÒ[¦n6¬7õOoðËÔµºU¨<ðB1|±†—5󑓦´—3XjŒ-ˆ–DlÄÉ#;ø9ì06«H T›Q>˨X_‡Ù¥þÆ>Žêj}ÍìP§"Ô“ÐÔù ã|ÓÇo Í3„3€¤÷Kyew¨LŒ’[Ùba¼`{À‘ûD€|°mŠ µ ’æù p¡â†ÔžG£?‰ð‡™å³W¼ö]:^WFX×ÄàœŸ 2OÊ€ËOcu¬Ü] ÷KÅèq’ßvý´æ•v~K‡»à@ªO3ç뱦´UNÜéžÓ§Ã| ñZ± G0ýSòÍZë#IcxäPÈà«)yŠÇ1 "› 'CÑþ_Ú´j_³t[„'ëëMµ$éwÍc:ñÂÙh¿ä6Ï¡ëI5 y–ÆNîN4QLJ܌ì}:Ð cr†¦Æé Õ[æ3IRú2ŠÒ$‘†—#ê2*D·êæFL ÎÚ÷K—S“OUˆÝļn×!¶ùÆ?ë\ëSÓ`íÏh/ïy•ŒÆa@8‘NÀ’»ï0È'˜ù{ÛiãÓ5ho„‚#w ÆN @án˜ëLû.ší¤"Ú-íf”-ÌÒ©Y žgv8ÀÇ®j¸_¬Ó] b¥—‰$ùôäúã<ÏOVƒEù Û\ã)J)bM.¼¾ßORígØîÍC*\G¦FÄ ŽñÚE9U‰ÔSË-7M±”Ëg§Ú[ÈW„¼0ª<2-…%Òµ8#Ò­ý¦æ$t^틸©á<þU1uËVýG}pzw13®1÷©pŽÉ#n³QoîY){¶Çêõ™*–b$“Ê‘ ­Nãh­¢µ_۸صvÿº¶&™¬úi/…—1òA·×&³5Ïu ÏÎö7zlFàºöŒðć¡ øˆ8;g–äVý¹¶·Ôî$k‹©c Æyª¯%ðññ51\(`ÐRk Am#žÆ5i®#¸$)Ì)y“ô©½žìÅå÷Þ¦r1fFÀ’\ò¢®1·\o@0Ó-fÖç[™‡ ¼mî.v~mçÈtñ6äUD  •ŒQGKJ`Ò³  (¢€(¢Š¢Š( d%£‘ц °È#åTíW°jÒô[‘hNæÙÆb'˪úf®tP¶ãB׬ï´þôÅ âA“õ–µÉÊI ÃÄúì•®X!8&‰$_PGހ㓱¹·xû—˱èyÖ^HÈCˆ#‘6~91ƒãŒrõ®²ÝŸÑ›âÒ,ÎÙ?µg¥ÀÜQi¶q·Š@ ÿ*”Â./†Ý¦¸>–ûïý)å‡cµK—Y$Ž;5<ä»É};}k£… P€¯hºOeôý*A8V¸ºÿ>|3á—ÒQEQEEPÿÙpgsphere/doc/img/sphere.jpg000066400000000000000000000101221332443031700162000ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ ŽŽÿÄÿÄ@!1AQa"2q‘¡#3BR±br’ÁÑ$Ss‚Ò&4c¢TáðÿÚ?ûýQEQEQEQEQEV/"D…äuDQ’ÌpJoH¬šu‚ÔKw+Ê!_e€ÆHf!N3К^]~U YôÛ`¼Ì×|D|@úÖ«WUÔÝͭƘaëÛˆøð‡È b}JþÉøn.4–ÛeiL-õâÍe¤–­‘tVÙ” —aÂzlÞï–sOÚêv7ŽRÞîsU<…7EQEQEAÔ="+)µÒ­Úöàuû¨»òÙŸÝâEGy.înH{¯®£Ã3LéÁ =ȇ8ßÏyåXj¯kê…ïÅÄWq‘$-v ÇÄ:{$ ‘ÏCεÇé5ž¯{V‘!UÖáãÀ9` ’÷8À5RX"Ô^ú ë¶S”Û˜O†Ho™¬´k–±’ëOdÿáʲ²,aŠ0<ëׯ#Þ*4–XÇwc¨ÝÄ$Ú8A3oÉÀù9ïŒxVÍ;öƒMw¨Ù‰¥¹*Ò5©â1€ à;àoȶäÕ›KÛkèËÛL²pØæ§¸Ž`øG]†Þá,aš$½ÜaUÔY'ÿPkìçƒ{+©aÿÇ!2Çò'#ÈŠB{·Óï’k¸}Y&<J˜³eËmÂzã˜Üâ¨Yê‹qvö’ÄÐÜ.ªÄ"gJFÄrÛ˜ùU (¢Šä½#×$–í´{ zÌÃýþ]ä! ÛƶítØy¥v─ PÄà0ÕE%—S<6ÎÑZri×f“Á;‡ï|»éF)´A¾‹0IodàŽÕ׉AÇ´àó\s<Ç…?¤ÚêZMŒv‘XY¾2^_[l»l~Ï95惩?£úpP[Eêéƒ|rÂ:¶ÀùØúZhwGVµGœ‘‹Î?jG_Χ¡@ØŽ™ºeŽxRX^7PÊÊr=GÈð¨V—ó=új†dÓà µâ&‰ç#Œì1°n\ÎÀŠêT«¨e ©r5;_Ž94K• +oÞõ”½Ò¤*ö>ÂE–@$Åߎ¥Uó€*ž›£cÄdn0ËxHؼA¦è¢¦kÚ²hÚD·gM’?ŠC²ŸÐâ4¸{$%˜¼ŽÅävæìw$ѧ0¸»“LwÕÝq‘Û©bJü’9íÓ5ÖÆUrUà©Z:¦£q­È>Ìæ @zFíþãúWF !èÙÿ§l}ØBü¶þ•]j#ÝCèÍèŽfáÓ®˜˜@˜¥æP¹ Ìc‘Èê)“ou­ã×#km?Ÿ«ö“©ŽKû£Ÿ^ê°UB€€Û)ìæÒ˜Í§!’Û9’Ì]æ>ãû¼çªîîTØÚÚÉÆ“H&—Ž2 s‹…p|{ªÍ@I?dkóFˆ«epQØ(Ç®HÉðbŸ‚º(Ú˜V¤tsÁy«B ßø4hRj·Q’@©¤__±Y Vì÷“ Œv«Úñ#aæEzWÔF&uÓmÏ4ˆ‡™‡‹{«åŸkÐí`Ñ/®t˜ã ÿˆ·|nêve'™*{ú0«ù¬I¨Ópk×-l}6ûcÒw€w¨;ŸºgL‘ãØÌÅ¥¶ c»Æ}Æ>8Þ¦°°™îG$“q,Œœ¶ „ÏÓëU«ÃÈ×Åí½›Ùbb2Š I?]ª„mÂõž­$cD¹i_ …âÁ;õ§ì´¡ooAyunÊ€’q.zû,ùSéoª/¹ª¡ÿRØô"˜Ž dóÕ-‡ÂÐÿΕµ²½:íì2êÓ©x¢”˜cDã÷—¨8ÇåUWA°r ÊËvÃñR´ƒùIáúUH£Ž * äª0•n Hk1ÉêÉ{n¥®lÛ¶@9ºãÛO5Ïž)øî¡–ÕnVEìYÉÀá#9ùT¶¸›\û;FxtïÇr6i‡t}Ã÷¾]õZ¢·…!†5Ž$*ª0©:ÜÏg5¥ÌDó7ª ž|~éñá`ÀšÝ¥®¯¦ÚGî%´ª2wÀìñVh# Šø¸Œ“.xg†Nž„>º#ÜvshQÞ+ÍIøìã‡üÉã_¯ÿUÒÁ'*~))¸Þ•fúKlÝ&µ‘<Õ”¡j°­[V`Ôùµ¸­of{r61Á¸SûÍυLÒtÖ’æk Qƒ%±Ãh˜‚9$g`_#}†ÕÔ‚ÀåXMc"˜‚òû¹‘‡ƒT¡Ÿ4çÍFÞë©Sð5¯JÔàJ·õ›˜‘Ñ{6.àn§„óøS‹®Z·Üv×§c0ùãZÚ.µ;¢¶ŠÕ<íÆÃý«·þÕ±4È¥`÷ÓIxÀä,¸‚ ¾y5Q\(`ÐTk Am#žÆ5i®#¸$)Ì)‹r- ÜÛ8ÌDøu_,Ô ^²¶ÓûP?'ˆ|†OÌ š×&7)$|.?äpk ØÜÛ¼}‹Œ‰eØô<ë¯$d!ÄÈ›?˜ÁïÆ9yÖèEÅãp۴׺Òß]ÿ¥\°ô;T¹u’Hã³SÎIÛ´—ȷκí'Ñ}?JN®.¿ÏŸ ÃøG%ò«TQEQEQEk–gN ¢I¹Ôõ¤›Ñý½í"Àüm“ûVqhÚ\ Å›gw¤ éN… P€¯h¢Š(¢¿ÿÙpgsphere/doc/img/sphere.xcf000066400000000000000000001202061332443031700162050ustar00rootroot00000000000000gimp xcf file  B÷šB÷š o(xžë  textÿ       4  dÒ2BRb0ð¹þÿ<ÿ;üÿÿÿ8ÿÿ7þÿþÿ4ÿ=þÿ ȹþÿ<ÿ;üÿÿÿ8ÿÿ7þÿþÿ4ÿ=þÿ Èÿ9þÿÿ<ÿ<ÿ<ÿ<ÿþÿ8ÿ zÿ9þÿÿ<ÿ<ÿ<ÿ<ÿþÿ8ÿ zØþÿÿÿÿÿÿþÿg°ÿÿÿÿÿÿÿüÿÿÿüÿÿÿÿÿÿÿ*Øþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿüÿÿÿüÿÿÿÿÿÿÿ*Vþÿ=þÿ=þÿ=þÿ=ÿ=ÿ=üÿÿÿ6ÿå$ÿÿ8ÿÿ:ÿ<ÿ<ÿ:ÿÿ8ÿÿT$ÿÿ8ÿÿ:ÿ<ÿ<ÿ+þÿ ÿÿ*þÿ ÿÿ)þÿ=þÿ=ÿ=ÿ=üÿÿÿ6ÿåPP((  axisÿ     É  å`l  , z W Õ@P¹þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=þÿþ  ¹þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=þÿþÿ=þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ4þ ÿþ }þ = >þ =þ =þ >þ =þ =þ = >þ =þ =þ >þ =þ =þ = >þ =þ =þ >þ =þ =þ = >þ =þ = >þ =þ =þ = 4þÿ=þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=þÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ4 ?þÿ<ÿ=þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ ?þ < =þ < < < =þ <þ < < < =þ <þ < < =þ <þ < < < =þ <þ < <  ?þÿ<ÿ=þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ<ÿ=þÿ<þÿ<ÿ<ÿ þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=ÿ<ÿ8ÿÿ3ÿÿ/ÿ ÿ,þÿÿ'ÿÿ#ÿÿÿÿþÿ ÿþÿ$ÿÿ)ÿÿ-ÿ þÿ0ÿþÿ5ÿþÿ<ÿ<ÿ=þÿ<þÿ<ÿ=þÿþ þ =þ = >þ =þ =þ = >þ =þ = >þ =þ =þ = >þ =þ = >þ =þ = < 8  3  /   ,þ  '  #    þ   þ $  )  -  þ 0 þ 5 þ < < =þ <þ < =þ þ þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=þÿ=ÿ>þÿ=þÿ=ÿ>þÿ=þÿ=ÿ<ÿ8ÿÿ3ÿÿ/ÿ ÿ,þÿÿ'ÿÿ#ÿÿÿÿþÿ ÿþÿ$ÿÿ)ÿÿ-ÿ þÿ0ÿþÿ5ÿþÿ<ÿ<ÿ=þÿ<þÿ<ÿ=þÿþ þÿÿÿÿÿÿÿÿÿÿ£ þ     þ T þÿÿÿÿÿÿÿÿÿÿ£+ÿ=þÿ;ÿ;ÿ;ÿ;ÿ<ÿ<ÿ;ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ=þÿç+ =þ =þ <þ <þ <þ <þ =þ <þ <þ <þ |þ <þ <þ |þ <þ <þ |þ <þ <þ ¼þ <þ e+ÿ=þÿ;ÿ;ÿ;ÿ;ÿ<ÿ<ÿ;ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ;ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ=þÿçPP((  helpÿ       5  eu…•¥ÃÓãóÏÿ<ÿ<ÿ ®PP((ŽŽSphereÿ      ¾ŽŽڞӞߎŽ -LHVIÝm„•Ø™«›hžÃüÿûòÄÊ®ÿ5ÿöê±–}¯²Äÿ1ÿòôϱy‘ªËÞôôõôöÿ.ÿõùÍ’p€Èëñòóôôüòðäÿ,ÿíÛ¦}£Ò×~ÈòòÏ»››® ‚tÿ)ÿêþÀ†ŒÊéîïðºqœš¼âïòöä€Ùÿ'ÿèû·…¤Öêìí8§˜˜óôõõöæ€Ô÷ÿ&ÿçÊ„ŸÚêììê¾›ÀèòäxØôõõðŠÈ÷÷ÿ#ÿäþÕŒÒèéëìÍ’¼îðñòò²ôõô£¥÷õÓÿ"ÿãø£zÂàâÔÂâ‰àëððñòóíwÑõÊ…îÓ‹ ÿ!ÿâÖ{k“”Œš³¢l•‹€Š˜»ßóô±Žé~Ô–áøÿÿàô¬q’¹ÞåèêÚ‚Óîïðìéʰ‹~Ãk‡jl¡¨™ŽÿÿñÖ~†ÍâäæèéâˆÌîîðððñíÔͶyknljj‰ÐäïÿÿÝý¿h“Øáãäæèé¡°ìîÜή ƒŠ§¬¡pnmnk—™€‡¯ÿÿÜý®h“ÜÞâãåçèÍÀ¨€—¦ÆÕðòÜž„nkr ¬~Þ÷ßÉÿÿÜ®t•ÛÜàãäæâ´|„¬Êîïðïð䟊Ȧlžœµöµxà÷øÿÿÛ¸š”×ÚÞá⽑‰®wäìîîïð騂Èò²nšô“µöö¾wÐøÿÿàÀ¯ˆÕÙÜÖ¦†£×èÊzììîî︀¶îòÈp‹ñô“µööüÐvÎÿÿÙÀ¼ŠÊ×΢ˆ¸ÝåæèÄzììî׋¢âðñ×s~àôô“Àöö÷÷Èxÿÿâý½À’´Í¥ŠºßãäææèÛuÝæ®‰Îðïðè„pÑôôû’Äöö÷÷þËÿÿâ±·»Š¯„­Úßàãäææè醜„«ìïðïïšm¼óôôû†Ìöö÷÷ÿÛþ¬·Æ…tœÒÚÜàâãäææèè–i·îîïðï¶n”ïòóôôzÛöö÷ÿØ­«Ä¦yÀÖ×ÚÞàâãäææÛŒž¥xËîïðØtzæòòóôôtãõöö÷÷ÿÔÌ›¼j²ÓÖØÛÞàâãäæÅ~Áéê±r›ÖìpÐñòòóôôpæõöõѬzÿÿÓÒŒ²„¤vÐÔÖØÛÝàâä㶆ÐéêëìÛžuwpŠØñòòóôío¾³ z„µßÿÿßà}«„³»…ÐÔÖÙÜÝàâàŸŽÞèéêëìíîÈqu}v~{{ø}j’ªÊâ÷÷ÿÞò‡|·Æ¬ŒÑÕÖÙÜÝàß¡âçèéêëììíqÊððêØØõèóoåõõöö÷÷ÿÿâ …|¼ÀÈ ”ÒÕ×ÚÛÞØƒ­äæçèéêëììÁp˜ððòñòòóópäôõöö÷÷ÿÿàÏt~µ¿ÃÈœ”ÓÔ×ÚÚÎ}¶ãäææèéêëìéywáïððòó÷oäôõöö÷÷ÿÿÏówp¬»¿ÄÈ¢‹ÓÔ×ÚÉ}¸àãäææèèêëì¥o²îïðïððñòòóoäôõõöö÷ÿÿߣiŸ¶»¿ÄÈ·xÔÔ×Ç~ÀààãäææèèêêØuêîîððóñòòópßôôõöö÷ÿ ÿáêk±·¼ÁÆÉÃnÈÕÆ|ºÝßáâäåæçèéêšo¿îîðþñòò÷vÒôôõöö÷ÿ ÿᣩ²·¾ÂÆÈ̈›Ê}²ÛÜÞáâääæçèéÍr…ìîîðüïððòòúÇôôõöö ÿÓçn¡¯²·¾ÂÆÈ̶n~¨ØÚÜÞàâãäæçèèpËìíîîïðïððñòòŒÂôôüõööÿ ÿÌü”}¦¯´¸¾ÂÆÈÌÍw|ÔØÚÛÝàâãäææçÈpŒëììîîïððïðñòò’ºóôôõööÿ ÿÚÖd“¨¯¶¹¾ÂÆÈ̘‡p¦ØÚÚÝàáâäåæçpÈêììíîîïððõñò’´óôôõõöÿ ÿØüŒh¤¨°µ¸¾ÀÆÈ©Ì³n©ÚÚÝàáâãäæÊpéêëììîîïïððöñ’²óóôôõõÿ ÿØÔ|w¤¨°µ¸¾ÀÆ´zÆÐÓ¶n¢ÖÜßàâãäæ˜oÁéêëììíîïïððöñ’°òóôôõõÿ ÿÞŸŽ|¤¨°µ¸¾À¾{´ÎÐÒÕ¼t†ÉÞàâãäÒp€äéêêììîïðû’¯òóôôþõÿ ÿÖ艤¨°µº¾Àˆ›ÊÍÐÒÔÖÑkŸÙáâä¡n»èèéêëììíîîïðð÷œ®òóóôôõÿ ÿÙÀ‡Š¥©¯µº¾ …ÆÉÍÏÑÔÖ×ÙÄ‚m•Åßrzßçèèêêëììîîð÷ œòòóóôôÿ ÿÙ“žƒ‰¥©¯µ¸¶rºÆÈÌÏÐÓÖ×ÙÚÚÁ‘qpmŒÜçèèéêëììîîþïðð÷¸Šòòéβ›ÿÿÉùˆ£†ˆ¥©¯µ¶€¡ÃÅÈËÎÐÓÖÖÙÚÛÝÞÐxorrz¡ª½ÎÎÔÖÚÜØÕÓÓÉ—t›vwv”²ÿÿÚË—¤Š†¥©¯´›‚¾ÂÅÈÊÎÐÒÔÖØÚÛÜÞÆmâɽ¢š|rorrñsrqpp|‰r³ÌÝòóóÿÿɰ¤•y¥¨¯¬q®¾ÁÅÇÊÍÐÑÔÕÖÙÚÜÝ—n¼ãäææçèéêëêÞßëîïðð¿{ðñòòóóÿÿɰ¡£œn¤¨®†¸¾ÀÄÆÈÍÎÐÒÕÖØÚÛÑtuâãäåæçèéêêëììíîîïðËxêðñòòóÿÿ×󢡠m ¨žsµ¸¼ÀÃÆÈÌÎÐÒÔÖØÚÚµmžââääææçèéêêììîöïÞrßðññòòÿÿȼž£¢¢~ƒ§{–µ¸»¿ÂÅÈËÍÐÒÔÕ×ÙÚ’nÄáâãäåæçèèéêëììíîîïïn×ððññòÿÿüþ•¢££Í™l”v®´·»¿ÁÅÈÊÌÐÑÓÔÖØÐr{àááâäåæçèèéêëëììîîïïnÖððññòÿÿýø{££Òrf–°³¶¹¾ÀÃÆÈËÎÐÑÓÕתl¢ÞààâãäåæçèèéêêëìíîîïqÒïððþñÿÿüÄ’¢££Ó‹f£®²¶¸¾¾ÂÅÈÉÌÐÐÒÔÖmÀÝÞßáâääæççèééêëììíîî~¼ððÿü¡–¢££Úxlz®²¶¸½¾ÁÄÇÉÌÎÐÒÔÐpyÚÜÝßáâãäåæçèèéêêììûíî—²ððÿüŠ¢¢££Øžon‹±µ·»¾ÀÄÆÈÊÎÏÑÓ­lžÚÛÜÞàâããäææçèééêëììùî›®ïðïððüÿûòÄÊ®ÿ5ÿöê±–}¯²Äÿ1ÿòôϱy‘ªËÞôôõôöÿ.ÿõùÍ’p€Èëñòóôôüòðäÿ,ÿíÛ¦}£Ò×~ÈòòÏ»››® ‚tÿ)ÿêþÀ†ŒÊéîïðºqœš¼âïòöä€Ùÿ'ÿèû·…¤Öêìí8§˜˜óôõõöæ€Ô÷ÿ&ÿçÊ„ŸÚêììê¾›ÀèòäxØôõõðŠÈ÷÷ÿ#ÿäþÕŒÒèéëìÍ’¼îðñòò²ôõô£¥÷õÓÿ"ÿãø£zÂàâÔÂâ‰àëððñòóíwÑõÊ…îÓ‹ ÿ!ÿâÖ{k“”Œš³¢l•‹€Š˜»ßóô±Žé~Ô–áøÿÿàô¬q’¹ÞåèêÚ‚Óîïðìéʰ‹~Ãk‡jl¡¨™ŽÿÿñÖ~†ÍâäæèéâˆÌîîðððñíÔͶyknljj‰ÐäïÿÿÝý¿h“Øáãäæèé¡°ìîÜή ƒŠ§¬¡pnmnk—™€‡¯ÿÿÜý®h“ÜÞâãåçèÍÀ¨€—¦ÆÕðòÜž„nkr ¬~Þ÷ßÉÿÿÜ®t•ÛÜàãäæâ´|„¬Êîïðïð䟊Ȧlžœµöµxà÷øÿÿÛ¸š”×ÚÞá⽑‰®wäìîîïð騂Èò²nšô“µöö¾wÐøÿÿàÀ¯ˆÕÙÜÖ¦†£×èÊzììîî︀¶îòÈp‹ñô“µööüÐvÎÿÿÙÀ¼ŠÊ×΢ˆ¸ÝåæèÄzììî׋¢âðñ×s~àôô“Àöö÷÷Èxÿÿâý½À’´Í¥ŠºßãäææèÛuÝæ®‰Îðïðè„pÑôôû’Äöö÷÷þËÿÿâ±·»Š¯„­Úßàãäææè醜„«ìïðïïšm¼óôôû†Ìöö÷÷ÿÛþ¬·Æ…tœÒÚÜàâãäææèè–i·îîïðï¶n”ïòóôôzÛöö÷ÿØ­«Ä¦yÀÖ×ÚÞàâãäææÛŒž¥xËîïðØtzæòòóôôtãõöö÷÷ÿÔÌ›¼j²ÓÖØÛÞàâãäæÅ~Áéê±r›ÖìpÐñòòóôôpæõöõѬzÿÿÓÒŒ²„¤vÐÔÖØÛÝàâä㶆ÐéêëìÛžuwpŠØñòòóôío¾³ z„µßÿÿßà}«„³»…ÐÔÖÙÜÝàâàŸŽÞèéêëìíîÈqu}v~{{ø}j’ªÊâ÷÷ÿÞò‡|·Æ¬ŒÑÕÖÙÜÝàß¡âçèéêëììíqÊððêØØõèóoåõõöö÷÷ÿÿâ …|¼ÀÈ ”ÒÕ×ÚÛÞØƒ­äæçèéêëììÁp˜ððòñòòóópäôõöö÷÷ÿÿàÏt~µ¿ÃÈœ”ÓÔ×ÚÚÎ}¶ãäææèéêëìéywáïððòó÷oäôõöö÷÷ÿÿÏówp¬»¿ÄÈ¢‹ÓÔ×ÚÉ}¸àãäææèèêëì¥o²îïðïððñòòóoäôõõöö÷ÿÿߣiŸ¶»¿ÄÈ·xÔÔ×Ç~ÀààãäææèèêêØuêîîððóñòòópßôôõöö÷ÿ ÿáêk±·¼ÁÆÉÃnÈÕÆ|ºÝßáâäåæçèéêšo¿îîðþñòò÷vÒôôõöö÷ÿ ÿᣩ²·¾ÂÆÈ̈›Ê}²ÛÜÞáâääæçèéÍr…ìîîðüïððòòúÇôôõöö ÿÓçn¡¯²·¾ÂÆÈ̶n~¨ØÚÜÞàâãäæçèèpËìíîîïðïððñòòŒÂôôüõööÿ ÿÌü”}¦¯´¸¾ÂÆÈÌÍw|ÔØÚÛÝàâãäææçÈpŒëììîîïððïðñòò’ºóôôõööÿ ÿÚÖd“¨¯¶¹¾ÂÆÈ̘‡p¦ØÚÚÝàáâäåæçpÈêììíîîïððõñò’´óôôõõöÿ ÿØüŒh¤¨°µ¸¾ÀÆÈ©Ì³n©ÚÚÝàáâãäæÊpéêëììîîïïððöñ’²óóôôõõÿ ÿØÔ|w¤¨°µ¸¾ÀÆ´zÆÐÓ¶n¢ÖÜßàâãäæ˜oÁéêëììíîïïððöñ’°òóôôõõÿ ÿÞŸŽ|¤¨°µ¸¾À¾{´ÎÐÒÕ¼t†ÉÞàâãäÒp€äéêêììîïðû’¯òóôôþõÿ ÿÖ艤¨°µº¾Àˆ›ÊÍÐÒÔÖÑkŸÙáâä¡n»èèéêëììíîîïðð÷œ®òóóôôõÿ ÿÙÀ‡Š¥©¯µº¾ …ÆÉÍÏÑÔÖ×ÙÄ‚m•Åßrzßçèèêêëììîîð÷ œòòóóôôÿ ÿÙ“žƒ‰¥©¯µ¸¶rºÆÈÌÏÐÓÖ×ÙÚÚÁ‘qpmŒÜçèèéêëììîîþïðð÷¸Šòòéβ›ÿÿÉùˆ£†ˆ¥©¯µ¶€¡ÃÅÈËÎÐÓÖÖÙÚÛÝÞÐxorrz¡ª½ÎÎÔÖÚÜØÕÓÓÉ—t›vwv”²ÿÿÚË—¤Š†¥©¯´›‚¾ÂÅÈÊÎÐÒÔÖØÚÛÜÞÆmâɽ¢š|rorrñsrqpp|‰r³ÌÝòóóÿÿɰ¤•y¥¨¯¬q®¾ÁÅÇÊÍÐÑÔÕÖÙÚÜÝ—n¼ãäææçèéêëêÞßëîïðð¿{ðñòòóóÿÿɰ¡£œn¤¨®†¸¾ÀÄÆÈÍÎÐÒÕÖØÚÛÑtuâãäåæçèéêêëììíîîïðËxêðñòòóÿÿ×󢡠m ¨žsµ¸¼ÀÃÆÈÌÎÐÒÔÖØÚÚµmžââääææçèéêêììîöïÞrßðññòòÿÿȼž£¢¢~ƒ§{–µ¸»¿ÂÅÈËÍÐÒÔÕ×ÙÚ’nÄáâãäåæçèèéêëììíîîïïn×ððññòÿÿüþ•¢££Í™l”v®´·»¿ÁÅÈÊÌÐÑÓÔÖØÐr{àááâäåæçèèéêëëììîîïïnÖððññòÿÿýø{££Òrf–°³¶¹¾ÀÃÆÈËÎÐÑÓÕתl¢ÞààâãäåæçèèéêêëìíîîïqÒïððþñÿÿüÄ’¢££Ó‹f£®²¶¸¾¾ÂÅÈÉÌÐÐÒÔÖmÀÝÞßáâääæççèééêëììíîî~¼ððÿü¡–¢££Úxlz®²¶¸½¾ÁÄÇÉÌÎÐÒÔÐpyÚÜÝßáâãäåæçèèéêêììûíî—²ððÿüŠ¢¢££Øžon‹±µ·»¾ÀÄÆÈÊÎÏÑÓ­lžÚÛÜÞàâããäææçèééêëììùî›®ïðïððüÿûòÄÊ®ÿ5ÿöê±–}¯²Äÿ1ÿòôϱy‘ªËÞôôõôöÿ.ÿõùÍ’p€Èëñòóôôüòðäÿ,ÿíÛ¦}£Ò×~ÈòòÏ»››® ‚tÿ)ÿêþÀ†ŒÊéîïðºqœš¼âïòöä€Ùÿ'ÿèû·…¤Öêìí8§˜˜óôõõöæ€Ô÷ÿ&ÿçÊ„ŸÚêììê¾›ÀèòäxØôõõðŠÈ÷÷ÿ#ÿäþÕŒÒèéëìÍ’¼îðñòò²ôõô£¥÷õÓÿ"ÿãø£zÂàâÔÂâ‰àëððñòóíwÑõÊ…îÓ‹ ÿ!ÿâÖ{k“”Œš³¢l•‹€Š˜»ßóô±Žé~Ô–áøÿÿàô¬q’¹ÞåèêÚ‚Óîïðìéʰ‹~Ãk‡jl¡¨™ŽÿÿñÖ~†ÍâäæèéâˆÌîîðððñíÔͶyknljj‰ÐäïÿÿÝý¿h“Øáãäæèé¡°ìîÜή ƒŠ§¬¡pnmnk—™€‡¯ÿÿÜý®h“ÜÞâãåçèÍÀ¨€—¦ÆÕðòÜž„nkr ¬~Þ÷ßÉÿÿÜ®t•ÛÜàãäæâ´|„¬Êîïðïð䟊Ȧlžœµöµxà÷øÿÿÛ¸š”×ÚÞá⽑‰®wäìîîïð騂Èò²nšô“µöö¾wÐøÿÿàÀ¯ˆÕÙÜÖ¦†£×èÊzììîî︀¶îòÈp‹ñô“µööüÐvÎÿÿÙÀ¼ŠÊ×΢ˆ¸ÝåæèÄzììî׋¢âðñ×s~àôô“Àöö÷÷Èxÿÿâý½À’´Í¥ŠºßãäææèÛuÝæ®‰Îðïðè„pÑôôû’Äöö÷÷þËÿÿâ±·»Š¯„­Úßàãäææè醜„«ìïðïïšm¼óôôû†Ìöö÷÷ÿÛþ¬·Æ…tœÒÚÜàâãäææèè–i·îîïðï¶n”ïòóôôzÛöö÷ÿØ­«Ä¦yÀÖ×ÚÞàâãäææÛŒž¥xËîïðØtzæòòóôôtãõöö÷÷ÿÔÌ›¼j²ÓÖØÛÞàâãäæÅ~Áéê±r›ÖìpÐñòòóôôpæõöõѬzÿÿÓÒŒ²„¤vÐÔÖØÛÝàâä㶆ÐéêëìÛžuwpŠØñòòóôío¾³ z„µßÿÿßà}«„³»…ÐÔÖÙÜÝàâàŸŽÞèéêëìíîÈqu}v~{{ø}j’ªÊâ÷÷ÿÞò‡|·Æ¬ŒÑÕÖÙÜÝàß¡âçèéêëììíqÊððêØØõèóoåõõöö÷÷ÿÿâ …|¼ÀÈ ”ÒÕ×ÚÛÞØƒ­äæçèéêëììÁp˜ððòñòòóópäôõöö÷÷ÿÿàÏt~µ¿ÃÈœ”ÓÔ×ÚÚÎ}¶ãäææèéêëìéywáïððòó÷oäôõöö÷÷ÿÿÏówp¬»¿ÄÈ¢‹ÓÔ×ÚÉ}¸àãäææèèêëì¥o²îïðïððñòòóoäôõõöö÷ÿÿߣiŸ¶»¿ÄÈ·xÔÔ×Ç~ÀààãäææèèêêØuêîîððóñòòópßôôõöö÷ÿ ÿáêk±·¼ÁÆÉÃnÈÕÆ|ºÝßáâäåæçèéêšo¿îîðþñòò÷vÒôôõöö÷ÿ ÿᣩ²·¾ÂÆÈ̈›Ê}²ÛÜÞáâääæçèéÍr…ìîîðüïððòòúÇôôõöö ÿÓçn¡¯²·¾ÂÆÈ̶n~¨ØÚÜÞàâãäæçèèpËìíîîïðïððñòòŒÂôôüõööÿ ÿÌü”}¦¯´¸¾ÂÆÈÌÍw|ÔØÚÛÝàâãäææçÈpŒëììîîïððïðñòò’ºóôôõööÿ ÿÚÖd“¨¯¶¹¾ÂÆÈ̘‡p¦ØÚÚÝàáâäåæçpÈêììíîîïððõñò’´óôôõõöÿ ÿØüŒh¤¨°µ¸¾ÀÆÈ©Ì³n©ÚÚÝàáâãäæÊpéêëììîîïïððöñ’²óóôôõõÿ ÿØÔ|w¤¨°µ¸¾ÀÆ´zÆÐÓ¶n¢ÖÜßàâãäæ˜oÁéêëììíîïïððöñ’°òóôôõõÿ ÿÞŸŽ|¤¨°µ¸¾À¾{´ÎÐÒÕ¼t†ÉÞàâãäÒp€äéêêììîïðû’¯òóôôþõÿ ÿÖ艤¨°µº¾Àˆ›ÊÍÐÒÔÖÑkŸÙáâä¡n»èèéêëììíîîïðð÷œ®òóóôôõÿ ÿÙÀ‡Š¥©¯µº¾ …ÆÉÍÏÑÔÖ×ÙÄ‚m•Åßrzßçèèêêëììîîð÷ œòòóóôôÿ ÿÙ“žƒ‰¥©¯µ¸¶rºÆÈÌÏÐÓÖ×ÙÚÚÁ‘qpmŒÜçèèéêëììîîþïðð÷¸Šòòéβ›ÿÿÉùˆ£†ˆ¥©¯µ¶€¡ÃÅÈËÎÐÓÖÖÙÚÛÝÞÐxorrz¡ª½ÎÎÔÖÚÜØÕÓÓÉ—t›vwv”²ÿÿÚË—¤Š†¥©¯´›‚¾ÂÅÈÊÎÐÒÔÖØÚÛÜÞÆmâɽ¢š|rorrñsrqpp|‰r³ÌÝòóóÿÿɰ¤•y¥¨¯¬q®¾ÁÅÇÊÍÐÑÔÕÖÙÚÜÝ—n¼ãäææçèéêëêÞßëîïðð¿{ðñòòóóÿÿɰ¡£œn¤¨®†¸¾ÀÄÆÈÍÎÐÒÕÖØÚÛÑtuâãäåæçèéêêëììíîîïðËxêðñòòóÿÿ×󢡠m ¨žsµ¸¼ÀÃÆÈÌÎÐÒÔÖØÚÚµmžââääææçèéêêììîöïÞrßðññòòÿÿȼž£¢¢~ƒ§{–µ¸»¿ÂÅÈËÍÐÒÔÕ×ÙÚ’nÄáâãäåæçèèéêëììíîîïïn×ððññòÿÿüþ•¢££Í™l”v®´·»¿ÁÅÈÊÌÐÑÓÔÖØÐr{àááâäåæçèèéêëëììîîïïnÖððññòÿÿýø{££Òrf–°³¶¹¾ÀÃÆÈËÎÐÑÓÕתl¢ÞààâãäåæçèèéêêëìíîîïqÒïððþñÿÿüÄ’¢££Ó‹f£®²¶¸¾¾ÂÅÈÉÌÐÐÒÔÖmÀÝÞßáâääæççèééêëììíîî~¼ððÿü¡–¢££Úxlz®²¶¸½¾ÁÄÇÉÌÎÐÒÔÐpyÚÜÝßáâãäåæçèèéêêììûíî—²ððÿüŠ¢¢££Øžon‹±µ·»¾ÀÄÆÈÊÎÏÑÓ­lžÚÛÜÞàâããäææçèééêëììùî›®ïðïððÿÀÿ”–‰z˜–˜¬´åôççÿÿþûÿ'ÿÚúÆÂÜÝÝóɳ¬†€ ¼ÔÚäôíÿ(ÿøò´”Ü÷øøùùúóô×°Ž¿âòùðëòèÿ$ÿý޵øøùúîûúöòòÞµ|›Þìêèæîïþÿ!ÿퟎ²ÊöùùúúÙ¼––›–±ÂÃÃõ²uŸ‘|޼Ðùÿÿñ÷öóÝ´…ž¿—вÈôøûûüôüøê¾‰Ÿèÿÿøøð¾‰•ôûûüûúÆ™òüüùÓêÿÿôøÜ¢‹¾èúö­Œïûû üûÔ’ñüýýúøÎЍêÿÿú”˜Ñùùúúùù©˜ùûûü üüÔŽøýýúùćµäÿÿýãøùùúúøÕûûü üýüµ¬üýýùüôªÞðÿÿøíÖÃÀÁ¬¢š˜w~–Ÿ¢µÃÃÌéüüýý‰ÙýýûÏ~ÚÛÿÿᆋ¨ººÀÌæòóÃ{óïäϼ¼¹˜†‹“ ¾Ô÷ýÍ—ýýúæ‚·üõÿÿøùúúûÊ|ûûüüõûêâÀ²†”ªtßýýúꇫòêÿÿûÈàùùúúúû¼‘ûûü üý÷ñבw¾æüýýøêŸ×ýôÿýÿÿù¤†ƒªÏðúúúûˆÁûûü üý÷»ªïÄŽÃðýýùä¨íðêêÿÿøóëÛ|•Ç÷Öxðûûüüýýؤýýùó¿’ ÜüýýùËÀöýòúÿ ÿøù÷úΠ{x©ûûüüýýÚšýýïé¡Îýýûšëýãúýÿòýÿ ÿøùúøõ––еëüüýýѪýýóõ²”Êýä ýøç¢öÿ ÿîÌøøùùúô“’õûè´‚ Ýûüüýý³¬ýýóò¼’Ó›èüØ¢y×ûÿ ÿözÕøùùኛóûû÷ôÈŽÒùüüýýý˜Ëý ýôþî§|µòýøÐy¼ÿ ÿöÉxÜõÁ|¼úúûûüúÏŽŒÔúýýüïväý ýþöãzˆÎüý¾uïÿÿùø¸t„ŒàúúûüùýÖ‰×üýýýÁ”ý ýþõv¥€¾ìî’Ï÷êÿÿúÈŽ}qèúúûüýûÚ†Œßþþý‚Êþþýþõ•¾ÚÒýòˆÏôÿÿ÷ŒÏô¦‚òúúûûüýõþûÍ€¡ìþĆøþþýþóúÀ±þù²¾úî…Øêÿÿ÷öøøõ—õúûûüýþùõ¸|€ÕþþýùþýýþÖ²þþùªøÖŠòÿÿøùøûûüüýþûæwtÝþþýÖ²þþùà¦÷²µøÿÿþ÷øøúùßxÀûüüýþÿùÀ{Á~´úþ þýÖ²þþøýá¦ùˆÜóÿÿþ÷øøúùúÖvÕüüýþÿöÚsÞÿñš‡æÿþ þýβþþýúæ£Î˜üÿÿþ÷øøõùúú´yìüüýýþþÿü×qÍÿÿúÎyÀþÿþþüý²µýýú顇Øàÿÿþ÷øøõùúúù¡ŽúüýýþþÿüÖrÈÿÿúï‘—ðÿþþüýžÕýýúáv˜úõÿÿ÷øþùúúúòˆªûýþþÿüÒrÉÿÿúù¶ƒÝÿþþýyæýýûДøßÿÿ÷øþùúúúûäuÐýþþÿûý³xÒÿ ÿûÔ|Äýþþý׆ý ýô§¬íéÿÿ÷÷øøùúúüüÆwèþþÿûíÿ ÿûê¨üþþü¨¶þýýôÌn¼ôÿÿ÷÷øøùúúüõ ŽùþþÿÖ~ ÷ÿ ÿûúš’øþþüxèþýýñâ§èãÿö÷÷øøùúúüüöñ‚®þì˜{Ôþÿÿûþº„ëþþû¼—þþýýçüªÑŒ÷ïö÷÷øøùúúûüüýÝt¬v£ñÿÿöÂ~äþû|Üþþý ýéŠü—¿ðö÷÷øøùúúûüü÷ÅrkÒþÿÿ÷Îݾ’ýþþý ýé”ýê‚îöö÷÷øùúúûïÀ~‹ÍŠ¡þÿÿûß~näþþ ýé£ýý°¿öö÷÷øùøâ©uÓüþéqÓÿÿûþ–oÕþþ ýî£ýýð~õöö÷ì·…t¤ßüýþþü¾zóÿÿøÄÞ{×þþý ýþ˜ýýñ²õ׳‰nÈöûüüýýþþýŸÿÿöÙsâÿå€àþþýýþƒýýñèrw”½è÷ùúúûüüýþþüètÏÿÿõò}Èÿÿþá„ãþýýýù„ýýñüÔêöö÷øøùúûüüýþþûÿ¾‚ôÿÿô÷ˆ¢ýÿÿþþÐêýýëÞ¢ýýüýôõõö÷÷øùúúûüýýþþüúŽ­ÿÿû÷Ž™ûÿÿþüÀ‰÷ýýü̱ýüüôóõöö÷÷øùúûüüýþþûÿÞsáÿ ÿû÷‘“þÿÿþü¹™üýýü¬Õýüüðóôôõö÷÷øùúúüüýýþþüÿ«†ÿ ÿûö”üÿÿþüûœ¶ýýý…ïüüðóôôõö÷÷øøùúûüüýþþûÿ÷~Àÿ ÿûð‰›ýÿÿþôýùŠÌýýüýýؘüüóôóõö÷÷øøúûûüýýþþûÿÎyòÿÿûÙ{¢ûÿÿþýüåƒèüüý Èüüîòóóôôõö÷÷øùúûüüýýþþü”¤þÿÿúþÊq¿üÿÿþý÷Γöüüõ~óüüòóñôõöö÷øøúúûüüýýþþüærÜÿÿûô¤xÐÿÿþýøü¬¨üüµ©üüòïóôôõö÷÷øùúúûüüýýþþü¯‘þÿÿûÜ‚ŽîÿÿþýüùóØú|êüüàñòòóóôôõö÷÷øùúúûüüýýþþñwÌÿÿ÷«rºÿÿþýüûÞ…§ üüñòóçôõõö÷÷øùúûûüüýýþþÂ~÷ÏŒåÿÿþýüü«nïüüÀÿ”–‰z˜–˜¬´åôççÿÿþûÿ'ÿÚúÆÂÜÝÝóɳ¬†€ ¼ÔÚäôíÿ(ÿøò´”Ü÷øøùùúóô×°Ž¿âòùðëòèÿ$ÿý޵øøùúîûúöòòÞµ|›Þìêèæîïþÿ!ÿퟎ²ÊöùùúúÙ¼––›–±ÂÃÃõ²uŸ‘|޼Ðùÿÿñ÷öóÝ´…ž¿—вÈôøûûüôüøê¾‰Ÿèÿÿøøð¾‰•ôûûüûúÆ™òüüùÓêÿÿôøÜ¢‹¾èúö­Œïûû üûÔ’ñüýýúøÎЍêÿÿú”˜Ñùùúúùù©˜ùûûü üüÔŽøýýúùćµäÿÿýãøùùúúøÕûûü üýüµ¬üýýùüôªÞðÿÿøíÖÃÀÁ¬¢š˜w~–Ÿ¢µÃÃÌéüüýý‰ÙýýûÏ~ÚÛÿÿᆋ¨ººÀÌæòóÃ{óïäϼ¼¹˜†‹“ ¾Ô÷ýÍ—ýýúæ‚·üõÿÿøùúúûÊ|ûûüüõûêâÀ²†”ªtßýýúꇫòêÿÿûÈàùùúúúû¼‘ûûü üý÷ñבw¾æüýýøêŸ×ýôÿýÿÿù¤†ƒªÏðúúúûˆÁûûü üý÷»ªïÄŽÃðýýùä¨íðêêÿÿøóëÛ|•Ç÷Öxðûûüüýýؤýýùó¿’ ÜüýýùËÀöýòúÿ ÿøù÷úΠ{x©ûûüüýýÚšýýïé¡Îýýûšëýãúýÿòýÿ ÿøùúøõ––еëüüýýѪýýóõ²”Êýä ýøç¢öÿ ÿîÌøøùùúô“’õûè´‚ Ýûüüýý³¬ýýóò¼’Ó›èüØ¢y×ûÿ ÿözÕøùùኛóûû÷ôÈŽÒùüüýýý˜Ëý ýôþî§|µòýøÐy¼ÿ ÿöÉxÜõÁ|¼úúûûüúÏŽŒÔúýýüïväý ýþöãzˆÎüý¾uïÿÿùø¸t„ŒàúúûüùýÖ‰×üýýýÁ”ý ýþõv¥€¾ìî’Ï÷êÿÿúÈŽ}qèúúûüýûÚ†Œßþþý‚Êþþýþõ•¾ÚÒýòˆÏôÿÿ÷ŒÏô¦‚òúúûûüýõþûÍ€¡ìþĆøþþýþóúÀ±þù²¾úî…Øêÿÿ÷öøøõ—õúûûüýþùõ¸|€ÕþþýùþýýþÖ²þþùªøÖŠòÿÿøùøûûüüýþûæwtÝþþýÖ²þþùà¦÷²µøÿÿþ÷øøúùßxÀûüüýþÿùÀ{Á~´úþ þýÖ²þþøýá¦ùˆÜóÿÿþ÷øøúùúÖvÕüüýþÿöÚsÞÿñš‡æÿþ þýβþþýúæ£Î˜üÿÿþ÷øøõùúú´yìüüýýþþÿü×qÍÿÿúÎyÀþÿþþüý²µýýú顇Øàÿÿþ÷øøõùúúù¡ŽúüýýþþÿüÖrÈÿÿúï‘—ðÿþþüýžÕýýúáv˜úõÿÿ÷øþùúúúòˆªûýþþÿüÒrÉÿÿúù¶ƒÝÿþþýyæýýûДøßÿÿ÷øþùúúúûäuÐýþþÿûý³xÒÿ ÿûÔ|Äýþþý׆ý ýô§¬íéÿÿ÷÷øøùúúüüÆwèþþÿûíÿ ÿûê¨üþþü¨¶þýýôÌn¼ôÿÿ÷÷øøùúúüõ ŽùþþÿÖ~ ÷ÿ ÿûúš’øþþüxèþýýñâ§èãÿö÷÷øøùúúüüöñ‚®þì˜{Ôþÿÿûþº„ëþþû¼—þþýýçüªÑŒ÷ïö÷÷øøùúúûüüýÝt¬v£ñÿÿöÂ~äþû|Üþþý ýéŠü—¿ðö÷÷øøùúúûüü÷ÅrkÒþÿÿ÷Îݾ’ýþþý ýé”ýê‚îöö÷÷øùúúûïÀ~‹ÍŠ¡þÿÿûß~näþþ ýé£ýý°¿öö÷÷øùøâ©uÓüþéqÓÿÿûþ–oÕþþ ýî£ýýð~õöö÷ì·…t¤ßüýþþü¾zóÿÿøÄÞ{×þþý ýþ˜ýýñ²õ׳‰nÈöûüüýýþþýŸÿÿöÙsâÿå€àþþýýþƒýýñèrw”½è÷ùúúûüüýþþüètÏÿÿõò}Èÿÿþá„ãþýýýù„ýýñüÔêöö÷øøùúûüüýþþûÿ¾‚ôÿÿô÷ˆ¢ýÿÿþþÐêýýëÞ¢ýýüýôõõö÷÷øùúúûüýýþþüúŽ­ÿÿû÷Ž™ûÿÿþüÀ‰÷ýýü̱ýüüôóõöö÷÷øùúûüüýþþûÿÞsáÿ ÿû÷‘“þÿÿþü¹™üýýü¬Õýüüðóôôõö÷÷øùúúüüýýþþüÿ«†ÿ ÿûö”üÿÿþüûœ¶ýýý…ïüüðóôôõö÷÷øøùúûüüýþþûÿ÷~Àÿ ÿûð‰›ýÿÿþôýùŠÌýýüýýؘüüóôóõö÷÷øøúûûüýýþþûÿÎyòÿÿûÙ{¢ûÿÿþýüåƒèüüý Èüüîòóóôôõö÷÷øùúûüüýýþþü”¤þÿÿúþÊq¿üÿÿþý÷Γöüüõ~óüüòóñôõöö÷øøúúûüüýýþþüærÜÿÿûô¤xÐÿÿþýøü¬¨üüµ©üüòïóôôõö÷÷øùúúûüüýýþþü¯‘þÿÿûÜ‚ŽîÿÿþýüùóØú|êüüàñòòóóôôõö÷÷øùúúûüüýýþþñwÌÿÿ÷«rºÿÿþýüûÞ…§ üüñòóçôõõö÷÷øùúûûüüýýþþÂ~÷ÏŒåÿÿþýüü«nïüüÀÿ”–‰z˜–˜¬´åôççÿÿþûÿ'ÿÚúÆÂÜÝÝóɳ¬†€ ¼ÔÚäôíÿ(ÿøò´”Ü÷øøùùúóô×°Ž¿âòùðëòèÿ$ÿý޵øøùúîûúöòòÞµ|›Þìêèæîïþÿ!ÿퟎ²ÊöùùúúÙ¼––›–±ÂÃÃõ²uŸ‘|޼Ðùÿÿñ÷öóÝ´…ž¿—вÈôøûûüôüøê¾‰Ÿèÿÿøøð¾‰•ôûûüûúÆ™òüüùÓêÿÿôøÜ¢‹¾èúö­Œïûû üûÔ’ñüýýúøÎЍêÿÿú”˜Ñùùúúùù©˜ùûûü üüÔŽøýýúùćµäÿÿýãøùùúúøÕûûü üýüµ¬üýýùüôªÞðÿÿøíÖÃÀÁ¬¢š˜w~–Ÿ¢µÃÃÌéüüýý‰ÙýýûÏ~ÚÛÿÿᆋ¨ººÀÌæòóÃ{óïäϼ¼¹˜†‹“ ¾Ô÷ýÍ—ýýúæ‚·üõÿÿøùúúûÊ|ûûüüõûêâÀ²†”ªtßýýúꇫòêÿÿûÈàùùúúúû¼‘ûûü üý÷ñבw¾æüýýøêŸ×ýôÿýÿÿù¤†ƒªÏðúúúûˆÁûûü üý÷»ªïÄŽÃðýýùä¨íðêêÿÿøóëÛ|•Ç÷Öxðûûüüýýؤýýùó¿’ ÜüýýùËÀöýòúÿ ÿøù÷úΠ{x©ûûüüýýÚšýýïé¡Îýýûšëýãúýÿòýÿ ÿøùúøõ––еëüüýýѪýýóõ²”Êýä ýøç¢öÿ ÿîÌøøùùúô“’õûè´‚ Ýûüüýý³¬ýýóò¼’Ó›èüØ¢y×ûÿ ÿözÕøùùኛóûû÷ôÈŽÒùüüýýý˜Ëý ýôþî§|µòýøÐy¼ÿ ÿöÉxÜõÁ|¼úúûûüúÏŽŒÔúýýüïväý ýþöãzˆÎüý¾uïÿÿùø¸t„ŒàúúûüùýÖ‰×üýýýÁ”ý ýþõv¥€¾ìî’Ï÷êÿÿúÈŽ}qèúúûüýûÚ†Œßþþý‚Êþþýþõ•¾ÚÒýòˆÏôÿÿ÷ŒÏô¦‚òúúûûüýõþûÍ€¡ìþĆøþþýþóúÀ±þù²¾úî…Øêÿÿ÷öøøõ—õúûûüýþùõ¸|€ÕþþýùþýýþÖ²þþùªøÖŠòÿÿøùøûûüüýþûæwtÝþþýÖ²þþùà¦÷²µøÿÿþ÷øøúùßxÀûüüýþÿùÀ{Á~´úþ þýÖ²þþøýá¦ùˆÜóÿÿþ÷øøúùúÖvÕüüýþÿöÚsÞÿñš‡æÿþ þýβþþýúæ£Î˜üÿÿþ÷øøõùúú´yìüüýýþþÿü×qÍÿÿúÎyÀþÿþþüý²µýýú顇Øàÿÿþ÷øøõùúúù¡ŽúüýýþþÿüÖrÈÿÿúï‘—ðÿþþüýžÕýýúáv˜úõÿÿ÷øþùúúúòˆªûýþþÿüÒrÉÿÿúù¶ƒÝÿþþýyæýýûДøßÿÿ÷øþùúúúûäuÐýþþÿûý³xÒÿ ÿûÔ|Äýþþý׆ý ýô§¬íéÿÿ÷÷øøùúúüüÆwèþþÿûíÿ ÿûê¨üþþü¨¶þýýôÌn¼ôÿÿ÷÷øøùúúüõ ŽùþþÿÖ~ ÷ÿ ÿûúš’øþþüxèþýýñâ§èãÿö÷÷øøùúúüüöñ‚®þì˜{Ôþÿÿûþº„ëþþû¼—þþýýçüªÑŒ÷ïö÷÷øøùúúûüüýÝt¬v£ñÿÿöÂ~äþû|Üþþý ýéŠü—¿ðö÷÷øøùúúûüü÷ÅrkÒþÿÿ÷Îݾ’ýþþý ýé”ýê‚îöö÷÷øùúúûïÀ~‹ÍŠ¡þÿÿûß~näþþ ýé£ýý°¿öö÷÷øùøâ©uÓüþéqÓÿÿûþ–oÕþþ ýî£ýýð~õöö÷ì·…t¤ßüýþþü¾zóÿÿøÄÞ{×þþý ýþ˜ýýñ²õ׳‰nÈöûüüýýþþýŸÿÿöÙsâÿå€àþþýýþƒýýñèrw”½è÷ùúúûüüýþþüètÏÿÿõò}Èÿÿþá„ãþýýýù„ýýñüÔêöö÷øøùúûüüýþþûÿ¾‚ôÿÿô÷ˆ¢ýÿÿþþÐêýýëÞ¢ýýüýôõõö÷÷øùúúûüýýþþüúŽ­ÿÿû÷Ž™ûÿÿþüÀ‰÷ýýü̱ýüüôóõöö÷÷øùúûüüýþþûÿÞsáÿ ÿû÷‘“þÿÿþü¹™üýýü¬Õýüüðóôôõö÷÷øùúúüüýýþþüÿ«†ÿ ÿûö”üÿÿþüûœ¶ýýý…ïüüðóôôõö÷÷øøùúûüüýþþûÿ÷~Àÿ ÿûð‰›ýÿÿþôýùŠÌýýüýýؘüüóôóõö÷÷øøúûûüýýþþûÿÎyòÿÿûÙ{¢ûÿÿþýüåƒèüüý Èüüîòóóôôõö÷÷øùúûüüýýþþü”¤þÿÿúþÊq¿üÿÿþý÷Γöüüõ~óüüòóñôõöö÷øøúúûüüýýþþüærÜÿÿûô¤xÐÿÿþýøü¬¨üüµ©üüòïóôôõö÷÷øùúúûüüýýþþü¯‘þÿÿûÜ‚ŽîÿÿþýüùóØú|êüüàñòòóóôôõö÷÷øùúúûüüýýþþñwÌÿÿ÷«rºÿÿþýüûÞ…§ üüñòóçôõõö÷÷øùúûûüüýýþþÂ~÷ÏŒåÿÿþýüü«nïüüÿ’ÿþýÿ ÿþíÿ ÿþÝÿ ÿýÅùÿ ÿý“Øÿ ÿüÙéÿ ÿü˰óÿ ÿüñ‡òÿ ÿûü Ûûÿÿûü¼ìÿÿûüäžéÿÿûüï~ðÿÿúüû„úéÿÿüüƒØðÿÿüü‚Äçÿÿüü‹Üçÿÿúüû—úöÿÿ’ÿþýÿ ÿþíÿ ÿþÝÿ ÿýÅùÿ ÿý“Øÿ ÿüÙéÿ ÿü˰óÿ ÿüñ‡òÿ ÿûü Ûûÿÿûü¼ìÿÿûüäžéÿÿûüï~ðÿÿúüû„úéÿÿüüƒØðÿÿüü‚Äçÿÿüü‹Üçÿÿúüû—úöÿÿ’ÿþýÿ ÿþíÿ ÿþÝÿ ÿýÅùÿ ÿý“Øÿ ÿüÙéÿ ÿü˰óÿ ÿüñ‡òÿ ÿûü Ûûÿÿûü¼ìÿÿûüäžéÿÿûüï~ðÿÿúüû„úéÿÿüüƒØðÿÿüü‚Äçÿÿüü‹Üçÿÿúüû—úöÿÿ€ÿÿüø¢££×‚‡¤—h–²·¸¼¿ÂÅÇÊÌÎÐÒŽl¼ÙÚÜÝàáââääææçèééêëììüœ«ïððÿÆïw¥¤££¡o ¢¦i™´¹¸¾ÀÄÆÈÊÌÐÐvuÎØÚÛÜÞàááãäåæçèèéêëëì쬌îïððïÿÿüîy¦££Ì‘|¢¢¤¨’g·¸¾ÀÂÆÈÊÌϾlˆÖ×ÙÚÛÝßàáâääåæçèèéêëëìÂzîîïððÿÿÆîv¥¢££|’£¢¤§¬›j€³¼¿ÂÄÇÉËΡl¦ÕÖØÙÚÜÞàáâãääæçèèééêëìÄvîîïïðÿÿÊît£¢£žp££¢¤¦ª®©vož¾ÁÃÆÈÊÌ„lÂÔÖÖØÚÛÝÞàáããäåæççèéêêëÊsäîîþïÿÿÆðk¢¢£~££¢¤¦¨¬°³Žj‚®ÁÄÇÈÆpwÌÒÔÖ×ÙÚÜÝÞàâããäææçèèéêêàrÑíîîïÿÿÆöo£¤£€’££¢£¥§ª®³¶¬„i„°ÆÈºkˆÐÑÓÕÖØÚÛÜÝßáâãäåææçèèéêërÉìíîîÿÿøù}¤¢n¢££Ñ¤¦ª­±´·¸«ƒj|¦˜k¤ÐÐÒÔÖ×ÙÚÛÜÞàáâääææçèèéêêvÄììîîÿÿùúŠ¢–}££Õ¢¤¨«°²¶¸»¾²‘oij”ÅÏÑÓÔÖØÚÚÛÝßàáãääææçèèéꌬììþíÿÿùùšx¤‹‰££Ñ¢£¦ª­±´¸º¾¿ÂÁvjpgy‘¨ÆÕÖØÚÚÜÞàáâãääææçèè餠ëì̶ÿÿùøšwŸ•££¢Ó¥©¬°³¶¹»¾À¸lÊÁ¢†yhh|‡¤°²´¼¾ÄÁÀ¾¸¸¹¬–znoiq…ÿÿùúšŠ†u ££¢Ó¤¨ª¯±´¸¸¼¾«jŠÈÊÌÏÎÈÁ¦¢Ž~yzvronoptz||ƒ˜”oÉßäëÿÿúø—¢mn££Ò¢¤¦¨¬°³¶¸º¾—jžÈÉÊÍÐÑÒÔÖÖØÚÚØÔÒÑÔÖÛãåæççÉpéêêëÿÿúúœ¤ƒ}££¢Ô¤¦«®²¶¶¹¼Žj¬ÆÈÉËÎÐÑÓÕÖרÚÛÜÝàááâääåæçÍoßéêëÿÿú£¢h££¢Ô£¥ª¬°´¶¸ºwj¾ÅÇÈÊÌÎÐÒÔÔÖרÚÚÜÞààâãääææÞtÄééêÿÿùû¤¡rz££Õ¤§ª®²´·¸rmÁÄÅÆÈËÍÏÐÒÓÕÖ×ÚÚÜÝÞàáâãääææw¾èééÿÿøô›¢„—v‹££Ø¤¦©«°±¶¬l~¿ÁÄÅÇÊËÎÐÑÒÔÖÖØÙÚÜÝÞàáâãäåæ‚¬èèÿ÷ôˆ¤|˜œm–££Ö¤§ª¬°²¤i…¾¿ÁÄÆÈÊÌÎÐÐÓÔÖרÚÛÜÝßáâããä䣔çèèÿÿöùŒ¦z™£’m££×¦¨¬®²œiº¾ÀÂÄÆÈËÍÐÐÑÓÔÖ×ÙÚÛÜÞàáââä䪎æçèÿÿöŒ¢{š££Žnœ££×¤§ª­°‘i›¸¾¿ÀÃÅÇÉËÎÏÐÒÔÕÖØÚÚÛÝÞàááãã¾rææçÿÿûˆ¢|œ££üŠm˜££Ø¦¨ª®Šhœ¸º¾¿ÁÄÆÈÊÌÎÏÐÒÔÕÖØÙÚÛÜÞàáââÐjäææÿÿû¦–{œ££üi££Ø¤¦¨«Ši¤¶¸¼¾ÀÂÄÆÈÉÌÎÐÑÒÓÕÖØÙÚÛÜÞàáâÔnÌäæÿÿûÀŠ}š££ü”j~££×¢£¤¦ªyk«¶¸º¼¿ÁÃÅÆÈÊÌÏÐÑÒÔÖÖØÚÚÛÜÞßàá|´äåÿÿûæx}™££ûœun”££Ú¥¨qk®´¶¸º¾¿ÂÄÆÈÉËÎÐÐÒÔÖÖ×ÙÚÚÛÜÝßá‚«ääÿÿûýs…˜££ú¢Šh}œ££Û¦lk­±´·¸º¾¿ÁÄÆÈÉËÎÏÐÒÔÕÖ×ÙÚÚÛÜÞàŸããÿÿüšv–££Ôšzh‚ž¤¢£kkª¯±´¶¸º¾¿ÂÄÆÇÉËÍÏÐÒÓÔÖרÙÚÛÜݪ„áâÿÿúÚcŒ¤¢££Ö•th~š¢kmª¬°³¶·¸»¾ÀÂÄÆÈÊËÎÐÑÒÓÕÖרÚÚÛÜÁmÞáÿÿúz„¤¢¢££Ø–ydqhp¨«¯±³¶¸º½¾ÀÂÅÇÉÊÌÏÐÐÒÔÖÖ×ÙÚÚÛÔhÜáÿÿú³u¢¦¢£ £Úœ‚hfxŽ¥¯±´¶¸¸¼¾ÁÃÅÇÈÊÌÏÐÐÒÔÕÖרÙÚ×t¸ßÿÿúúg‘¦¢£ £Ükjƒlfr…–¥¶¸º¾¿ÀÃÅÇÈÊÌÎÏÐÒÓÔÖÖØÙÚ‚ªÝÿ ÿûwr¢¢£ £Û¢jr¢¤šŒ€jhj{Ž–¨¬µÀÅÇÈÊÌÎÐÑÒÓÔÖÖÎă…¦ÿ ÿü«x£ £Üjq££¦¨ª­¦œ…xihjprruz}~~}wuvvplji†ÿ ÿûÙ}ƒ£ £Üjp£¢¤¦¨ª¯±³¶¸¸º¯¤ ¢¢ž˜˜™›Ÿ§«¬®ºÍ»nÒÿ ÿúövŸv™£ £Ükn¢¡¢¤¦¨«®±´¶·¹»¾¾ÁÃÄÇÈÊÌÎÏÐÑÒÔÕÖhÊÿ ÿú¢¨t˜£ £ýkj¢¢á£¤¦©¬®±³µ·¸»¾¿ÀÃÅÆÈÊËÍÏÐÑÒÔÕv­ÿ ÿùà{£™r™£ £ýqj££ã¤§ª«¯±³¶¸¸»¾¿ÁÃÅÇÉÊÌÎÏÐÑÒÔŠžÿ ÿøüŒž£—p—££üxj¢££ä¦¨ª«¯±³¶¸¸º¾¿ÁÃÅÇÈÉËÍÏÐÐÒž}ÿ ÿøÐ~££˜uŒ££üƒi££ä¤¦¦ª«¯±´¶·¹»¾¿ÀÃÅÆÈÉËÌÎÏЮrÿ ÿöû~Ÿ¢¤ u€¢££ü„g’££ã¢£¥¦¨ª¬®±³µ·¸»¾¿ÁÃÄÆÈÉÊËÎÏÅjÿ ÿö×¢¡¢¢…q—££üŠf££æ¤¥¨ª«¯±³¶¸¸º½¾ÀÂÄÆÈÉÊÌÎÏpÿ ÿü𢣣û–n€Ÿ££ü•fŠ££ô¢¡¢¤§ª«¯±³¶¸¸ó¼¾ÀÁÄÆÇÈÉËÌŠÿ ÿûåz£¢££õ …nˆ¡££—g|££æ¢¡£¥¦ª«¯±´¶·¸º¾¾¿ÂÄÆÆÈÉÊ›ÿÿýžŽ¤¤ô¢££™|n‹Ÿ¡lx££é¤¥¨ª¬®±³µ¶¸º¼¾ÀÂÃÄÆÇȬÿÿùóz£¢¤££ù—yk†mj££¤ë¥¨ª«¯±²µ¶¸¹º¼¾ÀÂÄÅÇ¿ÿÿùÏx£¢¤¢££ùš€ngŽ¢£ £ì¦§¨ª®°±´¶¸¸¹¾¾ÀÁÄÅÆÿÿü¨~¤££øŽflixŠž££¢ì£¤¦¨ª«®±³¶¸¹»½¾¿ÁÃÅÿÿûý…¯££ò›h€žŒxjo}Œ˜££¢¢í£¤¦¨ª«¯±²´¶¸º¼¾¿ÀÂÿÿüòrŽ££Ý¢ps¢££ —†xjhs…’›£¦¨ª«®°±´¶¸¸¼¾¿¿ÿÿûçmƒ¢££ü€hŸ££ø¢˜‘„~rhiiñlpw~‚„‡„€|uonpÿÿûÞ}¡££ü”f‹£ £í¢¡š’ŽŒ‹‹Š‘”™›œ ©ÿÿû¸Žz££ü¡lx£ £î¤££¢£¤¤§ª«®±²´¶··ÿÿû»œx‹££üjž££õ¤¥¨«­°±³¶¶ÿÿú´¢‡y›££ü—fŠ££¢÷¤¨ª«®°±³ÿÿóþ¸¤˜z„ž££ts¢££ö¢£¤¦©ª¬¯°ÿÿôû» ¢ŒuŒŸŠh”££¤£ù¥¦¨ª«­ÿÿõø¢œ¢¢ˆq…hz££ú¤¦§©ªÿÿö•–¢££Œrh££¢û£¤¥§ÿÿüú•££ø¢qer’¢££þ¤ÿÿðü•€¤¤£’hŒ“~o{Š•£ £ú¤££¢£ÿÿëüªxœ¥ |mž£¡–†znz‚Ž–œ£ £ÿ÷Íq˜¤žm{¢££ì–Ž€|oloz„„…ˆŒŽŽŠÿÿøð‡~ž™iˆ£ £òž‘ŒŒ‡~|{xwx||ÿ!ÿ÷Ân„‹h“£¢££#ÿøô™omi”¤££ÿüø¢££×‚‡¤—h–²·¸¼¿ÂÅÇÊÌÎÐÒŽl¼ÙÚÜÝàáââääææçèééêëììüœ«ïððÿÆïw¥¤££¡o ¢¦i™´¹¸¾ÀÄÆÈÊÌÐÐvuÎØÚÛÜÞàááãäåæçèèéêëëì쬌îïððïÿÿüîy¦££Ì‘|¢¢¤¨’g·¸¾ÀÂÆÈÊÌϾlˆÖ×ÙÚÛÝßàáâääåæçèèéêëëìÂzîîïððÿÿÆîv¥¢££|’£¢¤§¬›j€³¼¿ÂÄÇÉËΡl¦ÕÖØÙÚÜÞàáâãääæçèèééêëìÄvîîïïðÿÿÊît£¢£žp££¢¤¦ª®©vož¾ÁÃÆÈÊÌ„lÂÔÖÖØÚÛÝÞàáããäåæççèéêêëÊsäîîþïÿÿÆðk¢¢£~££¢¤¦¨¬°³Žj‚®ÁÄÇÈÆpwÌÒÔÖ×ÙÚÜÝÞàâããäææçèèéêêàrÑíîîïÿÿÆöo£¤£€’££¢£¥§ª®³¶¬„i„°ÆÈºkˆÐÑÓÕÖØÚÛÜÝßáâãäåææçèèéêërÉìíîîÿÿøù}¤¢n¢££Ñ¤¦ª­±´·¸«ƒj|¦˜k¤ÐÐÒÔÖ×ÙÚÛÜÞàáâääææçèèéêêvÄììîîÿÿùúŠ¢–}££Õ¢¤¨«°²¶¸»¾²‘oij”ÅÏÑÓÔÖØÚÚÛÝßàáãääææçèèéꌬììþíÿÿùùšx¤‹‰££Ñ¢£¦ª­±´¸º¾¿ÂÁvjpgy‘¨ÆÕÖØÚÚÜÞàáâãääææçèè餠ëì̶ÿÿùøšwŸ•££¢Ó¥©¬°³¶¹»¾À¸lÊÁ¢†yhh|‡¤°²´¼¾ÄÁÀ¾¸¸¹¬–znoiq…ÿÿùúšŠ†u ££¢Ó¤¨ª¯±´¸¸¼¾«jŠÈÊÌÏÎÈÁ¦¢Ž~yzvronoptz||ƒ˜”oÉßäëÿÿúø—¢mn££Ò¢¤¦¨¬°³¶¸º¾—jžÈÉÊÍÐÑÒÔÖÖØÚÚØÔÒÑÔÖÛãåæççÉpéêêëÿÿúúœ¤ƒ}££¢Ô¤¦«®²¶¶¹¼Žj¬ÆÈÉËÎÐÑÓÕÖרÚÛÜÝàááâääåæçÍoßéêëÿÿú£¢h££¢Ô£¥ª¬°´¶¸ºwj¾ÅÇÈÊÌÎÐÒÔÔÖרÚÚÜÞààâãääææÞtÄééêÿÿùû¤¡rz££Õ¤§ª®²´·¸rmÁÄÅÆÈËÍÏÐÒÓÕÖ×ÚÚÜÝÞàáâãääææw¾èééÿÿøô›¢„—v‹££Ø¤¦©«°±¶¬l~¿ÁÄÅÇÊËÎÐÑÒÔÖÖØÙÚÜÝÞàáâãäåæ‚¬èèÿ÷ôˆ¤|˜œm–££Ö¤§ª¬°²¤i…¾¿ÁÄÆÈÊÌÎÐÐÓÔÖרÚÛÜÝßáâããä䣔çèèÿÿöùŒ¦z™£’m££×¦¨¬®²œiº¾ÀÂÄÆÈËÍÐÐÑÓÔÖ×ÙÚÛÜÞàáââä䪎æçèÿÿöŒ¢{š££Žnœ££×¤§ª­°‘i›¸¾¿ÀÃÅÇÉËÎÏÐÒÔÕÖØÚÚÛÝÞàááãã¾rææçÿÿûˆ¢|œ££üŠm˜££Ø¦¨ª®Šhœ¸º¾¿ÁÄÆÈÊÌÎÏÐÒÔÕÖØÙÚÛÜÞàáââÐjäææÿÿû¦–{œ££üi££Ø¤¦¨«Ši¤¶¸¼¾ÀÂÄÆÈÉÌÎÐÑÒÓÕÖØÙÚÛÜÞàáâÔnÌäæÿÿûÀŠ}š££ü”j~££×¢£¤¦ªyk«¶¸º¼¿ÁÃÅÆÈÊÌÏÐÑÒÔÖÖØÚÚÛÜÞßàá|´äåÿÿûæx}™££ûœun”££Ú¥¨qk®´¶¸º¾¿ÂÄÆÈÉËÎÐÐÒÔÖÖ×ÙÚÚÛÜÝßá‚«ääÿÿûýs…˜££ú¢Šh}œ££Û¦lk­±´·¸º¾¿ÁÄÆÈÉËÎÏÐÒÔÕÖ×ÙÚÚÛÜÞàŸããÿÿüšv–££Ôšzh‚ž¤¢£kkª¯±´¶¸º¾¿ÂÄÆÇÉËÍÏÐÒÓÔÖרÙÚÛÜݪ„áâÿÿúÚcŒ¤¢££Ö•th~š¢kmª¬°³¶·¸»¾ÀÂÄÆÈÊËÎÐÑÒÓÕÖרÚÚÛÜÁmÞáÿÿúz„¤¢¢££Ø–ydqhp¨«¯±³¶¸º½¾ÀÂÅÇÉÊÌÏÐÐÒÔÖÖ×ÙÚÚÛÔhÜáÿÿú³u¢¦¢£ £Úœ‚hfxŽ¥¯±´¶¸¸¼¾ÁÃÅÇÈÊÌÏÐÐÒÔÕÖרÙÚ×t¸ßÿÿúúg‘¦¢£ £Ükjƒlfr…–¥¶¸º¾¿ÀÃÅÇÈÊÌÎÏÐÒÓÔÖÖØÙÚ‚ªÝÿ ÿûwr¢¢£ £Û¢jr¢¤šŒ€jhj{Ž–¨¬µÀÅÇÈÊÌÎÐÑÒÓÔÖÖÎă…¦ÿ ÿü«x£ £Üjq££¦¨ª­¦œ…xihjprruz}~~}wuvvplji†ÿ ÿûÙ}ƒ£ £Üjp£¢¤¦¨ª¯±³¶¸¸º¯¤ ¢¢ž˜˜™›Ÿ§«¬®ºÍ»nÒÿ ÿúövŸv™£ £Ükn¢¡¢¤¦¨«®±´¶·¹»¾¾ÁÃÄÇÈÊÌÎÏÐÑÒÔÕÖhÊÿ ÿú¢¨t˜£ £ýkj¢¢á£¤¦©¬®±³µ·¸»¾¿ÀÃÅÆÈÊËÍÏÐÑÒÔÕv­ÿ ÿùà{£™r™£ £ýqj££ã¤§ª«¯±³¶¸¸»¾¿ÁÃÅÇÉÊÌÎÏÐÑÒÔŠžÿ ÿøüŒž£—p—££üxj¢££ä¦¨ª«¯±³¶¸¸º¾¿ÁÃÅÇÈÉËÍÏÐÐÒž}ÿ ÿøÐ~££˜uŒ££üƒi££ä¤¦¦ª«¯±´¶·¹»¾¿ÀÃÅÆÈÉËÌÎÏЮrÿ ÿöû~Ÿ¢¤ u€¢££ü„g’££ã¢£¥¦¨ª¬®±³µ·¸»¾¿ÁÃÄÆÈÉÊËÎÏÅjÿ ÿö×¢¡¢¢…q—££üŠf££æ¤¥¨ª«¯±³¶¸¸º½¾ÀÂÄÆÈÉÊÌÎÏpÿ ÿü𢣣û–n€Ÿ££ü•fŠ££ô¢¡¢¤§ª«¯±³¶¸¸ó¼¾ÀÁÄÆÇÈÉËÌŠÿ ÿûåz£¢££õ …nˆ¡££—g|££æ¢¡£¥¦ª«¯±´¶·¸º¾¾¿ÂÄÆÆÈÉÊ›ÿÿýžŽ¤¤ô¢££™|n‹Ÿ¡lx££é¤¥¨ª¬®±³µ¶¸º¼¾ÀÂÃÄÆÇȬÿÿùóz£¢¤££ù—yk†mj££¤ë¥¨ª«¯±²µ¶¸¹º¼¾ÀÂÄÅÇ¿ÿÿùÏx£¢¤¢££ùš€ngŽ¢£ £ì¦§¨ª®°±´¶¸¸¹¾¾ÀÁÄÅÆÿÿü¨~¤££øŽflixŠž££¢ì£¤¦¨ª«®±³¶¸¹»½¾¿ÁÃÅÿÿûý…¯££ò›h€žŒxjo}Œ˜££¢¢í£¤¦¨ª«¯±²´¶¸º¼¾¿ÀÂÿÿüòrŽ££Ý¢ps¢££ —†xjhs…’›£¦¨ª«®°±´¶¸¸¼¾¿¿ÿÿûçmƒ¢££ü€hŸ££ø¢˜‘„~rhiiñlpw~‚„‡„€|uonpÿÿûÞ}¡££ü”f‹£ £í¢¡š’ŽŒ‹‹Š‘”™›œ ©ÿÿû¸Žz££ü¡lx£ £î¤££¢£¤¤§ª«®±²´¶··ÿÿû»œx‹££üjž££õ¤¥¨«­°±³¶¶ÿÿú´¢‡y›££ü—fŠ££¢÷¤¨ª«®°±³ÿÿóþ¸¤˜z„ž££ts¢££ö¢£¤¦©ª¬¯°ÿÿôû» ¢ŒuŒŸŠh”££¤£ù¥¦¨ª«­ÿÿõø¢œ¢¢ˆq…hz££ú¤¦§©ªÿÿö•–¢££Œrh££¢û£¤¥§ÿÿüú•££ø¢qer’¢££þ¤ÿÿðü•€¤¤£’hŒ“~o{Š•£ £ú¤££¢£ÿÿëüªxœ¥ |mž£¡–†znz‚Ž–œ£ £ÿ÷Íq˜¤žm{¢££ì–Ž€|oloz„„…ˆŒŽŽŠÿÿøð‡~ž™iˆ£ £òž‘ŒŒ‡~|{xwx||ÿ!ÿ÷Ân„‹h“£¢££#ÿøô™omi”¤££ÿüø¢££×‚‡¤—h–²·¸¼¿ÂÅÇÊÌÎÐÒŽl¼ÙÚÜÝàáââääææçèééêëììüœ«ïððÿÆïw¥¤££¡o ¢¦i™´¹¸¾ÀÄÆÈÊÌÐÐvuÎØÚÛÜÞàááãäåæçèèéêëëì쬌îïððïÿÿüîy¦££Ì‘|¢¢¤¨’g·¸¾ÀÂÆÈÊÌϾlˆÖ×ÙÚÛÝßàáâääåæçèèéêëëìÂzîîïððÿÿÆîv¥¢££|’£¢¤§¬›j€³¼¿ÂÄÇÉËΡl¦ÕÖØÙÚÜÞàáâãääæçèèééêëìÄvîîïïðÿÿÊît£¢£žp££¢¤¦ª®©vož¾ÁÃÆÈÊÌ„lÂÔÖÖØÚÛÝÞàáããäåæççèéêêëÊsäîîþïÿÿÆðk¢¢£~££¢¤¦¨¬°³Žj‚®ÁÄÇÈÆpwÌÒÔÖ×ÙÚÜÝÞàâããäææçèèéêêàrÑíîîïÿÿÆöo£¤£€’££¢£¥§ª®³¶¬„i„°ÆÈºkˆÐÑÓÕÖØÚÛÜÝßáâãäåææçèèéêërÉìíîîÿÿøù}¤¢n¢££Ñ¤¦ª­±´·¸«ƒj|¦˜k¤ÐÐÒÔÖ×ÙÚÛÜÞàáâääææçèèéêêvÄììîîÿÿùúŠ¢–}££Õ¢¤¨«°²¶¸»¾²‘oij”ÅÏÑÓÔÖØÚÚÛÝßàáãääææçèèéꌬììþíÿÿùùšx¤‹‰££Ñ¢£¦ª­±´¸º¾¿ÂÁvjpgy‘¨ÆÕÖØÚÚÜÞàáâãääææçèè餠ëì̶ÿÿùøšwŸ•££¢Ó¥©¬°³¶¹»¾À¸lÊÁ¢†yhh|‡¤°²´¼¾ÄÁÀ¾¸¸¹¬–znoiq…ÿÿùúšŠ†u ££¢Ó¤¨ª¯±´¸¸¼¾«jŠÈÊÌÏÎÈÁ¦¢Ž~yzvronoptz||ƒ˜”oÉßäëÿÿúø—¢mn££Ò¢¤¦¨¬°³¶¸º¾—jžÈÉÊÍÐÑÒÔÖÖØÚÚØÔÒÑÔÖÛãåæççÉpéêêëÿÿúúœ¤ƒ}££¢Ô¤¦«®²¶¶¹¼Žj¬ÆÈÉËÎÐÑÓÕÖרÚÛÜÝàááâääåæçÍoßéêëÿÿú£¢h££¢Ô£¥ª¬°´¶¸ºwj¾ÅÇÈÊÌÎÐÒÔÔÖרÚÚÜÞààâãääææÞtÄééêÿÿùû¤¡rz££Õ¤§ª®²´·¸rmÁÄÅÆÈËÍÏÐÒÓÕÖ×ÚÚÜÝÞàáâãääææw¾èééÿÿøô›¢„—v‹££Ø¤¦©«°±¶¬l~¿ÁÄÅÇÊËÎÐÑÒÔÖÖØÙÚÜÝÞàáâãäåæ‚¬èèÿ÷ôˆ¤|˜œm–££Ö¤§ª¬°²¤i…¾¿ÁÄÆÈÊÌÎÐÐÓÔÖרÚÛÜÝßáâããä䣔çèèÿÿöùŒ¦z™£’m££×¦¨¬®²œiº¾ÀÂÄÆÈËÍÐÐÑÓÔÖ×ÙÚÛÜÞàáââä䪎æçèÿÿöŒ¢{š££Žnœ££×¤§ª­°‘i›¸¾¿ÀÃÅÇÉËÎÏÐÒÔÕÖØÚÚÛÝÞàááãã¾rææçÿÿûˆ¢|œ££üŠm˜££Ø¦¨ª®Šhœ¸º¾¿ÁÄÆÈÊÌÎÏÐÒÔÕÖØÙÚÛÜÞàáââÐjäææÿÿû¦–{œ££üi££Ø¤¦¨«Ši¤¶¸¼¾ÀÂÄÆÈÉÌÎÐÑÒÓÕÖØÙÚÛÜÞàáâÔnÌäæÿÿûÀŠ}š££ü”j~££×¢£¤¦ªyk«¶¸º¼¿ÁÃÅÆÈÊÌÏÐÑÒÔÖÖØÚÚÛÜÞßàá|´äåÿÿûæx}™££ûœun”££Ú¥¨qk®´¶¸º¾¿ÂÄÆÈÉËÎÐÐÒÔÖÖ×ÙÚÚÛÜÝßá‚«ääÿÿûýs…˜££ú¢Šh}œ££Û¦lk­±´·¸º¾¿ÁÄÆÈÉËÎÏÐÒÔÕÖ×ÙÚÚÛÜÞàŸããÿÿüšv–££Ôšzh‚ž¤¢£kkª¯±´¶¸º¾¿ÂÄÆÇÉËÍÏÐÒÓÔÖרÙÚÛÜݪ„áâÿÿúÚcŒ¤¢££Ö•th~š¢kmª¬°³¶·¸»¾ÀÂÄÆÈÊËÎÐÑÒÓÕÖרÚÚÛÜÁmÞáÿÿúz„¤¢¢££Ø–ydqhp¨«¯±³¶¸º½¾ÀÂÅÇÉÊÌÏÐÐÒÔÖÖ×ÙÚÚÛÔhÜáÿÿú³u¢¦¢£ £Úœ‚hfxŽ¥¯±´¶¸¸¼¾ÁÃÅÇÈÊÌÏÐÐÒÔÕÖרÙÚ×t¸ßÿÿúúg‘¦¢£ £Ükjƒlfr…–¥¶¸º¾¿ÀÃÅÇÈÊÌÎÏÐÒÓÔÖÖØÙÚ‚ªÝÿ ÿûwr¢¢£ £Û¢jr¢¤šŒ€jhj{Ž–¨¬µÀÅÇÈÊÌÎÐÑÒÓÔÖÖÎă…¦ÿ ÿü«x£ £Üjq££¦¨ª­¦œ…xihjprruz}~~}wuvvplji†ÿ ÿûÙ}ƒ£ £Üjp£¢¤¦¨ª¯±³¶¸¸º¯¤ ¢¢ž˜˜™›Ÿ§«¬®ºÍ»nÒÿ ÿúövŸv™£ £Ükn¢¡¢¤¦¨«®±´¶·¹»¾¾ÁÃÄÇÈÊÌÎÏÐÑÒÔÕÖhÊÿ ÿú¢¨t˜£ £ýkj¢¢á£¤¦©¬®±³µ·¸»¾¿ÀÃÅÆÈÊËÍÏÐÑÒÔÕv­ÿ ÿùà{£™r™£ £ýqj££ã¤§ª«¯±³¶¸¸»¾¿ÁÃÅÇÉÊÌÎÏÐÑÒÔŠžÿ ÿøüŒž£—p—££üxj¢££ä¦¨ª«¯±³¶¸¸º¾¿ÁÃÅÇÈÉËÍÏÐÐÒž}ÿ ÿøÐ~££˜uŒ££üƒi££ä¤¦¦ª«¯±´¶·¹»¾¿ÀÃÅÆÈÉËÌÎÏЮrÿ ÿöû~Ÿ¢¤ u€¢££ü„g’££ã¢£¥¦¨ª¬®±³µ·¸»¾¿ÁÃÄÆÈÉÊËÎÏÅjÿ ÿö×¢¡¢¢…q—££üŠf££æ¤¥¨ª«¯±³¶¸¸º½¾ÀÂÄÆÈÉÊÌÎÏpÿ ÿü𢣣û–n€Ÿ££ü•fŠ££ô¢¡¢¤§ª«¯±³¶¸¸ó¼¾ÀÁÄÆÇÈÉËÌŠÿ ÿûåz£¢££õ …nˆ¡££—g|££æ¢¡£¥¦ª«¯±´¶·¸º¾¾¿ÂÄÆÆÈÉÊ›ÿÿýžŽ¤¤ô¢££™|n‹Ÿ¡lx££é¤¥¨ª¬®±³µ¶¸º¼¾ÀÂÃÄÆÇȬÿÿùóz£¢¤££ù—yk†mj££¤ë¥¨ª«¯±²µ¶¸¹º¼¾ÀÂÄÅÇ¿ÿÿùÏx£¢¤¢££ùš€ngŽ¢£ £ì¦§¨ª®°±´¶¸¸¹¾¾ÀÁÄÅÆÿÿü¨~¤££øŽflixŠž££¢ì£¤¦¨ª«®±³¶¸¹»½¾¿ÁÃÅÿÿûý…¯££ò›h€žŒxjo}Œ˜££¢¢í£¤¦¨ª«¯±²´¶¸º¼¾¿ÀÂÿÿüòrŽ££Ý¢ps¢££ —†xjhs…’›£¦¨ª«®°±´¶¸¸¼¾¿¿ÿÿûçmƒ¢££ü€hŸ££ø¢˜‘„~rhiiñlpw~‚„‡„€|uonpÿÿûÞ}¡££ü”f‹£ £í¢¡š’ŽŒ‹‹Š‘”™›œ ©ÿÿû¸Žz££ü¡lx£ £î¤££¢£¤¤§ª«®±²´¶··ÿÿû»œx‹££üjž££õ¤¥¨«­°±³¶¶ÿÿú´¢‡y›££ü—fŠ££¢÷¤¨ª«®°±³ÿÿóþ¸¤˜z„ž££ts¢££ö¢£¤¦©ª¬¯°ÿÿôû» ¢ŒuŒŸŠh”££¤£ù¥¦¨ª«­ÿÿõø¢œ¢¢ˆq…hz££ú¤¦§©ªÿÿö•–¢££Œrh££¢û£¤¥§ÿÿüú•££ø¢qer’¢££þ¤ÿÿðü•€¤¤£’hŒ“~o{Š•£ £ú¤££¢£ÿÿëüªxœ¥ |mž£¡–†znz‚Ž–œ£ £ÿ÷Íq˜¤žm{¢££ì–Ž€|oloz„„…ˆŒŽŽŠÿÿøð‡~ž™iˆ£ £òž‘ŒŒ‡~|{xwx||ÿ!ÿ÷Ân„‹h“£¢££#ÿøô™omi”¤££ÿûðñòòóóôö÷ïøùúûûüüýýþú{uÇüÿÿþýüûû˜qâüüðæñòòóóôôõöö÷÷øùúûûüüýé¡pnçþþÿþýüú̈؊øüüþûððçñòòóóôôõöö÷øøùúúûë¦u˜ß¨þ þýü÷é|Ùû¡Æüüûûðûñòòóôôîõöö÷øøùßp–ÜüüÜpíþ þýü÷û’µûûîòûûýðïððûñòòóôôôõöö÷Åpäûûüüûž£ýýþþýüüû¦—ûûý±¼ûûþïððñòóôø×ªwy°èùúúùûüüçnãý ýüûüÊ‚ïûûüð‚ðûûþïðððñòò׳ƒtÇï÷÷øøùúúûûüœ¡üüûüÑvâûûýµ¼ûûèîïððïðçÒ¯}rޏäôõöö÷÷øøùúúûûãsäü üûüÒsÔûûæî„öûúúîîåײŒvn”ºáòóóôôõöö÷÷øþùúúý¤ûûüÖtÎúúý­¿úúêš„nk‹ªÇïðññòòóóôôõõöö÷÷øùüâtäúúûúûúüÒtÎúúõëŒúúð˜¶×îïððþñòòþóôôüõöö÷÷øý¡ú úüÌsÒú úò™Úú·ìíîîïïððïððúñòòóóôôõö÷ûøÞtâùùúûùÁsÒú úôÕ¤ùŽììíîîïïððüñòòóóôõö÷û¤øøùùûõ¤|Úù ù÷ô‰¼²ëììíîî÷ïððïððññòòóôþõöö÷üÚrðøøûå‰ìùùû¨zîêììþíîîþïððòóôõöý¯÷÷øûËz¤ðøøùöª“øêëëììíîîïðñòóôõöüÎxõ÷÷ü¤qÂøøù÷æ~ˆôéêêëììøíîîïïðïððñòóôõõòƒ¾öö÷Ø€Šâ÷÷øõõ“јêééêëëììîïðþïððñòóôõ÷¼‚óî¦r³ò÷ ÷øõ¿œ÷À¼èéêêëììþíîîðòóôùñy¬€ŽÚöö ÷ø÷ô݃ê÷Ý©èèééêëëì÷íîîïïððïððþñòòóôúÖ€q¾ðöö ÷üòŠÔ÷÷ý†çèèûéêêëììîþïððþïððñò÷óä˜qžràôõõö÷üö“´÷÷ôöšæççèèéêêëììþíîîïðþïððñöòã¤q”Þó”µôôõ öý¶ööýŸæççèûéêêëììíîþïððôØ nÖòóóÊyïôôõöü½‡ðööüõ¦åææ÷çèèéêêëëììþíîîþïððøîÉ‘q–ÖðòòüðyÆôôõöúÄ„ðööõõñÆäåææççèèéêêëëììîøïâ·t¤Ýððñòý°“óóôõüÇ‚áõõôðÊãääåæççèèéêêëëììõæÈ•t‚¹äððïððñùòÚqãòòóóôüÀ~ÛôôóÉâãääåæççèèéêêôëèÉwqžÑîîïððþïððñýжòòóôü»~ÝôôôóÈáâããäåææçèèöâ·“tq–ÂìíîîïðþïððýÀƒòòóùò³…èôôóóòë˜àáââãääæÞ¾žƒl| ÆæëëììþíîîþïððúärÙññòòûî–ŽìóóòíÏyÞààÒÀ±›znw“²Óäèéêêëìþíîîïðûïð’ªððñòûÞŒíòòåñ펵¤Šupr|¢¶ÌâææççèèééêêëëììþíîîïðüÅ€îððûñÉ{·òòñäð¤Ê¨˜¤¹ÄßáâãääååæççèèééêêëëììîþïððûênÜïððûìªzÎññðñðòËŸð§ÚÜÜÝßàáâãääûåææçèèéêþëììîïõðެððïØˆ‘ãð ðñâŠéî~ÙÚÚÜÝÞàááããäæçèéêëìþíîîô¼‡ïî®vºïððïðððéŒÚîålØÙÚÚÜÝÞßàââûãääåææþçèèþéêêþëììíîùém¸†ÝððïðêïžÁîî¾vÖØÙÚÛÜÝÝßàáââãääæçèéêëìöíîátvÀêîîï ïçîíì–ÖÖרÚÚÛÜÝÞààáâããääæçèéêëìúæ³vz˜î î察êììèrÖÏÕÖÖØÙÚÚÛÝÞÞàááâããääæçèéêôæ¸{ÔÇzéììíîîÞì²”êììë»—à¾ÔÕÖרÙÙÚÛÜÜÞààáââããääåææþçèèö¾|„ÄëëìpÒì ì௒ììëëä|Ò×­ÒÓÔÖÖרÙÚÚÛÝÞßààáââãääþåææçùä²x‚Âéêêü‘¶ëììýª”êêõ覞àÿœÐÑÒÔÖÖðØÙÚÚÛÜÝÝÞàááââãääøæÕ¨tŠÆæèèéüê« êêÐë衚èééèèÒzÏíÿ~ÏÐÑÒÔÔÕÖרÙÚÛÜÜÝÝßàááââãà¿“s™ËææççèýÄyééþêééúà“¨æéèèôâ´×ÿÿnËÏÐÑÓÓúÔÖÖ×ÙÚÚûÛÜÝÞààõʦwz¬ÔääååææçèüÝwÚèèâÔ‡¼çèççææ®ŽÔéÿÿk²ÌÍÏÐÐÑÓÔÕÖרÚÚòÛÜÚШ~p—ÁáâããääþåææüçxÄææúçæÀ€ÈææùåäÇtÐØÿÿævŸÊÌÍÏÐÐÑÒÔÔÕÖ×ØØ¿šzm¶ÛÞààþáââþãääûåæœ¯ææøäžŠÚææåääûØx¿ØÿÿÞ’ÈÉÊÍÎÏÐÑÑÒÓ¼£‰lx—¼ÚÚÛÜÝÝÞÞààááâããäø¦›ääÍ‚§ääøãâá‚¥Ðìÿÿê¤nÆÇÈÉË̵­’€lv‹§ËÔרÙÚÚöÛÜÝÝÞßààáââãëâã¾’à§€ÆããâãââáÞ˜Ùßÿÿè¦i¨¢”Žuoq~›®ÀÏÒÔÔÕÖÖרÙÚÚÛÜÞþßààùáÈp„ Ûââ÷áàßÛ˜ŠÔÕÿÿåmfj†‘›­·ÈËÌÎÏÐÐÑÒÓÔÔÖÖ×רÙÚÚþÛÜÜÝßûÑ’kÅààõßÞÞÝÚš§ÉÉïÿÿ𸇄ÀÂÄÄÆÇÈÊÊÌÍÎÐÐúÑÒÓÔÕÖÖØþÙÚÚÛÜùÝØ¤|¤tÞÞÜøÛØ•¢ÈÏìÿÿo¾ÀÂÃÄÅÇÈÈÊÊÌÍÏÐÐúÑÒÓÔÕÖÖØôÙÚÚØ¨w™ÖÚzÕÛÛÚùÙ¯ÓÐßÿÿì·­f°¾¾¿ÀÂÄÆÈÈÉÊËÌÎÏÐÐÒÔָרթz”ÌÙÙòyÇÙÙØØ×ÌŒ¹ÊÍÃÿÿµüp”º¾¾ñÀÁÃÅÆÇÈÈÉÊÌÍÎÏÐÐóÑÒÒÓÔÔÕÌ¡y“ÄÖÖýxÆÖÖùŃ´¿ËÉÿÿæ±´…}¸º»¼¾¿ÀÂÄÄÅÆÇÈÉÉËÌÍÎÏÐÐÑ÷¼–uÆÔÔÕÔÔôxÈÔÔÓ­ŠÀ°ËÉÿ ÿÙ°±™j´·¹¸»¾¾¿ÁÂÃÃÄÆÇÈÉÊÊÌÍÎÎÆª€~¤ÊÑÑÐÑÑÒÒôÐxÏÐÍ––Ä–ÂÈÿ ÿÞ«®¬fž´¶··º»¼¾¾¿ÀÁÃÄÅÆÇÈÈįŠs±ÎÎÏÐÐõÄqϼ©È’»Çÿ ÿ䩪«v†±²´¶·¸¸¹½¾¾¿ÀÀÂÄĤˆq¢ÈÈÊþÌÍÍôÌʶtœ†½¿‰¸Äÿ ÿ榨©Œn­°±³´¶¸¸¹¸»¾¾¬˜}p‚ ÀÅÅÆþÇÈÈöÇ£n¢Ä°‚´Êÿ ÿ¤æ¥ džª¬¯°²´µ¯ Ž‚pv¨¹¿ÀÀÁÃÄÄÅÆöºj¢ÂŸ}¯×ÿÿ£ë¤rˆ§¡›–Š€on|¡°¸·¸»»¾¾¿ÀòÁ»™~¤rµ‹‰Àôÿÿ퇄ƒ~jekjv‰– ®°±²´¶¶¸ýº¼¾¾õ¹™€º”„z¾ÿÿŒŒd”£¤¥§©ªª¬¯°²²ú´µµ¶¶¸¸¹ô´|˜¶¸¨iq˜éÿÿ£î¤£t‚¢¢£¤¦§¨¨©ª¬­®°°²þ³´´ñµ¶¨„xš³´´¨n‚Àèÿÿ£üi¡££¤¥ü¦¨©ªª¬í­®¯°°­’y¢¯­­©ƒpªãÿÿûðñòòóóôö÷ïøùúûûüüýýþú{uÇüÿÿþýüûû˜qâüüðæñòòóóôôõöö÷÷øùúûûüüýé¡pnçþþÿþýüú̈؊øüüþûððçñòòóóôôõöö÷øøùúúûë¦u˜ß¨þ þýü÷é|Ùû¡Æüüûûðûñòòóôôîõöö÷øøùßp–ÜüüÜpíþ þýü÷û’µûûîòûûýðïððûñòòóôôôõöö÷Åpäûûüüûž£ýýþþýüüû¦—ûûý±¼ûûþïððñòóôø×ªwy°èùúúùûüüçnãý ýüûüÊ‚ïûûüð‚ðûûþïðððñòò׳ƒtÇï÷÷øøùúúûûüœ¡üüûüÑvâûûýµ¼ûûèîïððïðçÒ¯}rޏäôõöö÷÷øøùúúûûãsäü üûüÒsÔûûæî„öûúúîîåײŒvn”ºáòóóôôõöö÷÷øþùúúý¤ûûüÖtÎúúý­¿úúêš„nk‹ªÇïðññòòóóôôõõöö÷÷øùüâtäúúûúûúüÒtÎúúõëŒúúð˜¶×îïððþñòòþóôôüõöö÷÷øý¡ú úüÌsÒú úò™Úú·ìíîîïïððïððúñòòóóôôõö÷ûøÞtâùùúûùÁsÒú úôÕ¤ùŽììíîîïïððüñòòóóôõö÷û¤øøùùûõ¤|Úù ù÷ô‰¼²ëììíîî÷ïððïððññòòóôþõöö÷üÚrðøøûå‰ìùùû¨zîêììþíîîþïððòóôõöý¯÷÷øûËz¤ðøøùöª“øêëëììíîîïðñòóôõöüÎxõ÷÷ü¤qÂøøù÷æ~ˆôéêêëììøíîîïïðïððñòóôõõòƒ¾öö÷Ø€Šâ÷÷øõõ“јêééêëëììîïðþïððñòóôõ÷¼‚óî¦r³ò÷ ÷øõ¿œ÷À¼èéêêëììþíîîðòóôùñy¬€ŽÚöö ÷ø÷ô݃ê÷Ý©èèééêëëì÷íîîïïððïððþñòòóôúÖ€q¾ðöö ÷üòŠÔ÷÷ý†çèèûéêêëììîþïððþïððñò÷óä˜qžràôõõö÷üö“´÷÷ôöšæççèèéêêëììþíîîïðþïððñöòã¤q”Þó”µôôõ öý¶ööýŸæççèûéêêëììíîþïððôØ nÖòóóÊyïôôõöü½‡ðööüõ¦åææ÷çèèéêêëëììþíîîþïððøîÉ‘q–ÖðòòüðyÆôôõöúÄ„ðööõõñÆäåææççèèéêêëëììîøïâ·t¤Ýððñòý°“óóôõüÇ‚áõõôðÊãääåæççèèéêêëëììõæÈ•t‚¹äððïððñùòÚqãòòóóôüÀ~ÛôôóÉâãääåæççèèéêêôëèÉwqžÑîîïððþïððñýжòòóôü»~ÝôôôóÈáâããäåææçèèöâ·“tq–ÂìíîîïðþïððýÀƒòòóùò³…èôôóóòë˜àáââãääæÞ¾žƒl| ÆæëëììþíîîþïððúärÙññòòûî–ŽìóóòíÏyÞààÒÀ±›znw“²Óäèéêêëìþíîîïðûïð’ªððñòûÞŒíòòåñ펵¤Šupr|¢¶ÌâææççèèééêêëëììþíîîïðüÅ€îððûñÉ{·òòñäð¤Ê¨˜¤¹ÄßáâãääååæççèèééêêëëììîþïððûênÜïððûìªzÎññðñðòËŸð§ÚÜÜÝßàáâãääûåææçèèéêþëììîïõðެððïØˆ‘ãð ðñâŠéî~ÙÚÚÜÝÞàááããäæçèéêëìþíîîô¼‡ïî®vºïððïðððéŒÚîålØÙÚÚÜÝÞßàââûãääåææþçèèþéêêþëììíîùém¸†ÝððïðêïžÁîî¾vÖØÙÚÛÜÝÝßàáââãääæçèéêëìöíîátvÀêîîï ïçîíì–ÖÖרÚÚÛÜÝÞààáâããääæçèéêëìúæ³vz˜î î察êììèrÖÏÕÖÖØÙÚÚÛÝÞÞàááâããääæçèéêôæ¸{ÔÇzéììíîîÞì²”êììë»—à¾ÔÕÖרÙÙÚÛÜÜÞààáââããääåææþçèèö¾|„ÄëëìpÒì ì௒ììëëä|Ò×­ÒÓÔÖÖרÙÚÚÛÝÞßààáââãääþåææçùä²x‚Âéêêü‘¶ëììýª”êêõ覞àÿœÐÑÒÔÖÖðØÙÚÚÛÜÝÝÞàááââãääøæÕ¨tŠÆæèèéüê« êêÐë衚èééèèÒzÏíÿ~ÏÐÑÒÔÔÕÖרÙÚÛÜÜÝÝßàááââãà¿“s™ËææççèýÄyééþêééúà“¨æéèèôâ´×ÿÿnËÏÐÑÓÓúÔÖÖ×ÙÚÚûÛÜÝÞààõʦwz¬ÔääååææçèüÝwÚèèâÔ‡¼çèççææ®ŽÔéÿÿk²ÌÍÏÐÐÑÓÔÕÖרÚÚòÛÜÚШ~p—ÁáâããääþåææüçxÄææúçæÀ€ÈææùåäÇtÐØÿÿævŸÊÌÍÏÐÐÑÒÔÔÕÖ×ØØ¿šzm¶ÛÞààþáââþãääûåæœ¯ææøäžŠÚææåääûØx¿ØÿÿÞ’ÈÉÊÍÎÏÐÑÑÒÓ¼£‰lx—¼ÚÚÛÜÝÝÞÞààááâããäø¦›ääÍ‚§ääøãâá‚¥Ðìÿÿê¤nÆÇÈÉË̵­’€lv‹§ËÔרÙÚÚöÛÜÝÝÞßààáââãëâã¾’à§€ÆããâãââáÞ˜Ùßÿÿè¦i¨¢”Žuoq~›®ÀÏÒÔÔÕÖÖרÙÚÚÛÜÞþßààùáÈp„ Ûââ÷áàßÛ˜ŠÔÕÿÿåmfj†‘›­·ÈËÌÎÏÐÐÑÒÓÔÔÖÖ×רÙÚÚþÛÜÜÝßûÑ’kÅààõßÞÞÝÚš§ÉÉïÿÿ𸇄ÀÂÄÄÆÇÈÊÊÌÍÎÐÐúÑÒÓÔÕÖÖØþÙÚÚÛÜùÝØ¤|¤tÞÞÜøÛØ•¢ÈÏìÿÿo¾ÀÂÃÄÅÇÈÈÊÊÌÍÏÐÐúÑÒÓÔÕÖÖØôÙÚÚØ¨w™ÖÚzÕÛÛÚùÙ¯ÓÐßÿÿì·­f°¾¾¿ÀÂÄÆÈÈÉÊËÌÎÏÐÐÒÔָרթz”ÌÙÙòyÇÙÙØØ×ÌŒ¹ÊÍÃÿÿµüp”º¾¾ñÀÁÃÅÆÇÈÈÉÊÌÍÎÏÐÐóÑÒÒÓÔÔÕÌ¡y“ÄÖÖýxÆÖÖùŃ´¿ËÉÿÿæ±´…}¸º»¼¾¿ÀÂÄÄÅÆÇÈÉÉËÌÍÎÏÐÐÑ÷¼–uÆÔÔÕÔÔôxÈÔÔÓ­ŠÀ°ËÉÿ ÿÙ°±™j´·¹¸»¾¾¿ÁÂÃÃÄÆÇÈÉÊÊÌÍÎÎÆª€~¤ÊÑÑÐÑÑÒÒôÐxÏÐÍ––Ä–ÂÈÿ ÿÞ«®¬fž´¶··º»¼¾¾¿ÀÁÃÄÅÆÇÈÈįŠs±ÎÎÏÐÐõÄqϼ©È’»Çÿ ÿ䩪«v†±²´¶·¸¸¹½¾¾¿ÀÀÂÄĤˆq¢ÈÈÊþÌÍÍôÌʶtœ†½¿‰¸Äÿ ÿ榨©Œn­°±³´¶¸¸¹¸»¾¾¬˜}p‚ ÀÅÅÆþÇÈÈöÇ£n¢Ä°‚´Êÿ ÿ¤æ¥ džª¬¯°²´µ¯ Ž‚pv¨¹¿ÀÀÁÃÄÄÅÆöºj¢ÂŸ}¯×ÿÿ£ë¤rˆ§¡›–Š€on|¡°¸·¸»»¾¾¿ÀòÁ»™~¤rµ‹‰Àôÿÿ퇄ƒ~jekjv‰– ®°±²´¶¶¸ýº¼¾¾õ¹™€º”„z¾ÿÿŒŒd”£¤¥§©ªª¬¯°²²ú´µµ¶¶¸¸¹ô´|˜¶¸¨iq˜éÿÿ£î¤£t‚¢¢£¤¦§¨¨©ª¬­®°°²þ³´´ñµ¶¨„xš³´´¨n‚Àèÿÿ£üi¡££¤¥ü¦¨©ªª¬í­®¯°°­’y¢¯­­©ƒpªãÿÿûðñòòóóôö÷ïøùúûûüüýýþú{uÇüÿÿþýüûû˜qâüüðæñòòóóôôõöö÷÷øùúûûüüýé¡pnçþþÿþýüú̈؊øüüþûððçñòòóóôôõöö÷øøùúúûë¦u˜ß¨þ þýü÷é|Ùû¡Æüüûûðûñòòóôôîõöö÷øøùßp–ÜüüÜpíþ þýü÷û’µûûîòûûýðïððûñòòóôôôõöö÷Åpäûûüüûž£ýýþþýüüû¦—ûûý±¼ûûþïððñòóôø×ªwy°èùúúùûüüçnãý ýüûüÊ‚ïûûüð‚ðûûþïðððñòò׳ƒtÇï÷÷øøùúúûûüœ¡üüûüÑvâûûýµ¼ûûèîïððïðçÒ¯}rޏäôõöö÷÷øøùúúûûãsäü üûüÒsÔûûæî„öûúúîîåײŒvn”ºáòóóôôõöö÷÷øþùúúý¤ûûüÖtÎúúý­¿úúêš„nk‹ªÇïðññòòóóôôõõöö÷÷øùüâtäúúûúûúüÒtÎúúõëŒúúð˜¶×îïððþñòòþóôôüõöö÷÷øý¡ú úüÌsÒú úò™Úú·ìíîîïïððïððúñòòóóôôõö÷ûøÞtâùùúûùÁsÒú úôÕ¤ùŽììíîîïïððüñòòóóôõö÷û¤øøùùûõ¤|Úù ù÷ô‰¼²ëììíîî÷ïððïððññòòóôþõöö÷üÚrðøøûå‰ìùùû¨zîêììþíîîþïððòóôõöý¯÷÷øûËz¤ðøøùöª“øêëëììíîîïðñòóôõöüÎxõ÷÷ü¤qÂøøù÷æ~ˆôéêêëììøíîîïïðïððñòóôõõòƒ¾öö÷Ø€Šâ÷÷øõõ“јêééêëëììîïðþïððñòóôõ÷¼‚óî¦r³ò÷ ÷øõ¿œ÷À¼èéêêëììþíîîðòóôùñy¬€ŽÚöö ÷ø÷ô݃ê÷Ý©èèééêëëì÷íîîïïððïððþñòòóôúÖ€q¾ðöö ÷üòŠÔ÷÷ý†çèèûéêêëììîþïððþïððñò÷óä˜qžràôõõö÷üö“´÷÷ôöšæççèèéêêëììþíîîïðþïððñöòã¤q”Þó”µôôõ öý¶ööýŸæççèûéêêëììíîþïððôØ nÖòóóÊyïôôõöü½‡ðööüõ¦åææ÷çèèéêêëëììþíîîþïððøîÉ‘q–ÖðòòüðyÆôôõöúÄ„ðööõõñÆäåææççèèéêêëëììîøïâ·t¤Ýððñòý°“óóôõüÇ‚áõõôðÊãääåæççèèéêêëëììõæÈ•t‚¹äððïððñùòÚqãòòóóôüÀ~ÛôôóÉâãääåæççèèéêêôëèÉwqžÑîîïððþïððñýжòòóôü»~ÝôôôóÈáâããäåææçèèöâ·“tq–ÂìíîîïðþïððýÀƒòòóùò³…èôôóóòë˜àáââãääæÞ¾žƒl| ÆæëëììþíîîþïððúärÙññòòûî–ŽìóóòíÏyÞààÒÀ±›znw“²Óäèéêêëìþíîîïðûïð’ªððñòûÞŒíòòåñ펵¤Šupr|¢¶ÌâææççèèééêêëëììþíîîïðüÅ€îððûñÉ{·òòñäð¤Ê¨˜¤¹ÄßáâãääååæççèèééêêëëììîþïððûênÜïððûìªzÎññðñðòËŸð§ÚÜÜÝßàáâãääûåææçèèéêþëììîïõðެððïØˆ‘ãð ðñâŠéî~ÙÚÚÜÝÞàááããäæçèéêëìþíîîô¼‡ïî®vºïððïðððéŒÚîålØÙÚÚÜÝÞßàââûãääåææþçèèþéêêþëììíîùém¸†ÝððïðêïžÁîî¾vÖØÙÚÛÜÝÝßàáââãääæçèéêëìöíîátvÀêîîï ïçîíì–ÖÖרÚÚÛÜÝÞààáâããääæçèéêëìúæ³vz˜î î察êììèrÖÏÕÖÖØÙÚÚÛÝÞÞàááâããääæçèéêôæ¸{ÔÇzéììíîîÞì²”êììë»—à¾ÔÕÖרÙÙÚÛÜÜÞààáââããääåææþçèèö¾|„ÄëëìpÒì ì௒ììëëä|Ò×­ÒÓÔÖÖרÙÚÚÛÝÞßààáââãääþåææçùä²x‚Âéêêü‘¶ëììýª”êêõ覞àÿœÐÑÒÔÖÖðØÙÚÚÛÜÝÝÞàááââãääøæÕ¨tŠÆæèèéüê« êêÐë衚èééèèÒzÏíÿ~ÏÐÑÒÔÔÕÖרÙÚÛÜÜÝÝßàááââãà¿“s™ËææççèýÄyééþêééúà“¨æéèèôâ´×ÿÿnËÏÐÑÓÓúÔÖÖ×ÙÚÚûÛÜÝÞààõʦwz¬ÔääååææçèüÝwÚèèâÔ‡¼çèççææ®ŽÔéÿÿk²ÌÍÏÐÐÑÓÔÕÖרÚÚòÛÜÚШ~p—ÁáâããääþåææüçxÄææúçæÀ€ÈææùåäÇtÐØÿÿævŸÊÌÍÏÐÐÑÒÔÔÕÖ×ØØ¿šzm¶ÛÞààþáââþãääûåæœ¯ææøäžŠÚææåääûØx¿ØÿÿÞ’ÈÉÊÍÎÏÐÑÑÒÓ¼£‰lx—¼ÚÚÛÜÝÝÞÞààááâããäø¦›ääÍ‚§ääøãâá‚¥Ðìÿÿê¤nÆÇÈÉË̵­’€lv‹§ËÔרÙÚÚöÛÜÝÝÞßààáââãëâã¾’à§€ÆããâãââáÞ˜Ùßÿÿè¦i¨¢”Žuoq~›®ÀÏÒÔÔÕÖÖרÙÚÚÛÜÞþßààùáÈp„ Ûââ÷áàßÛ˜ŠÔÕÿÿåmfj†‘›­·ÈËÌÎÏÐÐÑÒÓÔÔÖÖ×רÙÚÚþÛÜÜÝßûÑ’kÅààõßÞÞÝÚš§ÉÉïÿÿ𸇄ÀÂÄÄÆÇÈÊÊÌÍÎÐÐúÑÒÓÔÕÖÖØþÙÚÚÛÜùÝØ¤|¤tÞÞÜøÛØ•¢ÈÏìÿÿo¾ÀÂÃÄÅÇÈÈÊÊÌÍÏÐÐúÑÒÓÔÕÖÖØôÙÚÚØ¨w™ÖÚzÕÛÛÚùÙ¯ÓÐßÿÿì·­f°¾¾¿ÀÂÄÆÈÈÉÊËÌÎÏÐÐÒÔָרթz”ÌÙÙòyÇÙÙØØ×ÌŒ¹ÊÍÃÿÿµüp”º¾¾ñÀÁÃÅÆÇÈÈÉÊÌÍÎÏÐÐóÑÒÒÓÔÔÕÌ¡y“ÄÖÖýxÆÖÖùŃ´¿ËÉÿÿæ±´…}¸º»¼¾¿ÀÂÄÄÅÆÇÈÉÉËÌÍÎÏÐÐÑ÷¼–uÆÔÔÕÔÔôxÈÔÔÓ­ŠÀ°ËÉÿ ÿÙ°±™j´·¹¸»¾¾¿ÁÂÃÃÄÆÇÈÉÊÊÌÍÎÎÆª€~¤ÊÑÑÐÑÑÒÒôÐxÏÐÍ––Ä–ÂÈÿ ÿÞ«®¬fž´¶··º»¼¾¾¿ÀÁÃÄÅÆÇÈÈįŠs±ÎÎÏÐÐõÄqϼ©È’»Çÿ ÿ䩪«v†±²´¶·¸¸¹½¾¾¿ÀÀÂÄĤˆq¢ÈÈÊþÌÍÍôÌʶtœ†½¿‰¸Äÿ ÿ榨©Œn­°±³´¶¸¸¹¸»¾¾¬˜}p‚ ÀÅÅÆþÇÈÈöÇ£n¢Ä°‚´Êÿ ÿ¤æ¥ džª¬¯°²´µ¯ Ž‚pv¨¹¿ÀÀÁÃÄÄÅÆöºj¢ÂŸ}¯×ÿÿ£ë¤rˆ§¡›–Š€on|¡°¸·¸»»¾¾¿ÀòÁ»™~¤rµ‹‰Àôÿÿ퇄ƒ~jekjv‰– ®°±²´¶¶¸ýº¼¾¾õ¹™€º”„z¾ÿÿŒŒd”£¤¥§©ªª¬¯°²²ú´µµ¶¶¸¸¹ô´|˜¶¸¨iq˜éÿÿ£î¤£t‚¢¢£¤¦§¨¨©ª¬­®°°²þ³´´ñµ¶¨„xš³´´¨n‚Àèÿÿ£üi¡££¤¥ü¦¨©ªª¬í­®¯°°­’y¢¯­­©ƒpªãÿÿÿûû­àúéÿÿùûø±úúèÿÿùûç¤Ùùôÿÿùûà¾ëùûÿÿùûºÑúùüÿÿùû£ôúÄÙÿÿùò•úúÃãÿÿùÓ´úú£èÿÿù¨Üúù ðÿÿùúùù¦ïÿÿùÃùùøŸéÿÿùðùùøåÿÿþùøøý‰ãÿÿøýŒâÿÿø÷ýˆÝÿÿùø÷÷×Ñÿÿ÷ü¼¸ùÿÿ÷ûöÉóÿÿù÷öôñåÿÿù÷öã†óêÿÿúîõ¸¦ðÿÿúÞò™ÎàÿÿúÜÖ°òÐÿÿúÑ¥Ûññÿÿú¨§ãðáÿÿûtØæèÿÿû–ïìÔÿÿû¼àðìÿÿûÍËîçÿÿüËÌÜÿ ÿü­Ìðÿ ÿüœæíÿ ÿý¡Õÿ ÿýÄîÿ ÿþÞÿ ÿþÚÿ ÿþíÿ†ÿûû­àúéÿÿùûø±úúèÿÿùûç¤Ùùôÿÿùûà¾ëùûÿÿùûºÑúùüÿÿùû£ôúÄÙÿÿùò•úúÃãÿÿùÓ´úú£èÿÿù¨Üúù ðÿÿùúùù¦ïÿÿùÃùùøŸéÿÿùðùùøåÿÿþùøøý‰ãÿÿøýŒâÿÿø÷ýˆÝÿÿùø÷÷×Ñÿÿ÷ü¼¸ùÿÿ÷ûöÉóÿÿù÷öôñåÿÿù÷öã†óêÿÿúîõ¸¦ðÿÿúÞò™ÎàÿÿúÜÖ°òÐÿÿúÑ¥Ûññÿÿú¨§ãðáÿÿûtØæèÿÿû–ïìÔÿÿû¼àðìÿÿûÍËîçÿÿüËÌÜÿ ÿü­Ìðÿ ÿüœæíÿ ÿý¡Õÿ ÿýÄîÿ ÿþÞÿ ÿþÚÿ ÿþíÿ†ÿûû­àúéÿÿùûø±úúèÿÿùûç¤Ùùôÿÿùûà¾ëùûÿÿùûºÑúùüÿÿùû£ôúÄÙÿÿùò•úúÃãÿÿùÓ´úú£èÿÿù¨Üúù ðÿÿùúùù¦ïÿÿùÃùùøŸéÿÿùðùùøåÿÿþùøøý‰ãÿÿøýŒâÿÿø÷ýˆÝÿÿùø÷÷×Ñÿÿ÷ü¼¸ùÿÿ÷ûöÉóÿÿù÷öôñåÿÿù÷öã†óêÿÿúîõ¸¦ðÿÿúÞò™ÎàÿÿúÜÖ°òÐÿÿúÑ¥Ûññÿÿú¨§ãðáÿÿûtØæèÿÿû–ïìÔÿÿû¼àðìÿÿûÍËîçÿÿüËÌÜÿ ÿü­Ìðÿ ÿüœæíÿ ÿý¡Õÿ ÿýÄîÿ ÿþÞÿ ÿþÚÿ ÿþíÿ†ÿ€ÿ%ÿúß›hi££'ÿùØ‹hz ££(ÿñù®kejœ££¢¢£¤££*ÿóë“kx€€|€Œž ¢££,ÿïá¨sp„˜…xvƒ‰Š’££.ÿîùÞ·„|¡ Ÿ˜Š†‡„{vÿ1ÿ÷ûаˆ€†™¤¤þ¢ÿ4ÿõþöɼ“rtƒ„ÿ:ÿûðÁ¹¦ÿ?ÿ%ÿúß›hi££'ÿùØ‹hz ££(ÿñù®kejœ££¢¢£¤££*ÿóë“kx€€|€Œž ¢££,ÿïá¨sp„˜…xvƒ‰Š’££.ÿîùÞ·„|¡ Ÿ˜Š†‡„{vÿ1ÿ÷ûаˆ€†™¤¤þ¢ÿ4ÿõþöɼ“rtƒ„ÿ:ÿûðÁ¹¦ÿ?ÿ%ÿúß›hi££'ÿùØ‹hz ££(ÿñù®kejœ££¢¢£¤££*ÿóë“kx€€|€Œž ¢££,ÿïá¨sp„˜…xvƒ‰Š’££.ÿîùÞ·„|¡ Ÿ˜Š†‡„{vÿ1ÿ÷ûаˆ€†™¤¤þ¢ÿ4ÿõþöɼ“rtƒ„ÿ:ÿûðÁ¹¦ÿ?ÿ€ÿ£ó iŒ££¢¡¢¢££¤¥¥þ¦§§ð¨¦”~vŒ£©¨¨¤ŠnˆÓÿÿ£û„s££¢¢£¢í£¤œr…˜¤¦¦¥ ‹m¿ýÿÿ£üœg’££¤£íž”†sx†—¢¤¢¤¥ž‡m±êÿÿ£ý€t££õ¢ ™ˆ~rx€Ž¡££÷¥¤”zpÉøÿÿ£óŸ–‡d€ytytŠš££ùœƒnu ×ÿÿtõx~„††€d™ ¢££ø‚ouªÍçÿ!ÿ¢£ì¢~v ¢¢£¤¤™vm}”Êâþÿ#ÿè–”–™›œš–pp‡…‚ulqÂÞøÿ'ÿì‹{|}lnnmq|zz†¦¹ÇØôýÿ2ÿþ7ÿ£ó iŒ££¢¡¢¢££¤¥¥þ¦§§ð¨¦”~vŒ£©¨¨¤ŠnˆÓÿÿ£û„s££¢¢£¢í£¤œr…˜¤¦¦¥ ‹m¿ýÿÿ£üœg’££¤£íž”†sx†—¢¤¢¤¥ž‡m±êÿÿ£ý€t££õ¢ ™ˆ~rx€Ž¡££÷¥¤”zpÉøÿÿ£óŸ–‡d€ytytŠš££ùœƒnu ×ÿÿtõx~„††€d™ ¢££ø‚ouªÍçÿ!ÿ¢£ì¢~v ¢¢£¤¤™vm}”Êâþÿ#ÿè–”–™›œš–pp‡…‚ulqÂÞøÿ'ÿì‹{|}lnnmq|zz†¦¹ÇØôýÿ2ÿþ7ÿ£ó iŒ££¢¡¢¢££¤¥¥þ¦§§ð¨¦”~vŒ£©¨¨¤ŠnˆÓÿÿ£û„s££¢¢£¢í£¤œr…˜¤¦¦¥ ‹m¿ýÿÿ£üœg’££¤£íž”†sx†—¢¤¢¤¥ž‡m±êÿÿ£ý€t££õ¢ ™ˆ~rx€Ž¡££÷¥¤”zpÉøÿÿ£óŸ–‡d€ytytŠš££ùœƒnu ×ÿÿtõx~„††€d™ ¢££ø‚ouªÍçÿ!ÿ¢£ì¢~v ¢¢£¤¤™vm}”Êâþÿ#ÿè–”–™›œš–pp‡…‚ulqÂÞøÿ'ÿì‹{|}lnnmq|zz†¦¹ÇØôýÿ2ÿþ7ÿ€ÿÄÿÄÿÄÿÄÿGG##   Backgroundÿ     Ÿ’  Ÿ® n z  ŸÞŸîŸþ   . > N ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPP((pgsphere/doc/img/spoint.jpg000066400000000000000000000105341332443031700162350ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄ@!1AQa"2q‘¡#3BR±br’ÁÑ$Ss‚Ò&4c¢TáðÿÄÿÄ1!qÿÚ ?÷ú(¢€¢Š( (¬^D‰ Èꈣ%˜à ¨© é“N°Z‰nå`YD+ì°É Ä)ÆzK˯ʡ‹>›l™šïˆˆZ ôW7cªêº›¹µ¸Ó #ÝcqùãƒáLO©_Ù? ÅÆ’Ûl­)…¾¼Y ¹EEƒÒKVȺ+lÊK°á=6owË9§íu;Ç)ow Ž9ªÈ Bº(¢€¢Š( (¢€¢Š( (®KÒ mnßöm­ËE}ô±{î?*c}ðyxùƒú‡¤Ee6ºU»^ÜÂî¿u~[ û üH¨ï%ÝÍÉc5õÔxfi8!'¹pçã9ï<©‹X®£µX¬íâ³q1ÿh8Oˆ¥4µ‚}:ÌÏw* eNجhì2ÜxØoЂ|( Uí}P½ø¸Šî2$…®Ôø‡Od”ò9èyÖ¸ý&³ÕïcŠÒ#$0*ºÃÀÜ@h"úG®I-Ûhö.õ™:(?‡ûü»ÈCA·mÚé°óJíÅ)¡ˆÀ` ©.É f/#±y¹»É4iÌ..äÓÀµGw\dvêX’¿$ƒŽ{tÍô–]LðÛ;Eiɧ]šOî½òï¤u¦ÑVú,Á%½“‚;W^%ÓƒÍqÌór2¨ƒ’¨JÐÁÕ5nAög0ZÒ0wo÷Ò&×RÒlc´ŠÂÍñ’òúÛeØócöyɯš Z¤þéÀ]Am«¦ qñÈGêÛäjà4‡£gþ°÷a òÛúP,úZhwGVµGœ‘‹Î?jG_Χ¡@ØŽ™ºeŽxRX^7PÊÊr<|Zˆ÷Pú3z#™¸të¦&&)y”nCsär:Š —šeµËvçŠ …\DÜ.£ãÔx …i3ߦ¡¨fM>ÑÛ^"ažr8ÎÃåÌìªFÞë[Ç®FÖÚ?V'í&ÿS—÷G>½Õ`*ª…¶(>)WPÊAR2äjv¿rh—+ @Vß¼0#ê`ösiLfÓÉmœÉf.óqýÞGÀóÕwwªlmmdãI¤KŠÇ‚9ƒÅ¸>=Ô^éFÒ{a"ËF bïÇR‡ªùÀOM¿Q±Žâ27eÈ<$lFÞ Ó5$ý‘¯Í"­•ÁG`£¹#'ÁŠ|ñßAÐÑEpž]™u;KPsY‡ï±þ€æ®þ¼—[»:Œ÷—…±—/=ŸcèHí)KHØ©a™Õ?¹ä<ÏJ²lmîm’N›!á1‘È©ªˆâK~ØýäŒKŽªypùr®ŠÚ‚f³>­kb4ôxîšðö8ö%ç‘î³¾ÜêÍž¥ •¬6ß³µR5ª-ËàÍN¶>½é\’ã°„"ÿ¨ûŸ¦ÕÒ¡ Tk¶ý-µð²—þ4Žƒ©\­´»™x ¯2F›9N~•yMOÐ}›[˜ùp^NîF#èh7,ZÍßß\Acæ¶ã´“ù˜?”ÖñèþœÖóG,M3̼/<®^Cðc¸ïÀښܭ@Ž‘w3¬¶7›ÛRÛ—j‡Ý|@ßħR5ˆž­l…§µ´Eç,'Þ_=áâ5^ÏV·cÙÊL“¾Éòè|ªdmÂõž­$cD¹i_ …âÁ;õ «èÆ[N{·{¹žcæp>‚º(Ú¹{-([ÛÄ^][² $œKž¾Ë>Tú[ê‹îj¨Ô¶ý èU©ð^jПÃwÄ> ÔšR85“ÏT¶ Cÿ:VÖÊôë·°Ë«N¥âŠRaÞ^ ã#•WÄdêi×ìVC»=äÃcªö„|HØy‘K®ƒ`ä•–í†ÿâ¥iò“Ãô©ñzP‘úL=ƒMX§‘Åq§b%€ROrc8ÃqͯÖÖÃÓäÍÝãê7>ãÕº¾¢13®›ny¤D<Ì<[Ý_,ük^‡k‰}s¤ÇXßüE»ãwS³)<ÉSßÑ…U Hk1ÉêÉ{n¥®lÛ¶@9ºãÛO5Ïž+¤VsX“KÇu ¶«r²/bÈ$N ÏÊ¥µÄÚçÙÚ3ç~;‘³L;£î½òï În zå­€¦ÂßlzNãðõsã·CLé’íæ^‘Y®éEÒ ’ì ”2r|r ó • À‘Œn;9‡4?¨ïóR~;8áÿ2x×ëÿÕg,ΠH¹Æàˆ>¥N¾KˆM¯ÚvÈ.¨a†Îýy}(;8$åOÅ%rÐê«;x'‹¼”,>k𥵧“]€æp¿­EÒ¬Â?Im›¤Ö²'š²‘ô-KG«Øc>½mõWûÒ—úΜ—šlë{ç!‚H…daÓÇbµO“Ñí&X2ÚñIq:Ü<¦Fí;E÷H|ñ.93K®½nçðÝÜüP6>dõ­‚ïW¸Ú m—óÜÉÄ•?åY5‰æÇ–øçt´ÇŰj|ÚÜV·³G½¹àÜ)ýæ÷WÌç—C\ï©^Ít?Ê_²‹ùWsæMS‚(­âX #v ŠU© é:kIs5†¨Á’؉a´FÌA’3°/ƒ‘¾ÃjêA`r¨Ú‰õ]BÂü{¼~­/ð¾1òp¿3OÜÞÁešy 8I=O€ ß4ñÛÂóLá#AÄÌÇ`*=ÄÞY]ê#$‚õX˜oÐ$~b@>¾¶ÅÚ„És|†8PñCjO#ÑŸ¼÷CÄòÙ«Þz®/ +£,kÞpNO€'áA–žÆëY¸ºì–5Š3Ðã%¾¬ûjÍJô~K‡³À@ªO3ã籪´ržœéž³§Ã| ñZ± G0üˆSðÍuuŒ‘¤±¼r(dpU”ˆ<ÅÇ1 "› 'CÑþÚ´j^å³t[„'çëUµ$éwÍc:ñÂÙh¿ÈmŸ#Ö¢jó-Œœœh£¹9Øùu «”4ìn’U¾#5/£(­"IaYr>c"˜‚òû¹‘‡ƒAz(­‰Ïa€WÍP"iÉj.‡Ü`ßÒ”†|Óœk4M{®¥OÀÐYŠ`Ê‚2)•“5ÌéZœéVþ³s:/fÅÜ Ôðž quËVûŽÚàôìbfC¥»xVÚÚ8P¨ 9VÚ( (¢Š5}&ßY±k[ø‘ǼŒ9^i¨ÙÜéWOi|œCH£!—¼ëúW­Tý_G·Ö-;)²’.ñʾòê;Å“i’naâ an ƒœŽ‡åL½¼2ýä1¿ñ(5ó^Ñ®ô;µžæ6TÏ MBH:ôaÜ|qšÁDÅE:H„d^~cûP cj§"Šb;;Ç´müC5£Žäs‚3ü2q_;iÿø­üë@ö÷·p¬.J„ ÷XrùƒW£ŸnuÇIqu ä3ˆxˆñI߸ÎxúÕ¸½~rÃðBÇæHý(:”œwÖ¹5kxŸ³d—ü¸‡|‡/:‚±¬Ÿ÷L?)~ù.ó§æÚÎÊÇA…{Kë½™½N#ÑHiŸ%òÏÄRöSÛéÒj 6SpŒ–gnÍ2;ɤfÖŒ˜Çò #'¸/2~Tï£ÞŒ^_q]êhðG#dl %Ï z*ãuÆô4ËYµ¹ÖæaÃo{ ‡‹xò;Ï\ЍT `Ò±Š(à‰b‰B¢Œ:VtQ@QEQAŒ‘¤±´r"º0ÁV|+ŽÕ}VϢ܋Bw6Î3>WË5ÙÑAå·½dm§ö ~(Où Ÿ˜5®LnRHø\~ ÈàײV¹`†tàš$‘{AZÍ»ÇØ¸ÈØ–]CΰŠòFBA‰³ñÉŒüc—zËz?£7½¤X²jÎ-K¸¢ÓlãnôAý(<¦qxÜ6í5Áî´„·×éW,=Õ.]d’8ìÔó’ví%òíó¯G  9_h"é>‹éúT‚p­quþ|øfÂ9/•Z¢ŠŠ( (¢ŠÿÙpgsphere/doc/img/spoly.jpg000066400000000000000000000116451332443031700160730ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŽŽ"ÿÄÿÄA !1AQa"2q‘¡#BR3Sbr’±ÁÑs‚Ò$&c4T¢áðÿÄÿÄ+!1A2Qaq‘¡ðR±ÁÿÚ ?ß袊¢Š(Š+ËÈ‘!yQd³@z¢”7h¬šu‚ÔKw+Ê!_U€ÆHf!N3К.¿*†,úm°^fk¾"=à }hôUnÇUÕu7skq¦G²Æ6â>|!ò¿ʤO©_Ù? ÅÆ’Ûl­)…¾¼Y QI`í%«d]¶e%Øpž›7³ðÎj}®§cxå-îá‘Ç5Y#à( tQEQEEPQ@QU.Ðkkvÿ£mnZ(›õÒÅí¸ü©÷Áåçñ~¡Ú"²›]*ݯnáw_ÕEã–Èþè>ò);ÉwsrCØÍ}ušgNIð@Ü9ÆøÎ|O*‘kÔv«¼Vp"áŽ&?íÞIóKX'Ó îÌ÷÷r –TïŠÆŽÃ-džý'Ê€5WµôB÷ââ+¸È’»Pcâ=RPÈç¡ç\ãí5ž¯{V‘!UÖáãÀ9` ’÷8À5Âm-kS:rÄ00kÉ-㢞b5ÆìÇ©$ãË•IÒô"Ñ­/­l¡™Œ`ËnÊx3í)>Ëׯ#âe,j ¯}õÛ)ÊíÌ §Ë$7Ì×­å¬dºÓÆ™?ý9VVEŒ1F‡‹ ¹Èa‘Ï;šKH,c»±Ônâm ™‹·äà|œø€F<«¦úNÁ¦»ÔlÄÒÜ•iÔñÀPðð7ä[rh©Û22\[]ª°ÁWµvyàó¥©&—5ôv=½Ý¼ÙîUÈg…ÀÏû€FHðÁîÒöÚú2öÓ,€69©ð#˜>F ë°ÛÜ%Œ3D’»Œ*ºƒË$ÿñ€öÖ÷ºp/g#ÝB9ÛÌùp?qÏôlûÅL²¾‚þ, ‘’ ‘†R6 Ž`ùú9àÞÊêXñÈL±ü‰ÈøP'»}>ù&»‡Ñ’cÁ4¨Ù‹8õ\¶Ü'¡Î9Î( ¾ÏT[‹·´–&†à)uV ‰8âR6#–ÜÇʘPQ@QK5íY4m"[³ƒ&É Å!ÙGÏè —´zä’ݶa‚àI“¢ƒøÏËĈ ¼kn×M‡šWn)H• @CmPt¸{¤%˜¼ŽÅävæìw$ѧ0¸»“LwÕÝq‘ß©bJû”’9íÓ4ô–]LðÛ;Eiɧ]šO$ð½òñ¨:ŒSh‚+}`’ÞÉÁ«¯ƒYÁæ¸æy*yTAÉTp•h`êšÆ· û³˜-é;·ûô $i6º–“c¤VoŒ——ÒÛ.Ç›»ÎM|ÐbÕ'ìþœÔÑz:`Ç„pŽ­°?O¨›?öí€Ï³_–ßÚ€ŒúZhwGVµGœ‘‹Î?ZG_Χ¡@ØŽ™¬0Ëð¤±:¼n¡•”äyø´‘î¡ìÍèŽfáÓ®˜˜@˜¥æP¹ Ìc‘Èê(—šeµËwçŠ …\DÜ.£ßÔy*Ei3ߦ¡¨fM>ÑÛ^"ažr8ÎÃåÌì¦FÞë[ǦFÖÚ?F'ï&ÿS—÷G>¾à*ª…¶(ŠUÔ2TŒ‚9]¯Çš%ÊÈP·ñ ú^Îm)ŒÚr-³™,Áåâcð?»Èù|®îáÕM­¬œi4‚iq±Xã G0x¸WÏ€ñ{¥HUì}D‹-€I‹ÇJ«ñ€)ž›£cÄdn0ËxHؼÁ©4$ý¯Í"­•ÁG`£¹#'ÉŠ|ñã@Xh¢Šªo.̺¥¨9ެÃ÷Øÿ`óUþ²]nìê3Þ^Æ\¼dô }O ¤v”¥¤lT°ÌŒêŸäòÒœ›{›d…“…cÇvÈxLdr*G*C¢8’ß¾?¬‘‰qÕO.‡*±@ûP 5™õk[§£Çtׇ¸‰Ç©(Ï̃Þþ`Ó:Q¬Dðµkd-=¨=â/9a>Òù‘í1ç]n5»hÄIk›Ë™¶ZieÚîØövâHo¡MjÒ!Þ&UP[¼@HèIpNÝk@]ÁÈ7+-Û ÿê¥iò“Ãô¦‘G($TAÉT`…ZåÕ¸š©9¾¤’Μ,,­ŒÒíEéΔeÛÃÝeç [¢‡§ý¥Ùk³z=ÝéÑ#%WÙ.ÒÏcR@çœñ`ìåö‹¦êO¢ÙßY8¹“fc™Y¦OX0ÎrÅJ6ûìÃ< ñSR¡Š+xRcXâAª£ S­ÌösZ\ÀTO3z ÉçÇìŸ>û‰ $ØLw#’I¸–FN[Âgéõ¦Ôš5K]_M´ØKiTdïÝâœÐV. c$Ëžᓇ'¡–Em™vŠÍtîÔ] Ù.À¹AÓ'!‡¿ Ÿª#Üwsh¨ñóR~;8áý¤ñ¯×ÿª÷,ΠH¹Æàˆ>G¥.¾KˆM¯ÞwÈ.¨a†Îýy}( œr©ñIUhuUüÅâJ5Í2ƒZÓÉǦÀƒ8_ë@X£zÊ>Ë,/4Újšn¤Áî%²ÇÙ`r8€8#xŒV‰¯aŒúu¶?Õ_óTmP´ÒþÐôÝjÞX '‘_¼ñG8 „#î»ÒwS£FPIbMg+]S©Ùvñ¹œèåõ8·=Ú× s¦MiZº¤k¯[¹Å¼7wÿ ™}k »Õî6‚Æeü÷2qåOùPåŽÁ¬ïíJ[MC³ê-Ú9®,çW‘ÑKwhAR8€ÀËØ‘œyU°i s¾¥{5Ðý’ýÔ_Ê»Ÿ‰5&óMŠçDºÓ oð< ¢ '‘œmãS«¸8úž» Ÿ uN·ñkíÏà¬ö( kHu £sq¬±À†2 9$`qaÕׇÇCW°@«%û9¼’ÖÂu–ÊóÑçY6 Û*àî‘F´|Mj7°Y@fž@ˆRO@Sä+'×MH§iÛ«kÊ”–Ééðõ_†wšxíáy¦p‘ âfc°žâ o,®õ ‘’A z,L7ŒX?1 ,ã]b‚mBd¹¾C(x¡µ'‘èÏâ|!æytÕï=N—„•Ñ–5ñ8''È “ÖžÆëY¸ºî–5Š3Ðã%¾¬ûiÍ*ìü)—v=@TžgÏ㱦´UNÜéž“§Ã| ñZ± G0þ)÷f­uæHÒXÞ928*ÊFÄb€Ç㘆M…“¡èþïñ\5/bÙº-ÂóÇ÷¦ÚÆ’t»æ±xál´ß?ä6ÏÀõ¤š…¼Ëc'w'(ãÃîFv?´XÜ¡©±ºHuV÷ŒÒT¾Œ¢´‰$a†AeÈùŒŠ‘ä-ú¹‘‡“@>Š+bsÜEŸà›·l}—¸!Q-˜ïÕ”Bo>\98ÊŠ› ù©oÝÝ[Io2«Å*uaA ŠÃ„fºg³Ü½µÄí«Fµ=âóûì/ìlm;I£Ç¼‹{j‚9’fË>`õ¯;ô&æ²f±ÛŽÌEia£¢]-ê’$‰f û PíŽG œ`í{Ùÿ´X¥Œ[kb¸EÇ|¸ !òž^\ùl+ZוgÅÆ}N”û5ס⭥×Ì¢´q¯Þ¥+Ò®ÑöšÏ³Zi¹¹ÄiZýýþ½«ËÄbÕDœñ2Ä®ÏÆ$ߪ”Nç$zŽ \Û[êw5ÅÔ±†ã<ÕW’øxøš˜®0è)5† ¶‘Ïc´×ÜHæž!“øF™ðÛ½µkN³Rž2’Z,ls*ÍN£’XOŒçÙ\ÝÅi –RqœKÈÔšK¨Ç4öŒ’í{~=wî£>Ð|9$õ8ß lÿQ™ ˆ Ïàˆx(ñóæ~•'Dµšîåµ[´(ÄpA~óó<ÏÀt©Û¶ÖÑ€EʺÑEQE _I·ÖlZÖàc~$qí#DVi¨ÙÜéWOi|œCH£!—Äïý+Z¥ú¾o¬ZwSe$]ã•}¤?ÜxŠ&Ó$ÜÃÄÂÜ9ʤ½¼2þ²ßø”ù¯h×zÚÏs*g…¦‡!$z0ð>xÍxQ1@ÑN’!—ŸÄŠ[U9 ÷ Tˆìì[vÑ·ñ ×;‘ÎÏðÉþE|ï§ÿÚ·ó­7LK{{Û¸V— %B{,9|Á¯º×g4íy8ä^æèn'Œ"qÅù†ÃÏmˆ¥r\]Cy â^ b´Á./_œ°Ä<±ù’?¥k8FkYE­î*ÛÔU(Ë^…s@û>Ô½?¼í.¢·–é¬Iñ;/¬£ ‚v\yb´‰5kxŸ»d—öq&ù_B±¬Ÿú‹‰¦”¿ ü—üjb\ÛYÃÝCè0¢­^§}VUšI¼l°´XØT¸«R§96£œgÝåŒ{Ëë½™½#ÑHiÇ’ü3ïÊ{}:MAFÊnQ’ÌíݦG‰5m`ˆÉŒp/ ò2|ó'åS{=Ù‹Ëî+½MäbÌ$¹äE\cn¸Þ¦Da¦Zͭη3xÛÔ\ì<üÛÏéâmȪˆ@ +ÌQGKJ`Ò½ÐQ@QEQE™#IchäEta‚¬2÷U;Uì´†}äZ¹¶q˜‰òê¿ ÕΊ-¸Ðµë {í?½ñBx‡ÈdüÀ¥­rcr’GÂãðñ~G¶Jç,ΜD’/ƒ¨#ë@c“±¹·xû—˱èy׈¯$d!ÄÈ›?˜ÁñÆ9|kYnÏèÍíißlŸâ½Å£ip7Zmœmâ(?Ò€ÊaÃnÓ\ HK}wþÔòñڥˬ’GšžrNÝä¿ß:ÑÂ…(@WÚ.“Ù}?JN®.¿o>‡ðŽKð§TQ@QEQEÿÙpgsphere/doc/img/strans.jpg000066400000000000000000000127721332443031700162410ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ  "ÿÄÿÄD!1Q"Aaq‘¡#2B±Rbr‚ÁÑ3Cc’Â5¢ð%4s”²ÒáÿÄÿÄ.!1AQa‘¡±2qÁáð"ÑñbÿÚ ?÷ú(¢€(¢Š¢Š(¨éºÎ›¬,§_At"b¯Ý8b§$n:ƒÈÆEÅ½íæ“qm§Ü-½ÌËݬퟳ€Ì0Aâ ’7â³¶½™ÓàíÕ¿t°²CÆŸs)<\1˜Y’xÕB! ‚>Ðq‘™ÊRRI,ŽÊhΔ¥95%ªÙî×Ï~V| …å]Ó4ÇíU–§ýš½Òš;m:Ñt¹aî#à`gº”w ÂâØ–«]úfŒ´y¨'|·[ÝßוÖo†.êáEW! ¢Š(Š(  (¢€(¢Š¢Š(Š(  (ªšŽ§g¥[‹ÙÖ$Îy±è2h tƒ_ž-7UÑuInVg´™¸ANîTÈâØðý¤q äö5Jç´Ë&9*ëA&€ÒêWH·–à™[„ð›vbIàV8 “×>ú4[Èý¦]WSŠíon<1¡´”ˆbòU!|ù“@%Òû.–|wEå—Ù™ "!™vãU`x— øqå·,VºÖÁâf²‡K»Ç‘„‘׈d¥úMô‰<²ÛÙÝJg¸ž2DjH•ÊîØ# ÅŸÊ»¸°º³cszÁ4©\µÍ³³øË`¹ûÀ`o÷Ìhe ÎÞ륊UnRÄöçûêMgªZÝkúâ3kCìÑ4£Á#Ëã+Œª¾ûÓÙ4Í:à%•¬ž`˜”ÿ*ž4ˆÀ¨ŠÏ ª§¥Q:I¶%ô¹½•¹÷$qBßÃø„X™OZÒ­ ÒfšÝæ·xŠÉw+p† “ÃÏÒ˜pêVÜž+ÄL;¹>cÂOÁiUÖ¤ou]î5¶›½Ygû@Q•|Jª|Ë0ä@8Sµiq@!ŠâÞÏP⋎߿p&·”pð98" À%r2AëMགâi ITÏ;ÄÎëŸNžµ¯eö•s Ф˜Ø£’˜t"’û-Ì–WÍ1šH<3ÈwP˼reN~÷–IJ@ÔÑU¬nÖöÑ&PA;2·5a±ÔjÍQEEPÉ"EI#D™‰Àyל —ÖuyuI‰*Þd?áÇåñ<Ͼžöþù ÐÅ’1ì•r?Pc?R£ÜMg!œ[[† ÄÄ…D‰!@[µ¹–ÞöêÆÍ̲w±–„Xûˆ#êÐXZ¥¬gžG£hèÑ©"HxÜù ó\ž£ã@KuÿkÑéÃ{;,MsÑäü üÍif»/-ªijæò n®Ï9Y´"hñ¼‰þ¡@*²Ó.d9Úþy²¬Çæ¤h@  v ÖcNÕ4ÛdÔ"»¼·\ÞKàw`pv|êÆŸ«ÈÖ‰oge=ÛÅö}à^ê<D–=0NçPòÖ¶õÛýèS]?GßüêZ³?¡o“Nr}†r}‘ÏømÌÄOO5ø!SÜêrO3YéJ³\ ¤˜ï¼|ÛöFýqΫ\h÷zÍ»Eª]ˆámÄ›#‘.w$ö V4BZ6Ÿ$QÃsfDr$k¬? ¨èÃ~G•\™=¾‘k Œ–Ó/´÷ÇŠw˜en§ùtÀÇ*®Mλ.´ñøŽZX¯›¯¯1ëäÞŠf­v‰,–ή÷"€©Èf ‘ÔdçÝWb‰a·HFêŠg ¬ÌhN¢uK8™ô‹yˆTä3œ‡š1ÐdŒyåˆßÓÅ,sÄ’Äêñ¸ ¬§ ƒç@#‹ƒC× Ù/¼iŸ»Œ)_‡»yŠÐó§P·Š÷RŠÖU%^Ò`Hæ¾(°GCǺ¬iW2OfüÄ,b—°8Èô<þ4ê(¢€(¢Šλgqíú¤öñ;ˆÄ@þÑYúð¥zLžÙ"Ý0!PpƧÈþ#ü¾­q©ÌÞ×~àý£]J«ïï²>žÜvè^»È‡?Þ_^£Î€×[¶Â©ê§Ûµ;KæŽýüÃö>óŠùawÌAá:ò8ò=ò®4†ö­wR½;¬em£=îßS@hd°²ºÞâÎÞSþdJߘ¯‹¡éÿ•Yí×úT±µN­@.Ñmൿբ†Ð%Ê•áP0 HqîÎi” Ýj“ÇÄØ•Um‘ált ·­P²nÐjqŸÅ2“/ûjåßÙÏi>ðIÀÅOáaǘâáùT+ä”÷?‡ÑÜ¥<ÛŽõò4SKuxÞÖHµ‹u-%°+:(ÞHOÞñ÷‡¸:¸eXл°U–c€*×Rä˜ô»w¿~FE<0¯½ÎÇørj䯦ækí&Tpq÷…°¼8ÎsÒ”–›´“øœå^ätjž¼Ï–Û•ÚV–aÔNŸ«8˜F½ýœ ý‚®wO2¤½œ¸Åjó@|THãTE Š0ª£‚•cô=ØÆÖŒyC!?Ecò>ýš“Jõ™{Ø?Fª÷jPœ™Ï ÏÄàPY·µj——Cû¸ñmëÃ’çýG‡ø+峈{CynX£ŸXñ)?$Zù¢d·m1¾ý¦9î¯ï;ƒê uS­O'„a#‡ˆžmâl|š€iEPQ@y£ŸíÜ$«s,£¦ìGæMIp¸¨õt‘ûC|êG{¯Œìãm¼\Ã2̹\‚O5= }í­Ü5Æ^)UsÞÄÜ-ׯÇ5Ïg×S‹KŠXžÚQ12²J ¶Iýaœüª­ìå4›£û¦1Šu¦žêÊÞ1ø#Uù âj’’[Ö+…#늰š¥ùØh—?bIVãzJÞjÚ É¦Ç“ZkùøC~¿*µ|º¬¶ýÕÅͪ™|)o%ÙÏï1Øu8Ú¾j%¶­¦\ÈÁS2ÄÄú§û)ª;Jn¦fãa„B0#C¾1×–kž»Æ¼ëzø-ÿ®<+Kñ~#Ùßî²”9^5(£(üO7Ï¢6|)½¾£jÅ"â^ìïÈyôÚ¤ ]®¥XV Œ‚+ÕN¤m†Wõø·¹æ(½k—ÖUÖbÛÇ{n¼W6mÞ¢Žn¸Ã'ÅsñÅ0‚â;›x牃G"‡FêÈ¥²ÛZYÆÓ‰Í’)âfG œ±ºŸÒ‘i×z‹ ;J Aï`šxʳ#|àsÈååµY”¬·W†G^™ð¸ 5:ÓM§Æåm£O 8Ëã€úlOÀyšæÒWÚI#îÃíL¹äÄ?7ùU š(¢€(¢ŠÍ»SdÖ]ª–\}•äBD?´»0üñRimÄŒ$F1ʯäzŠÜöçN7ZT7‰´–’qqcp±øg„Ÿ@kÝæU‡ ‹÷—ùŽ¢€_©Ëpšt±ÍsÞFvæ9ŽcëZ -BÞlçF<¸s¸øR}X¥Í,¨«f&Àšä´ ÐXe«±ÉYh¬-¶îÌÑéÎëôÎ*Ôv_j.®ÊãÅÇ9aŽ˜>u:µ0Fé]ì\~ò7â|ŒîéÐdöx.b#l–Ë…'Ó?Z|×ļRȨ½XàVR÷G…ô»„Y®Ý„LcW¸r¶ÙÇê jIr‘jF>4Ñó5ìc„¡ó GÞcŸpóéUôÙoµÍ:¹ckN6ûIlÙ?€d†þ¢žCvð¤0¢Ç *¨À±:pžRW5J>Wb¨·›Mµg»` pÏÀ;’r¸çæH=i6‰©ÝYÄÓÜè÷’ÄdKh«/wÀ\¦Cì ÈUo3¾à_¼½Iâšàïcj ±ã:îêî9eÙË),t;hæ9œ¨i?xó¬FŽ+|ïÞý Fª¿çúv÷¹&®éz«´VW±I:qqÀO©ÂÜ'Š6Ã.ÛåVlïíuL¶“¬ª­Àà}äo5`wVS‚<ÅaµþÕhZ§aõÝbóCy[Iš[†òÙÒrQN ¹ÀâuÉVcŽBžvs³K½—X–êôÞÞ«q²’€Œc »’Ê3Þ0ݱ±ÑV†‘I¬qÊö¿'âJœ¤¤Ô¶-}r쿽šZ(¢²rKO Å*Ô«)yŠò½[Jm?P’ÎRÀ§Š s»!äs×ÈúŠõzW®è±kV=Ùnîâ<´ŽhÞ½AäGÿ””^wþÅ4RGÞB§?ˆþ•=Ìwñ”‘Y¸@;ƒŠ±:MerÖ·±÷S)Æÿu½Æ—Ù[Äé%´±«4@,7 wëY””S”’=IÉÙ #r¾uz @ NöࢤrË®qÂÙüó_;”>Ù1ꊕJœ\Ÿ‰5žÅ¹~ÞÞ[.nrI`Ž®æ¢9²*= ^ 9`;whqè¤ôÅ&Œ]0ÿ˜:û£_æ+å¤,º•Ì^\ê³ ÄO„ò «“6uEâf £™'¨?NZV{§†ÙKüÈØ|H¥‘iö9 ð ˜oÅ12ú³M#‘UB®€ :j—|„v1Ÿ3‰%ÿê?ê«6–Ö²€i'#y[ÏÄòƒ¢2NV:ºÈJYFn_–Tâ5÷¿/–O¥cO™-fÔâ‘Õ#Žs/®¡‰?ÅÅ]eÕ6'›}טtj¾¼Ï Üª·€É®\=ó,ÏÜÄêŠN\rÎäc™úU·»—P›Ù,™·8yò_æ|¿ ,ƃVÔc³…@±³`e+²³/$ƒoŽ:Ôlªºm„Zmš[Ä 7Å[ <ºëEMWþ4E2Újéab»¹w±bžúß¼HþЀ*0 ƒÀÜ nMzWV•¥J¾õE%ËïDf1°QEÊh(¢Š9Û;;'Ð.oî™ckH‹‡8ñ~ÁÎÇ'z‘î>cÜßéٚछ…Þ„qcÃø¹îytå^…nŸÛ-m/çBÓäu´ø…ÔÁ¸L¸„¢á‚ûÉóÀÒj:]–«oÜ^À²§0NÅOPFàû«™/XŸ•u{ÿ­œÎê©hÔü+~o_ù\wíÙ¾þN&”Z!Ö6}qGµÆ>ð‘z6\SÝO±ºŽ’8´ o­ø.Ø–1èy0úÒ#pc“»ž à“õ$BåÏé]' ûp¾P}j9u£º¶¸W$)1· “áo‡P*oi‹Íø|ü@¯çQÏ%µÄˆcf´ÕI»¶ÿ„/ÿ"*uº¾“îˆ I2–Ãêi-µòÉ “ÇÞ œ*ƒò©ýª|x! u‘€LšÂÛÇ&÷RÉrzH|?é0jËê0Û…Lø±áI÷Yø íû÷výõÃg©·Å¼¾b´Ú_b®¤Ïñ^¤iiVü*xæo¿!ýAÿ}*Õ•µ…ºÁiCòT©èŠ(  (¢€(¢Š½íäv,Ò«i¢„æGT °Ï¥g{A4úî¤{/d>Ç…$Õ.˜î¢'=ÐÁÏ…<öá>yÙjô»Ýg³—6:|ëã´m¬åB‘[9|;cΕöSAí‰b-î®ô±Å9–s2Ë$äã‰ÚFuñÇÝ#aÏ•sÕÇ)`K'·Øúz*£Nò—ˆžIß…¥–ìíÇ^K:]¼ÒmŽ‘¤Yiš<òjÝF4©í %,2ý¤Ž‚Æ6, Create an index Spherical index pgSphere uses GiST to create spherical indices. An index speeds up the execution time of operators <@, @, &&, #, =, and !=. You can create an index with the following spherical data types: point (spoint) circle (scircle) line (sline) ellipse (sellipse) polygon (spoly) path (spath) coordinates range (sbox) Simple index of spherical points pgsphere/doc/install.sgm000066400000000000000000000121101332443031700156110ustar00rootroot00000000000000 Installation Download pgSphere is not part of the PostgreSQL software. You can download it from the pgSphere homepage https://github.com/akorotkov/pgsphere Installation You will need PostgreSQL 9.1 or above. We assume that you have PostgreSQL already compiled and installed. Please note: Depending on your system configuration mostly you have to be logged in as the system superuser. There are two ways to compile pgSphere. The first is to copy the sources into the contribution directory of PostgreSQL's source tree (POSTGRESQL_SRC/src/contrib). Then, change into POSTGRESQL_SRC/src/contrib. If the sources are not yet installed and the directory pg_sphere does not exist, take the gzipped pgSphere sources ( e. g., pg_sphere_xxx.tgz ) and run: tar -xzf path/to/pg_sphere_xxx.tgz]]> Now, change into the pg_sphere directory and run : make]]> and to install pgSphere : make install]]> The second way does not require the PostgreSQL sources but the configuration tool pg_config. First unpack the pgSphere sources: tar -xzf path_to_pg_sphere_xxx.tgz]]> Now, change into the pg_sphere directory and run: make USE_PGXS=1 PG_CONFIG=/path/to/pg_config]]> To install pgSphere you have to run : make USE_PGXS=1 PG_CONFIG=/path/to/pg_config install]]> To check the installation change into the pg_sphere source directory again and run: make installcheck]]> The check status will be displayed. Please note, the check gives different results with different PostgreSQL-versions. Currently, the check should run without errors with PostgreSQL-version 8.4. Otherwise check the file regression.diff. Creating a database with <application>pgSphere</application> We assume you have already created a database datab, where datab is the name of any database. Presupposing the name of your PostgreSQL's superuser is postgres, type: psql -U postgres -c 'CREATE EXTENSION pg_sphere;' datab]]> Depending on your system, it may be necessary to give more psql options like port or host name. Please have a look at the PostgreSQL documentation for more details. To get the version of installed pgSphere software, simply call: SELECT pg_sphere_version();]]> pgsphere/doc/jadetex.cfg-dist000066400000000000000000000005231332443031700165060ustar00rootroot00000000000000\hypersetup{ pdftitle={pgSphere}, pdfsubject={user guide}, pdfauthor={pgSphere developer team}, pdfkeywords={spherical PostgreSQL SQL}, bookmarksopen=true, bookmarksopenlevel=2, colorlinks=true, linkcolor=blue, pdfpagemode=UseOutlines, pdfstartview=FitH } \usepackage{url} \tolerance=2000 pgsphere/doc/operators.sgm000066400000000000000000000442071332443031700161750ustar00rootroot00000000000000 Operators Casting pgSphere provides some casting operators. So, you can transform an object to another data type. A cast is done using a CAST(x AS typename), x::typename or typename(x) construct. Castings casting argument type target returns spoint scircle circle with center position spoint and radius 0.0 spoint sellipse an ellipse at position spoint and radius 0.0 spoint sline a line with length 0.0 at position spoint scircle sellipse the scircle as sellipse sline strans the Euler transformation of sline sellipse scircle the bounding circle of sellipse sellipse strans the Euler transformation of sellipse
Cast a spherical point as a circle SELECT CAST ( spoint '(10d,20d)' AS scircle );]]> ]]>
Equality All data types of pgSphere have equality operators. The equality operator is as in SQL =. Furthermore, there are two valid negators to indicate that two objects are not equal: != and <>. Equality of two spherical points SELECT spoint '(10d,20d)' = spoint '(370d,20d)' ;]]> Contain and overlap On the sphere, an equality relationship is rarely used. There are frequently questions like Is object a contained by object b? or Does object a overlap object b? pgSphere supports such queries using binary operators returning true or false: Contain and overlap operators operator operator returns true, if @ or <@ the left object is contained by the right object ˜ or @> the left object contains the right object !@ or !<@ the left object is not contained by the right object !˜ or !@> the left object does not contain the right object && the objects overlap each other !&& the objects do not overlap each other
An overlap or contain operator does not exist for all combinations of data types. For instance, scircle @ spoint is useless because a spherical point can never contain a spherical circle. Is the left circle contained by the right circle? SELECT scircle '<(0d,20d),2d>' @ scircle '<(355d,20d),10d>' AS test ;]]> Are the circles overlapping? SELECT scircle '<(0d,20d),2d>' && scircle '<(199d,-10d),10d>' AS test ;]]>
Crossing of lines Another binary relationship is crossing. pgSphere supports only crossing of lines. The correlative operator is named #. Are the lines crossed? SELECT sline '(0d,0d,0d),10d' # sline '(90d,5d,5d,XYZ),10d' AS test ;]]> Distance The binary distance operator <-> is a non-boolean operator returning the distance between two objects in radians. Currently, pgSphere supports only distances between points, circles, and between point and circle. If the objects are overlapping, the distance operator returns zero (0.0). Distance between two circles SELECT 180 * ( scircle '<(0d,20d),2d>' <-> scircle '<(0d,40d),2d>' )]]> Length and circumference The length/circumference operator @-@ is a non-boolean unary operator returning the circumference or length of an object. In the current implementation, pgSphere supports only circumferences of circles, polygons, and boxes. It supports lengths of lines and paths too. Instead of using the operator, you can use the functions circum(object) or length(object). Circumference of a circle SELECT 180 * ( @-@ scircle '<(0d,20d),30d>' )/ pi() AS circ ;]]> Length of a line SELECT 180 * ( @-@ sline '(0d,0d,0d),30d' )/ pi() AS length ;]]> Center The center operator @@ is a non-boolean unary operator returning the center of an object. In the current implementation of pgSphere, only centers of circles and ellipses are supported. Instead of using the operator, you can use the function center(object). Center of a circle SELECT @@ scircle '<(0d,20d),30d>';]]> Change the direction The unary operator - changes the direction of sline or spath objects. You can use it with an Euler transformation object in the figurative sense, too (). Swap begin and end of a <type>sline</type> SELECT - sline (spoint '(0d,0d)', spoint '(10d,0d)');]]> Turn the path of a line The unary operator ! turns the path of sline objects, but preserves begin and end of the spherical line. The length of returned line will be 360° minus the line length of operator's argument. The operator ! returns NULL, if the length of sline argument is 0, because the path of returned sline is undefined. Return length and check if north pole on <type>sline</type>s SELECT set_sphere_output('DEG');]]> SELECT length ( sline ( spoint '(0d,0d)', spoint '(0d,10d)' ) ) *]]> SELECT spoint '(0d,90d)' @]]> SELECT length ( ! sline ( spoint '(0d,0d)', spoint '(0d,10d)' ) ) *]]> SELECT spoint '(0d,90d)' @]]> Transformation As in a plane, translations and rotations are needed to do object or coordinate transformations. With pgSphere, it is done using Euler transformations (strans). On a sphere, there aren't real translations. All movements on a sphere are rotations around axes. The general syntax for a transformation is always: object operator euler where operators are + for a usual transformation, - for an inverse transformation. You can transform any object having a pgSphere data type, except the data type sbox. Transformation of a point Rotate a spherical point counterclockwise, first 90° around the x-axis, second 90° around the z-axis, and last 40.5° around the x-axis. SELECT set_sphere_output('DEG');]]> SELECT spoint '(30d,0d)' + strans '90d, 90d, 40.5d, XZX AS spoint';]]> You can use the + and - operator as unary operators for transformations, too. +strans just returns the transformation itself, -strans returns the inverse transformation. An inverse transformation SELECT set_sphere_output('DEG');]]> SELECT - strans '20d, 50d, 80d, XYZ' AS inverted;]]>
pgsphere/doc/pg_sphere.css000066400000000000000000000047721332443031700161400ustar00rootroot00000000000000/* similar to PostgreSQL.org Documentation Style */ body { margin: 1em; padding: 1em; font-size: 85%; font-family: verdana, sans-serif; color: #000; background-color: #fff; } h1 { font-size: 1.4em; font-weight: bold; margin-top: 0em; margin-bottom: 0em; } h2 { font-size: 1.2em; margin: 1.2em 0em 1.2em 0em; font-weight: bold; } h3 { font-size: 1.0em; margin: 1.2em 0em 1.2em 0em; font-weight: bold; } h4 { font-size: 0.95em; margin: 1.2em 0em 1.2em 0em; font-weight: normal; } h5 { font-size: 0.9em; margin: 1.2em 0em 1.2em 0em; font-weight: normal; } h6 { font-size: 0.85em; margin: 1.2em 0em 1.2em 0em; font-weight: normal; } img { border: 0; } ol, ul, li { font-size: 1.0em; line-height: 1.2em; margin-top: 0.2em; margin-bottom: 0.1em; } p { font-size: 1.0em; line-height: 1.2em; margin: 1.2em 0em 1.2em 0em; } li > p { margin-top: 0.2em; } pre { font-family: monospace; font-size: 1.2em; margin: 0em; } strong, b { font-weight: bold; } h1 { font-weight: bold; color: #EC5800; font-size: 1.4em; } h2 { font-weight: bold; color: #666; font-size: 1.2em; } h3 { font-weight: bold; color: #666; font-size: 1.1em; } h4 { color: #666; } /* Text Styles */ .txtCurrentLocation { font-weight: bold; } p, ol, ul, li { line-height: 1.5em; } table.CALSTABLE { width: 50%; } table.CALSTABLE td { vertical-align : top; } /* Link Styles */ a:link { color:#0066A2; text-decoration: underline; } a:visited { color:#004E66; text-decoration: underline; } a:active { color:#0066A2; text-decoration: underline; } a:hover { color:#000000; text-decoration: underline; } pre.programlisting, blockquote.note, blockquote.tip { -moz-border-radius: 8px 8px 8px 8px; -moz-box-shadow: 3px 3px 5px #DFDFDF; color: black; margin: 1ex 0ex 1ex 1ex; padding: 1ex; border-style: solid; border-width: 1px; } /* Programlisting */ pre.programlisting { background-color: #F7F7F7; border-color: #CFCFCF; font-family: monospace; text-align: left; } div.note { margin-top: 4ex; } blockquote.note, blockquote.tip { padding-top: 0ex; background-color: #FDFDEE; border-color: #DBDBCC; } .literal, .parameter, .funcsynopsis, .function { font-size: 130%; } div.table table tr td { padding: 0.5ex; } div.example p b { font-size : 70%; font-style: italic; } div.NAVFOOTER { margin-top: 5ex; }pgsphere/doc/pg_sphere.dsl-dist000066400000000000000000000177011332443031700170670ustar00rootroot00000000000000 ]]> ]]> ]> ;; PAPER string (time) #t))) ) ) (define %stylesheet% "pg_sphere.css") (define %generate-article-titlepage% ;; produce a title page for articles #t) (define (chunk-skip-first-element-list) ;; forces the Table of Contents on separate page '()) (define (list-element-list) ;; fixes bug in Table of Contents generation '()) (define %root-filename% ;; The filename of the root HTML document (e.g, "index"). "index") (define ($shade-verbatim-attr$) ;; REFENTRY shade-verbatim-attr ;; PURP Attributes used to create a shaded verbatim environment. ;; DESC ;; See '%shade-verbatim%' ;; /DESC ;; AUTHOR N/A ;; /REFENTRY (list (list "BORDER" "0") (list "BGCOLOR" "#F7F7F7") (list "WIDTH" ($table-width$)))) ;; ...but we need to do some extra work to make the above apply to PRE ;; as well. (mostly pasted from dbverb.dsl) (define ($verbatim-display$ indent line-numbers?) (let ((content (make element gi: "PRE" attributes: (list (list "CLASS" (gi))) (if (or indent line-numbers?) ($verbatim-line-by-line$ indent line-numbers?) (process-children))))) (if %shade-verbatim% (make element gi: "TABLE" attributes: ($shade-verbatim-attr$) (make element gi: "TR" (make element gi: "TD" content))) (make sequence (para-check) content (para-check 'restart))))) (define %shade-verbatim% ;; verbatim sections will be shaded if t(rue) #f) (define %use-id-as-filename% ;; Use ID attributes as name for component HTML files? #t) (define %graphic-extensions% ;; graphic extensions allowed '("jpg" "jpeg")) (define %graphic-default-extension% "jpg") (define %section-autolabel% ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) #t) (define (toc-depth nd) ;; more depth (3 levels) to toc; instead of flat hierarchy 2) (element emphasis ;; make role=strong equate to bold for emphasis tag (if (equal? (attribute-string "role") "strong") (make element gi: "STRONG" (process-children)) (make element gi: "EM" (process-children)))) (define (article-titlepage-recto-elements) ;; elements on an article's titlepage (list (normalize "title") (normalize "subtitle") (normalize "authorgroup") (normalize "author") (normalize "othercredit") (normalize "releaseinfo") (normalize "copyright") (normalize "pubdate") (normalize "revhistory") (normalize "abstract") (normalize "legalnotice"))) (define (article-title nd) (let* ((artchild (children nd)) (artheader (select-elements artchild (normalize "artheader"))) (artinfo (select-elements artchild (normalize "articleinfo"))) (ahdr (if (node-list-empty? artheader) artinfo artheader)) (ahtitles (select-elements (children ahdr) (normalize "title"))) (artitles (select-elements artchild (normalize "title"))) (titles (if (node-list-empty? artitles) ahtitles artitles))) (if (node-list-empty? titles) "" (node-list-first titles)))) (mode subtitle-mode ;; do not print subtitle on subsequent pages (element subtitle (empty-sosofo))) ;; notes. (element note (make sequence (para-check) ($admonition$) (para-check 'restart))) ]]> pgsphere/doc/pg_sphere.xml000066400000000000000000000043771332443031700161510ustar00rootroot00000000000000 ]>
pgSphere 1.1.5 pgSphere development team pgSphere provides spherical data types, functions, and operators for PostgreSQL. The project is hosted at pgfoundry.org and https://github.com/akorotkov/pgsphere This document describes installation and usage of this module. &capWhatis; &capInstall; &capTypes; &capConstr; &capOperators; &capFunctions; &capIndices; &capExamples; &capFaq; &capAppendixes;
pgsphere/doc/types.sgm000066400000000000000000000620031332443031700153150ustar00rootroot00000000000000 Data types Overview pgSphere provides spherical data types for storing with PostgreSQL. Furthermore, there is a data type to do transformations. Data types SQL type name spherical type spoint point (position) strans Euler transformation scircle circle sline line sellipse ellipse spoly polygon spath path sbox coordinate range
Point A spherical point is an object without expanse but with a position. Use cases are: sites on earth star positions on the sky sphere spherical positions on planets A spherical point (or position) is given by two values: longitude and latitude. Longitude is a floating point value between 0 and 2&pgr;. Latitude is a floating point value, too, but between -&pgr;/2 and &pgr;/2. It is possible to give a spherical position in degrees (DEG) or with a triple value of degrees, minutes and seconds (DMS). Degrees and minutes are integer values. The seconds are represented using a floating point value. A fourth method is specifying a longitude value as a triple value of hours, minutes and seconds (HMS). But, you can not use it with latitude values. A position specified using longitude and latitude in radians SELECT spoint '(0.1,-0.2)';]]> A position specified using longitude and latitude in degrees SELECT spoint '( 10.1d, -90d)';]]> A position specified using longitude and latitude (<literal>DMS</literal>) SELECT spoint '( 10d 12m 11.3s, -13d 14m)';]]> A position specified using longitude in <literal>HMS</literal>, and latitude in <literal>RAD</literal> SELECT spoint '( 23h 44m 10s, -1.4321 )';]]> As you can see you can combine the input format for longitude and latitude. The value pairs are always enclosed within braces. Spaces are optional. Euler transformation An Euler transformation is done with three counterclockwise object rotations around following the axes: x-axis, y-axis, or z-axis. Use cases are: spherical object transformations spherical coordinates transformations The input syntax of an Euler transformation is: angle1, angle2, angle3 [, axes ] where axes is an optional 3 letter code with letters : X, Y, or Z. Default is ZXZ. angleN is any valid angle with the input format RAD, DEG, or DMS. To do a transformation, you have to use a transformation operator (see ). Create a transformation object Create a transformation object to rotate a spherical object counterclockwise, first 20° around the x-axis, second -270° around the z-axis and last 70.5° around the y-axis. SELECT strans '20d, -270d, 70.5d, XZY';]]> Create a second transformation object Create a transformation object to rotate a spherical object counterclockwise, first 2° 20' around the z-axis, second 10° around the x-axis, and last 0° around the z-axis. SELECT strans '2d 20m, 10d, 0';]]> Circle A spherical circle is an area around a point, where all points inside the circle have a distance less than or equal to the radius of the circle. Use cases are: sites on earth having a maximum distance from another site round cluster or nebula on sky sphere a position with an undirected position error A circle is specified using a spherical point (spoint) and a radius : < point , radius > Valid radius units are RAD, DEG, and DMS. The circle radius must be less than or equal to 90° and cannot be less than zero. A circle around the North Pole with a radius of 5°. SELECT scircle '< (0d, 90d), 5d >';]]> Line A spherical line is part of a great circle (meridian) that has a beginning and an end and hence, a direction. Use cases are: direct connection of two points meteors on the sky sphere To allow lines with a length larger than 180°, the input i syntax is a somewhat complex. A general located line with a length length is defined as a line starting at position (0d,0d) and ending at position (length,0d) transformed with an Euler transformation euler. The input syntax is : ( euler ), length For a simpler line input, use casting operators () or constructor functions (). If the length is larger than 360°, the line length is truncated to 360°. The transformation euler will always be converted to an Euler transformation using axes Z, X, and Z. A line input A line starting at position (200d,+20d) and ending at position (200d,-10d). SELECT sline '( -90d, -20d, 200d, XYZ ), 30d ';]]> Ellipses Within pgSphere, ellipses are defined as :
If the center of any spherical ellipse is the North Pole, the perpendicular projection into the x-y-plane gives an ellipse as in two-dimensional space.
Use cases are: cluster or nebula on the sky sphere where the `height' is lower than the `width' to describe a position error An ellipse always has: a major radius rad_1 a minor radius rad_2 a center center a position angle pos (inclination) Hence, the input syntax is: < { rad_1, rad_2 }, center, pos > The radii rad_1 and rad_2 have to be less than 90°. If rad_1 is less than rad_2 , the values will be swapped. The position angle pos is defined within pgSphere as a counterclockwise rotation around the ellipse center and is zero, if the ellipse is “parallel to the equator” Input of a spherical ellipse An ellipse has a center at 20° longitude and 0° latitude. The minor radius is part of the equator. The major radius is 10°, the minor radius is 5°. SELECT sellipse '< { 10d, 5d } , ( 20d, 0d ), 90d >';]]>
Path A spherical path is a concatenation of spherical lines. Use cases are: rivers on earth trajectories of planets or comets on the sky plane Paths within pgSphere are simplified lists of positions. The input syntax is : {pos1,pos2[,pos3[,pos4[,...]]]} The distance between 2 sequent positions has to be less than 180° and greater than zero. At least 2 positions are required. Path input example A path going from (10d,0d) to (80d,30d) via (45d,15d). SELECT spath '{ (10d,0d),(45d,15d),(80d,30d) } ';]]> Polygon A spherical polygon is a closed spherical path where line segments cannot be crossed. One main use case are areas on the earth and sky sphere. Polygons within pgSphere have the same input syntax as paths: {pos1,pos2,pos3[,pos4[,... ]]} A spherical polygon has the same restrictions as a spherical path (see ). Except that a polygon needs at least 3 positions. The line segments can not be crossed. The maximum dimension of a polygon must be less than 180°. Input of polygon A polygon going from (270d,-10d). via (270d,30d) to (290d,10d) back to (270d,-10d) SELECT spoly '{ (270d,-10d), (270d,30d), (290d,10d) } ';]]> Coordinates range A spherical box is a coordinates range. Hence, you can select objects within a longitude range and latitude range. The box is represented using two spherical points: the southwest (pos_sw) and the northeast (pos_ne) edge of the box. The input syntax is: ( pos_sw, pos_ne ) or pos_sw, pos_ne If the latitude of the southwest edge is larger than the latitude of the northeast edge, pgSphere swaps the edges. If the longitude of the southwest edge is equal to the longitude of the northeast edge, pgSphere assumes a full latitude range, except that the latitudes are equal, too. Input of a full latitude range A full latitude range between +20° and +23°. SELECT sbox '( (0d,20d), (0d,23d) )';]]> A simple coordinates range A coordinate range between -10° and +10° in latitude and 350° and 10° in longitude. SELECT sbox '( (350d,-10d), (10d,+10d) )';]]>
pgsphere/doc/whatis.sgm000066400000000000000000000042761332443031700154600ustar00rootroot00000000000000 What is pgSphere? pgSphere is an extra module for PostgreSQL which adds spherical data types. It provides: input and output of data containing, overlapping, and other operators various input and converting functions and operators circumference and area of an object spherical transformation indexing of spherical data types several input and output formats Hence, you can do a fast search and analysis for objects with spherical attributes as used in geographical, astronomical, or other applications using PostgreSQL. For instance, you can manage data of geographical objects around the world and astronomical data like star and other catalogs conveniently using an SQL interface. The aim of pgSphere is to provide uniform access to spherical data. Because PostgreSQL itself supports a lot of software interfaces, you can now use the same database with different utilities and applications. pgsphere/ellipse.c000066400000000000000000000720561332443031700145060ustar00rootroot00000000000000#include "ellipse.h" /* Ellipse functions */ PG_FUNCTION_INFO_V1(sphereellipse_in); PG_FUNCTION_INFO_V1(sphereellipse_infunc); PG_FUNCTION_INFO_V1(sphereellipse_incl); PG_FUNCTION_INFO_V1(sphereellipse_rad1); PG_FUNCTION_INFO_V1(sphereellipse_rad2); PG_FUNCTION_INFO_V1(sphereellipse_center); PG_FUNCTION_INFO_V1(sphereellipse_trans); PG_FUNCTION_INFO_V1(sphereellipse_circle); PG_FUNCTION_INFO_V1(spherepoint_ellipse); PG_FUNCTION_INFO_V1(spherecircle_ellipse); PG_FUNCTION_INFO_V1(sphereellipse_equal); PG_FUNCTION_INFO_V1(sphereellipse_equal_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_point); PG_FUNCTION_INFO_V1(sphereellipse_cont_point_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_point_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_point_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_line); PG_FUNCTION_INFO_V1(sphereellipse_cont_line_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_line_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_line_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_line); PG_FUNCTION_INFO_V1(sphereellipse_overlap_line_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_line_com); PG_FUNCTION_INFO_V1(sphereellipse_overlap_line_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_circle); PG_FUNCTION_INFO_V1(sphereellipse_cont_circle_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_circle_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_circle_com_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_ellipse); PG_FUNCTION_INFO_V1(spherecircle_cont_ellipse_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_ellipse_com); PG_FUNCTION_INFO_V1(spherecircle_cont_ellipse_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_circle); PG_FUNCTION_INFO_V1(sphereellipse_overlap_circle_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_circle_com); PG_FUNCTION_INFO_V1(sphereellipse_overlap_circle_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_ellipse); PG_FUNCTION_INFO_V1(sphereellipse_cont_ellipse_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_ellipse_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_ellipse_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_ellipse); PG_FUNCTION_INFO_V1(sphereellipse_overlap_ellipse_neg); PG_FUNCTION_INFO_V1(spheretrans_ellipse); PG_FUNCTION_INFO_V1(spheretrans_ellipse_inv); /* * This function returns the arccos of a value. If variable 'a' is outside * the range (-1.00 .. 1.00), the function returns corresponding PI/2 or 3*PI/2. */ static float8 my_acos(float8 a) { if (a > 1.0) a = 1.0; if (a < -1.0) a = -1.0; return acos(a); } /* * Checks the parameter of an ellipse. */ static void sellipse_check(SELLIPSE *e) { SPoint sp; sp.lng = e->phi; spoint_check(&sp); if (PI - sp.lng >= PI_EPS) e->phi = sp.lng; else e->phi = sp.lng - PI; sp.lng = 0.0; sp.lat = e->theta; spoint_check(&sp); e->theta = sp.lat; sp.lng = e->psi; sp.lat = 0.0; spoint_check(&sp); e->psi = sp.lng; } /* * Returns the boundary circle of an ellipse. */ static void sellipse_circle(SCIRCLE *sc, const SELLIPSE *e) { SPoint sp; sellipse_center(&sp, e); memcpy((void *) &sc->center, (void *) &sp, sizeof(SPoint)); sc->radius = e->rad[0]; } /* * Returns an ellipse from axes, center and inclination. The largest axis * length is chosen for large axis. */ static SELLIPSE * sellipse_in(float8 r1, float8 r2, const SPoint *c, float8 inc) { SELLIPSE *e = (SELLIPSE *) palloc(sizeof(SELLIPSE)); e->rad[0] = Max(r1, r2); e->rad[1] = Min(r1, r2); e->phi = inc; e->theta = -c->lat; e->psi = c->lng; if (FPge(e->rad[0], PIH) || FPge(e->rad[1], PIH)) { pfree(e); e = NULL; elog(ERROR, "sphereellipse_in: radius must be less than 90 degrees"); } else { sellipse_check(e); } return e; } /* * Returns the radius of an ellipse depending on position angle. * * rada - major axis length * radb - minor axis length * ang - position angle in radians */ static float8 sellipse_dist(float8 rada, float8 radb, float8 ang) { float8 e; e = (1 - Sqr(sin(radb)) / Sqr(sin(rada))); return (asin(sin(radb) / sqrt(1 - e * Sqr(cos(ang))))); } /* * Returns distance between an ellipse and a point. */ static float8 sellipse_point_dist(const SELLIPSE *se, const SPoint *sp) { SEuler e; SPoint p; float8 dist, rad, ang; sellipse_trans(&e, se); spheretrans_inv(&e); euler_spoint_trans(&p, sp, &e); dist = my_acos(cos(p.lng) * cos(p.lat)); if (FPzero(dist)) { return -1.0; } else { if (FPeq(dist, PIH)) { ang = p.lat; } else { ang = my_acos(tan(p.lng) / tan(dist)); } rad = sellipse_dist(se->rad[0], se->rad[1], ang); if (FPzero((dist - rad))) { return 0.0; } else if (FPgt(dist, rad)) { return (dist - rad); } else { return -1.0; } } return -1.0; } /* * Performs an Euler transformation of an ellipse. */ static void euler_sellipse_trans(SELLIPSE *out, const SELLIPSE *in, const SEuler *se) { SEuler et; SLine sl[2]; SPoint p[2]; sellipse_trans(&et, in); sl[0].length = PIH; sl[0].phi = sl[0].theta = sl[0].psi = 0.0; euler_sline_trans(&sl[1], &sl[0], &et); euler_sline_trans(&sl[0], &sl[1], se); sline_begin(&p[0], &sl[0]); sline_end(&p[1], &sl[0]); et.psi = p[0].lng; et.theta = -p[0].lat; et.phi = 0.0; et.phi_a = EULER_AXIS_X; et.theta_a = EULER_AXIS_Y; et.psi_a = EULER_AXIS_Z; out->psi = et.psi; out->theta = et.theta; spheretrans_inv(&et); euler_sline_trans(&sl[1], &sl[0], &et); sphereline_to_euler(&et, &sl[1]); out->phi = et.theta; out->rad[0] = in->rad[0]; out->rad[1] = in->rad[1]; } /* * Returns the relationship between two ellipses as PGS_ELLIPSE_ELLIPSE_REL * int8 value. */ static int8 sellipse_ellipse_pos(const SELLIPSE *se1, const SELLIPSE *se2) { int8 r; /* equality */ if (sellipse_eq(se1, se2)) { return PGS_ELLIPSE_CONT; } /* se2 is circle or point */ if (FPeq(se2->rad[0], se2->rad[1])) { SCIRCLE c; sellipse_circle(&c, se2); r = sellipse_circle_pos(se1, &c); switch (r) { case PGS_ELLIPSE_CIRCLE_AVOID: return PGS_ELLIPSE_AVOID; case PGS_CIRCLE_CONT_ELLIPSE: return PGS_ELLIPSE_OVER; case PGS_ELLIPSE_CONT_CIRCLE: return PGS_ELLIPSE_CONT; case PGS_ELLIPSE_CIRCLE_OVER: return PGS_ELLIPSE_OVER; default: return PGS_ELLIPSE_AVOID; } } /* se1 is circle or point */ if (FPeq(se1->rad[0], se1->rad[1])) { SCIRCLE c; sellipse_circle(&c, se1); r = sellipse_circle_pos(se2, &c); switch (r) { case PGS_ELLIPSE_CIRCLE_AVOID: return PGS_ELLIPSE_AVOID; case PGS_CIRCLE_CONT_ELLIPSE: return PGS_ELLIPSE_CONT; case PGS_ELLIPSE_CONT_CIRCLE: return PGS_ELLIPSE_OVER; case PGS_ELLIPSE_CIRCLE_OVER: return PGS_ELLIPSE_OVER; default: return PGS_ELLIPSE_AVOID; } } /* se2 is line */ if (FPzero(se2->rad[1])) { SLine l; sellipse_line(&l, se2); r = sellipse_line_pos(se1, &l); switch (r) { case PGS_ELLIPSE_LINE_AVOID: return PGS_ELLIPSE_AVOID; case PGS_ELLIPSE_CONT_LINE: return PGS_ELLIPSE_CONT; case PGS_ELLIPSE_LINE_OVER: return PGS_ELLIPSE_OVER; default: return PGS_ELLIPSE_AVOID; } } /* se1 is line */ if (FPzero(se1->rad[1])) { SLine l; sellipse_line(&l, se1); r = sellipse_line_pos(se2, &l); switch (r) { case PGS_ELLIPSE_LINE_AVOID: return PGS_ELLIPSE_AVOID; case PGS_ELLIPSE_CONT_LINE: return PGS_ELLIPSE_OVER; case PGS_ELLIPSE_LINE_OVER: return PGS_ELLIPSE_OVER; default: return PGS_ELLIPSE_AVOID; } } /* now we have two real ellipses */ do { SPoint p1, p2; float8 dist; /* check inner and outer circles */ sellipse_center(&p1, se1); sellipse_center(&p2, se2); dist = spoint_dist(&p1, &p2); if (FPle((se1->rad[0] + se2->rad[0]), dist)) { return PGS_ELLIPSE_AVOID; } else if (FPle((dist + se1->rad[0]), se2->rad[1])) { return PGS_ELLIPSE_OVER; } else if (FPle((dist + se2->rad[0]), se1->rad[1])) { return PGS_ELLIPSE_CONT; } else { SEuler eul; SELLIPSE etmp, e; SPoint sp[3]; int i; float8 diff[3]; float8 elng; const int maxcntr = 100000; int cntr; /* transform se1 to north pol */ sellipse_trans(&eul, se1); spheretrans_inv(&eul); euler_sellipse_trans(&etmp, se2, &eul); eul.phi = PIH; eul.theta = PIH; eul.psi = 0; eul.phi_a = EULER_AXIS_Z; eul.theta_a = EULER_AXIS_X; eul.psi_a = EULER_AXIS_Z; euler_sellipse_trans(&e, &etmp, &eul); etmp.rad[0] = se1->rad[0]; etmp.rad[1] = se1->rad[1]; etmp.phi = 0.0; etmp.theta = -PIH; etmp.psi = PIH; /* search for minimum distance */ sp[0].lat = sp[2].lat = PIH - se1->rad[0]; sellipse_center(&sp[1], &e); if (FPeq(sp[1].lat, PIH)) { elng = PIH; } else { elng = sp[1].lng; } if (sin(elng) < 0) { sp[0].lng = PI; sp[1].lng = 3 * PIH; sp[2].lng = PID; } else { sp[0].lng = 0.0; sp[1].lng = PIH; sp[2].lng = PI; } sp[1].lat = PIH - se1->rad[1]; cntr = 0; do { for (i = 0; i < 3; i++) { diff[i] = sellipse_point_dist(&e, &sp[i]); if (diff[i] < 0.0) { return PGS_ELLIPSE_OVER; } } if (diff[0] <= diff[1] && diff[1] <= diff[2]) { memcpy((void *) &sp[2], (void *) &sp[1], sizeof(SPoint)); } else if (diff[0] <= diff[2] && diff[2] <= diff[1]) { if (Abs(sp[0].lng - elng) < Abs(sp[2].lng - elng)) { memcpy((void *) &sp[2], (void *) &sp[1], sizeof(SPoint)); } else { memcpy((void *) &sp[0], (void *) &sp[1], sizeof(SPoint)); } } else if (diff[1] <= diff[0] && diff[0] <= diff[2]) { memcpy((void *) &sp[2], (void *) &sp[0], sizeof(SPoint)); memcpy((void *) &sp[0], (void *) &sp[1], sizeof(SPoint)); } else if (diff[1] <= diff[2] && diff[2] <= diff[0]) { memcpy((void *) &sp[0], (void *) &sp[1], sizeof(SPoint)); } else if (diff[2] <= diff[0] && diff[0] <= diff[1]) { if (Abs(sp[0].lng - elng) < Abs(sp[2].lng - elng)) { memcpy((void *) &sp[2], (void *) &sp[1], sizeof(SPoint)); } else { memcpy((void *) &sp[0], (void *) &sp[1], sizeof(SPoint)); } } else if (diff[2] <= diff[1] && diff[1] <= diff[0]) { memcpy((void *) &sp[0], (void *) &sp[2], sizeof(SPoint)); memcpy((void *) &sp[2], (void *) &sp[1], sizeof(SPoint)); } if (sp[2].lng < sp[0].lng) { /* switch here too */ memcpy((void *) &sp[1], (void *) &sp[0], sizeof(SPoint)); memcpy((void *) &sp[0], (void *) &sp[2], sizeof(SPoint)); memcpy((void *) &sp[2], (void *) &sp[1], sizeof(SPoint)); } sp[1].lng = (sp[0].lng + sp[2].lng) / 2.0; sp[1].lat = PIH - sellipse_dist(etmp.rad[0], etmp.rad[1], sp[1].lng); cntr++; } while (cntr < maxcntr && ((sp[2].lng - sp[0].lng) > FLT_EPSILON)); if (cntr >= maxcntr) { elog(ERROR, "Bug found in pg_sphere function 'sellipse_ellipse_pos' ! \n Please report it to pg_sphere team."); } sellipse_center(&sp[1], &e); if (sellipse_cont_point(&etmp, &sp[1])) { return PGS_ELLIPSE_CONT; } else { return PGS_ELLIPSE_AVOID; } } } while (0); return PGS_ELLIPSE_AVOID; } void sellipse_trans(SEuler *se, const SELLIPSE *e) { se->psi = e->psi; se->theta = e->theta; se->phi = e->phi; se->phi_a = EULER_AXIS_X; se->theta_a = EULER_AXIS_Y; se->psi_a = EULER_AXIS_Z; } /* Returns center of ellipse */ void sellipse_center(SPoint *sp, const SELLIPSE *e) { sp->lng = e->psi; sp->lat = -e->theta; } bool sellipse_line(SLine *sl, const SELLIPSE *e) { if (!FPzero(e->rad[0])) { SEuler se; SLine slt; SPoint p[2]; p[0].lat = p[1].lat = 0.0; p[0].lng = -e->rad[0]; p[1].lng = e->rad[0]; sline_from_points(&slt, &p[0], &p[1]); sellipse_trans(&se, e); euler_sline_trans(sl, &slt, &se); return true; } else { return false; } } bool sellipse_eq(const SELLIPSE *e1, const SELLIPSE *e2) { if (FPne(e1->rad[0], e2->rad[0]) || FPne(e1->rad[1], e2->rad[1])) { return false; } else if (FPzero(e1->rad[0])) { /* point */ SPoint p[2]; sellipse_center(&p[0], e1); sellipse_center(&p[1], e2); return spoint_eq(&p[0], &p[1]); } else if (FPeq(e1->rad[0], e1->rad[1])) { /* circle */ SCIRCLE c[2]; sellipse_circle(&c[0], e1); sellipse_circle(&c[1], e2); return scircle_eq(&c[0], &c[1]); } else { SEuler se[2]; sellipse_trans(&se[0], e1); sellipse_trans(&se[1], e2); return strans_eq(&se[0], &se[1]); } return false; } bool sellipse_cont_point(const SELLIPSE *se, const SPoint *sp) { SPoint c; float8 dist; sellipse_center(&c, se); dist = spoint_dist(sp, &c); if (FPgt(dist, se->rad[0])) { return false; } if (FPle(dist, se->rad[1])) { return true; } if (FPzero(se->rad[1])) { SLine l; sellipse_line(&l, se); return spoint_at_sline(sp, &l); } else { SEuler et; SPoint p; float8 a, e; sellipse_trans(&et, se); spheretrans_inv(&et); euler_spoint_trans(&p, sp, &et); if (FPeq(dist, PIH)) { e = p.lat; } else { e = my_acos(tan(p.lng) / tan(dist)); } a = sellipse_dist(se->rad[0], se->rad[1], e); if (FPge(a, dist)) { return true; } else { return false; } } return false; } int8 sellipse_line_pos(const SELLIPSE *se, const SLine *sl) { /* line is point */ if (FPzero(sl->length)) { SPoint p; sline_begin(&p, sl); if (sellipse_cont_point(se, &p)) { return PGS_ELLIPSE_CONT_LINE; } else { return PGS_ELLIPSE_LINE_AVOID; } } /* ellipse is point */ if (FPzero(se->rad[0])) { SPoint p; sellipse_center(&p, se); if (spoint_at_sline(&p, sl)) { return PGS_ELLIPSE_LINE_OVER; } else { return PGS_ELLIPSE_LINE_AVOID; } } /* ellipse is line */ if (FPzero(se->rad[1])) { SLine l; int8 res; sellipse_line(&l, se); res = sline_sline_pos(&l, sl); if (res == PGS_LINE_AVOID) { return PGS_ELLIPSE_LINE_AVOID; } else if (res == PGS_LINE_CONT_LINE || res == PGS_LINE_EQUAL) { return PGS_ELLIPSE_CONT_LINE; } else { return PGS_ELLIPSE_LINE_OVER; } } /* ellipse is circle */ if (FPeq(se->rad[0], se->rad[1])) { SCIRCLE c; int8 res; sellipse_circle(&c, se); res = sphereline_circle_pos(sl, &c); if (res == PGS_CIRCLE_LINE_AVOID) { return PGS_ELLIPSE_LINE_AVOID; } else if (res == PGS_CIRCLE_CONT_LINE) { return PGS_ELLIPSE_CONT_LINE; } else { return PGS_ELLIPSE_LINE_OVER; } } /* begin or end of line inside ellipse */ { bool bb, be; SPoint p; sline_begin(&p, sl); bb = sellipse_cont_point(se, &p); sline_end(&p, sl); be = sellipse_cont_point(se, &p); if (bb || be) { if (bb && be) { return PGS_ELLIPSE_CONT_LINE; } if (!(bb && be)) { return PGS_ELLIPSE_LINE_OVER; } } } /* compare with bounding circle */ { SCIRCLE c; int8 res; sellipse_circle(&c, se); res = sphereline_circle_pos(sl, &c); if (res == PGS_CIRCLE_LINE_AVOID) { return PGS_ELLIPSE_LINE_AVOID; } } /* compare in detail */ { SEuler e; SPoint c; SELLIPSE set; sphereline_to_euler(&e, sl); spheretrans_inv(&e); euler_sellipse_trans(&set, se, &e); sellipse_center(&c, &set); if (sin(c.lng + se->rad[0]) < 0.0) { return PGS_ELLIPSE_LINE_AVOID; } if (sin(c.lng - se->rad[0] - sl->length) < 0.0) { return PGS_ELLIPSE_LINE_AVOID; } if ((c.lat >= 0) && (se->rad[0] - c.lat) > 0.0) { return PGS_ELLIPSE_LINE_AVOID; } if ((c.lat < 0) && (se->rad[0] + c.lat) > 0.0) { return PGS_ELLIPSE_LINE_AVOID; } else { SPoint cn; float8 eps, dist, sinr; float8 d[3]; int i; SPoint lp[3]; SPoint lpt[3]; sellipse_trans(&e, &set); spheretrans_inv(&e); lp[0].lng = 0.0; lp[1].lng = sl->length / 2; lp[2].lng = sl->length; lp[0].lat = lp[1].lat = lp[2].lat = 0.0; cn.lng = 0.0; cn.lat = 0.0; eps = (1 - Sqr(sin(se->rad[1])) / Sqr(sin(se->rad[0]))); sinr = sin(se->rad[1]); while (FPgt(lp[2].lng, lp[0].lng)) { for (i = 0; i < 3; i++) { euler_spoint_trans(&lpt[i], &lp[i], &e); dist = spoint_dist(&lpt[i], &cn); if (FPeq(dist, PIH)) { d[i] = lpt[i].lat; } else { d[i] = tan(lpt[i].lng) / tan(dist); } d[i] = asin(sinr / sqrt(1 - eps * Sqr(d[i]))); if (FPge(d[i], dist)) { return PGS_ELLIPSE_LINE_OVER; } } /* get the best values */ for (i = 0; i < 3; i++) { if (d[i] <= d[(i + 1) % 3] && d[i] <= d[(i + 2) % 3]) { lpt[0].lng = lp[i].lng; if (d[(i + 1) % 3] <= d[(i + 2) % 3]) { lpt[1].lng = lp[(i + 1) % 3].lng; } else { lpt[1].lng = lp[(i + 2) % 3].lng; } if (lpt[0].lng > lpt[1].lng) { dist = lpt[0].lng; lpt[0].lng = lpt[1].lng; lpt[1].lng = dist; } lp[0].lng = lpt[0].lng; lp[1].lng = (lpt[0].lng + lpt[1].lng) / 2; lp[2].lng = lpt[1].lng; } } } } } return PGS_ELLIPSE_LINE_AVOID; } int8 sellipse_circle_pos(const SELLIPSE *se, const SCIRCLE *sc) { /* circle is point */ if (FPzero(sc->radius)) { if (sellipse_cont_point(se, &sc->center)) { return PGS_ELLIPSE_CONT_CIRCLE; } else { return PGS_ELLIPSE_CIRCLE_AVOID; } } /* ellipse is circle */ if (FPeq(se->rad[0], se->rad[1])) { SCIRCLE tc; float8 dist; sellipse_circle(&tc, se); if (scircle_eq(&tc, sc)) { return PGS_ELLIPSE_CIRCLE_EQUAL; } dist = spoint_dist(&tc.center, &sc->center); if (FPle((dist + sc->radius), tc.radius)) { return PGS_ELLIPSE_CONT_CIRCLE; } if (FPle((dist + tc.radius), sc->radius)) { return PGS_CIRCLE_CONT_ELLIPSE; } if (FPgt((sc->radius + tc.radius), dist)) { return PGS_ELLIPSE_CIRCLE_OVER; } else { return PGS_ELLIPSE_CIRCLE_AVOID; } } /* ellipse is line */ if (FPzero(se->rad[1])) { SLine l; int8 res; sellipse_line(&l, se); res = sphereline_circle_pos(&l, sc); if (res == PGS_CIRCLE_LINE_AVOID) { return PGS_ELLIPSE_CIRCLE_AVOID; } else if (res == PGS_CIRCLE_CONT_LINE) { return PGS_CIRCLE_CONT_ELLIPSE; } else { return PGS_ELLIPSE_CIRCLE_OVER; } } else { /* * now ellipse is a real ellipse and * circle is a real circle */ float8 dist; SPoint c; sellipse_center(&c, se); dist = spoint_dist(&sc->center, &c); if (FPzero(dist)) { if (FPle(sc->radius, se->rad[1])) { return PGS_ELLIPSE_CONT_CIRCLE; } else if (FPge(sc->radius, se->rad[0])) { return PGS_CIRCLE_CONT_ELLIPSE; } else { return PGS_ELLIPSE_CIRCLE_OVER; } } else { SEuler et; SPoint p; float8 a, e; sellipse_trans(&et, se); spheretrans_inv(&et); euler_spoint_trans(&p, &sc->center, &et); if (FPeq(dist, PIH)) { e = p.lat; } else { e = my_acos(tan(p.lng) / tan(dist)); } a = sellipse_dist(se->rad[0], se->rad[1], e); if (FPle((dist + sc->radius), a)) { return PGS_ELLIPSE_CONT_CIRCLE; } else if (FPle((dist + a), sc->radius)) { return PGS_CIRCLE_CONT_ELLIPSE; } else if (FPgt((a + sc->radius), dist)) { return PGS_ELLIPSE_CIRCLE_OVER; } else { return PGS_ELLIPSE_CIRCLE_AVOID; } } } return PGS_ELLIPSE_CIRCLE_AVOID; } Datum sphereellipse_in(PG_FUNCTION_ARGS) { SELLIPSE *e = NULL; char *s = PG_GETARG_CSTRING(0); SPoint p; double r1, r2, inc; void sphere_yyparse(void); init_buffer(s); sphere_yyparse(); if (get_ellipse(&p.lng, &p.lat, &r1, &r2, &inc)) { e = sellipse_in(r1, r2, &p, inc); reset_buffer(); } PG_RETURN_POINTER(e); } Datum sphereellipse_infunc(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); float8 r1 = PG_GETARG_FLOAT8(1); float8 r2 = PG_GETARG_FLOAT8(2); float8 inc = PG_GETARG_FLOAT8(3); SELLIPSE *e = sellipse_in(r1, r2, p, inc); PG_RETURN_POINTER(e); } Datum sphereellipse_incl(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(e->phi); } Datum sphereellipse_rad1(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(e->rad[0]); } Datum sphereellipse_rad2(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(e->rad[1]); } Datum sphereellipse_center(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) palloc(sizeof(SPoint)); sellipse_center(p, e); PG_RETURN_POINTER(p); } Datum sphereellipse_trans(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SEuler *t = (SEuler *) palloc(sizeof(SEuler)); sellipse_trans(t, e); PG_RETURN_POINTER(t); } Datum sphereellipse_circle(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) palloc(sizeof(SCIRCLE)); sellipse_circle(c, e); PG_RETURN_POINTER(c); } Datum spherepoint_ellipse(PG_FUNCTION_ARGS) { SPoint *c = (SPoint *) PG_GETARG_POINTER(0); SELLIPSE *e = sellipse_in(0.0, 0.0, c, 0.0); if (e) { PG_RETURN_POINTER(e); } PG_RETURN_NULL(); } Datum spherecircle_ellipse(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SELLIPSE *e = sellipse_in(c->radius, c->radius, &c->center, 0.0); if (e) { PG_RETURN_POINTER(e); } PG_RETURN_NULL(); } Datum sphereellipse_equal(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_eq(e1, e2)); } Datum sphereellipse_equal_neg(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!sellipse_eq(e1, e2)); } Datum sphereellipse_cont_point(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_cont_point(e, p)); } Datum sphereellipse_cont_point_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!sellipse_cont_point(e, p)); } Datum sphereellipse_cont_point_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sellipse_cont_point(e, p)); } Datum sphereellipse_cont_point_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!sellipse_cont_point(e, p)); } Datum sphereellipse_cont_line(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b == PGS_ELLIPSE_CONT_LINE); } Datum sphereellipse_cont_line_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b != PGS_ELLIPSE_CONT_LINE); } Datum sphereellipse_cont_line_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b == PGS_ELLIPSE_CONT_LINE); } Datum sphereellipse_cont_line_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b != PGS_ELLIPSE_CONT_LINE); } Datum sphereellipse_overlap_line(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b > PGS_ELLIPSE_LINE_AVOID); } Datum sphereellipse_overlap_line_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b == PGS_ELLIPSE_LINE_AVOID); } Datum sphereellipse_overlap_line_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b > PGS_ELLIPSE_LINE_AVOID); } Datum sphereellipse_overlap_line_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sellipse_line_pos(e, l); PG_RETURN_BOOL(b == PGS_ELLIPSE_LINE_AVOID); } Datum sphereellipse_cont_circle(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos == PGS_ELLIPSE_CONT_CIRCLE || pos == PGS_ELLIPSE_CIRCLE_EQUAL); } Datum sphereellipse_cont_circle_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos != PGS_ELLIPSE_CONT_CIRCLE && pos != PGS_ELLIPSE_CIRCLE_EQUAL); } Datum sphereellipse_cont_circle_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos == PGS_ELLIPSE_CONT_CIRCLE || pos == PGS_ELLIPSE_CIRCLE_EQUAL); } Datum sphereellipse_cont_circle_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos != PGS_ELLIPSE_CONT_CIRCLE && pos != PGS_ELLIPSE_CIRCLE_EQUAL); } Datum spherecircle_cont_ellipse(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos == PGS_CIRCLE_CONT_ELLIPSE || pos == PGS_ELLIPSE_CIRCLE_EQUAL); } Datum spherecircle_cont_ellipse_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos != PGS_CIRCLE_CONT_ELLIPSE && pos != PGS_ELLIPSE_CIRCLE_EQUAL); } Datum spherecircle_cont_ellipse_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos == PGS_CIRCLE_CONT_ELLIPSE || pos == PGS_ELLIPSE_CIRCLE_EQUAL); } Datum spherecircle_cont_ellipse_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int pos = sellipse_circle_pos(e, c); PG_RETURN_BOOL(pos != PGS_CIRCLE_CONT_ELLIPSE && pos != PGS_ELLIPSE_CIRCLE_EQUAL); } Datum sphereellipse_overlap_circle(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_circle_pos(e, c) > PGS_ELLIPSE_CIRCLE_AVOID); } Datum sphereellipse_overlap_circle_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_circle_pos(e, c) == PGS_ELLIPSE_CIRCLE_AVOID); } Datum sphereellipse_overlap_circle_com(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sellipse_circle_pos(e, c) > PGS_ELLIPSE_CIRCLE_AVOID); } Datum sphereellipse_overlap_circle_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sellipse_circle_pos(e, c) == PGS_ELLIPSE_CIRCLE_AVOID); } Datum sphereellipse_cont_ellipse(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) == PGS_ELLIPSE_CONT); } Datum sphereellipse_cont_ellipse_neg(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) != PGS_ELLIPSE_CONT); } Datum sphereellipse_cont_ellipse_com(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(1); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) == PGS_ELLIPSE_CONT); } Datum sphereellipse_cont_ellipse_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(1); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) != PGS_ELLIPSE_CONT); } Datum sphereellipse_overlap_ellipse(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) > PGS_ELLIPSE_AVOID); } Datum sphereellipse_overlap_ellipse_neg(PG_FUNCTION_ARGS) { SELLIPSE *e1 = (SELLIPSE *) PG_GETARG_POINTER(0); SELLIPSE *e2 = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sellipse_ellipse_pos(e1, e2) == PGS_ELLIPSE_AVOID); } Datum spheretrans_ellipse(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SELLIPSE *out = (SELLIPSE *) palloc(sizeof(SELLIPSE)); euler_sellipse_trans(out, e, se); sellipse_check(out); PG_RETURN_POINTER(out); } Datum spheretrans_ellipse_inv(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SELLIPSE *out = (SELLIPSE *) palloc(sizeof(SELLIPSE)); SEuler tmp; spheretrans_inverse(&tmp, se); euler_sellipse_trans(out, e, &tmp); sellipse_check(out); PG_RETURN_POINTER(out); } pgsphere/ellipse.h000066400000000000000000000163561332443031700145140ustar00rootroot00000000000000#ifndef __PGS_ELLIPSE_H__ #define __PGS_ELLIPSE_H__ #include "line.h" /* Ellipse declarations */ /* * Spherical ellipse data structure. A spherical ellipse is represented using * two radii and an Euler transformation (ZXZ-axis). The "untransformed" ellipse * is located on equator at position (0,0). The large radius is along equator. */ typedef struct { /* * rad[0] is the large radius, rad[1] is the small radius of an ellipse in * radians */ float8 rad[2]; float8 phi, /* the first rotation angle around z axis */ theta, /* the second rotation angle around x axis */ psi; /* the last rotation angle around z axis */ } SELLIPSE; /* * PGS_RELATIONSHIPS */ /* PGS_ELLIPSE_LINE_REL Ellipse and line */ #define PGS_ELLIPSE_LINE_AVOID 0 /* ellipse avoids line */ #define PGS_ELLIPSE_CONT_LINE 1 /* ellipse contains line */ #define PGS_ELLIPSE_LINE_OVER 2 /* ellipse overlaps line */ /* PGS_ELLIPSE_CIRCLE_REL Ellipse and circle */ #define PGS_ELLIPSE_CIRCLE_AVOID 0 /* ellipse avoids circle */ #define PGS_CIRCLE_CONT_ELLIPSE 1 /* circle contains ellipse */ #define PGS_ELLIPSE_CONT_CIRCLE 2 /* ellipse contains circle */ #define PGS_ELLIPSE_CIRCLE_EQUAL 3 /* ellipse equals circle */ #define PGS_ELLIPSE_CIRCLE_OVER 4 /* ellipse overlaps circle */ /* PGS_ELLIPSE_ELLIPSE_REL Ellipse and ellipse */ #define PGS_ELLIPSE_AVOID 0 /* ellipse avoids other ellipse */ #define PGS_ELLIPSE_CONT 1 /* ellipse contains other ellipse */ #define PGS_ELLIPSE_OVER 2 /* ellipse overlaps other ellipse */ /* * Checks whether two ellipses are equal . */ bool sellipse_eq(const SELLIPSE *e1, const SELLIPSE *e2); /* * Returns the center of an ellipse. */ void sellipse_center(SPoint *sp, const SELLIPSE *e); /* * Checks whether a ellipse contains point. */ bool sellipse_cont_point(const SELLIPSE *se, const SPoint *sp); /* * Returns the large axis of an ellipse as line. */ bool sellipse_line(SLine *sl, const SELLIPSE *e); /* * Relationship between a line and an ellipse as PGS_ELLIPSE_LINE_REL int8 value. */ int8 sellipse_line_pos(const SELLIPSE *se, const SLine *sl); /* * Relationship between a circle and an ellipse as PGS_ELLIPSE_CIRCLE_REL int8 value. */ int8 sellipse_circle_pos(const SELLIPSE *se, const SCIRCLE *sc); /* * Returns the Euler transformation of an ellipse. */ void sellipse_trans(SEuler *se, const SELLIPSE *e); /* * Input of the spherical ellipse. */ Datum sphereellipse_in(PG_FUNCTION_ARGS); /* * Input of the spherical ellipse from center, axes and inclination. */ Datum sphereellipse_infunc(PG_FUNCTION_ARGS); /* * Returns the inclination of an ellipse. */ Datum sphereellipse_incl(PG_FUNCTION_ARGS); /* * Returns the length of the major axis of an ellipse. */ Datum sphereellipse_rad1(PG_FUNCTION_ARGS); /* * Returns the length of the minor axis of an ellipse. */ Datum sphereellipse_rad2(PG_FUNCTION_ARGS); /* * Returns the center of an ellipse. */ Datum sphereellipse_center(PG_FUNCTION_ARGS); /* * Returns the Euler transformation of an ellipse. */ Datum sphereellipse_trans(PG_FUNCTION_ARGS); /* * Casts a spherical ellipse as circle. The created circle is the boundary * circle of ellipse. The diameter of returned circle is equal to length of * major axis of ellipse. */ Datum sphereellipse_circle(PG_FUNCTION_ARGS); /* * Casts a spherical point to an ellipse. */ Datum spherepoint_ellipse(PG_FUNCTION_ARGS); /* * Casts a spherical circle to an ellipse. */ Datum spherecircle_ellipse(PG_FUNCTION_ARGS); /* * Checks whether two ellipses are equal. */ Datum sphereellipse_equal(PG_FUNCTION_ARGS); /* * Checks whether two ellipses are not equal. */ Datum sphereellipse_equal_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a point. */ Datum sphereellipse_cont_point(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a point. */ Datum sphereellipse_cont_point_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a point. */ Datum sphereellipse_cont_point_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a point. */ Datum sphereellipse_cont_point_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a line. */ Datum sphereellipse_cont_line(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a line. */ Datum sphereellipse_cont_line_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a line. */ Datum sphereellipse_cont_line_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a line. */ Datum sphereellipse_cont_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a line overlap. */ Datum sphereellipse_overlap_line(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a line don't overlap. */ Datum sphereellipse_overlap_line_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a line overlap. */ Datum sphereellipse_overlap_line_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a line don't overlap. */ Datum sphereellipse_overlap_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a circle. */ Datum sphereellipse_cont_circle(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a circle. */ Datum sphereellipse_cont_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a circle. */ Datum sphereellipse_cont_circle_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a circle. */ Datum sphereellipse_cont_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains an ellipse. */ Datum spherecircle_cont_ellipse(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain an ellipse. */ Datum spherecircle_cont_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains an ellipse. */ Datum spherecircle_cont_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain an ellipse. */ Datum spherecircle_cont_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and an ellipse overlap. */ Datum sphereellipse_overlap_circle(PG_FUNCTION_ARGS); /* * Checks whether a circle and an ellipse don't overlap. */ Datum sphereellipse_overlap_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and an ellipse overlap. */ Datum sphereellipse_overlap_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a circle and an ellipse don't overlap. */ Datum sphereellipse_overlap_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains other ellipse. */ Datum sphereellipse_cont_ellipse(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain other ellipse. */ Datum sphereellipse_cont_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse is contained by other ellipse. */ Datum sphereellipse_cont_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse isn't contained by other ellipse. */ Datum sphereellipse_cont_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two ellipses overlap. */ Datum sphereellipse_overlap_ellipse(PG_FUNCTION_ARGS); /* * Checks whether two ellipses don't overlap. */ Datum sphereellipse_overlap_ellipse_neg(PG_FUNCTION_ARGS); /* * Transforms an ellipse using an Euler transformation. */ Datum spheretrans_ellipse(PG_FUNCTION_ARGS); /* * Transforms an ellipse using an Euler transformation. */ Datum spheretrans_ellipse_inv(PG_FUNCTION_ARGS); #endif pgsphere/euler.c000066400000000000000000000230471332443031700141610ustar00rootroot00000000000000#include "euler.h" /* Euler transformation functions */ PG_FUNCTION_INFO_V1(spheretrans_in); PG_FUNCTION_INFO_V1(spheretrans_from_float8); PG_FUNCTION_INFO_V1(spheretrans_from_float8_and_type); PG_FUNCTION_INFO_V1(spheretrans_equal); PG_FUNCTION_INFO_V1(spheretrans_not_equal); PG_FUNCTION_INFO_V1(spheretrans_phi); PG_FUNCTION_INFO_V1(spheretrans_theta); PG_FUNCTION_INFO_V1(spheretrans_psi); PG_FUNCTION_INFO_V1(spheretrans_type); PG_FUNCTION_INFO_V1(spheretrans_zxz); PG_FUNCTION_INFO_V1(spheretrans); PG_FUNCTION_INFO_V1(spheretrans_invert); PG_FUNCTION_INFO_V1(spheretrans_trans); PG_FUNCTION_INFO_V1(spheretrans_trans_inv); PG_FUNCTION_INFO_V1(spheretrans_point); PG_FUNCTION_INFO_V1(spheretrans_point_inverse); /* * Checks and modifies the Euler transformation. */ static void spheretrans_check(SEuler *e) { SPoint sp[3]; sp[0].lat = sp[1].lat = sp[2].lat = 0.0; sp[0].lng = e->phi; sp[1].lng = e->theta; sp[2].lng = e->psi; spoint_check(&sp[0]); spoint_check(&sp[1]); spoint_check(&sp[2]); e->phi = sp[0].lng; e->theta = sp[1].lng; e->psi = sp[2].lng; } Datum spheretrans_in(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) palloc(sizeof(SEuler)); char *c = PG_GETARG_CSTRING(0); unsigned char etype[3]; int i; void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); if (get_euler(&se->phi, &se->theta, &se->psi, etype)) { for (i = 0; i < 3; i++) { switch (i) { case 0: se->phi_a = etype[i]; break; case 1: se->theta_a = etype[i]; break; case 2: se->psi_a = etype[i]; break; } } spheretrans_check(se); } else { reset_buffer(); pfree(se); se = NULL; elog(ERROR, "spheretrans_in: parse error"); } reset_buffer(); PG_RETURN_POINTER(se); } Datum spheretrans_from_float8(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) palloc(sizeof(SEuler)); se->phi = PG_GETARG_FLOAT8(0); se->theta = PG_GETARG_FLOAT8(1); se->psi = PG_GETARG_FLOAT8(2); seuler_set_zxz(se); spheretrans_check(se); PG_RETURN_POINTER(se); } Datum spheretrans_from_float8_and_type(PG_FUNCTION_ARGS) { SEuler *se; Datum d[3]; int i; char *c = PG_GETARG_CSTRING(3); unsigned char t = 0; d[0] = PG_GETARG_DATUM(0); d[1] = PG_GETARG_DATUM(1); d[2] = PG_GETARG_DATUM(2); se = (SEuler *) DatumGetPointer( DirectFunctionCall3(spheretrans_from_float8, d[0], d[1], d[2])); for (i = 0; i < 3; i++) { switch (c[i]) { case 'x': case 'X': t = EULER_AXIS_X; break; case 'y': case 'Y': t = EULER_AXIS_Y; break; case 'z': case 'Z': t = EULER_AXIS_Z; break; default: t = 0; } if (t == 0) { pfree(se); elog(ERROR, "invalid axis format"); } switch (i) { case 0: se->phi_a = t; break; case 1: se->theta_a = t; break; case 2: se->psi_a = t; break; } } PG_RETURN_POINTER(se); } void seuler_set_zxz(SEuler *se) { se->phi_a = EULER_AXIS_Z; se->theta_a = EULER_AXIS_X; se->psi_a = EULER_AXIS_Z; } bool strans_eq(const SEuler *e1, const SEuler *e2) { SPoint in[2], p[4]; in[0].lng = 0.0; in[0].lat = 0.0; in[1].lng = PIH; in[1].lat = 0.0; euler_spoint_trans(&p[0], &in[0], e1); euler_spoint_trans(&p[1], &in[1], e1); euler_spoint_trans(&p[2], &in[0], e2); euler_spoint_trans(&p[3], &in[1], e2); return spoint_eq(&p[0], &p[2]) && spoint_eq(&p[1], &p[3]); } Datum spheretrans_equal(PG_FUNCTION_ARGS) { SEuler *e1 = (SEuler *) PG_GETARG_POINTER(0); SEuler *e2 = (SEuler *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(strans_eq(e1, e2)); } Datum spheretrans_not_equal(PG_FUNCTION_ARGS) { SEuler *e1 = (SEuler *) PG_GETARG_POINTER(0); SEuler *e2 = (SEuler *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!strans_eq(e1, e2)); } Datum spheretrans_phi(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); PG_RETURN_POINTER(&se->phi); } Datum spheretrans_theta(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); PG_RETURN_POINTER(&se->theta); } Datum spheretrans_psi(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); PG_RETURN_POINTER(&se->psi); } Datum spheretrans_type(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); BpChar *result = (BpChar *) palloc(3 + VARHDRSZ); char ret[4]; int i; unsigned char t = 0; for (i = 0; i < 3; i++) { switch (i) { case 0: t = se->phi_a; break; case 1: t = se->theta_a; break; case 2: t = se->psi_a; break; } switch (t) { case EULER_AXIS_X: ret[i] = 'X'; break; case EULER_AXIS_Y: ret[i] = 'Y'; break; case EULER_AXIS_Z: ret[i] = 'Z'; break; } } ret[3] = '\0'; SET_VARSIZE(result, 3 + VARHDRSZ); memcpy((void *) VARDATA(result), (void *) &ret[0], 3); PG_RETURN_BPCHAR_P(result); } void spheretrans_inv(SEuler *se) { float8 lng[3]; const unsigned char c = se->phi_a; lng[2] = -se->phi; lng[1] = -se->theta; lng[0] = -se->psi; se->phi = lng[0]; se->theta = lng[1]; se->psi = lng[2]; se->phi_a = se->psi_a; se->psi_a = c; } void spheretrans_inverse(SEuler *se_out, const SEuler *se_in) { memcpy((void *) se_out, (void *) se_in, sizeof(SEuler)); spheretrans_inv(se_out); } void strans_zxz(SEuler *ret, const SEuler *se) { if (se->phi_a == EULER_AXIS_Z && se->theta_a == EULER_AXIS_X && se->psi_a == EULER_AXIS_Z) { memcpy((void *) ret, (void *) se, sizeof(SEuler)); } else { SEuler tmp; tmp.psi = 0.0; tmp.theta = 0.0; tmp.phi = 0.0; seuler_set_zxz(&tmp); seuler_trans_zxz(ret, se, &tmp); } } Datum spheretrans_zxz(PG_FUNCTION_ARGS) { SEuler *si = (SEuler *) PG_GETARG_POINTER(0); SEuler *ret = (SEuler *) palloc(sizeof(SEuler)); strans_zxz(ret, si); PG_RETURN_POINTER(ret); } Datum spheretrans(PG_FUNCTION_ARGS) { Datum d = PG_GETARG_DATUM(0); PG_RETURN_DATUM(d); } Datum spheretrans_invert(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); SEuler *ret = (SEuler *) palloc(sizeof(SEuler)); spheretrans_inverse(ret, se); PG_RETURN_POINTER(ret); } void seuler_trans_zxz(SEuler *out, const SEuler *in, const SEuler *se) { SPoint sp[4]; sp[0].lng = 0.0; sp[0].lat = 0.0; sp[1].lng = PIH; sp[1].lat = 0.0; euler_spoint_trans(&sp[2], &sp[0], in); euler_spoint_trans(&sp[3], &sp[1], in); euler_spoint_trans(&sp[0], &sp[2], se); euler_spoint_trans(&sp[1], &sp[3], se); spherevector_to_euler(out, &sp[0], &sp[1]); } Datum spheretrans_trans(PG_FUNCTION_ARGS) { SEuler *se1 = (SEuler *) PG_GETARG_POINTER(0); SEuler *se2 = (SEuler *) PG_GETARG_POINTER(1); SEuler *out = (SEuler *) palloc(sizeof(SEuler)); seuler_trans_zxz(out, se1, se2); PG_RETURN_POINTER(out); } Datum spheretrans_trans_inv(PG_FUNCTION_ARGS) { SEuler *se1 = (SEuler *) PG_GETARG_POINTER(0); SEuler *se2 = (SEuler *) PG_GETARG_POINTER(1); SEuler *out = (SEuler *) palloc(sizeof(SEuler)); SEuler tmp; spheretrans_inverse(&tmp, se2); seuler_trans_zxz(out, se1, &tmp); spheretrans_check(out); PG_RETURN_POINTER(out); } void euler_spoint_trans(SPoint *out, const SPoint *in, const SEuler *se) { Vector3D v, o; spoint_vector3d(&v, in); euler_vector_trans(&o, &v, se); vector3d_spoint(out, &o); } Datum spheretrans_point(PG_FUNCTION_ARGS) { SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SPoint *out = (SPoint *) palloc(sizeof(SPoint)); euler_spoint_trans(out, sp, se); PG_RETURN_POINTER(out); } Datum spheretrans_point_inverse(PG_FUNCTION_ARGS) { Datum sp = PG_GETARG_DATUM(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SEuler tmp; Datum ret; spheretrans_inverse(&tmp, se); ret = DirectFunctionCall2(spheretrans_point, sp, PointerGetDatum(&tmp)); PG_RETURN_DATUM(ret); } /* * Transforms a spherical vector from 'spb' to 'spe' into an inverse Euler * transformation. Returns true if the transformation was successful. */ static bool spherevector_to_euler_inv(SEuler *se, const SPoint *spb, const SPoint *spe) { if (spoint_eq(spb, spe)) { return false; } else { Vector3D vbeg, vend, vtmp; SPoint spt[2]; SEuler set; spoint_vector3d(&vbeg, spb); spoint_vector3d(&vend, spe); vector3d_cross(&vtmp, &vbeg, &vend); vector3d_spoint(&spt[0], &vtmp); set.phi = -spt[0].lng - PIH; set.theta = spt[0].lat - PIH; set.psi = 0.0; seuler_set_zxz(&set); euler_spoint_trans(&spt[1], spb, &set); set.psi = -spt[1].lng; memcpy((void *) se, (void *) &set, sizeof(SEuler)); } return true; } bool spherevector_to_euler(SEuler *se, const SPoint *spb, const SPoint *spe) { bool ret; ret = spherevector_to_euler_inv(se, spb, spe); if (ret) { spheretrans_inv(se); } return ret; } void euler_vector_trans(Vector3D *out, const Vector3D *in, const SEuler *se) { int i; unsigned char t; const double *a; double u[3], vr[3], sa, ca; t = 0; a = NULL; u[0] = in->x; u[1] = in->y; u[2] = in->z; for (i = 0; i < 3; i++) { switch (i) { case 0: a = &se->phi; t = se->phi_a; break; case 1: a = &se->theta; t = se->theta_a; break; case 2: a = &se->psi; t = se->psi_a; break; } if (FPzero(*a)) { continue; } sa = sin(*a); ca = cos(*a); switch (t) { case EULER_AXIS_X: vr[0] = u[0]; vr[1] = ca * u[1] - sa * u[2]; vr[2] = sa * u[1] + ca * u[2]; break; case EULER_AXIS_Y: vr[0] = ca * u[0] + sa * u[2]; vr[1] = u[1]; vr[2] = ca * u[2] - sa * u[0]; break; case EULER_AXIS_Z: vr[0] = ca * u[0] - sa * u[1]; vr[1] = sa * u[0] + ca * u[1]; vr[2] = u[2]; break; } memcpy((void *) &u[0], (void *) &vr[0], sizeof(u)); } out->x = u[0]; out->y = u[1]; out->z = u[2]; } pgsphere/euler.h000066400000000000000000000074541332443031700141720ustar00rootroot00000000000000#ifndef __PGS_EULER_H__ #define __PGS_EULER_H__ #include "point.h" /* * Euler transformation declarations */ /* * Data structure of spherical (Euler) transformation. */ typedef struct { unsigned char phi_a:2, /* first axis */ theta_a:2, /* second axis */ psi_a:2; /* third axis */ float8 phi, /* first rotation angle */ theta, /* second rotation angle */ psi; /* third rotation angle */ } SEuler; /* * Transforms a spherical point and returns the pointer to a transformed spherical * point. */ void euler_spoint_trans(SPoint *out, const SPoint *in, const SEuler *se); /* * Transforms a spherical vector from 'spb' to 'spe' into an Euler transformation. * Returns true if the transformation was successful. */ bool spherevector_to_euler(SEuler *se, const SPoint *spb, const SPoint *spe); /* * Sets the axes of transformation to ZXZ. */ void seuler_set_zxz(SEuler *se); /* * Checks equality of two transformations. */ bool strans_eq(const SEuler *e1, const SEuler *e2); /* * Transforms a vector using an Euler transformation. Returns the pointer to * the result vector. */ void euler_vector_trans(Vector3D *out, const Vector3D *in, const SEuler *se); /* * Inverts an Euler transformation. Returns the pointer to the * inverted transformation. */ void spheretrans_inverse(SEuler *se_out, const SEuler *se_in); /* * Inverts an Euler transformation replacing the original Euler transformation. * Returns the pointer to the inverted transformation. */ void spheretrans_inv(SEuler *se); /* * Converts an Euler transformation to a ZXZ-axis transformation. Returns * the pointer to the converted transformation. */ void strans_zxz(SEuler *ret, const SEuler *se); /* * Transforms an Euler transformation 'in' into 'out' using 'se'. The result * is always a ZXZ-axis transformation. Returns the pointer to the transformed * transformation. */ void seuler_trans_zxz(SEuler *out, const SEuler *in, const SEuler *se); /* * Input of an Euler transformation. */ Datum spheretrans_in(PG_FUNCTION_ARGS); /* * Input of an Euler transformation with axis Z,X,Z from three angles * (phi, theta, psi) in radians. */ Datum spheretrans_from_float8(PG_FUNCTION_ARGS); /* * Returns the first angle of an Euler transformation in radians. */ Datum spheretrans_phi(PG_FUNCTION_ARGS); /* * Returns the second angle of an Euler transformation in radians. */ Datum spheretrans_theta(PG_FUNCTION_ARGS); /* * Returns the third angle of an Euler transformation in radians. */ Datum spheretrans_psi(PG_FUNCTION_ARGS); /* * Returns the axis of an Euler transformation as three letter code. */ Datum spheretrans_type(PG_FUNCTION_ARGS); /* * Returns the Euler transformation (does nothing). This function is needed * for +strans operator. */ Datum spheretrans(PG_FUNCTION_ARGS); /* * Returns the inverse Euler transformation. */ Datum spheretrans_invert(PG_FUNCTION_ARGS); /* * Convert an Euler transformation to a ZXZ-axis transformation. */ Datum spheretrans_zxz(PG_FUNCTION_ARGS); /* * This function creates an Euler transformation from 3 angle values in * radians and three letter code used for axes. A letter can be X, Y or Z * (case-insensitive). */ Datum spheretrans_from_float8_and_type(PG_FUNCTION_ARGS); /* * Checks equality of two Euler transformations. */ Datum spheretrans_equal(PG_FUNCTION_ARGS); /* * Checks inequality of two Euler transformations. */ Datum spheretrans_not_equal(PG_FUNCTION_ARGS); /* * Transforms an Euler transformation. */ Datum spheretrans_trans(PG_FUNCTION_ARGS); /* * Transforms inverse an Euler transformations. */ Datum spheretrans_trans_inv(PG_FUNCTION_ARGS); /* * Transforms a spherical point. */ Datum spheretrans_point(PG_FUNCTION_ARGS); /* * Perform inverse transformation of a spherical point. */ Datum spheretrans_point_inverse(PG_FUNCTION_ARGS); #endif pgsphere/expected/000077500000000000000000000000001332443031700144745ustar00rootroot00000000000000pgsphere/expected/bounding_box_gist.out000066400000000000000000000040331332443031700207300ustar00rootroot00000000000000CREATE TABLE bbox_ellipse (e sellipse not null); INSERT INTO bbox_ellipse VALUES ('<{10d, 0.1d}, (0d,0d), 0d>'); SELECT spoint '(5d, 0d)' @ sellipse '<{10d, 0.1d}, (0d,0d), 0d>' AS inside; inside -------- t (1 row) SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e; count ------- 1 (1 row) -- The ellipse has semi-major axis length of 10 degrees along the equator, -- so (lon,lat) = (5,0) should be inside. CREATE INDEX idx_bbox_ellipse ON bbox_ellipse USING gist (e); ANALYZE bbox_ellipse; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e; count ------- 1 (1 row) CREATE TABLE bbox_poly (p spoly not null); INSERT INTO bbox_poly VALUES ('{(40d,-40d), (0d,80d), (-40d,-40d)}'); SELECT spoint '(0d, 0d)' @ spoly '{(40d,-40d), (0d,80d), (-40d,-40d)}' AS inside; inside -------- t (1 row) SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p; count ------- 1 (1 row) CREATE INDEX idx_bbox_poly ON bbox_poly USING gist (p); ANALYZE bbox_poly; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p; count ------- 1 (1 row) CREATE TABLE bbox_path (p spath not null); INSERT INTO bbox_path VALUES ('{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}'); SELECT sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS crossing; crossing ---------- t (1 row) SELECT spoint '(0d, 0d)' @ spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS inside; inside -------- t (1 row) SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p; count ------- 1 (1 row) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p; count ------- 1 (1 row) CREATE INDEX idx_bbox_path ON bbox_path USING gist (p); ANALYZE bbox_path; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p; count ------- 1 (1 row) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p; count ------- 1 (1 row) pgsphere/expected/box.out000066400000000000000000001252661332443031700160310ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- -- sbox and spoint -- SELECT spoint '(0d,90d)' @ sbox '((0d,80d),(360d,90d))' ; ?column? ---------- t (1 row) SELECT sbox '((309d,309d),(313d,313d))' ~ spoint '(310d,310d)' ; ?column? ---------- t (1 row) SELECT spoint '(310d,310d)' @ sbox '((309d,309d),(313d,313d))' ; ?column? ---------- t (1 row) SELECT sbox '((309d,309d),(313d,313d))' ~ spoint '(10d,10d)' ; ?column? ---------- f (1 row) SELECT spoint '(10d,10d)' @ sbox '((309d,309d),(313d,313d))' ; ?column? ---------- f (1 row) SELECT sbox '((309d,309d),(313d,313d))' !~ spoint '(310d,310d)' ; ?column? ---------- f (1 row) SELECT spoint '(310d,310d)' !@ sbox '((309d,309d),(313d,313d))' ; ?column? ---------- f (1 row) SELECT sbox '((309d,309d),(313d,313d))' !~ spoint '(10d,10d)' ; ?column? ---------- t (1 row) SELECT spoint '(10d,10d)' !@ sbox '((309d,309d),(313d,313d))' ; ?column? ---------- t (1 row) SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(10d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(10d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(20d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(20d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,15d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(315d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(315d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,15d)'; ?column? ---------- t (1 row) SELECT spoint '(320d, 15d)' @ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT spoint '(140d,-15d)' @ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,15d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,20d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,15d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,15d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,10d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,15d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,20d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,15d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,20d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,15d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,20d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(300d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-80d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-85d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-90d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(180d,-90d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(180d,-89.99d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(300d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,80d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,85d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,90d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(180d,90d)'; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(180d,89.99d)'; ?column? ---------- f (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(300d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-80d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-85d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-90d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(180d,-90d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(180d,-89.99d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(300d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,80d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,85d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,90d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(180d,90d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(180d,89.99d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d,-11d)'; ?column? ---------- f (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d,-10d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, -5d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 0d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 5d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 20d)'; ?column? ---------- t (1 row) SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 21d)'; ?column? ---------- f (1 row) SELECT spoint '(320d, 15d)' !@ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- f (1 row) SELECT spoint '(140d,-15d)' !@ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT sbox '((10d,10d),(20d,20d))' !~ spoint '(10d,10d)'; ?column? ---------- f (1 row) SELECT sbox '((270d,-10d),(300d,20d))' !~ spoint '(10d,10d)'; ?column? ---------- t (1 row) -- -- sbox (as point) and spoint -- SELECT sbox '((310d,310d),(310d,310d))' ~ spoint '(310d,310d)' ; ?column? ---------- t (1 row) SELECT spoint '(310d,310d)' @ sbox '((310d,310d),(310d,310d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,310d),(310d,310d))' ~ spoint '(10d,10d)' ; ?column? ---------- f (1 row) SELECT spoint '(11d,11d)' @ sbox '((310d,310d),(310d,310d))' ; ?column? ---------- f (1 row) -- -- sbox and circle -- -- Check negators / commutators SELECT scircle '<(0d, 70d),1d>' && sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' && scircle '<(0d, 70d),1d>'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 70d),1d>' !&& sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !&& scircle '<(0d, 70d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 50d),1d>' && sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' && scircle '<(0d, 50d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 50d),1d>' !&& sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !&& scircle '<(0d, 50d),1d>'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 70d),1d>' @ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' @ scircle '<(0d, 70d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 70d),1d>' !@ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !@ scircle '<(0d, 70d),1d>'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 50d),1d>' @ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' @ scircle '<(0d, 50d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 50d),1d>' !@ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !@ scircle '<(0d, 50d),1d>'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 70d),1d>' ~ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' ~ scircle '<(0d, 70d),1d>'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 70d),1d>' !~ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !~ scircle '<(0d, 70d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 50d),1d>' ~ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- f (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' ~ scircle '<(0d, 50d),1d>'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 50d),1d>' !~ sbox '((-10d, 60d),(10d, 80d))'; ?column? ---------- t (1 row) SELECT sbox '((-10d, 60d),(10d, 80d))' !~ scircle '<(0d, 50d),1d>'; ?column? ---------- t (1 row) -- Other Checks SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-90d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-89d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-89d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-88d))'; ?column? ---------- f (1 row) SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 88d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-88d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),10d>' @ sbox '((0d, 80d),(360d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),10d>' ~ sbox '((0d, 80d),(360d, 90d))'; ?column? ---------- t (1 row) SELECT scircle '<(0d, 90d),10d>' && sbox '((0d, 80d),(360d, 90d))'; ?column? ---------- t (1 row) -- -- sbox and line -- SELECT sline( spoint '(0d,0d)', spoint '(0d,10d)' ) @ sbox '((0d,0d),(10d,10d))'; ?column? ---------- t (1 row) SELECT sline( spoint '(0d,0d)', spoint '(0d,0d)' ) @ sbox '((0d,0d),(10d,10d))'; ?column? ---------- t (1 row) SELECT sline( spoint '(0d,10d)', spoint '(10d,10d)' ) @ sbox '((0d,0d),(10d,10d))'; ?column? ---------- f (1 row) SELECT sline( spoint '(0d,0d)', spoint '(0d,10d)' ) && sbox '((0d,0d),(10d,10d))'; ?column? ---------- t (1 row) SELECT sline( spoint '(0d,0d)', spoint '(0d,0d)' ) && sbox '((0d,0d),(10d,10d))'; ?column? ---------- t (1 row) SELECT sline( spoint '(0d,10d)', spoint '(10d,10d)' ) && sbox '((0d,0d),(10d,10d))'; ?column? ---------- t (1 row) -- sbox is point, sline is point SELECT sbox '((310d,310d),(310d,310d))' ~ sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) @ sbox '((310d,310d),(310d,310d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,310d),(310d,310d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,11d)' , spoint '(11d,11d)' ) @ sbox '((310d,310d),(310d,310d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) @ sbox '((310d,90d),(310d,90d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,90d),(310d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,310d),(310d,310d))' && sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) && sbox '((310d,310d),(310d,310d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,310d),(310d,310d))' && sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,11d)' , spoint '(11d,11d)' ) && sbox '((310d,310d),(310d,310d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) && sbox '((310d,90d),(310d,90d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,90d),(310d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; ?column? ---------- t (1 row) -- sbox is point only SELECT sbox '((310d,10d),(310d,10d))' ~ sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(310d,10d))' && sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) @ sbox '((310d,10d),(310d,10d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) && sbox '((310d,10d),(310d,10d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(310d,10d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,20d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(310d,10d))' && sline ( spoint '(10d,10d)', spoint '(10d,20d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,11d)' , spoint '(21d,11d)' ) @ sbox '((310d,10d),(310d,10d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,11d)' , spoint '(21d,11d)' ) && sbox '((310d,10d),(310d,10d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) @ sbox '((310d,90d),(310d,90d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) && sbox '((310d,90d),(310d,90d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,90d),(310d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((310d,90d),(310d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) ; ?column? ---------- t (1 row) -- sline is point only SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) @ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) && sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) @ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) && sbox '((310d,10d),(320d,20d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d, 11d)' , spoint '(11d,11d)' ) @ sbox '((310d,10d),(320d,20d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d, 11d)' , spoint '(11d,11d)' ) && sbox '((310d,10d),(320d,20d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d, 90d)' , spoint '(11d,90d)' ) @ sbox '((310d,80d),(320d,90d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(11d, 90d)' , spoint '(11d,90d)' ) && sbox '((310d,80d),(320d,90d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(11d, 85d)' , spoint '(11d,85d)' ) @ sbox '((310d,80d),(320d,90d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(11d, 85d)' , spoint '(11d,85d)' ) && sbox '((310d,80d),(320d,90d))' ; ?column? ---------- f (1 row) SELECT sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) @ sbox '((310d,80d),(320d,90d))' ; ?column? ---------- t (1 row) SELECT sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) && sbox '((310d,80d),(320d,90d))' ; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(320d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(320d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(320d,90d))' ~ sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((310d,80d),(320d,90d))' && sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) ; ?column? ---------- t (1 row) -- sline / sbox near pole SELECT sbox '((20d,80d),(200d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,85d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((20d,80d),(200d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,85d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((10d,80d),(210d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((10d,80d),(210d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((10d,80d),(211d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((10d,80d),(211d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(199d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((190d,80d),(199d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(200d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(200d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(210d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(210d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,80d),(210d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,80d),(210d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((210d,80d),(220d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((210d,80d),(220d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(199d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((190d,80d),(199d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((190d,80d),(200d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((190d,80d),(200d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((190d,80d),(210d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((190d,80d),(210d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,80d),(210d,88d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,80d),(210d,88d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((210d,80d),(220d,88d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((210d,80d),(220d,88d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; ?column? ---------- f (1 row) -- sbox near equator SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,85d)', spoint '( 20d, 85d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,85d)', spoint '( 20d, 85d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(190d, 0d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(190d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(205d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(205d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(202d, 0d)', spoint '(207d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(202d, 0d)', spoint '(207d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,-5d)', spoint '(200d, 5d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,-5d)', spoint '(200d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,-5d)', spoint '(205d, 5d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,-5d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,-5d)', spoint '(200d, 15d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,-5d)', spoint '(200d, 15d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,-5d)', spoint '(205d, 15d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,-5d)', spoint '(205d, 15d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(210d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(210d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(211d, 11d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(211d, 11d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(211d, 11d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(211d, 11d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(210d, 10d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(210d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(209d, 9d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(209d, 9d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 1d)', spoint '(211d, 11d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 1d)', spoint '(211d, 11d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 0d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 1d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 1d)', spoint '(205d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(210d, 10d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(210d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(205d, 10d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(205d, 10d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(200d, 0d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(200d, 0d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(200d, 20d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(200d, 20d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,10d)', spoint '(205d, 20d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,10d)', spoint '(205d, 20d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(210d,10d)', spoint '(210d, 20d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(210d,10d)', spoint '(210d, 20d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, -5d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, -5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, -5d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, -5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(210d, 0d)', spoint '(210d, -5d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(210d, 0d)', spoint '(210d, -5d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((200d,0d),(210d,10d))' ~ sline '( -10d, -10d, 200d, ZXZ ), 20d' ; ?column? ---------- f (1 row) SELECT sbox '((200d,0d),(210d,10d))' && sline '( -10d, -10d, 200d, ZXZ ), 20d' ; ?column? ---------- t (1 row) -- general position SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, 0d)', spoint '(190d, 0d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, 0d)', spoint '(190d, 0d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -50d)', spoint '(190d, -50d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -50d)', spoint '(190d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -40d)', spoint '(189d, -40d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -40d)', spoint '(189d, -40d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -50d)', spoint '(189d, -50d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -50d)', spoint '(189d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -40d)', spoint '(191d, -40d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -40d)', spoint '(191d, -40d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -50d)', spoint '(191d, -50d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -50d)', spoint '(191d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -51d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -51d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(190d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -41d)', spoint '(189d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -41d)', spoint '(189d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -39d)', spoint '(180d, -51d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -39d)', spoint '(180d, -51d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(180d, -51d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(180d, -51d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(180d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(180d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(180d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(180d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(180d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(180d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -39d)', spoint '(182d, -51d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -39d)', spoint '(182d, -51d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(182d, -51d)' ) ; ?column? ---------- f (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(182d, -51d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(182d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(182d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(182d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(182d, -50d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(182d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(182d, -49d)' ) ; ?column? ---------- t (1 row) SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; ?column? ---------- t (1 row) -- all less/equals/greater permutations of spoint coordinates with respect to a fixed sbox select 'f' as expected, spoint(0.50, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(0.50, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(0.50, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(0.50, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(0.50, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(0.75, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 't' as expected, spoint(0.75, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(0.75, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(0.75, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 'f' as expected, spoint(0.75, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.00, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 't' as expected, spoint(1.00, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(1.00, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(1.00, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 'f' as expected, spoint(1.00, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.25, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 't' as expected, spoint(1.25, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(1.25, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 't' as expected, spoint(1.25, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- t | t (1 row) select 'f' as expected, spoint(1.25, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.50, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.50, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.50, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.50, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) select 'f' as expected, spoint(1.50, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; expected | actual ----------+-------- f | f (1 row) -- wide spherical boxes pgsphere/expected/circle.out000066400000000000000000000345311332443031700164740ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- Input/Output --- SELECT set_sphere_output( 'RAD' ); set_sphere_output ------------------- SET RAD (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; scircle ------------------------------------------- <(0.2727077 , 0.018180513) , 0.017453293> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; scircle ------------------------------------------- <(0.2727077 , 0.018180513) , 0.026179939> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; scircle ----------------------------------- <(0.2727077 , 0.018180513) , 0.1> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; scircle ----------------------------------------- <(0.2727077 , 0.018180513) , 1.5707963> (1 row) SELECT set_sphere_output( 'DEG' ); set_sphere_output ------------------- SET DEG (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; scircle ------------------------------- <(15.625d , 1.0416667d) , 1d> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; scircle --------------------------------- <(15.625d , 1.0416667d) , 1.5d> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; scircle -------------------------------------- <(15.625d , 1.0416667d) , 5.729578d> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; scircle -------------------------------- <(15.625d , 1.0416667d) , 90d> (1 row) SELECT set_sphere_output( 'DMS' ); set_sphere_output ------------------- SET DMS (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 1d 0m 0s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 1d 30m 0s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; scircle ------------------------------------------------------ <( 15d 37m 30s , + 1d 2m 30s) , 5d 43m 46.480625s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 90d 0m 0s> (1 row) SELECT set_sphere_output( 'HMS' ); set_sphere_output ------------------- SET HMS (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 1d 0m 0s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 1d 30m 0s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; scircle ------------------------------------------------------ <( 1h 2m 30s , + 1d 2m 30s) , 5d 43m 46.480625s> (1 row) SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 90d 0m 0s> (1 row) SELECT set_sphere_output( 'DMS' ); set_sphere_output ------------------- SET DMS (1 row) -- Functions -- checking spherical circle operators SELECT scircle '<(0, 90d),1>' = '<(0, 90d),1>' ; ?column? ---------- t (1 row) SELECT scircle '<(0,-90d),1>' <> '<(0, 90d),1>' ; ?column? ---------- t (1 row) -- float8 dist(scircle,scircle) SELECT 180.0*dist('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle,'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); ?column? ---------- 19.8 (1 row) SELECT 180.0*dist('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 13 (1 row) SELECT 180.0*dist('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 20 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 0.5 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 0 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 87 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 178 (1 row) -- spoint center(scircle) SELECT center('< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle); center ------------------------------- ( 15d 37m 30s , + 1d 2m 30s) (1 row) SELECT center('< (1h 2m 30s , +90d 0m 0s), 1.0d >'::scircle); center ------------------------------ ( 15d 37m 30s , +90d 0m 0s) (1 row) -- scircle scircle(spoint) SELECT scircle('(0d,0d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , + 0d 0m 0s) , 0d 0m 0s> (1 row) SELECT scircle('(0d,90d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , +90d 0m 0s) , 0d 0m 0s> (1 row) SELECT scircle('(0d,-90d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , -90d 0m 0s) , 0d 0m 0s> (1 row) -- Operators -- = operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (25h 0m 0s,+1d), 1d 30m >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle='< (13h 0m 0s,+85d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle='< (13h 0m 0s,-85d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle='< (2h 0m 0s,+90d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle='< (2h 0m 0s,-90d), 1.5d >'::scircle ; ?column? ---------- t (1 row) -- should be "false" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,-1d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 2.5d >'::scircle ; ?column? ---------- f (1 row) -- <> operator -- should be "false" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (25h 0m 0s,+1d), 1d 30m >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle <> '< (13h 0m 0s,+85d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle <> '< (13h 0m 0s,-85d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle <> '< (2h 0m 0s,+90d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle <> '< (2h 0m 0s,-90d), 1.5d >'::scircle ; ?column? ---------- f (1 row) -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,-1d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 2.5d >'::scircle ; ?column? ---------- t (1 row) -- && operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 0.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,-1d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0s,0d), 15d >'::scircle; ?column? ---------- t (1 row) SELECT '< (2h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0.1s,0d), 15d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (23h 0m 0.1s,0d), 15d >'::scircle; ?column? ---------- t (1 row) -- should be "false" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle && '< (1h 0m 0s,-1d), 0.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (1d 0m 0s,+1d), 1.0d >'::scircle && '< (0d 0m 0s,0d), 0.1d >'::scircle; ?column? ---------- f (1 row) -- @@ operator SELECT @@ '< (1h 2m 3s , +1d 2m 3s), 1.0d >'::scircle; ?column? ------------------------------ ( 15d 30m 45s , + 1d 2m 3s) (1 row) SELECT @@ '< (1h 2m 3s , +90d 0m 0s), 1.0d >'::scircle; ?column? ------------------------------ ( 15d 30m 45s , +90d 0m 0s) (1 row) -- <-> operator SELECT 180.0*('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle<->'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); ?column? ---------- 19.8 (1 row) SELECT 180.0*('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 13 (1 row) SELECT 180.0*('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 20 (1 row) SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 0.5 (1 row) SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 0 (1 row) SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 87 (1 row) SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 178 (1 row) -- scircle @ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (2d 0m 0s,+1d), 0.5d >'::scircle @ '< (1d 0m 0s,0d), 3.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; ?column? ---------- t (1 row) -- should be "false" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (2h 0m 0s,+1d), 1.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (2d 0m 0s,+1d), 1.5d >'::scircle @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; ?column? ---------- f (1 row) -- scircle ~ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1d 0m 0s,0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 0.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; ?column? ---------- t (1 row) -- should be "false" SELECT '< (2h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 1.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; ?column? ---------- f (1 row) -- spoint @ scircle operator -- should be "true" SELECT '(1h 0m 0s,+1d) '::spoint @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '(2d 0m 0s,+1d) '::spoint @ '< (1d 0m 0s, 0d), 3.5d >'::scircle; ?column? ---------- t (1 row) SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; ?column? ---------- t (1 row) SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; ?column? ---------- t (1 row) SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; ?column? ---------- t (1 row) -- should be "false" SELECT '(1h 0m 0s,+1d )'::spoint @ '< (2h 0m 0s,-1d), 1.5d >'::scircle; ?column? ---------- f (1 row) SELECT '(3d 30m 0s,+1d )'::spoint @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; ?column? ---------- f (1 row) SELECT '(1h 0m 0s,+88.99d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; ?column? ---------- f (1 row) SELECT '(1h 0m 0s,-88.99d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; ?column? ---------- f (1 row) -- spoint ~ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d) '::spoint; ?column? ---------- t (1 row) SELECT '< (1d 0m 0s, 0d), 3.5d >'::scircle ~ '(2d 0m 0s,+1d) '::spoint; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; ?column? ---------- t (1 row) SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; ?column? ---------- t (1 row) -- should be "false" SELECT '< (2h 0m 0s,-1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d )'::spoint; ?column? ---------- f (1 row) SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '(3d 30m 0s,+1d )'::spoint; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+88.99d)'::spoint; ?column? ---------- f (1 row) SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-88.99d)'::spoint; ?column? ---------- f (1 row) pgsphere/expected/circle_extended.out000066400000000000000000000123411332443031700203470ustar00rootroot00000000000000-- indexed operations..... SET enable_indexscan=off; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; count ------- 13 (1 row) select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; count ------- 1 (1 row) select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; count ------- 1 (1 row) select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; count ------- 13 (1 row) SET enable_indexscan=on; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; count ------- 361 (1 row) select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; count ------- 13 (1 row) select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; count ------- 1 (1 row) select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; count ------- 1 (1 row) select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; count ------- 361 (1 row) select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; count ------- 13 (1 row) select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; count ------- 13 (1 row) -- "Cross-correlation" about 30 seconds on PIII-750 select count(spoint_data.sp) from spoint_data,scircle_data where spoint_data.sp @ scircle_data.sc; count ------- 78842 (1 row) pgsphere/expected/contains_ops.out000066400000000000000000000652261332443031700177370ustar00rootroot00000000000000-- scircle vs spoint select 'scircle @> spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) @> spoint(1.0,1.0) as actual; ?column? | expected | actual -------------------+----------+-------- scircle @> spoint | t | t (1 row) select 'scircle @> spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> spoint(2.0,2.0) as actual; ?column? | expected | actual -------------------+----------+-------- scircle @> spoint | f | f (1 row) select 'spoint <@ scircle', 't' as expected, spoint(1.0,1.0) <@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- spoint <@ scircle | t | t (1 row) select 'spoint <@ scircle', 'f' as expected, spoint(2.0,2.0) <@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- spoint <@ scircle | f | f (1 row) select 'scircle !@> spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !@> spoint(1.0,1.0) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !@> spoint | f | f (1 row) select 'scircle !@> spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> spoint(2.0,2.0) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !@> spoint | t | t (1 row) select 'spoint !<@ scircle', 'f' as expected, spoint(1.0,1.0) !<@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- spoint !<@ scircle | f | f (1 row) select 'spoint !<@ scircle', 't' as expected, spoint(2.0,2.0) !<@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- spoint !<@ scircle | t | t (1 row) -- sbox vs spoint select 'sbox @> spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> spoint(1.1,1.1) as actual; ?column? | expected | actual ----------------+----------+-------- sbox @> spoint | t | t (1 row) select 'sbox @> spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> spoint(2.0,2.0) as actual; ?column? | expected | actual ----------------+----------+-------- sbox @> spoint | f | f (1 row) select 'spoint <@ sbox', 't' as expected, spoint(1.1,1.1) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- spoint <@ sbox | t | t (1 row) select 'spoint <@ sbox', 'f' as expected, spoint(2.0,2.0) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- spoint <@ sbox | f | f (1 row) select 'sbox !@> spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> spoint(1.1,1.1) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !@> spoint | f | f (1 row) select 'sbox !@> spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> spoint(2.0,2.0) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !@> spoint | t | t (1 row) select 'spoint !<@ sbox', 'f' as expected, spoint(1.1,1.1) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- spoint !<@ sbox | f | f (1 row) select 'spoint !<@ sbox', 't' as expected, spoint(2.0,2.0) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- spoint !<@ sbox | t | t (1 row) -- spoly vs spoint select 'spoly @> spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> spoint(1.1,1.1) as actual; ?column? | expected | actual -----------------+----------+-------- spoly @> spoint | t | t (1 row) select 'spoly @> spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> spoint(2.0,2.0) as actual; ?column? | expected | actual -----------------+----------+-------- spoly @> spoint | f | f (1 row) select 'spoint <@ spoly', 't' as expected, spoint(1.1,1.1) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoint <@ spoly | t | t (1 row) select 'spoint <@ spoly', 'f' as expected, spoint(2.0,2.0) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoint <@ spoly | f | f (1 row) select 'spoly !@> spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> spoint(1.1,1.1) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !@> spoint | f | f (1 row) select 'spoly !@> spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> spoint(2.0,2.0) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !@> spoint | t | t (1 row) select 'spoint !<@ spoly', 'f' as expected, spoint(1.1,1.1) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- spoint !<@ spoly | f | f (1 row) select 'spoint !<@ spoly', 't' as expected, spoint(2.0,2.0) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- spoint !<@ spoly | t | t (1 row) -- scircle vs scircle select 'scircle @> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(1.0,1.0),0.05) as actual; ?column? | expected | actual --------------------+----------+-------- scircle @> scircle | t | t (1 row) select 'scircle @> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(2.0,2.0),0.05) as actual; ?column? | expected | actual --------------------+----------+-------- scircle @> scircle | f | f (1 row) select 'scircle @> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(1.0,1.0),0.2) as actual; ?column? | expected | actual --------------------+----------+-------- scircle @> scircle | f | f (1 row) select 'scircle <@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.05) <@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle <@ scircle | t | t (1 row) select 'scircle <@ scircle', 'f' as expected, scircle(spoint(2.0,2.0),0.05) <@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle <@ scircle | f | f (1 row) select 'scircle <@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.2) <@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle <@ scircle | f | f (1 row) select 'scircle !@> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(1.0,1.0),0.05) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !@> scircle | f | f (1 row) select 'scircle !@> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(2.0,2.0),0.05) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !@> scircle | t | t (1 row) select 'scircle !@> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(1.0,1.0),0.2) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !@> scircle | t | t (1 row) select 'scircle !<@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.05) !<@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !<@ scircle | f | f (1 row) select 'scircle !<@ scircle', 't' as expected, scircle(spoint(2.0,2.0),0.05) !<@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !<@ scircle | t | t (1 row) select 'scircle !<@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.2) !<@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual ---------------------+----------+-------- scircle !<@ scircle | t | t (1 row) -- sbox vs scircle select 'sbox @> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox @> scircle | t | t (1 row) select 'sbox @> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(2.0,2.0),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox @> scircle | f | f (1 row) select 'sbox @> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox @> scircle | f | f (1 row) select 'scircle <@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle <@ sbox | t | t (1 row) select 'scircle <@ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.01) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle <@ sbox | f | f (1 row) select 'scircle <@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle <@ sbox | f | f (1 row) select 'sbox !@> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !@> scircle | f | f (1 row) select 'sbox !@> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(2.0,2.0),0.01) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !@> scircle | t | t (1 row) select 'sbox !@> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !@> scircle | t | t (1 row) select 'scircle !<@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !<@ sbox | f | f (1 row) select 'scircle !<@ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.01) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !<@ sbox | t | t (1 row) select 'scircle !<@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !<@ sbox | t | t (1 row) -- select 'scircle @> sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle @> sbox | t | t (1 row) select 'scircle @> sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.2) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle @> sbox | f | f (1 row) select 'scircle @> sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle @> sbox | f | f (1 row) select 'sbox <@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox <@ scircle | t | t (1 row) select 'sbox <@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox <@ scircle | f | f (1 row) select 'sbox <@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox <@ scircle | f | f (1 row) select 'scircle !@> sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@> sbox | f | f (1 row) select 'scircle !@> sbox', 't' as expected, scircle(spoint(2.0,2.0),0.2) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@> sbox | t | t (1 row) select 'scircle !@> sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@> sbox | t | t (1 row) select 'sbox !<@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !<@ scircle | f | f (1 row) select 'sbox !<@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !<@ scircle | t | t (1 row) select 'sbox !<@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ------------------+----------+-------- sbox !<@ scircle | t | t (1 row) -- spoly vs scircle select 'spoly @> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ------------------+----------+-------- spoly @> scircle | t | t (1 row) select 'spoly @> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- spoly @> scircle | f | f (1 row) select 'spoly @> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- spoly @> scircle | f | f (1 row) select 'scircle <@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.01) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle <@ spoly | t | t (1 row) select 'scircle <@ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.01) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle <@ spoly | f | f (1 row) select 'scircle <@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.2) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle <@ spoly | f | f (1 row) select 'spoly !@> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !@> scircle | f | f (1 row) select 'spoly !@> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !@> scircle | t | t (1 row) select 'spoly !@> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !@> scircle | t | t (1 row) select 'scircle !<@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !<@ spoly | f | f (1 row) select 'scircle !<@ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.01) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !<@ spoly | t | t (1 row) select 'scircle !<@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.2) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !<@ spoly | t | t (1 row) -- select 'scircle @> spoly', 't' as expected, scircle(spoint(1.1,1.1),0.5) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle @> spoly | t | t (1 row) select 'scircle @> spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.5) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle @> spoly | f | f (1 row) select 'scircle @> spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.05) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle @> spoly | f | f (1 row) select 'spoly <@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(1.1,1.1),0.5) as actual; ?column? | expected | actual ------------------+----------+-------- spoly <@ scircle | t | t (1 row) select 'spoly <@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(2.0,2.0),0.5) as actual; ?column? | expected | actual ------------------+----------+-------- spoly <@ scircle | f | f (1 row) select 'spoly <@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(1.1,1.1),0.05) as actual; ?column? | expected | actual ------------------+----------+-------- spoly <@ scircle | f | f (1 row) select 'scircle !@> spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.5) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !@> spoly | f | f (1 row) select 'scircle !@> spoly', 't' as expected, scircle(spoint(2.0,2.0),0.5) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !@> spoly | t | t (1 row) select 'scircle !@> spoly', 't' as expected, scircle(spoint(1.1,1.1),0.05) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -------------------+----------+-------- scircle !@> spoly | t | t (1 row) select 'spoly !<@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(1.1,1.1),0.5) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !<@ scircle | f | f (1 row) select 'spoly !<@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(2.0,2.0),0.5) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !<@ scircle | t | t (1 row) select 'spoly !<@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(1.1,1.1),0.05) as actual; ?column? | expected | actual -------------------+----------+-------- spoly !<@ scircle | t | t (1 row) -- sbox vs spoly select 'sbox @> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox @> spoly | t | t (1 row) select 'sbox @> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox @> spoly | f | f (1 row) select 'sbox @> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox @> spoly | f | f (1 row) select 'spoly <@ sbox', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly <@ sbox | t | t (1 row) select 'spoly <@ sbox', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly <@ sbox | f | f (1 row) select 'spoly <@ sbox', 'f' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly <@ sbox | f | f (1 row) select 'sbox !@> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- sbox !@> spoly | f | f (1 row) select 'sbox !@> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- sbox !@> spoly | t | t (1 row) select 'sbox !@> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(0.9,0.9),(1.1,0.9),(1.1,1.1),(0.9,1.1)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- sbox !@> spoly | t | t (1 row) select 'spoly !<@ sbox', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ----------------+----------+-------- spoly !<@ sbox | f | f (1 row) select 'spoly !<@ sbox', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ----------------+----------+-------- spoly !<@ sbox | t | t (1 row) select 'spoly !<@ sbox', 't' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ----------------+----------+-------- spoly !<@ sbox | t | t (1 row) -- spoly vs spoly select 'spoly @> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly @> spoly | t | t (1 row) select 'spoly @> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly @> spoly | f | f (1 row) select 'spoly @> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly @> spoly | f | f (1 row) select 'spoly <@ spoly', 't' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly <@ spoly | t | t (1 row) select 'spoly <@ spoly', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly <@ spoly | f | f (1 row) select 'spoly <@ spoly', 'f' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly <@ spoly | f | f (1 row) select 'spoly !@> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !@> spoly | f | f (1 row) select 'spoly !@> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !@> spoly | t | t (1 row) select 'spoly !@> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !@> spoly | t | t (1 row) select 'spoly !<@ spoly', 'f' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !<@ spoly | f | f (1 row) select 'spoly !<@ spoly', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !<@ spoly | t | t (1 row) select 'spoly !<@ spoly', 't' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoly !<@ spoly | t | t (1 row) pgsphere/expected/contains_ops_compat.out000066400000000000000000000641721332443031700213010ustar00rootroot00000000000000-- scircle vs spoint select 'scircle ~ spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) ~ spoint(1.0,1.0) as actual; ?column? | expected | actual ------------------+----------+-------- scircle ~ spoint | t | t (1 row) select 'scircle ~ spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ spoint(2.0,2.0) as actual; ?column? | expected | actual ------------------+----------+-------- scircle ~ spoint | f | f (1 row) select 'spoint @ scircle', 't' as expected, spoint(1.0,1.0) @ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual ------------------+----------+-------- spoint @ scircle | t | t (1 row) select 'spoint @ scircle', 'f' as expected, spoint(2.0,2.0) @ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual ------------------+----------+-------- spoint @ scircle | f | f (1 row) select 'scircle !~ spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !~ spoint(1.0,1.0) as actual; ?column? | expected | actual -------------------+----------+-------- scircle !~ spoint | f | f (1 row) select 'scircle !~ spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ spoint(2.0,2.0) as actual; ?column? | expected | actual -------------------+----------+-------- scircle !~ spoint | t | t (1 row) select 'spoint !@ scircle', 'f' as expected, spoint(1.0,1.0) !@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- spoint !@ scircle | f | f (1 row) select 'spoint !@ scircle', 't' as expected, spoint(2.0,2.0) !@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- spoint !@ scircle | t | t (1 row) -- sbox vs spoint select 'sbox ~ spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ spoint(1.1,1.1) as actual; ?column? | expected | actual ---------------+----------+-------- sbox ~ spoint | t | t (1 row) select 'sbox ~ spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ spoint(2.0,2.0) as actual; ?column? | expected | actual ---------------+----------+-------- sbox ~ spoint | f | f (1 row) select 'spoint @ sbox', 't' as expected, spoint(1.1,1.1) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ---------------+----------+-------- spoint @ sbox | t | t (1 row) select 'spoint @ sbox', 'f' as expected, spoint(2.0,2.0) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ---------------+----------+-------- spoint @ sbox | f | f (1 row) select 'sbox !~ spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ spoint(1.1,1.1) as actual; ?column? | expected | actual ----------------+----------+-------- sbox !~ spoint | f | f (1 row) select 'sbox !~ spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ spoint(2.0,2.0) as actual; ?column? | expected | actual ----------------+----------+-------- sbox !~ spoint | t | t (1 row) select 'spoint !@ sbox', 'f' as expected, spoint(1.1,1.1) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- spoint !@ sbox | f | f (1 row) select 'spoint !@ sbox', 't' as expected, spoint(2.0,2.0) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- spoint !@ sbox | t | t (1 row) -- spoly vs spoint select 'spoly ~ spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ spoint(1.1,1.1) as actual; ?column? | expected | actual ----------------+----------+-------- spoly ~ spoint | t | t (1 row) select 'spoly ~ spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ spoint(2.0,2.0) as actual; ?column? | expected | actual ----------------+----------+-------- spoly ~ spoint | f | f (1 row) select 'spoint @ spoly', 't' as expected, spoint(1.1,1.1) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoint @ spoly | t | t (1 row) select 'spoint @ spoly', 'f' as expected, spoint(2.0,2.0) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoint @ spoly | f | f (1 row) select 'spoly !~ spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ spoint(1.1,1.1) as actual; ?column? | expected | actual -----------------+----------+-------- spoly !~ spoint | f | f (1 row) select 'spoly !~ spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ spoint(2.0,2.0) as actual; ?column? | expected | actual -----------------+----------+-------- spoly !~ spoint | t | t (1 row) select 'spoint !@ spoly', 'f' as expected, spoint(1.1,1.1) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoint !@ spoly | f | f (1 row) select 'spoint !@ spoly', 't' as expected, spoint(2.0,2.0) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- spoint !@ spoly | t | t (1 row) -- scircle vs scircle select 'scircle ~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(1.0,1.0),0.05) as actual; ?column? | expected | actual -------------------+----------+-------- scircle ~ scircle | t | t (1 row) select 'scircle ~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(2.0,2.0),0.05) as actual; ?column? | expected | actual -------------------+----------+-------- scircle ~ scircle | f | f (1 row) select 'scircle ~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(1.0,1.0),0.2) as actual; ?column? | expected | actual -------------------+----------+-------- scircle ~ scircle | f | f (1 row) select 'scircle @ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.05) @ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- scircle @ scircle | t | t (1 row) select 'scircle @ scircle', 'f' as expected, scircle(spoint(2.0,2.0),0.05) @ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- scircle @ scircle | f | f (1 row) select 'scircle @ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.2) @ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual -------------------+----------+-------- scircle @ scircle | f | f (1 row) select 'scircle !~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(1.0,1.0),0.05) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !~ scircle | f | f (1 row) select 'scircle !~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(2.0,2.0),0.05) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !~ scircle | t | t (1 row) select 'scircle !~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(1.0,1.0),0.2) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !~ scircle | t | t (1 row) select 'scircle !@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.05) !@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !@ scircle | f | f (1 row) select 'scircle !@ scircle', 't' as expected, scircle(spoint(2.0,2.0),0.05) !@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !@ scircle | t | t (1 row) select 'scircle !@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.2) !@ scircle(spoint(1.0,1.0),0.1) as actual; ?column? | expected | actual --------------------+----------+-------- scircle !@ scircle | t | t (1 row) -- sbox vs scircle select 'sbox ~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ----------------+----------+-------- sbox ~ scircle | t | t (1 row) select 'sbox ~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(2.0,2.0),0.01) as actual; ?column? | expected | actual ----------------+----------+-------- sbox ~ scircle | f | f (1 row) select 'sbox ~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ----------------+----------+-------- sbox ~ scircle | f | f (1 row) select 'scircle @ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle @ sbox | t | t (1 row) select 'scircle @ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.01) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle @ sbox | f | f (1 row) select 'scircle @ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle @ sbox | f | f (1 row) select 'sbox !~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !~ scircle | f | f (1 row) select 'sbox !~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(2.0,2.0),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !~ scircle | t | t (1 row) select 'sbox !~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !~ scircle | t | t (1 row) select 'scircle !@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !@ sbox | f | f (1 row) select 'scircle !@ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.01) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !@ sbox | t | t (1 row) select 'scircle !@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !@ sbox | t | t (1 row) -- select 'scircle ~ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle ~ sbox | t | t (1 row) select 'scircle ~ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.2) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle ~ sbox | f | f (1 row) select 'scircle ~ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual ----------------+----------+-------- scircle ~ sbox | f | f (1 row) select 'sbox @ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ----------------+----------+-------- sbox @ scircle | t | t (1 row) select 'sbox @ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual ----------------+----------+-------- sbox @ scircle | f | f (1 row) select 'sbox @ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ----------------+----------+-------- sbox @ scircle | f | f (1 row) select 'scircle !~ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !~ sbox | f | f (1 row) select 'scircle !~ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.2) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !~ sbox | t | t (1 row) select 'scircle !~ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; ?column? | expected | actual -----------------+----------+-------- scircle !~ sbox | t | t (1 row) select 'sbox !@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !@ scircle | f | f (1 row) select 'sbox !@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !@ scircle | t | t (1 row) select 'sbox !@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- sbox !@ scircle | t | t (1 row) -- spoly vs scircle select 'spoly ~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual -----------------+----------+-------- spoly ~ scircle | t | t (1 row) select 'spoly ~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- spoly ~ scircle | f | f (1 row) select 'spoly ~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual -----------------+----------+-------- spoly ~ scircle | f | f (1 row) select 'scircle @ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.01) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle @ spoly | t | t (1 row) select 'scircle @ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.01) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle @ spoly | f | f (1 row) select 'scircle @ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.2) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle @ spoly | f | f (1 row) select 'spoly !~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(1.1,1.1),0.01) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !~ scircle | f | f (1 row) select 'spoly !~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(2.0,2.0),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !~ scircle | t | t (1 row) select 'spoly !~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(1.1,1.1),0.2) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !~ scircle | t | t (1 row) select 'scircle !@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@ spoly | f | f (1 row) select 'scircle !@ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.01) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@ spoly | t | t (1 row) select 'scircle !@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.2) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !@ spoly | t | t (1 row) -- select 'scircle ~ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.5) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle ~ spoly | t | t (1 row) select 'scircle ~ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.5) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle ~ spoly | f | f (1 row) select 'scircle ~ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.05) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual -----------------+----------+-------- scircle ~ spoly | f | f (1 row) select 'spoly @ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(1.1,1.1),0.5) as actual; ?column? | expected | actual -----------------+----------+-------- spoly @ scircle | t | t (1 row) select 'spoly @ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(2.0,2.0),0.5) as actual; ?column? | expected | actual -----------------+----------+-------- spoly @ scircle | f | f (1 row) select 'spoly @ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(1.1,1.1),0.05) as actual; ?column? | expected | actual -----------------+----------+-------- spoly @ scircle | f | f (1 row) select 'scircle !~ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.5) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !~ spoly | f | f (1 row) select 'scircle !~ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.5) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !~ spoly | t | t (1 row) select 'scircle !~ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.05) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; ?column? | expected | actual ------------------+----------+-------- scircle !~ spoly | t | t (1 row) select 'spoly !@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(1.1,1.1),0.5) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !@ scircle | f | f (1 row) select 'spoly !@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(2.0,2.0),0.5) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !@ scircle | t | t (1 row) select 'spoly !@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(1.1,1.1),0.05) as actual; ?column? | expected | actual ------------------+----------+-------- spoly !@ scircle | t | t (1 row) -- sbox vs spoly select 'sbox ~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual --------------+----------+-------- sbox ~ spoly | t | t (1 row) select 'sbox ~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual --------------+----------+-------- sbox ~ spoly | f | f (1 row) select 'sbox ~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly as actual; ?column? | expected | actual --------------+----------+-------- sbox ~ spoly | f | f (1 row) select 'spoly @ sbox', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual --------------+----------+-------- spoly @ sbox | t | t (1 row) select 'spoly @ sbox', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual --------------+----------+-------- spoly @ sbox | f | f (1 row) select 'spoly @ sbox', 'f' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual --------------+----------+-------- spoly @ sbox | f | f (1 row) select 'sbox !~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox !~ spoly | f | f (1 row) select 'sbox !~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox !~ spoly | t | t (1 row) select 'sbox !~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(0.9,0.9),(1.1,0.9),(1.1,1.1),(0.9,1.1)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- sbox !~ spoly | t | t (1 row) select 'spoly !@ sbox', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly !@ sbox | f | f (1 row) select 'spoly !@ sbox', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly !@ sbox | t | t (1 row) select 'spoly !@ sbox', 't' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; ?column? | expected | actual ---------------+----------+-------- spoly !@ sbox | t | t (1 row) -- spoly vs spoly select 'spoly ~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly ~ spoly | t | t (1 row) select 'spoly ~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly ~ spoly | f | f (1 row) select 'spoly ~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly ~ spoly | f | f (1 row) select 'spoly @ spoly', 't' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly @ spoly | t | t (1 row) select 'spoly @ spoly', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly @ spoly | f | f (1 row) select 'spoly @ spoly', 'f' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ---------------+----------+-------- spoly @ spoly | f | f (1 row) select 'spoly !~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !~ spoly | f | f (1 row) select 'spoly !~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !~ spoly | t | t (1 row) select 'spoly !~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !~ spoly | t | t (1 row) select 'spoly !@ spoly', 'f' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !@ spoly | f | f (1 row) select 'spoly !@ spoly', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !@ spoly | t | t (1 row) select 'spoly !@ spoly', 't' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; ?column? | expected | actual ----------------+----------+-------- spoly !@ spoly | t | t (1 row) pgsphere/expected/ellipse.out000066400000000000000000000627151332443031700166750ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- ellipse tests --equal operator SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(170d,-12d),0d>' = sellipse '<{5d,5d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(170d,-12d),0d>' = sellipse '<{5d,2d},(170d,-12d),-2d>'; ?column? ---------- f (1 row) -- not equal SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' = sellipse '<{10d,5d},(300d,0d), 180d>' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' = sellipse '<{10d,5d},(300d,0d), 270d>' ; ?column? ---------- t (1 row) -- ellipse and point SELECT spoint '(280d,-20d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoint '(280d,-10d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoint '(280d,-9.9d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d,-10d)' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d, -9d)' ; ?column? ---------- f (1 row) SELECT spoint '(280d,-10d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoint '(280d,-9.9d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d,-10d)' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d, -9d)' ; ?column? ---------- t (1 row) SELECT spoint '(0d, 90d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(0d, -90d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(0d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- t (1 row) SELECT spoint '(90d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(180d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(270d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(9d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- t (1 row) SELECT spoint '(0d, 9d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- f (1 row) SELECT spoint '(0d, 4d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; ?column? ---------- t (1 row) -- --ellipse and circle (@,&&) -- -- negators and commutators SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d, -9d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d, -9d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d,-10d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d, -9d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d,-10d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d, -9d),0d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d, 0d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d, 0d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d,-10d),2d>' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d, 0d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d,-10d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d, 0d),2d>' ; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),0d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) -- ellipse is circle SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-10d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-16d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) -- ellipse is line SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; ?column? ---------- t (1 row) -- --ellipse and line (@,&&) -- -- negators and commutators SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) -- line is point , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is point , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is point , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is line SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- -- ellipse and ellipse -- -- check @ SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},(300d,0d),180d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d),270d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) -- negators , commutator @,&& SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- t (1 row) -- left ellipse is point right ellipse is point SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is point SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is point SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is real ellipse right ellipse is point SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is point right ellipse is line SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is line SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is line SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is point right ellipse is circle SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is circle SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is circle SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) pgsphere/expected/euler.out000066400000000000000000000004701332443031700163420ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- checking Euler transformation operators SELECT strans '-10d,0d,10d,ZZZ' = '-10d,0d,10d,XXX' ; ?column? ---------- t (1 row) SELECT strans '-40d,0d,40d,ZZZ' <> '-40d,0d,40d,XXX' ; ?column? ---------- f (1 row) pgsphere/expected/gnomo.out000066400000000000000000000672401332443031700163550ustar00rootroot00000000000000SET extra_float_digits TO -3; SELECT set_sphere_output_precision(12); set_sphere_output_precision ----------------------------- SET 12 (1 row) select gnomonic_proj(spoint '(0.95, -0.455)', spoint '(1, -0.45)'); gnomonic_proj -------------------------------------- (-0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(0.95, -0.45)', spoint '(1, -0.45)'); gnomonic_proj --------------------------------------- (-0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(0.95, -0.445)', spoint '(1, -0.45)'); gnomonic_proj ------------------------------------- (-0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(1, -0.455)', spoint '(1, -0.45)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(1, -0.45)', spoint '(1, -0.45)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(1, -0.445)', spoint '(1, -0.45)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(1.05, -0.455)', spoint '(1, -0.45)'); gnomonic_proj ------------------------------------- (0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(1.05, -0.45)', spoint '(1, -0.45)'); gnomonic_proj -------------------------------------- (0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(1.05, -0.445)', spoint '(1, -0.45)'); gnomonic_proj ------------------------------------ (0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(0.95, 0.045)', spoint '(1, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(0.95, 0.05)', spoint '(1, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(0.95, 0.055)', spoint '(1, 0.05)'); gnomonic_proj ------------------------------------- (-0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(1, 0.045)', spoint '(1, 0.05)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(1, 0.05)', spoint '(1, 0.05)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(1, 0.055)', spoint '(1, 0.05)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(1.05, 0.045)', spoint '(1, 0.05)'); gnomonic_proj ------------------------------------- (0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(1.05, 0.05)', spoint '(1, 0.05)'); gnomonic_proj ------------------------------------- (0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(1.05, 0.055)', spoint '(1, 0.05)'); gnomonic_proj ------------------------------------ (0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(0.95, 0.545)', spoint '(1, 0.55)'); gnomonic_proj -------------------------------------- (-0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(0.95, 0.55)', spoint '(1, 0.55)'); gnomonic_proj -------------------------------------- (-0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(0.95, 0.555)', spoint '(1, 0.55)'); gnomonic_proj ------------------------------------- (-0.0425163485073,0.00556025800979) (1 row) select gnomonic_proj(spoint '(1, 0.545)', spoint '(1, 0.55)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(1, 0.55)', spoint '(1, 0.55)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(1, 0.555)', spoint '(1, 0.55)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(1.05, 0.545)', spoint '(1, 0.55)'); gnomonic_proj ------------------------------------- (0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(1.05, 0.55)', spoint '(1, 0.55)'); gnomonic_proj ------------------------------------- (0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(1.05, 0.555)', spoint '(1, 0.55)'); gnomonic_proj ------------------------------------ (0.0425163485073,0.00556025800979) (1 row) select gnomonic_proj(spoint '(2.95, -0.455)', spoint '(3, -0.45)'); gnomonic_proj -------------------------------------- (-0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(2.95, -0.45)', spoint '(3, -0.45)'); gnomonic_proj --------------------------------------- (-0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(2.95, -0.445)', spoint '(3, -0.45)'); gnomonic_proj ------------------------------------- (-0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(3, -0.455)', spoint '(3, -0.45)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(3, -0.45)', spoint '(3, -0.45)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(3, -0.445)', spoint '(3, -0.45)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(3.05, -0.455)', spoint '(3, -0.45)'); gnomonic_proj ------------------------------------- (0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(3.05, -0.45)', spoint '(3, -0.45)'); gnomonic_proj -------------------------------------- (0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(3.05, -0.445)', spoint '(3, -0.45)'); gnomonic_proj ------------------------------------ (0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(2.95, 0.045)', spoint '(3, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(2.95, 0.05)', spoint '(3, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(2.95, 0.055)', spoint '(3, 0.05)'); gnomonic_proj ------------------------------------- (-0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(3, 0.045)', spoint '(3, 0.05)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(3, 0.05)', spoint '(3, 0.05)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(3, 0.055)', spoint '(3, 0.05)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(3.05, 0.045)', spoint '(3, 0.05)'); gnomonic_proj ------------------------------------- (0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(3.05, 0.05)', spoint '(3, 0.05)'); gnomonic_proj ------------------------------------- (0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(3.05, 0.055)', spoint '(3, 0.05)'); gnomonic_proj ------------------------------------ (0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(2.95, 0.545)', spoint '(3, 0.55)'); gnomonic_proj -------------------------------------- (-0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(2.95, 0.55)', spoint '(3, 0.55)'); gnomonic_proj -------------------------------------- (-0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(2.95, 0.555)', spoint '(3, 0.55)'); gnomonic_proj ------------------------------------- (-0.0425163485073,0.00556025800979) (1 row) select gnomonic_proj(spoint '(3, 0.545)', spoint '(3, 0.55)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(3, 0.55)', spoint '(3, 0.55)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(3, 0.555)', spoint '(3, 0.55)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(3.05, 0.545)', spoint '(3, 0.55)'); gnomonic_proj ------------------------------------- (0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(3.05, 0.55)', spoint '(3, 0.55)'); gnomonic_proj ------------------------------------- (0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(3.05, 0.555)', spoint '(3, 0.55)'); gnomonic_proj ------------------------------------ (0.0425163485073,0.00556025800979) (1 row) select gnomonic_proj(spoint '(4.95, -0.455)', spoint '(5, -0.45)'); gnomonic_proj -------------------------------------- (-0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(4.95, -0.45)', spoint '(5, -0.45)'); gnomonic_proj --------------------------------------- (-0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(4.95, -0.445)', spoint '(5, -0.45)'); gnomonic_proj ------------------------------------- (-0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(5, -0.455)', spoint '(5, -0.45)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(5, -0.45)', spoint '(5, -0.45)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(5, -0.445)', spoint '(5, -0.45)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(5.05, -0.455)', spoint '(5, -0.45)'); gnomonic_proj ------------------------------------- (0.0449403289896,-0.00549389025232) (1 row) select gnomonic_proj(spoint '(5.05, -0.45)', spoint '(5, -0.45)'); gnomonic_proj -------------------------------------- (0.0450492463284,-0.000489973819396) (1 row) select gnomonic_proj(spoint '(5.05, -0.445)', spoint '(5, -0.45)'); gnomonic_proj ------------------------------------ (0.0451581642008,0.00451396713168) (1 row) select gnomonic_proj(spoint '(4.95, 0.045)', spoint '(5, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(4.95, 0.05)', spoint '(5, 0.05)'); gnomonic_proj -------------------------------------- (-0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(4.95, 0.055)', spoint '(5, 0.05)'); gnomonic_proj ------------------------------------- (-0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(5, 0.045)', spoint '(5, 0.05)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(5, 0.05)', spoint '(5, 0.05)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(5, 0.055)', spoint '(5, 0.05)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(5.05, 0.045)', spoint '(5, 0.05)'); gnomonic_proj ------------------------------------- (0.0499915339465,-0.00494380775197) (1 row) select gnomonic_proj(spoint '(5.05, 0.05)', spoint '(5, 0.05)'); gnomonic_proj ------------------------------------- (0.0499790130537,6.24607520336e-05) (1 row) select gnomonic_proj(spoint '(5.05, 0.055)', spoint '(5, 0.05)'); gnomonic_proj ------------------------------------ (0.0499664921686,0.00506872612906) (1 row) select gnomonic_proj(spoint '(4.95, 0.545)', spoint '(5, 0.55)'); gnomonic_proj -------------------------------------- (-0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(4.95, 0.55)', spoint '(5, 0.55)'); gnomonic_proj -------------------------------------- (-0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(4.95, 0.555)', spoint '(5, 0.55)'); gnomonic_proj ------------------------------------- (-0.0425163485073,0.00556025800979) (1 row) select gnomonic_proj(spoint '(5, 0.545)', spoint '(5, 0.55)'); gnomonic_proj ----------------------- (0,-0.00500004166708) (1 row) select gnomonic_proj(spoint '(5, 0.55)', spoint '(5, 0.55)'); gnomonic_proj --------------- (0,0) (1 row) select gnomonic_proj(spoint '(5, 0.555)', spoint '(5, 0.55)'); gnomonic_proj ---------------------- (0,0.00500004166708) (1 row) select gnomonic_proj(spoint '(5.05, 0.545)', spoint '(5, 0.55)'); gnomonic_proj ------------------------------------- (0.0427780606339,-0.00444549618887) (1 row) select gnomonic_proj(spoint '(5.05, 0.55)', spoint '(5, 0.55)'); gnomonic_proj ------------------------------------- (0.0426472042059,0.000557394853467) (1 row) select gnomonic_proj(spoint '(5.05, 0.555)', spoint '(5, 0.55)'); gnomonic_proj ------------------------------------ (0.0425163485073,0.00556025800979) (1 row) select gnomonic_inv(point '(0.95, -0.455)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.93404045604 , -0.620644470397) (1 row) select gnomonic_inv(point '(0.95, -0.45)', spoint '(1, -0.45)'); gnomonic_inv --------------------------------- (1.93256213345 , -0.6176011915) (1 row) select gnomonic_inv(point '(0.95, -0.445)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.93108704609 , -0.614550369264) (1 row) select gnomonic_inv(point '(1, -0.455)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.95836918132 , -0.604764854006) (1 row) select gnomonic_inv(point '(1, -0.45)', spoint '(1, -0.45)'); gnomonic_inv --------------------------------- (1.956914533 , -0.601789767222) (1 row) select gnomonic_inv(point '(1, -0.445)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.95546286092 , -0.598807609319) (1 row) select gnomonic_inv(point '(1.05, -0.455)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.98112232487 , -0.589335241812) (1 row) select gnomonic_inv(point '(1.05, -0.45)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.97969293971 , -0.586426792177) (1 row) select gnomonic_inv(point '(1.05, -0.445)', spoint '(1, -0.45)'); gnomonic_inv ----------------------------------- (1.97826629181 , -0.583511718073) (1 row) select gnomonic_inv(point '(0.95, 0.045)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.76151307432 , 0.0688368263878) (1 row) select gnomonic_inv(point '(0.95, 0.05)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.76163833436 , 0.0724553691159) (1 row) select gnomonic_inv(point '(0.95, 0.055)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.76176362732 , 0.0760729610951) (1 row) select gnomonic_inv(point '(1, 0.045)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.78715062848 , 0.0671371183392) (1 row) select gnomonic_inv(point '(1, 0.05)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.78727603001 , 0.0706664479787) (1 row) select gnomonic_inv(point '(1, 0.055)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.78740146287 , 0.0741948953969) (1 row) select gnomonic_inv(point '(1.05, 0.045)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.81153380434 , 0.0654793685341) (1 row) select gnomonic_inv(point '(1.05, 0.05)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.81165903459 , 0.0689216776286) (1 row) select gnomonic_inv(point '(1.05, 0.055)', spoint '(1, 0.05)'); gnomonic_inv ----------------------------------- (1.81178429461 , 0.0723631680984) (1 row) select gnomonic_inv(point '(0.95, 0.545)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.03218995407 , 0.728455908477) (1 row) select gnomonic_inv(point '(0.95, 0.55)', spoint '(1, 0.55)'); gnomonic_inv --------------------------------- (2.03421959002 , 0.73119792829) (1 row) select gnomonic_inv(point '(0.95, 0.555)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.03625413817 , 0.733931067146) (1 row) select gnomonic_inv(point '(1, 0.545)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.05449576075 , 0.709476159185) (1 row) select gnomonic_inv(point '(1, 0.55)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.05647450328 , 0.712160401141) (1 row) select gnomonic_inv(point '(1, 0.555)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.05845768052 , 0.714836300149) (1 row) select gnomonic_inv(point '(1.05, 0.545)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.07517654321 , 0.691081532871) (1 row) select gnomonic_inv(point '(1.05, 0.55)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.07710459256 , 0.693709435824) (1 row) select gnomonic_inv(point '(1.05, 0.555)', spoint '(1, 0.55)'); gnomonic_inv ---------------------------------- (2.07903665116 , 0.696329506692) (1 row) select gnomonic_inv(point '(2.95, -0.455)', spoint '(3, -0.45)'); gnomonic_inv ---------------------------------- (4.33700283527 , -0.27165319266) (1 row) select gnomonic_inv(point '(2.95, -0.45)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.33630528922 , -0.270232089821) (1 row) select gnomonic_inv(point '(2.95, -0.445)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.33560797557 , -0.268810216042) (1 row) select gnomonic_inv(point '(3, -0.455)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.34076229378 , -0.267566262208) (1 row) select gnomonic_inv(point '(3, -0.45)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.34007515086 , -0.266165779414) (1 row) select gnomonic_inv(point '(3, -0.445)', spoint '(3, -0.45)'); gnomonic_inv ---------------------------------- (4.3393882297 , -0.264764558966) (1 row) select gnomonic_inv(point '(3.05, -0.455)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.34440480094 , -0.263594269354) (1 row) select gnomonic_inv(point '(3.05, -0.45)', spoint '(3, -0.45)'); gnomonic_inv ----------------------------------- (4.34372777472 , -0.262213858104) (1 row) select gnomonic_inv(point '(3.05, -0.445)', spoint '(3, -0.45)'); gnomonic_inv ---------------------------------- (4.34305096026 , -0.26083274066) (1 row) select gnomonic_inv(point '(2.95, 0.045)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.24503385176 , 0.0304755271062) (1 row) select gnomonic_inv(point '(2.95, 0.05)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.24510988812 , 0.0320785494309) (1 row) select gnomonic_inv(point '(2.95, 0.055)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.24518592839 , 0.0336814889852) (1 row) select gnomonic_inv(point '(3, 0.045)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25009578006 , 0.0300187358568) (1 row) select gnomonic_inv(point '(3, 0.05)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25017080308 , 0.0315977381062) (1 row) select gnomonic_inv(point '(3, 0.055)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25024582985 , 0.0331766612496) (1 row) select gnomonic_inv(point '(3.05, 0.045)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25500799412 , 0.0295747078489) (1 row) select gnomonic_inv(point '(3.05, 0.05)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25508202643 , 0.0311303608536) (1 row) select gnomonic_inv(point '(3.05, 0.055)', spoint '(3, 0.05)'); gnomonic_inv ----------------------------------- (4.25515606233 , 0.0326859382093) (1 row) select gnomonic_inv(point '(2.95, 0.545)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38069288002 , 0.317532355075) (1 row) select gnomonic_inv(point '(2.95, 0.55)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38154729845 , 0.318861246744) (1 row) select gnomonic_inv(point '(2.95, 0.555)', spoint '(3, 0.55)'); gnomonic_inv --------------------------------- (4.38240199663 , 0.32018919076) (1 row) select gnomonic_inv(point '(3, 0.545)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38378731662 , 0.312753597658) (1 row) select gnomonic_inv(point '(3, 0.55)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38462848315 , 0.314063671577) (1 row) select gnomonic_inv(point '(3, 0.555)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38546991631 , 0.315372838396) (1 row) select gnomonic_inv(point '(3.05, 0.545)', spoint '(3, 0.55)'); gnomonic_inv --------------------------------- (4.38678374836 , 0.30810938986) (1 row) select gnomonic_inv(point '(3.05, 0.55)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38761205219 , 0.309401127485) (1 row) select gnomonic_inv(point '(3.05, 0.555)', spoint '(3, 0.55)'); gnomonic_inv ---------------------------------- (4.38844061031 , 0.310691996365) (1 row) select gnomonic_inv(point '(4.95, -0.455)', spoint '(5, -0.45)'); gnomonic_inv ---------------------------------- (6.42981110208 , -0.16736666225) (1 row) select gnomonic_inv(point '(4.95, -0.45)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.42938044467 , -0.166481000773) (1 row) select gnomonic_inv(point '(4.95, -0.445)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.42894984006 , -0.165595153928) (1 row) select gnomonic_inv(point '(5, -0.455)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43120262006 , -0.165755596923) (1 row) select gnomonic_inv(point '(5, -0.45)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43077610111 , -0.164878340453) (1 row) select gnomonic_inv(point '(5, -0.445)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43034963344 , -0.164000903857) (1 row) select gnomonic_inv(point '(5.05, -0.455)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43256711154 , -0.164174672255) (1 row) select gnomonic_inv(point '(5.05, -0.45)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43214465391 , -0.163305666876) (1 row) select gnomonic_inv(point '(5.05, -0.445)', spoint '(5, -0.45)'); gnomonic_inv ----------------------------------- (6.43172224608 , -0.162436486422) (1 row) select gnomonic_inv(point '(4.95, 0.045)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37213822757 , 0.0187969806712) (1 row) select gnomonic_inv(point '(4.95, 0.05)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37218674577 , 0.0197858028573) (1 row) select gnomonic_inv(point '(4.95, 0.055)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37223526492 , 0.0207746056121) (1 row) select gnomonic_inv(point '(5, 0.045)', spoint '(5, 0.05)'); gnomonic_inv ---------------------------------- (6.37407370398 , 0.018616268731) (1 row) select gnomonic_inv(point '(5, 0.05)', spoint '(5, 0.05)'); gnomonic_inv ---------------------------------- (6.37412177425 , 0.019595585605) (1 row) select gnomonic_inv(point '(5, 0.055)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37416984544 , 0.0205748836027) (1 row) select gnomonic_inv(point '(5.05, 0.045)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37597230446 , 0.0184389309028) (1 row) select gnomonic_inv(point '(5.05, 0.05)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37601993463 , 0.0194089199093) (1 row) select gnomonic_inv(point '(5.05, 0.055)', spoint '(5, 0.05)'); gnomonic_inv ----------------------------------- (6.37606756569 , 0.0203788905738) (1 row) select gnomonic_inv(point '(4.95, 0.545)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45661633464 , 0.195624197626) (1 row) select gnomonic_inv(point '(4.95, 0.55)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45713747936 , 0.196458682014) (1 row) select gnomonic_inv(point '(4.95, 0.555)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45765868608 , 0.197292936568) (1 row) select gnomonic_inv(point '(5, 0.545)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45774838305 , 0.193741168464) (1 row) select gnomonic_inv(point '(5, 0.55)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45826444902 , 0.194567808878) (1 row) select gnomonic_inv(point '(5, 0.555)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45878057519 , 0.195394225934) (1 row) select gnomonic_inv(point '(5.05, 0.545)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45885829716 , 0.191893369946) (1 row) select gnomonic_inv(point '(5.05, 0.55)', spoint '(5, 0.55)'); gnomonic_inv --------------------------------- (6.45936938113 , 0.19271230794) (1 row) select gnomonic_inv(point '(5.05, 0.555)', spoint '(5, 0.55)'); gnomonic_inv ---------------------------------- (6.45988052356 , 0.193531028815) (1 row) pgsphere/expected/index.out000066400000000000000000000036251332443031700163420ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- without idx SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>'; count ------- 32 (1 row) SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; count ------- 4 (1 row) SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>'; count ------- 12 (1 row) SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>'; count ------- 48 (1 row) SELECT count(*) FROM spheretmp3 WHERE b && scircle '<(1,1),0.3>'; count ------- 28 (1 row) SELECT count(*) FROM spheretmp3 WHERE spoint '(3.09 , 1.25)' @ b ; count ------- 1 (1 row) SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>'; count ------- 8 (1 row) SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>'; count ------- 40 (1 row) -- create idx CREATE INDEX aaaidx ON spheretmp1 USING gist ( p ); CREATE INDEX bbbidx ON spheretmp2 USING gist ( c ); CREATE INDEX cccidx ON spheretmp3 USING gist ( b ); CREATE INDEX dddidx ON spheretmp4 USING gist ( l ); --with idx SET enable_seqscan = OFF ; SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>' ; count ------- 32 (1 row) SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; count ------- 4 (1 row) SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>' ; count ------- 12 (1 row) SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>' ; count ------- 48 (1 row) SELECT count(*) FROM spheretmp3 WHERE b && scircle '<(1,1),0.3>'; count ------- 28 (1 row) SELECT count(*) FROM spheretmp3 WHERE spoint '(3.09 , 1.25)' @ b ; count ------- 1 (1 row) SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>' ; count ------- 8 (1 row) SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>' ; count ------- 40 (1 row) pgsphere/expected/init.out000066400000000000000000000002321332443031700161650ustar00rootroot00000000000000-- -- first, define the datatype. Turn off echoing so that expected file -- does not depend on contents of pg_sphere.sql. -- CREATE EXTENSION pg_sphere; pgsphere/expected/init_extended.out000066400000000000000000000013671332443031700200570ustar00rootroot00000000000000-- indexed operations..... -- spoint_data and scircle_data tables have to be created and indexed using \! testsuite/gen_point.pl 1 > results/gen_point_1.sql \i results/gen_point_1.sql CREATE TABLE spoint_data (sp spoint); COPY spoint_data (sp) FROM stdin; CREATE INDEX sp_idx ON spoint_data USING gist (sp); -- and \! testsuite/gen_circle.pl 1 0.1 > results/gen_circle_1_0.1.sql \i results/gen_circle_1_0.1.sql CREATE TABLE scircle_data (sc scircle); COPY scircle_data (sc) FROM stdin; CREATE INDEX sc_idx ON scircle_data USING gist (sc); -- \! testsuite/gen_poly.pl 1 0.1 4 > results/gen_poly_1_0.1_4.sql \i results/gen_poly_1_0.1_4.sql CREATE TABLE spoly_data (sp spoly); COPY spoly_data (sp) FROM stdin; CREATE INDEX spl_idx ON spoly_data USING gist (sp); pgsphere/expected/line.out000066400000000000000000000061731332443031700161630ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- checking spherical line operators SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) = sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) <> sline ( spoint '(0, -89d)', spoint '(0, 90d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(5d, 5d)', spoint '(5d, -5d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 5d)', spoint '(10d, -5d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(15d, 5d)', spoint '(15d, -5d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 0d)', spoint '(10d, -5d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(5d, -5d)', spoint '(5d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, -5d)', spoint '(10d, 5d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(15d, -5d)', spoint '(15d, 5d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 0d)', spoint '(10d, 5d)' ) ; ?column? ---------- f (1 row) -- check small lines SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000005d, 0.0000005d)', spoint '(0.0000005d, -0.0000005d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0.0000005d)', spoint '(0.000001d, -0.0000005d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000015d, 0.0000005d)', spoint '(0.0000015d, -0.0000005d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0d)', spoint '(0.000001d, -0.0000005d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000005d, -0.0000005d)', spoint '(0.0000005d, 0.0000005d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, -0.0000005d)', spoint '(0.000001d, 0.0000005d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000015d, -0.0000005d)', spoint '(0.0000015d, 0.0000005d)' ) ; ?column? ---------- f (1 row) SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0d)', spoint '(0.000001d, 0.0000005d)' ) ; ?column? ---------- f (1 row) pgsphere/expected/path.out000066400000000000000000000177561332443031700162010ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- -- ellipse and path -- -- negators , commutator @,&& SELECT spath '{(280d, -9d),(280d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- f (1 row) -- path is a line , ellipse is point SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is circle SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is path SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is a real ellipse SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- create path as aggregate SELECT spath(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; spath --------------------------- {(0 , 1),(1 , 1),(1 , 0)} (1 row) -- -- checking path other operators -- \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path1 'spath \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path2 'spath \'{(0,0),(1,0),(2,0),(3,0)}\'' \set path3 'spath \'{(0,0),(0,1),(0,1.5)}\'' SELECT @-@ spath '{(0,0),(1,0),(2,0),(3,0)}'; ?column? ---------- 3 (1 row) SELECT :path1 = :path2; ?column? ---------- f (1 row) SELECT :path1 = :path1; ?column? ---------- t (1 row) SELECT :path1 <> :path2; ?column? ---------- t (1 row) SELECT :path1 <> :path1; ?column? ---------- f (1 row) SELECT :poly && :path1; ?column? ---------- t (1 row) SELECT :path1 && :poly ; ?column? ---------- t (1 row) SELECT :path1 @ :poly ; ?column? ---------- t (1 row) SELECT :path2 @ :poly ; ?column? ---------- f (1 row) SELECT :path1 && :path1; ?column? ---------- t (1 row) SELECT :path1 && :path1; ?column? ---------- t (1 row) SELECT :poly && :path2; ?column? ---------- t (1 row) SELECT :path2 && :poly ; ?column? ---------- t (1 row) SELECT :path2 && :path1; ?column? ---------- t (1 row) SELECT :poly && :path3; ?column? ---------- f (1 row) SELECT :path3 && :poly ; ?column? ---------- f (1 row) SELECT :path3 && :path1; ?column? ---------- f (1 row) SELECT :path3 && :path2; ?column? ---------- t (1 row) SELECT :path1 @ scircle '<(0,1),1>'; ?column? ---------- f (1 row) SELECT :path3 @ scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 @ scircle '<(0,1),0.7>'; ?column? ---------- f (1 row) SELECT :path1 && scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,1),0.7>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,-1),0.7>'; ?column? ---------- f (1 row) SELECT :path3 @ scircle '<(0,-1),0.7>'; ?column? ---------- f (1 row) SELECT :path3 && sline ( spoint '(0,-1)', spoint '(0,1)' ); ?column? ---------- t (1 row) SELECT :path3 && sline ( spoint '(-1,0)', spoint '(1,0)' ); ?column? ---------- t (1 row) SELECT :path3 && sline ( spoint '(-1,0)', spoint '(-0.3,0)' ); ?column? ---------- f (1 row) SELECT spath '{(0.11,0.15),(0.12,0.15),(0.13,0.15)}' @ :poly; ?column? ---------- t (1 row) -- create path SELECT spath(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; spath --------------------------- {(0 , 1),(1 , 1),(1 , 0)} (1 row) SELECT set_sphere_output( 'DEG' ); set_sphere_output ------------------- SET DEG (1 row) -- test stored data SELECT spoint(p,2) FROM spheretmp6 WHERE id=2; spoint ------------ (1d , -5d) (1 row) pgsphere/expected/pg_sphere.out000066400000000000000000001424621332443031700172120ustar00rootroot00000000000000-- -- first, define the datatype. Turn off echoing so that expected file -- does not depend on contents of pg_sphere.sql. -- \set ECHO none psql:pgs_types.sql:23: NOTICE: TypeCreate: changing argument type of function spoint_out from OPAQUE to spoint psql:pgs_types.sql:23: NOTICE: TypeCreate: changing return type of function spoint_in from OPAQUE to spoint psql:pgs_types.sql:46: NOTICE: TypeCreate: changing argument type of function scircle_out from OPAQUE to scircle psql:pgs_types.sql:46: NOTICE: TypeCreate: changing return type of function scircle_in from OPAQUE to scircle psql:pgs_types.sql:69: NOTICE: TypeCreate: changing argument type of function sellipse_out from OPAQUE to sellipse psql:pgs_types.sql:69: NOTICE: TypeCreate: changing return type of function sellipse_in from OPAQUE to sellipse psql:pgs_types.sql:93: NOTICE: TypeCreate: changing argument type of function sline_out from OPAQUE to sline psql:pgs_types.sql:93: NOTICE: TypeCreate: changing return type of function sline_in from OPAQUE to sline psql:pgs_types.sql:118: NOTICE: TypeCreate: changing argument type of function spath_out from OPAQUE to spath psql:pgs_types.sql:118: NOTICE: TypeCreate: changing return type of function spath_in from OPAQUE to spath psql:pgs_types.sql:142: NOTICE: TypeCreate: changing argument type of function spoly_out from OPAQUE to spoly psql:pgs_types.sql:142: NOTICE: TypeCreate: changing return type of function spoly_in from OPAQUE to spoly psql:pgs_types.sql:166: NOTICE: TypeCreate: changing argument type of function strans_out from OPAQUE to strans psql:pgs_types.sql:166: NOTICE: TypeCreate: changing return type of function strans_in from OPAQUE to strans psql:pgs_gist.sql:22: NOTICE: TypeCreate: changing argument type of function spherekey_out from OPAQUE to spherekey psql:pgs_gist.sql:22: NOTICE: TypeCreate: changing return type of function spherekey_in from OPAQUE to spherekey -- check spherical point operators SELECT spoint '(0, 90d)' = spoint '(0, 90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' = spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0,-90d)' = spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' != spoint '(0, 90d)'; ?column? ---------- f (1 row) SELECT spoint '(0, 90d)' != spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0,-90d)' != spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0d, 0)' = spoint '(360d,0)'; ?column? ---------- t (1 row) -- checking spherical circle operators SELECT scircle '<(0, 90d),1>' = '<(0, 90d),1>' ; ?column? ---------- t (1 row) SELECT scircle '<(0,-90d),1>' <> '<(0, 90d),1>' ; ?column? ---------- t (1 row) -- checking spherical line operators SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) = sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) ; ?column? ---------- t (1 row) SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) <> sline ( spoint '(0, -89d)', spoint '(0, 90d)' ) ; ?column? ---------- t (1 row) -- checking Euler transformation operators SELECT strans '-10d,0d,10d,ZZZ' = '-10d,0d,10d,XXX' ; ?column? ---------- t (1 row) SELECT strans '-40d,0d,40d,ZZZ' <> '-40d,0d,40d,XXX' ; ?column? ---------- f (1 row) -- checking polygon operators \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon ?column? ---------- t (1 row) SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon ?column? ---------- t (1 row) SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon ?column? ---------- t (1 row) SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon ?column? ---------- f (1 row) SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.05>' @ :poly; -- circle overlaps polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.10>' @ :poly; -- circle overlaps polygon ?column? ---------- f (1 row) SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.05>' && :poly; -- circle overlaps polygon ?column? ---------- t (1 row) SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) && :poly; -- line inside polygon ?column? ---------- t (1 row) \unset poly \set poly1 'spoly \'{(0,0),(1,0),(0,1)}\'' \set poly2 'spoly \'{(1,0),(0,0),(0,1)}\'' \set poly3 'spoly \'{(0,1),(0,0),(1,0)}\'' \set poly4 'spoly \'{(0.1,0.9),(0.1,0.1),(0.9,0.1)}\'' \set poly5 'spoly \'{(0.2,0.0),(1.2,0.0),(0.2,1)}\'' SELECT :poly1 = :poly2; ?column? ---------- f (1 row) SELECT :poly2 = :poly3; ?column? ---------- f (1 row) SELECT :poly3 = :poly1; ?column? ---------- t (1 row) SELECT :poly1 && :poly2; ?column? ---------- t (1 row) SELECT :poly2 && :poly3; ?column? ---------- t (1 row) SELECT :poly3 && :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly2; ?column? ---------- t (1 row) SELECT :poly2 @ :poly3; ?column? ---------- t (1 row) SELECT :poly3 @ :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly4; ?column? ---------- f (1 row) SELECT :poly4 @ :poly1; ?column? ---------- t (1 row) SELECT :poly1 && :poly4; ?column? ---------- t (1 row) SELECT :poly4 && :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly5; ?column? ---------- f (1 row) SELECT :poly5 @ :poly1; ?column? ---------- f (1 row) SELECT :poly1 && :poly5; ?column? ---------- t (1 row) SELECT :poly5 && :poly1; ?column? ---------- t (1 row) \unset poly1 \unset poly2 \unset poly3 \unset poly4 \unset poly5 -- checking path operators \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path1 'spath \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path2 'spath \'{(0,0),(1,0),(2,0),(3,0)}\'' \set path3 'spath \'{(0,0),(0,1),(0,1.5)}\'' SELECT @-@ spath '{(0,0),(1,0),(2,0),(3,0)}'; ?column? ---------- 3 (1 row) SELECT :path1 = :path2; ?column? ---------- f (1 row) SELECT :path1 = :path1; ?column? ---------- t (1 row) SELECT :path1 <> :path2; ?column? ---------- t (1 row) SELECT :path1 <> :path1; ?column? ---------- f (1 row) SELECT :poly && :path1; ?column? ---------- t (1 row) SELECT :path1 && :poly ; ?column? ---------- t (1 row) SELECT :path1 @ :poly ; ?column? ---------- t (1 row) SELECT :path2 @ :poly ; ?column? ---------- f (1 row) SELECT :path1 && :path1; ?column? ---------- t (1 row) SELECT :path1 && :path1; ?column? ---------- t (1 row) SELECT :poly && :path2; ?column? ---------- t (1 row) SELECT :path2 && :poly ; ?column? ---------- t (1 row) SELECT :path2 && :path1; ?column? ---------- t (1 row) SELECT :poly && :path3; ?column? ---------- f (1 row) SELECT :path3 && :poly ; ?column? ---------- f (1 row) SELECT :path3 && :path1; ?column? ---------- f (1 row) SELECT :path3 && :path2; ?column? ---------- t (1 row) SELECT :path1 @ scircle '<(0,1),1>'; ?column? ---------- f (1 row) SELECT :path3 @ scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 @ scircle '<(0,1),0.7>'; ?column? ---------- f (1 row) SELECT :path1 && scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,1),1>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,1),0.7>'; ?column? ---------- t (1 row) SELECT :path3 && scircle '<(0,-1),0.7>'; ?column? ---------- f (1 row) SELECT :path3 @ scircle '<(0,-1),0.7>'; ?column? ---------- f (1 row) SELECT :path3 && sline ( spoint '(0,-1)', spoint '(0,1)' ); ?column? ---------- t (1 row) SELECT :path3 && sline ( spoint '(-1,0)', spoint '(1,0)' ); ?column? ---------- t (1 row) SELECT :path3 && sline ( spoint '(-1,0)', spoint '(-0.3,0)' ); ?column? ---------- f (1 row) SELECT spath '{(0.11,0.15),(0.12,0.15),(0.13,0.15)}' @ :poly; ?column? ---------- t (1 row) -- ellipse tests --equal operator SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(170d,-12d),0d>' = sellipse '<{5d,5d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(170d,-12d),0d>' = sellipse '<{5d,2d},(170d,-12d),-2d>'; ?column? ---------- f (1 row) -- not equal SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d),-2d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' = sellipse '<{10d,5d},(300d,0d), 180d>' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' = sellipse '<{10d,5d},(300d,0d), 270d>' ; ?column? ---------- t (1 row) -- ellipse and point SELECT spoint '(280d,-20d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoint '(280d,-10d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoint '(280d,-9.9d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d,-10d)' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d, -9d)' ; ?column? ---------- f (1 row) SELECT spoint '(280d,-10d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoint '(280d,-9.9d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d,-10d)' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d, -9d)' ; ?column? ---------- t (1 row) -- --ellipse and circle (@,&&) -- -- negators and commutators SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d, -9d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d, -9d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d,-10d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d, -9d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d,-10d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d, -9d),0d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d, 0d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d, 0d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d,-10d),2d>' ; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d, 0d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d,-10d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d, 0d),2d>' ; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),0d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) -- ellipse is circle SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-10d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-16d),2d>' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) -- ellipse is line SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-16d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; ?column? ---------- t (1 row) -- --ellipse and line (@,&&) -- -- negators and commutators SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); ?column? ---------- f (1 row) -- line is point , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is point , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is point , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is line SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- line is a real line , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- -- ellipse and path -- -- negators , commutator @,&& SELECT spath '{(280d, -9d),(280d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -9d),(280d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -9d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d,-11d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d,-12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d,-11d),(280d,-12d)}'; ?column? ---------- f (1 row) -- path is a line , ellipse is point SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is circle SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is path SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- path is a line , ellipse is a real ellipse SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d, -8d),90d>'; ?column? ---------- t (1 row) -- -- ellipse and polygon -- -- negators , commutator @,&& SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- f (1 row) -- ellipse is point SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is circle SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,2d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is line SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,0d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is a real ellipse SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,1d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,1d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- -- ellipse and ellipse -- -- check @ SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},(300d,0d),180d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},(300d,0d),270d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) -- negators , commutator @,&& SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 52d,6d), 0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 90d,9d), 0d>'; ?column? ---------- t (1 row) -- left ellipse is point right ellipse is point SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is point SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is point SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is real ellipse right ellipse is point SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; ?column? ---------- f (1 row) -- left ellipse is point right ellipse is line SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is line SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is line SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is point right ellipse is circle SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is line right ellipse is circle SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- left ellipse is circle right ellipse is circle SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; ?column? ---------- f (1 row) -- index tests CREATE TABLE spheretmp1 (p spoint); \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' CREATE TABLE spheretmp2 (c scircle); \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' CREATE TABLE spheretmp4 AS SELECT sline ( p , p - strans '-15d,-15d,-15d,ZXZ' ) AS l FROM spheretmp1; -- checking input SELECT count(*) FROM spheretmp1 WHERE p @ scircle '< ( 180d 1m 10s , -2d 23m 59s ) , 10d >'; count ------- 32 (1 row) -- without idx SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>'; count ------- 32 (1 row) SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>'; count ------- 12 (1 row) SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>'; count ------- 48 (1 row) SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>'; count ------- 8 (1 row) SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>'; count ------- 40 (1 row) SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; count ------- 4 (1 row) -- create idx CREATE INDEX aaaidx ON spheretmp1 USING gist ( p ); CREATE INDEX bbbidx ON spheretmp2 USING gist ( c ); CREATE INDEX cccidx ON spheretmp4 USING gist ( l ); --with idx SET enable_seqscan = OFF ; SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>' ; count ------- 32 (1 row) SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>' ; count ------- 12 (1 row) SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>' ; count ------- 48 (1 row) SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>' ; count ------- 8 (1 row) SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>' ; count ------- 40 (1 row) SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; count ------- 4 (1 row) pgsphere/expected/point.out000066400000000000000000000113231332443031700163560ustar00rootroot00000000000000-- radian input SELECT spoint (-3*pi(), 0); spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint ( 3*pi(), 0); spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint ( 0, pi()); spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint ( 0, -pi()); spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint ( 2*pi(), 2*pi()); spoint --------- (0 , 0) (1 row) SELECT spoint ( pi(), 2*pi()); spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint ( 0, pi()/2); spoint ----------------------- (0 , 1.5707963267949) (1 row) SELECT spoint ( 0, -pi()/2); spoint ------------------------ (0 , -1.5707963267949) (1 row) -- degree input SELECT spoint '(-540d, 0d)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 540d, 0d)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0d, 180d)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0d, -180d)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 360d, 360d)'; spoint --------- (0 , 0) (1 row) SELECT spoint '( 180d, 360d)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0d, 90d)'; spoint ----------------------- (0 , 1.5707963267949) (1 row) SELECT spoint '( 0d, -90d)'; spoint ------------------------ (0 , -1.5707963267949) (1 row) -- dms input SELECT spoint '( 0.0d 0m 0s, 0d 0m 0s)'; ERROR: parsing: syntax error SELECT spoint '( 0d 60m 0s, 0d 0m 0s)'; ERROR: parsing: minutes or seconds invalid (min:60.000000 sec:0.000000) SELECT spoint '( 0d 0m 60s, 0d 0m 0s)'; ERROR: parsing: minutes or seconds invalid (min:0.000000 sec:60.000000) SELECT spoint '( 539d 59m 59.9999s, 0d 0m 0s)'; spoint ------------------------ (3.14159265310498 , 0) (1 row) SELECT spoint '( 0d 0m 0s, 180d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0d 0m 0s, -180d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 360d 0m 0s, 360d 0m 0s)'; spoint --------- (0 , 0) (1 row) SELECT spoint '( 180d 0m 0s, 360d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0d 0m 0s, 90d 0m 0s)'; spoint ----------------------- (0 , 1.5707963267949) (1 row) SELECT spoint '( 0d 0m 0s, -90d 0m 0s)'; spoint ------------------------ (0 , -1.5707963267949) (1 row) -- hms input for latitude SELECT spoint '( 0.0h 0m 0s, 0)'; ERROR: parsing: syntax error SELECT spoint '( 0h 60m 0s, 0)'; ERROR: parsing: minutes or seconds invalid (min:60.000000 sec:0.000000) SELECT spoint '( 0h 0m 60s, 0)'; ERROR: parsing: minutes or seconds invalid (min:0.000000 sec:60.000000) SELECT spoint '( 35h 59m 59.9999s, 0d 0m 0s)'; spoint ------------------------ (3.14159264631759 , 0) (1 row) SELECT spoint '( 0h 0m 0s, 180d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0h 0m 0s, -180d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 24h 0m 0s, 360d 0m 0s)'; spoint --------- (0 , 0) (1 row) SELECT spoint '( 12h 0m 0s, 360d 0m 0s)'; spoint ------------------------ (3.14159265358979 , 0) (1 row) SELECT spoint '( 0h 0m 0s, 90d 0m 0s)'; spoint ----------------------- (0 , 1.5707963267949) (1 row) SELECT spoint '( 0h 0m 0s, -90d 0m 0s)'; spoint ------------------------ (0 , -1.5707963267949) (1 row) -- mixed input -- operators SELECT spoint '(0, 90d)' = spoint '(0, 90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' = spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0,-90d)' = spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' != spoint '(0, 90d)'; ?column? ---------- f (1 row) SELECT spoint '(0, 90d)' != spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0,-90d)' != spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0d, 0)' = spoint '(360d,0)'; ?column? ---------- t (1 row) pgsphere/expected/points.out000066400000000000000000000304171332443031700165460ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- operators SELECT spoint '(0, 90d)' = spoint '(0, 90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' = spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0,-90d)' = spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0, 90d)' != spoint '(0, 90d)'; ?column? ---------- f (1 row) SELECT spoint '(0, 90d)' != spoint '(0,-90d)'; ?column? ---------- t (1 row) SELECT spoint '(0,-90d)' != spoint '(0,-90d)'; ?column? ---------- f (1 row) SELECT spoint '(0d, 0)' = spoint '(360d,0)'; ?column? ---------- t (1 row) -- I/O test -- -- Output --- SELECT set_sphere_output( 'DEG' ); set_sphere_output ------------------- SET DEG (1 row) SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; spoint ------------------------ (15.625d , 1.0416667d) (1 row) SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; spoint ------------------------- (0.625d , 0.041666667d) (1 row) SELECT '( 1h 3m 30s , -1d 3m 3.6s)'::spoint; spoint --------------------- (15.875d , -1.051d) (1 row) SELECT '( 0h 3m 30s , -0d 3m 3.6s)'::spoint; spoint -------------------- (0.875d , -0.051d) (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; spoint ---------------- (0.625d , 90d) (1 row) SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; spoint ----------------- (0.625d , -90d) (1 row) SELECT set_sphere_output( 'DMS' ); set_sphere_output ------------------- SET DMS (1 row) SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; spoint ------------------------------- ( 15d 37m 30s , + 1d 2m 30s) (1 row) SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; spoint ------------------------------- ( 0d 37m 30s , + 0d 2m 30s) (1 row) SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; spoint ------------------------------- ( 15d 37m 30s , - 1d 2m 30s) (1 row) SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; spoint ------------------------------- ( 0d 37m 30s , - 0d 2m 30s) (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; spoint ------------------------------ ( 0d 37m 30s , +90d 0m 0s) (1 row) SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; spoint ------------------------------ ( 0d 37m 30s , -90d 0m 0s) (1 row) SELECT set_sphere_output( 'HMS' ); set_sphere_output ------------------- SET HMS (1 row) SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; spoint ------------------------------- ( 1h 2m 30s , + 1d 2m 30s) (1 row) SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; spoint ------------------------------- ( 0h 2m 30s , + 0d 2m 30s) (1 row) SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; spoint ------------------------------- ( 1h 2m 30s , - 1d 2m 30s) (1 row) SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; spoint ------------------------------- ( 0h 2m 30s , - 0d 2m 30s) (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; spoint ------------------------------ ( 0h 2m 30s , +90d 0m 0s) (1 row) SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; spoint ------------------------------ ( 0h 2m 30s , -90d 0m 0s) (1 row) SELECT set_sphere_output( 'RAD' ); set_sphere_output ------------------- SET RAD (1 row) SELECT '( 0h 0m 0s , 0d 0m 0s)'::spoint; spoint --------- (0 , 0) (1 row) -- "incorrect dec. values" SELECT set_sphere_output( 'DEG' ); set_sphere_output ------------------- SET DEG (1 row) SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint; spoint ------------------ (180.625d , 85d) (1 row) SELECT '( 24h 2m 30s , 5d 0m 0s)'::spoint; spoint --------------- (0.625d , 5d) (1 row) SELECT '( -0h 2m 30s , -5d 0m 0s)'::spoint; spoint ------------------ (359.375d , -5d) (1 row) SELECT '( 0h 2m 30s , -95d 0m 0s)'::spoint; spoint ------------------- (180.625d , -85d) (1 row) -- Input -- SELECT '( 0.625d , -0.04166666667d)'::spoint; spoint -------------------------- (0.625d , -0.041666667d) (1 row) SELECT '(0.0109083078249646 , -0.000727220521664407)'::spoint; spoint -------------------------- (0.625d , -0.041666667d) (1 row) -- functions for point -------------- -- spoint(float8, float8) SELECT spoint(0.0109083078249646 , -0.000727220521664407); spoint -------------------------- (0.625d , -0.041666667d) (1 row) SELECT set_sphere_output( 'RAD' ); set_sphere_output ------------------- SET RAD (1 row) SELECT spoint(7.28318530717958623 , 0.00); spoint --------- (1 , 0) (1 row) SELECT spoint(0.0 , 2.141592653589793116); spoint ----------------- (3.1415927 , 1) (1 row) -- dist(spoint,spoint) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 0m 30s , 0d 0m 0s)'::spoint); dist ------------------- 0.008726646259972 (1 row) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , 10d 0m 0s)'::spoint); dist ----------------- 0.1745329251994 (1 row) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); dist ----------------- 0.1745329251994 (1 row) SELECT dist('( 0h 2m 30s , 95d 0m 0s)'::spoint,'( 12h 2m 30s , 85d 0m 0s)'::spoint); dist ------ 0 (1 row) SELECT dist('( 24h 2m 30s , 10d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); dist ----------------- 0.3490658503989 (1 row) SELECT dist('( 0h 2m 30s , 90d 0m 0s)'::spoint,'( 12h 2m 30s , 90d 0m 0s)'::spoint); dist ------ 0 (1 row) SELECT dist('( 0h 2m 30s , -90d 0m 0s)'::spoint,'( 12h 2m 30s , -90d 0m 0s)'::spoint); dist ------ 0 (1 row) -- long(spoint) SELECT long('( 0h 2m 30s , 0d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('( 0h 2m 30s ,95d 0m 0s)'::spoint); long ---------------- 3.152500961415 (1 row) SELECT long('( 0h 2m 30s ,85d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('( 0h 2m 30s ,-95d 0m 0s)'::spoint); long ---------------- 3.152500961415 (1 row) SELECT long('( 0h 2m 30s ,-85d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('( 0h 2m 30s ,90d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('( 0h 2m 30s ,-90d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('(24h 2m 30s , 0d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('(24h 2m 30s ,95d 0m 0s)'::spoint); long ---------------- 3.152500961415 (1 row) SELECT long('(24h 2m 30s ,85d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('(24h 2m 30s ,-95d 0m 0s)'::spoint); long ---------------- 3.152500961415 (1 row) SELECT long('(24h 2m 30s ,-85d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('(24h 2m 30s ,90d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) SELECT long('(24h 2m 30s ,-90d 0m 0s)'::spoint); long ------------------ 0.01090830782496 (1 row) -- lat(spoint) SELECT lat('( 0h 2m 30s , 0d 0m 0s)'::spoint); lat ----- 0 (1 row) SELECT lat('( 0h 2m 30s ,95d 0m 0s)'::spoint); lat ---------------- 1.483529864195 (1 row) SELECT lat('( 0h 2m 30s ,85d 0m 0s)'::spoint); lat ---------------- 1.483529864195 (1 row) SELECT lat('( 0h 2m 30s ,-95d 0m 0s)'::spoint); lat ----------------- -1.483529864195 (1 row) SELECT lat('( 0h 2m 30s ,-85d 0m 0s)'::spoint); lat ----------------- -1.483529864195 (1 row) SELECT lat('( 0h 2m 30s ,90d 0m 0s)'::spoint); lat ---------------- 1.570796326795 (1 row) SELECT lat('( 0h 2m 30s ,-90d 0m 0s)'::spoint); lat ----------------- -1.570796326795 (1 row) SELECT lat('(24h 2m 30s , 0d 0m 0s)'::spoint); lat ----- 0 (1 row) SELECT lat('(24h 2m 30s ,95d 0m 0s)'::spoint); lat ---------------- 1.483529864195 (1 row) SELECT lat('(24h 2m 30s ,85d 0m 0s)'::spoint); lat ---------------- 1.483529864195 (1 row) SELECT lat('(24h 2m 30s ,-95d 0m 0s)'::spoint); lat ----------------- -1.483529864195 (1 row) SELECT lat('(24h 2m 30s ,-85d 0m 0s)'::spoint); lat ----------------- -1.483529864195 (1 row) SELECT lat('(24h 2m 30s ,90d 0m 0s)'::spoint); lat ---------------- 1.570796326795 (1 row) SELECT lat('(24h 2m 30s ,-90d 0m 0s)'::spoint); lat ----------------- -1.570796326795 (1 row) -- operators for points ------------- -- = operator ----------------------- SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 24h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 24h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint='( 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint='( 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint='( 12h 2m 30s , 45d 0m 0s)'::spoint; ?column? ---------- f (1 row) -- <> operator ----------------------- SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 24h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 24h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<>'( 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<>'( 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<>'( 12h 2m 30s , 45d 0m 0s)'::spoint; ?column? ---------- t (1 row) -- <-> operator --------------------- SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 0m 30s , 0d 0m 0s)'::spoint; ?column? ------------------- 0.008726646259972 (1 row) SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ----------------- 0.1745329251994 (1 row) SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; ?column? ----------------- 0.1745329251994 (1 row) SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<->'( 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; ?column? ----------------- 0.3490658503989 (1 row) SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<->'( 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<->'( 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) pgsphere/expected/poly.out000066400000000000000000001070361332443031700162170ustar00rootroot00000000000000\set ECHO none set_sphere_output_precision ----------------------------- SET 8 (1 row) -- checking polygon operators \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon ?column? ---------- t (1 row) SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon ?column? ---------- t (1 row) SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon ?column? ---------- t (1 row) SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon ?column? ---------- f (1 row) SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.05>' @ :poly; -- circle overlaps polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.10>' @ :poly; -- circle overlaps polygon ?column? ---------- f (1 row) SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon ?column? ---------- t (1 row) SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon ?column? ---------- f (1 row) SELECT scircle '<(0.25,0.00),0.05>' && :poly; -- circle overlaps polygon ?column? ---------- t (1 row) SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line touches polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon ?column? ---------- f (1 row) SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line touches polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon ?column? ---------- t (1 row) SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) && :poly; -- line inside polygon ?column? ---------- t (1 row) \unset poly \set poly1 'spoly \'{(0,0),(1,0),(0,1)}\'' \set poly2 'spoly \'{(1,0),(0,0),(0,1)}\'' \set poly3 'spoly \'{(0,1),(0,0),(1,0)}\'' \set poly4 'spoly \'{(0.1,0.9),(0.1,0.1),(0.9,0.1)}\'' \set poly5 'spoly \'{(0.2,0.0),(1.2,0.0),(0.2,1)}\'' SELECT :poly1 = :poly2; ?column? ---------- t (1 row) SELECT :poly2 = :poly3; ?column? ---------- t (1 row) SELECT :poly3 = :poly1; ?column? ---------- t (1 row) SELECT :poly1 && :poly2; ?column? ---------- t (1 row) SELECT :poly2 && :poly3; ?column? ---------- t (1 row) SELECT :poly3 && :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly2; ?column? ---------- t (1 row) SELECT :poly2 @ :poly3; ?column? ---------- t (1 row) SELECT :poly3 @ :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly4; ?column? ---------- f (1 row) SELECT :poly4 @ :poly1; ?column? ---------- t (1 row) SELECT :poly1 && :poly4; ?column? ---------- t (1 row) SELECT :poly4 && :poly1; ?column? ---------- t (1 row) SELECT :poly1 @ :poly5; ?column? ---------- f (1 row) SELECT :poly5 @ :poly1; ?column? ---------- f (1 row) SELECT :poly1 && :poly5; ?column? ---------- t (1 row) SELECT :poly5 && :poly1; ?column? ---------- t (1 row) \unset poly1 \unset poly2 \unset poly3 \unset poly4 \unset poly5 -- From testsuite/poly_test.sql SELECT set_sphere_output('DEG'); set_sphere_output ------------------- SET DEG (1 row) SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; spoly ------------------------------------ {(10d , 0d),(10d , 1d),(15d , 0d)} (1 row) SELECT spoly '{(359d,0d),(359d,1d),(4d,0d)}'; spoly ------------------------------------- {(359d , 0d),(359d , 1d),(4d , 0d)} (1 row) SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; spoly ------------------------------------ {(10d , 0d),(10d , 1d),(15d , 0d)} (1 row) -- incorrect input ----- SELECT spoly '{(10d,0d),(10d,1d)}'; ERROR: spherepoly_in: more than two points needed LINE 1: SELECT spoly '{(10d,0d),(10d,1d)}'; ^ --- self-crossing input ----- SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; ERROR: spherepoly_from_array: a line segment overlaps or polygon too large LINE 1: SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; ^ --- functions SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); npoints --------- 3 (1 row) SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d),(5d,-5d)}'); npoints --------- 4 (1 row) --SELECT npoints( spoly '{(0d,0d),(0d,90d),(15d,90d),(15d,0d)}'); SELECT area(spoly '{(0d,0d),(0d,90d),(1,0d)}'); area ------ 1 (1 row) SELECT area(spoly '{(0d,0d),(0d,90d),(90d,0d)}')/(4.0*pi()); ?column? ---------- 0.125 (1 row) --- operations --- = operator --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(2d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(2d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(3d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; ?column? ---------- f (1 row) --- <> operator --- should be false SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(2d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(2d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; ?column? ---------- f (1 row) --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; ?column? ---------- t (1 row) --- spoint @ spoly --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; ?column? ---------- t (1 row) --- spoint @ spoly --- should be true SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '(0d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '(0d,0d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '(0d,89.9d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '(0d,90d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '(0d,-89.9d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '(0d,-90d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) --- should be false SELECT '(0.1d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '(45d,-89d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- f (1 row) SELECT '(0d,1d)'::spoint @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) --- spoly ~ spoint --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0.5d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,89.9d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,90d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-89.9d)'::spoint; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-90d)'::spoint; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.1d,0.5d)'::spoint; ?column? ---------- f (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(45d,-89d)'::spoint; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '(0d,1d)'::spoint; ?column? ---------- f (1 row) --- scircle @ spoly --- should be true SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '<(0d,89.9d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,90d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,-89.9d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,-90d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) --- should be false SELECT '<(0.1d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(45d,-89d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- f (1 row) SELECT '<(0d,1d),0.1d>'::scircle @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0d,0d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) --- spoly ~ scircle --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.5d,0.5d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,89.9d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,90d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-89.9d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-90d),0.1d>'::scircle; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(45d,-89d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '<(0d,1d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.1d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.6d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) --- spoly @ scircle --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),2.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ '<(0d,90d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' @ '<(180d,-90d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),0.99d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(60d,0d),0.99d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}' @ '<(0d,90d),1.0d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}' @ '<(180d,-90d),1.0d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(2d,0d)}' @ '<(0d,0d),1.0d>'::scircle; ?column? ---------- f (1 row) --- scircle ~ spoly --- should be true SELECT '<(0d,0d),2.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; ?column? ---------- t (1 row) SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) --- should be false SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; ?column? ---------- f (1 row) SELECT '<(60d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; ?column? ---------- f (1 row) SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}'; ?column? ---------- f (1 row) SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}'; ?column? ---------- f (1 row) SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(2d,0d)}'; ?column? ---------- f (1 row) --- scircle && spoly --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,89.9d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-89.9d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-90d),0.1d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0d,0d),2.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' && '<(0d,0d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(180d,-90d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && '<(0d,0d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(0d,2d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(2d,0d),1.0d>'::scircle; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(1.5d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,88.0d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.3d,0.5d),0.1d>'::scircle; ?column? ---------- f (1 row) SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-87d),0.1d>'::scircle; ?column? ---------- f (1 row) --- spoly && scircle --- should be true SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '<(0d,89.9d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,90d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,-89.9d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,-90d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,0d),2.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; ?column? ---------- t (1 row) SELECT '<(0d,90d),1.0d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT '<(180d,-90d),1.0d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- t (1 row) SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT '<(0d,2d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT '<(2d,0d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) --- should be false SELECT '<(1.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0d,88.0d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- f (1 row) SELECT '<(0.3d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT '<(0d,-87d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; ?column? ---------- f (1 row) --- spoly @ spoly --- should be true SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) --- should be false --SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- f (1 row) --- spoly ~ spoly --- should be true SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; ?column? ---------- f (1 row) --- spoly && spoly --- should be true SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; ?column? ---------- t (1 row) SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; ?column? ---------- t (1 row) SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- t (1 row) --- should be false SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; ?column? ---------- f (1 row) SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; ?column? ---------- f (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(3d,-1d),(3d,1d),(5d,1d),(5d,-1d)}'; ?column? ---------- f (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-1d,3d),(-1d,5d),(1d,5d),(1d,3d)}'; ?column? ---------- f (1 row) SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d,1d),(181d,1d),(181d,-1d)}'; ?column? ---------- f (1 row) -- -- ellipse and polygon -- -- negators , commutator @,&& SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; ?column? ---------- f (1 row) SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; ?column? ---------- f (1 row) -- ellipse is point SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is circle SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,2d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is line SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,0d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- ellipse is a real ellipse SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,1d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- f (1 row) SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{2d,1d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; ?column? ---------- t (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; ?column? ---------- f (1 row) SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; ?column? ---------- t (1 row) -- create polygon as aggregate SELECT spoly(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; spoly ------------------------------------------------------------- {(0d , 57.29578d),(57.29578d , 57.29578d),(57.29578d , 0d)} (1 row) -- test stored data SELECT count(id) FROM spheretmp5 WHERE id=2 AND area(p) BETWEEN 5.735555 AND 5.735556 ; count ------- 1 (1 row) -- check to create this small polygon without errors SELECT area( spoly '{ (3.09472232280407 , 1.47261266025223), (3.0947320190777 , 1.47261266025223), (3.0947320190777 , 1.47262235652586), (3.09472232280407 , 1.47262235652586) }') >= 0 ; ?column? ---------- t (1 row) SELECT npoints( spoly '{ (1.51214841579108 , -2.90888208684947e-05), (1.5121581120647 , -2.90888208684947e-05), (1.5121581120647 , -1.93925472462553e-05), (1.51214841579108 , -1.93925472462553e-05) }'); npoints --------- 4 (1 row) pgsphere/expected/tables.out000066400000000000000000001241551332443031700165070ustar00rootroot00000000000000-- Create tables SET client_min_messages = 'warning'; CREATE TABLE spheretmp1 (p spoint); \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' CREATE TABLE spheretmp2 (c scircle); \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' CREATE TABLE spheretmp3 (b sbox); \copy spheretmp3 from 'data/test_spherebox.data' CREATE TABLE spheretmp4 AS SELECT sline ( p , p - strans '-15d,-15d,-15d,ZXZ' ) AS l FROM spheretmp1; CREATE TABLE spheretmp5 (id int PRIMARY KEY , p spoly ); \copy spheretmp5 from 'data/test_spherepolygon.data' CREATE TABLE spheretmp6 (id int PRIMARY KEY , p spath ); \copy spheretmp6 from 'data/test_spherepath.data' -- Aggregate data from tables SELECT set_sphere_output_precision(12); set_sphere_output_precision ----------------------------- SET 12 (1 row) CREATE TABLE spheretmp7 (p spoint); \copy spheretmp7 from 'data/test_spherepolygon_aggregate.data' SELECT spoly(p) FROM spheretmp7; spoly ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ {(0 , -0.9),(0.0174532925199 , -0.9),(0.0349065850399 , -0.9),(0.0523598775598 , -0.9),(0.0698131700798 , -0.9),(0.0872664625997 , -0.9),(0.10471975512 , -0.9),(0.12217304764 , -0.9),(0.13962634016 , -0.9),(0.157079632679 , -0.9),(0.174532925199 , -0.9),(0.191986217719 , -0.9),(0.209439510239 , -0.9),(0.226892802759 , -0.9),(0.244346095279 , -0.9),(0.261799387799 , -0.9),(0.279252680319 , -0.9),(0.296705972839 , -0.9),(0.314159265359 , -0.9),(0.331612557879 , -0.9),(0.349065850399 , -0.9),(0.366519142919 , -0.9),(0.383972435439 , -0.9),(0.401425727959 , -0.9),(0.418879020479 , -0.9),(0.436332312999 , -0.9),(0.453785605519 , -0.9),(0.471238898038 , -0.9),(0.488692190558 , -0.9),(0.506145483078 , -0.9),(0.523598775598 , -0.9),(0.541052068118 , -0.9),(0.558505360638 , -0.9),(0.575958653158 , -0.9),(0.593411945678 , -0.9),(0.610865238198 , -0.9),(0.628318530718 , -0.9),(0.645771823238 , -0.9),(0.663225115758 , -0.9),(0.680678408278 , -0.9),(0.698131700798 , -0.9),(0.715584993318 , -0.9),(0.733038285838 , -0.9),(0.750491578358 , -0.9),(0.767944870878 , -0.9),(0.785398163397 , -0.9),(0.802851455917 , -0.9),(0.820304748437 , -0.9),(0.837758040957 , -0.9),(0.855211333477 , -0.9),(0.872664625997 , -0.9),(0.890117918517 , -0.9),(0.907571211037 , -0.9),(0.925024503557 , -0.9),(0.942477796077 , -0.9),(0.959931088597 , -0.9),(0.977384381117 , -0.9),(0.994837673637 , -0.9),(1.01229096616 , -0.9),(1.02974425868 , -0.9),(1.0471975512 , -0.9),(1.06465084372 , -0.9),(1.08210413624 , -0.9),(1.09955742876 , -0.9),(1.11701072128 , -0.9),(1.1344640138 , -0.9),(1.15191730632 , -0.9),(1.16937059884 , -0.9),(1.18682389136 , -0.9),(1.20427718388 , -0.9),(1.2217304764 , -0.9),(1.23918376892 , -0.9),(1.25663706144 , -0.9),(1.27409035396 , -0.9),(1.29154364648 , -0.9),(1.308996939 , -0.9),(1.32645023152 , -0.9),(1.34390352404 , -0.9),(1.36135681656 , -0.9),(1.37881010908 , -0.9),(1.3962634016 , -0.9),(1.41371669412 , -0.9),(1.43116998664 , -0.9),(1.44862327916 , -0.9),(1.46607657168 , -0.9),(1.4835298642 , -0.9),(1.50098315672 , -0.9),(1.51843644924 , -0.9),(1.53588974176 , -0.9),(1.55334303427 , -0.9),(1.57079632679 , -0.9),(1.58824961931 , -0.9),(1.60570291183 , -0.9),(1.62315620435 , -0.9),(1.64060949687 , -0.9),(1.65806278939 , -0.9),(1.67551608191 , -0.9),(1.69296937443 , -0.9),(1.71042266695 , -0.9),(1.72787595947 , -0.9),(1.74532925199 , -0.9),(1.76278254451 , -0.9),(1.78023583703 , -0.9),(1.79768912955 , -0.9),(1.81514242207 , -0.9),(1.83259571459 , -0.9),(1.85004900711 , -0.9),(1.86750229963 , -0.9),(1.88495559215 , -0.9),(1.90240888467 , -0.9),(1.91986217719 , -0.9),(1.93731546971 , -0.9),(1.95476876223 , -0.9),(1.97222205475 , -0.9),(1.98967534727 , -0.9),(2.00712863979 , -0.9),(2.02458193231 , -0.9),(2.04203522483 , -0.9),(2.05948851735 , -0.9),(2.07694180987 , -0.9),(2.09439510239 , -0.9),(2.11184839491 , -0.9),(2.12930168743 , -0.9),(2.14675497995 , -0.9),(2.16420827247 , -0.9),(2.18166156499 , -0.9),(2.19911485751 , -0.9),(2.21656815003 , -0.9),(2.23402144255 , -0.9),(2.25147473507 , -0.9),(2.26892802759 , -0.9),(2.28638132011 , -0.9),(2.30383461263 , -0.9),(2.32128790515 , -0.9),(2.33874119767 , -0.9),(2.35619449019 , -0.9),(2.37364778271 , -0.9),(2.39110107523 , -0.9),(2.40855436775 , -0.9),(2.42600766027 , -0.9),(2.44346095279 , -0.9),(2.46091424531 , -0.9),(2.47836753783 , -0.9),(2.49582083035 , -0.9),(2.51327412287 , -0.9),(2.53072741539 , -0.9),(2.54818070791 , -0.9),(2.56563400043 , -0.9),(2.58308729295 , -0.9),(2.60054058547 , -0.9),(2.61799387799 , -0.9),(2.63544717051 , -0.9),(2.65290046303 , -0.9),(2.67035375555 , -0.9),(2.68780704807 , -0.9),(2.70526034059 , -0.9),(2.72271363311 , -0.9),(2.74016692563 , -0.9),(2.75762021815 , -0.9),(2.77507351067 , -0.9),(2.79252680319 , -0.9),(2.80998009571 , -0.9),(2.82743338823 , -0.9),(2.84488668075 , -0.9),(2.86233997327 , -0.9),(2.87979326579 , -0.9),(2.89724655831 , -0.9),(2.91469985083 , -0.9),(2.93215314335 , -0.9),(2.94960643587 , -0.9),(2.96705972839 , -0.9),(2.98451302091 , -0.9),(3.00196631343 , -0.9),(3.01941960595 , -0.9),(3.03687289847 , -0.9),(3.05432619099 , -0.9),(3.07177948351 , -0.9),(3.08923277603 , -0.9),(3.10668606855 , -0.9),(3.12413936107 , -0.9),(3.14159265359 , -0.9),(3.15904594611 , -0.9),(3.17649923863 , -0.9),(3.19395253115 , -0.9),(3.21140582367 , -0.9),(3.22885911619 , -0.9),(3.24631240871 , -0.9),(3.26376570123 , -0.9),(3.28121899375 , -0.9),(3.29867228627 , -0.9),(3.31612557879 , -0.9),(3.33357887131 , -0.9),(3.35103216383 , -0.9),(3.36848545635 , -0.9),(3.38593874887 , -0.9),(3.40339204139 , -0.9),(3.42084533391 , -0.9),(3.43829862643 , -0.9),(3.45575191895 , -0.9),(3.47320521147 , -0.9),(3.49065850399 , -0.9),(3.50811179651 , -0.9),(3.52556508903 , -0.9),(3.54301838155 , -0.9),(3.56047167407 , -0.9),(3.57792496659 , -0.9),(3.59537825911 , -0.9),(3.61283155163 , -0.9),(3.63028484415 , -0.9),(3.64773813667 , -0.9),(3.66519142919 , -0.9),(3.68264472171 , -0.9),(3.70009801423 , -0.9),(3.71755130675 , -0.9),(3.73500459927 , -0.9),(3.75245789179 , -0.9),(3.76991118431 , -0.9),(3.78736447683 , -0.9),(3.80481776935 , -0.9),(3.82227106187 , -0.9),(3.83972435439 , -0.9),(3.85717764691 , -0.9),(3.87463093943 , -0.9),(3.89208423195 , -0.9),(3.90953752447 , -0.9),(3.92699081699 , -0.9),(3.94444410951 , -0.9),(3.96189740203 , -0.9),(3.97935069455 , -0.9),(3.99680398707 , -0.9),(4.01425727959 , -0.9),(4.03171057211 , -0.9),(4.04916386463 , -0.9),(4.06661715715 , -0.9),(4.08407044967 , -0.9),(4.10152374219 , -0.9),(4.11897703471 , -0.9),(4.13643032723 , -0.9),(4.15388361975 , -0.9),(4.17133691227 , -0.9),(4.18879020479 , -0.9),(4.20624349731 , -0.9),(4.22369678983 , -0.9),(4.24115008235 , -0.9),(4.25860337487 , -0.9),(4.27605666739 , -0.9),(4.29350995991 , -0.9),(4.31096325243 , -0.9),(4.32841654495 , -0.9),(4.34586983747 , -0.9),(4.36332312999 , -0.9),(4.38077642251 , -0.9),(4.39822971503 , -0.9),(4.41568300755 , -0.9),(4.43313630007 , -0.9),(4.45058959259 , -0.9),(4.46804288511 , -0.9),(4.48549617763 , -0.9),(4.50294947015 , -0.9),(4.52040276267 , -0.9),(4.53785605519 , -0.9),(4.55530934771 , -0.9),(4.57276264023 , -0.9),(4.59021593275 , -0.9),(4.60766922527 , -0.9),(4.62512251778 , -0.9),(4.6425758103 , -0.9),(4.66002910282 , -0.9),(4.67748239534 , -0.9),(4.69493568786 , -0.9),(4.71238898038 , -0.9),(4.7298422729 , -0.9),(4.74729556542 , -0.9),(4.76474885794 , -0.9),(4.78220215046 , -0.9),(4.79965544298 , -0.9),(4.8171087355 , -0.9),(4.83456202802 , -0.9),(4.85201532054 , -0.9),(4.86946861306 , -0.9),(4.88692190558 , -0.9),(4.9043751981 , -0.9),(4.92182849062 , -0.9),(4.93928178314 , -0.9),(4.95673507566 , -0.9),(4.97418836818 , -0.9),(4.9916416607 , -0.9),(5.00909495322 , -0.9),(5.02654824574 , -0.9),(5.04400153826 , -0.9),(5.06145483078 , -0.9),(5.0789081233 , -0.9),(5.09636141582 , -0.9),(5.11381470834 , -0.9),(5.13126800086 , -0.9),(5.14872129338 , -0.9),(5.1661745859 , -0.9),(5.18362787842 , -0.9),(5.20108117094 , -0.9),(5.21853446346 , -0.9),(5.23598775598 , -0.9),(5.2534410485 , -0.9),(5.27089434102 , -0.9),(5.28834763354 , -0.9),(5.30580092606 , -0.9),(5.32325421858 , -0.9),(5.3407075111 , -0.9),(5.35816080362 , -0.9),(5.37561409614 , -0.9),(5.39306738866 , -0.9),(5.41052068118 , -0.9),(5.4279739737 , -0.9),(5.44542726622 , -0.9),(5.46288055874 , -0.9),(5.48033385126 , -0.9),(5.49778714378 , -0.9),(5.5152404363 , -0.9),(5.53269372882 , -0.9),(5.55014702134 , -0.9),(5.56760031386 , -0.9),(5.58505360638 , -0.9),(5.6025068989 , -0.9),(5.61996019142 , -0.9),(5.63741348394 , -0.9),(5.65486677646 , -0.9),(5.67232006898 , -0.9),(5.6897733615 , -0.9),(5.70722665402 , -0.9),(5.72467994654 , -0.9),(5.74213323906 , -0.9),(5.75958653158 , -0.9),(5.7770398241 , -0.9),(5.79449311662 , -0.9),(5.81194640914 , -0.9),(5.82939970166 , -0.9),(5.84685299418 , -0.9),(5.8643062867 , -0.9),(5.88175957922 , -0.9),(5.89921287174 , -0.9),(5.91666616426 , -0.9),(5.93411945678 , -0.9),(5.9515727493 , -0.9),(5.96902604182 , -0.9),(5.98647933434 , -0.9),(6.00393262686 , -0.9),(6.02138591938 , -0.9),(6.0388392119 , -0.9),(6.05629250442 , -0.9),(6.07374579694 , -0.9),(6.09119908946 , -0.9),(6.10865238198 , -0.9),(6.1261056745 , -0.9),(6.14355896702 , -0.9),(6.16101225954 , -0.9),(6.17846555206 , -0.9),(6.19591884458 , -0.9),(6.2133721371 , -0.9),(6.23082542962 , -0.9),(6.24827872214 , -0.9),(6.26573201466 , -0.9)} (1 row) CREATE TABLE spheretmp8 (p spoint); \copy spheretmp8 from 'data/test_spherepoint.data' SELECT spath(p) FROM spheretmp8 WHERE p IS NOT NULL; spath --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {(1.32 , 0.61),(5.88318530718 , -0.17),(2.3 , 0.6),(5.36318530718 , -0.19),(5.35318530718 , 0.52),(1.89 , 0.1),(1.33 , 0.52),(2.19 , 0.94),(0.13 , 0.34),(0.19 , -0.79),(0.52 , 0.45),(4.66318530718 , 0.14),(4.82318530718 , -0.75),(5.47318530718 , -0.08),(3 , -0.08),(2.21 , -0.91),(0.89 , 1.48),(5.67318530718 , -0.82),(1.06 , -1.13),(1.99 , -1.11),(6.10318530718 , -0.41),(3.09 , 1.25),(0.01 , 0.28),(3.20318530718 , 0.72),(3.61318530718 , 0.97),(2.32 , 0.88),(4.84318530718 , 0.07),(6.02318530718 , -0.09),(3.49318530718 , 1.36),(6.01318530718 , -0.51),(2.15 , 0.84),(4.70318530718 , 0.3),(2.23 , 0.63),(5.85318530718 , 0.52),(3.16318530718 , 0.85),(2.65 , -0.2),(2.33 , -0.05),(4.20318530718 , 0.14),(5.36318530718 , -1.16),(2.87 , -1.38),(2.43 , 1.09),(5.84318530718 , -0.5),(0.41 , -0.34),(4.81318530718 , -0.44),(2.61 , 0.34),(3.02 , 0.84),(1.14 , 0.01),(3.16318530718 , -0.21),(0.99 , -1.22),(2.39 , -0.42),(3.95318530718 , -0.2),(0.22 , -0.09),(5.50318530718 , -0.41),(3.77318530718 , -0.53),(0.66 , 1.29),(3.60318530718 , -0.78),(1.48 , -0.93),(1.57 , -1.06),(2.33 , -0.66),(1.08 , 0.27),(6.07318530718 , -0.3),(3.59318530718 , -0.49),(4.46318530718 , 0.48),(0.03 , 0.29),(2.5 , 0.63),(5.55318530718 , -0.14),(4.19318530718 , -0.49),(5.39318530718 , 0.66),(1.29 , 0.57),(2.51 , -0.96),(2.66 , 0.16),(0.97 , -0.84),(5.28318530718 , 1.02),(2.71 , 0.08),(2.64 , -0.89),(3.93318530718 , 0.92),(1.1 , 0.35),(1.07 , 1.09),(1.13 , 0.53),(5.95318530718 , -0.29),(1.5 , 1.1),(3.22318530718 , 0.07),(0.25 , -0.17),(0.07 , -0.46),(0.06 , 0.4),(3.68318530718 , 0.75),(4.90318530718 , -0.66),(2.01 , -0.23),(0.42 , -0.01),(1.05 , -1.24),(4.17318530718 , -0.82),(6.12318530718 , -0.05),(0.3 , -0.39),(1.35 , 0.05),(5.35318530718 , 0.5),(4.00318530718 , 0.11),(2.82 , 0.68),(2.74 , -0.9),(1.36 , -0.31),(5.47318530718 , -0.2),(2.07 , -0.04),(3.69318530718 , 0.57),(4.46318530718 , 0.44),(5.82318530718 , 0.06),(1.09 , -0.57),(2.49 , -0.07),(3.89318530718 , -0.14),(4.36318530718 , -0.47),(5.02318530718 , 0.35),(3.45318530718 , 0.16),(1.42 , 0.42),(3.15318530718 , -0.99),(5.97318530718 , 0.14),(4.65318530718 , -0.14),(5.27318530718 , -0.63),(3.53318530718 , -0.2),(1.21 , 0.69),(0.05 , -0.97),(3.98318530718 , 0.12),(2.05 , -0.82),(1.3 , -0.33),(2.89 , 0.03),(2.47 , 0.5),(3.69318530718 , 0.28),(5.12318530718 , -0.21),(6.00318530718 , 0.15),(2.26 , -0.9),(1.4 , 0.67),(3.35318530718 , 0.5),(4.66318530718 , 0.09),(1.32 , 0.32),(3.88318530718 , 0.43),(4.40318530718 , 0.8),(5.44318530718 , 0.8),(4.13318530718 , -0.04),(1.29 , -0.9),(2.26 , 0.27),(1.56 , 0.48),(3.06 , 0.12),(2.54 , 0.59),(0.98 , -0.6),(1.41 , 0.05),(1.25 , 0.42),(3.17318530718 , -0.19),(2.22 , -0.73),(0.42 , 0.09),(5.30318530718 , -0.11),(6.26318530718 , 0.99),(5.22318530718 , 0.32),(4.14318530718 , -1.13),(3.17318530718 , 0.35),(1.45 , -0.39),(3.36318530718 , -0.9),(0.93 , 0.27),(2.42 , 1.29),(2.65 , -0.07),(4.09318530718 , 0.05),(4.95318530718 , -0.23),(2.24 , -0.57),(4.47318530718 , 0.88),(0.01 , 0.51),(0.97 , -0.71),(2.71 , -0.26),(1.67 , -0.35),(4.76318530718 , 0.45),(4.50318530718 , -0.01),(0.38 , 1.03),(1.9 , -0.69),(1.92 , 0.65),(4.45318530718 , -1.4),(4.01318530718 , 0.45),(0.84 , 0.18),(5.41318530718 , 0.6),(2.2 , 0.89),(5.89318530718 , -0.33),(0.84 , -0.71),(0.62 , -0.15),(1.63 , -0.11),(1.43 , 0.46),(5.83318530718 , 0.91),(2.02 , 0.24),(5.03318530718 , -0.73),(2.45 , 0.74),(2.82 , 0.52),(2.5 , -0.83),(4.26318530718 , 0.32),(1.89 , -0.02),(1.48 , 0.98),(1.45 , -0.54),(3.28318530718 , -1.04),(3.08 , -0.25),(2.41 , 0.02),(3.72318530718 , -0.51),(2.14 , -0.58),(2.87 , -1.24),(3.16318530718 , -1.38),(1.24 , 0.95),(5.61318530718 , 1.05),(1.97 , -0.2),(6.27318530718 , -0.49),(5.77318530718 , -0.43),(3.02 , 0.69),(1.09 , -0.09),(6.18318530718 , -0.57),(3.20318530718 , -0.15),(0.08 , 0.32),(4.74318530718 , -0.46),(4.46318530718 , 0.73),(5.02318530718 , 0.4),(0.22 , -1.42),(1.23 , -1.14),(4.20318530718 , -1.03),(1.42 , -0.64),(1.72 , 0.11),(1.7 , 0.9),(2.79 , 0.31),(2.9 , 0.28),(3.74318530718 , 0.69),(4.11318530718 , 0.28),(1.75 , 0),(5.12318530718 , -0.47),(1.02 , 0.12),(5.40318530718 , -0.37),(2.45 , -0.78),(4.79318530718 , -1.16),(5.97318530718 , 1.25),(1.7 , -0.94),(4.32318530718 , 0.05),(4.58318530718 , -0.99),(4.60318530718 , 0.79),(3.96318530718 , -0.35),(4.27318530718 , -1.32),(2.55 , -0.69),(2.87 , 0.26),(6.27318530718 , 0.64),(6.11318530718 , 0.84),(2.1 , 1.08),(1.91 , 0.9),(5.48318530718 , -0.45),(2.51 , 0.44),(5.36318530718 , -0.8),(1.18 , 0.83),(3.49318530718 , 0.9),(1.85 , -0.46),(3.81318530718 , 0.02),(2.67 , -0.65),(2.77 , -0.22),(4.33318530718 , 0.27),(4.52318530718 , 0.31),(5.91318530718 , 0.64),(1.07 , -0.97),(2.63 , -0.28),(2.44 , -0.32),(0.36 , -0.86),(4.97318530718 , 0.89),(6.16318530718 , -0.65),(5.19318530718 , 0.56),(3.35318530718 , -0.05),(1.9 , 0.02),(2.54 , -1.17),(2.75 , 1.18),(5.23318530718 , -0.29),(0.42 , -0.06),(5.50318530718 , -1.15),(4.99318530718 , 0.1),(0.67 , 0.97),(3 , 0.76),(6.16318530718 , -1.12),(4.41318530718 , -0.02),(4.60318530718 , -0.74),(1.84 , -0.42),(0.57 , 0.1),(0.55 , 0.27),(3.34318530718 , 1.05),(1.49 , 0.52),(0.38 , 0.04),(1.94 , 1.33),(4.89318530718 , 0.41),(2.06 , 0.6),(1.06 , -0.54),(2.92 , -0.37),(0.53 , -1.21),(0.69 , 1.35),(3.61318530718 , -0.48),(1.31 , 1.19),(0.21 , -0.72),(0.26 , -1),(3.03 , 0.54),(3.42318530718 , 0.01),(1.97 , 1.48),(4.54318530718 , 0.93),(3.09 , 0.6),(4.45318530718 , -0.28),(3.22318530718 , -0.56),(1.46 , -0.48),(0.69 , -1.09),(0.13 , -0.66),(3.87318530718 , 0.05),(1.23 , -0.62),(0.67 , 0.89),(3.19395253115 , -0.0415970138392),(3.14193202317 , -0.0418830539111),(3.19031642854 , 0.0418874172342)} (1 row) pgsphere/gist.c000066400000000000000000001322111332443031700140050ustar00rootroot00000000000000#include "gist.h" /* * Functions needed to build a GIST index */ PG_FUNCTION_INFO_V1(pointkey_in); PG_FUNCTION_INFO_V1(pointkey_out); PG_FUNCTION_INFO_V1(pointkey_volume); PG_FUNCTION_INFO_V1(pointkey_area); PG_FUNCTION_INFO_V1(pointkey_perimeter); PG_FUNCTION_INFO_V1(spherekey_in); PG_FUNCTION_INFO_V1(spherekey_out); PG_FUNCTION_INFO_V1(g_spherekey_decompress); PG_FUNCTION_INFO_V1(g_scircle_compress); PG_FUNCTION_INFO_V1(g_spoint_compress); PG_FUNCTION_INFO_V1(g_sline_compress); PG_FUNCTION_INFO_V1(g_spath_compress); PG_FUNCTION_INFO_V1(g_spoly_compress); PG_FUNCTION_INFO_V1(g_sellipse_compress); PG_FUNCTION_INFO_V1(g_sbox_compress); PG_FUNCTION_INFO_V1(g_spherekey_union); PG_FUNCTION_INFO_V1(g_spherekey_same); PG_FUNCTION_INFO_V1(g_spoint_consistent); PG_FUNCTION_INFO_V1(g_scircle_consistent); PG_FUNCTION_INFO_V1(g_sline_consistent); PG_FUNCTION_INFO_V1(g_spath_consistent); PG_FUNCTION_INFO_V1(g_spoly_consistent); PG_FUNCTION_INFO_V1(g_sellipse_consistent); PG_FUNCTION_INFO_V1(g_sbox_consistent); PG_FUNCTION_INFO_V1(g_spherekey_penalty); PG_FUNCTION_INFO_V1(g_spherekey_picksplit); /* * Returns the relationship between two keys as PGS_KEY_REL. */ uchar spherekey_interleave(const int32 *k1, const int32 *k2) { uchar i; char tb; /* i represents x,y,z */ tb = 0; for (i = 0; i < 3; i++) { tb |= ((k2[i] > k1[i + 3]) || (k1[i] > k2[i + 3])); if (tb) break; } if (tb) { return SCKEY_DISJ; } tb = 1; for (i = 0; i < 3; i++) { tb &= ((k1[i] == k2[i]) && (k1[i + 3] == k2[i + 3])); if (!tb) break; } if (tb) { return SCKEY_SAME; } tb = 1; for (i = 0; i < 3; i++) { tb &= (k1[i] <= k2[i] && k1[i + 3] >= k2[i + 3]); if (!tb) break; } if (tb) { /* v2 in v1 */ return SCKEY_IN; } return SCKEY_OVERLAP; } Datum spherekey_in(PG_FUNCTION_ARGS) { elog(ERROR, "Not implemented!"); PG_RETURN_POINTER(NULL); } Datum spherekey_out(PG_FUNCTION_ARGS) { const float8 ks = (float8) MAXCVALUE; int32 *k = (int32 *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(1024); sprintf(buffer, "(%.9f,%.9f,%.9f),(%.9f,%.9f,%.9f)", k[0] / ks, k[1] / ks, k[2] / ks, k[3] / ks, k[4] / ks, k[5] / ks); PG_RETURN_CSTRING(buffer); } static bool get_sizes(GiSTSPointKey *k, float8 sizes[3]) { int i; const float8 ks = (float8) MAXCVALUE; if (IS_LEAF(k)) return false; for (i = 0; i < 3; i++) { sizes[i] = (((uint64) k->k[i + 3] - (uint64) k->k[i]) + 1) / ks; } return true; } Datum pointkey_volume(PG_FUNCTION_ARGS) { GiSTSPointKey *k = (GiSTSPointKey *) PG_GETARG_POINTER(0); float8 sizes[3]; if (!get_sizes(k, sizes)) PG_RETURN_FLOAT8(0.0); PG_RETURN_FLOAT8(sizes[0] * sizes[1] * sizes[2]); } Datum pointkey_area(PG_FUNCTION_ARGS) { GiSTSPointKey *k = (GiSTSPointKey *) PG_GETARG_POINTER(0); float8 sizes[3]; if (!get_sizes(k, sizes)) PG_RETURN_FLOAT8(0.0); PG_RETURN_FLOAT8(sizes[0] * sizes[1] + sizes[0] * sizes[2] + sizes[1] * sizes[2]); } Datum pointkey_perimeter(PG_FUNCTION_ARGS) { GiSTSPointKey *k = (GiSTSPointKey *) PG_GETARG_POINTER(0); float8 sizes[3]; if (!get_sizes(k, sizes)) PG_RETURN_FLOAT8(0.0); PG_RETURN_FLOAT8(sizes[0] + sizes[1] + sizes[2]); } Datum pointkey_in(PG_FUNCTION_ARGS) { elog(ERROR, "Not implemented!"); PG_RETURN_POINTER(NULL); } Datum pointkey_out(PG_FUNCTION_ARGS) { const float8 ks = (float8) MAXCVALUE; GiSTSPointKey *k = (GiSTSPointKey *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(1024); if (IS_LEAF(k)) { sprintf(buffer, "(%.9f,%.9f)", k->lng, k->lat); } else { sprintf(buffer, "(%.9f,%.9f,%.9f),(%.9f,%.9f,%.9f)", k->k[0] / ks, k->k[1] / ks, k->k[2] / ks, k->k[3] / ks, k->k[4] / ks, k->k[5] / ks); } PG_RETURN_CSTRING(buffer); } Datum g_spherekey_decompress(PG_FUNCTION_ARGS) { PG_RETURN_DATUM(PG_GETARG_DATUM(0)); } /* * General compress method for all data types. Uses genkey to generate key * value (see key.c). */ #define PGS_COMPRESS(type, genkey, detoast) \ do \ { \ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); \ GISTENTRY *retval; \ if (entry->leafkey) \ { \ retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); \ if (DatumGetPointer(entry->key) != NULL) \ { \ int32 *k = (int32 *) palloc(KEYSIZE); \ if (detoast) \ genkey(k, (type *) DatumGetPointer(PG_DETOAST_DATUM(entry->key))); \ else \ genkey(k, (type *) DatumGetPointer(entry->key)); \ gistentryinit(*retval, PointerGetDatum(k), \ entry->rel, entry->page, \ entry->offset, false); \ } \ else \ { \ gistentryinit(*retval, (Datum) 0, \ entry->rel, entry->page, \ entry->offset, false); \ } \ } \ else \ { \ retval = entry; \ } \ PG_RETURN_POINTER(retval); \ } \ while (0) Datum g_scircle_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SCIRCLE, spherecircle_gen_key, 0); } Datum g_spoint_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SPoint, spherepoint_gen_key, 0); } Datum g_sline_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SLine, sphereline_gen_key, 0); } Datum g_spath_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SPATH, spherepath_gen_key, 1); } Datum g_spoly_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SPOLY, spherepoly_gen_key, 1); } Datum g_sellipse_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SELLIPSE, sphereellipse_gen_key, 0); } Datum g_sbox_compress(PG_FUNCTION_ARGS) { PGS_COMPRESS(SBOX, spherebox_gen_key, 0); } Datum g_spherekey_union(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *sizep = (int *) PG_GETARG_POINTER(1); int numranges, i; int32 *ret = (int32 *) palloc(KEYSIZE); numranges = entryvec->n; memcpy((void *) ret, (void *) DatumGetPointer(entryvec->vector[0].key), KEYSIZE); for (i = 1; i < numranges; i++) { spherekey_union_two(ret, (int32 *) DatumGetPointer(entryvec->vector[i].key)); } *sizep = KEYSIZE; PG_RETURN_POINTER(ret); } Datum g_spherekey_same(PG_FUNCTION_ARGS) { int32 *c1 = (int32 *) PG_GETARG_POINTER(0); int32 *c2 = (int32 *) PG_GETARG_POINTER(1); bool *result = (bool *) PG_GETARG_POINTER(2); int i; *result = true; if (c1 && c2) { for (i = 0; i < 6; i++) { *result &= (c1[i] == c2[i]); } } else { *result = (c1 == NULL && c2 == NULL) ? true : false; } PG_RETURN_POINTER(result); } /* * General interleave method with query cache. genkey function is used to * generate the key value. "dir" defines which value is the first for * spherekey_interleave: 0 - query key, 1 - entry key. */ #define SCK_INTERLEAVE(type, genkey, dir) \ do \ { \ int32 * q = NULL; \ if (!gq_cache_get_value (PGS_TYPE_##type, query, &q)) \ { \ q = (int32 *) malloc(KEYSIZE); \ genkey(q, (type * )query); \ gq_cache_set_value(PGS_TYPE_##type, query, q); \ free(q); \ gq_cache_get_value(PGS_TYPE_##type, query, &q); \ } \ if (dir) \ i = spherekey_interleave(ent, q); \ else \ i = spherekey_interleave(q , ent); \ } \ while (0) Datum g_spoint_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 13: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 14: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 15: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 16: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 39: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 40: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 41: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 42: SCK_INTERLEAVE(SBOX, spherebox_gen_key , 0); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_OVERLAP) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_scircle_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 22: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 23: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 24: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 25: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 26: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 27: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 44: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 45: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 46: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 47: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 48: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 49: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_sline_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: case 2: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_spath_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_spoly_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 22: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 23: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 24: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 25: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 26: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 27: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 44: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 45: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 46: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 47: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 48: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 49: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_sellipse_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 22: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 23: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 24: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 25: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 26: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 27: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 44: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 45: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 46: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 47: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 48: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 49: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } Datum g_sbox_consistent(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); void *query = (void *) PG_GETARG_POINTER(1); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool result = false; if (DatumGetPointer(entry->key) == NULL || !query) { PG_RETURN_BOOL(false); } else { bool *recheck = (bool *) PG_GETARG_POINTER(4); int32 *ent = (int32 *) DatumGetPointer(entry->key); int i = SCKEY_DISJ; *recheck = true; switch (strategy) { case 1: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 11: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 12: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 13: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 14: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 21: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 22: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 23: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 24: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 25: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 26: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 27: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; case 31: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 32: SCK_INTERLEAVE(SLine, sphereline_gen_key, 0); break; case 33: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 0); break; case 34: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 35: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 36: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 37: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 0); break; case 38: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 0); break; case 39: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 0); break; case 40: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 0); break; case 43: SCK_INTERLEAVE(SPoint, spherepoint_gen_key, 1); break; case 44: SCK_INTERLEAVE(SCIRCLE, spherecircle_gen_key, 1); break; case 45: SCK_INTERLEAVE(SLine, sphereline_gen_key, 1); break; case 46: SCK_INTERLEAVE(SPATH, spherepath_gen_key, 1); break; case 47: SCK_INTERLEAVE(SPOLY, spherepoly_gen_key, 1); break; case 48: SCK_INTERLEAVE(SELLIPSE, sphereellipse_gen_key, 1); break; case 49: SCK_INTERLEAVE(SBOX, spherebox_gen_key, 1); break; } if (GIST_LEAF(entry)) { switch (strategy) { case 1: if (i == SCKEY_SAME) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } else { switch (strategy) { case 1: if (i > SCKEY_OVERLAP) result = true; break; default: if (i > SCKEY_DISJ) result = true; break; } } PG_RETURN_BOOL(result); } PG_RETURN_BOOL(false); } typedef int32 coord_t; typedef struct { coord_t coord[3]; } Point3D; typedef struct { Point3D low; Point3D high; } Box3D; #ifdef NOT_USED static void checkBox3D(Box3D *box) { int i; for (i = 0; i < 3; i++) { if (box->low.coord[i] < -MAXCVALUE || box->low.coord[i] > MAXCVALUE) { elog(ERROR, "Invalid key!"); } if (box->high.coord[i] < -MAXCVALUE || box->high.coord[i] > MAXCVALUE) { elog(ERROR, "Invalid key!"); } } } #endif static void adjustBox3D(Box3D *b, Box3D *addon) { int i; for (i = 0; i < 3; i++) { if (b->high.coord[i] < addon->high.coord[i]) b->high.coord[i] = addon->high.coord[i]; if (b->low.coord[i] > addon->low.coord[i]) b->low.coord[i] = addon->low.coord[i]; } } static inline double sizeBox3D(Box3D *b) { return (double) ((int64) b->high.coord[0] - (int64) b->low.coord[0]) / MAXCVALUE * (double) ((int64) b->high.coord[1] - (int64) b->low.coord[1]) / MAXCVALUE * (double) ((int64) b->high.coord[2] - (int64) b->low.coord[2]) / MAXCVALUE; } static inline double unionSizeBox3D(Box3D *a, Box3D *b) { return (double) ((int64) Max(a->high.coord[0], b->high.coord[0]) - (int64) Min(a->low.coord[0], b->low.coord[0])) / MAXCVALUE * (double) ((int64) Max(a->high.coord[1], b->high.coord[1]) - (int64) Min(a->low.coord[1], b->low.coord[1])) / MAXCVALUE * (double) ((int64) Max(a->high.coord[2], b->high.coord[2]) - (int64) Min(a->low.coord[2], b->low.coord[2])) / MAXCVALUE; } /* * Trivial split: half of entries will be placed on one page * and another half - to another. */ static void fallbackSplit(Box3D *boxes, OffsetNumber maxoff, GIST_SPLITVEC *v) { OffsetNumber i; Box3D *unionL = NULL, *unionR = NULL; int nbytes; nbytes = (maxoff + 2) * sizeof(OffsetNumber); v->spl_left = (OffsetNumber *) palloc(nbytes); v->spl_right = (OffsetNumber *) palloc(nbytes); v->spl_nleft = v->spl_nright = 0; for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { Box3D *cur = &boxes[i]; if (i <= (maxoff - FirstOffsetNumber + 1) / 2) { v->spl_left[v->spl_nleft] = i; if (unionL == NULL) { unionL = (Box3D *) palloc(sizeof(Box3D)); *unionL = *cur; } else adjustBox3D(unionL, cur); v->spl_nleft++; } else { v->spl_right[v->spl_nright] = i; if (unionR == NULL) { unionR = (Box3D *) palloc(sizeof(Box3D)); *unionR = *cur; } else adjustBox3D(unionR, cur); v->spl_nright++; } } if (v->spl_ldatum_exists) adjustBox3D(unionL, (Box3D *) DatumGetPointer(v->spl_ldatum)); v->spl_ldatum = PointerGetDatum(unionL); if (v->spl_rdatum_exists) adjustBox3D(unionR, (Box3D *) DatumGetPointer(v->spl_rdatum)); v->spl_rdatum = PointerGetDatum(unionR); v->spl_ldatum_exists = v->spl_rdatum_exists = false; } /* * Represents information about an entry that can be placed to either group * without affecting overlap over selected axis ("common entry"). */ typedef struct { /* Index of entry in the initial array */ int index; /* Delta between penalties of entry insertion into different groups */ double delta; } CommonEntry; /* * Context for g_box_consider_split. Contains information about currently * selected split and some general information. */ typedef struct { int entriesCount; /* total number of entries being split */ Box3D boundingBox; /* minimum bounding box across all entries */ /* Information about currently selected split follows */ bool first; /* true if no split was selected yet */ coord_t leftUpper; /* upper bound of left interval */ coord_t rightLower; /* lower bound of right interval */ float4 ratio; float4 overlap; int dim; /* axis of this split */ double range; /* width of general MBR projection to the * selected axis */ } ConsiderSplitContext; /* * Interval represents projection of box to axis. */ typedef struct { coord_t lower, upper; } SplitInterval; /* * Interval comparison function by lower bound of the interval; */ static inline int interval_cmp_lower(const void *i1, const void *i2) { coord_t lower1 = ((const SplitInterval *) i1)->lower, lower2 = ((const SplitInterval *) i2)->lower; if (lower1 < lower2) return -1; else if (lower1 > lower2) return 1; else return 0; } /* * Interval comparison function by upper bound of the interval; */ static inline int interval_cmp_upper(const void *i1, const void *i2) { coord_t upper1 = ((const SplitInterval *) i1)->upper, upper2 = ((const SplitInterval *) i2)->upper; if (upper1 < upper2) return -1; else if (upper1 > upper2) return 1; else return 0; } /* * Replace negative value with zero. */ static inline float non_negative(float val) { if (val >= 0.0f) return val; else return 0.0f; } /* Minimum accepted ratio of split */ #define LIMIT_RATIO 0.3 /* * Consider replacement of currently selected split with the better one. */ static inline void g_box_consider_split(ConsiderSplitContext *context, int dimNum, coord_t rightLower, int minLeftCount, coord_t leftUpper, int maxLeftCount) { int leftCount, rightCount; float4 ratio, overlap; double range; /* * Calculate entries distribution ratio assuming most uniform distribution * of common entries. */ if (minLeftCount >= (context->entriesCount + 1) / 2) { leftCount = minLeftCount; } else { if (maxLeftCount <= context->entriesCount / 2) leftCount = maxLeftCount; else leftCount = context->entriesCount / 2; } rightCount = context->entriesCount - leftCount; /* * Ratio of split - quotient between size of lesser group and total * entries count. */ ratio = ((float4) Min(leftCount, rightCount)) / ((float4) context->entriesCount); if (ratio > LIMIT_RATIO) { bool selectthis = false; /* * The ratio is acceptable, so compare current split with previously * selected one. Between splits of one dimension we search for minimal * overlap (allowing negative values) and minimal ration (between same * overlaps. We switch dimension if find less overlap (non-negative) * or less range with same overlap. */ range = (float8) context->boundingBox.high.coord[dimNum] - (float8) context->boundingBox.low.coord[dimNum]; overlap = ((float8) leftUpper - (float8) rightLower) / range; /* If there is no previous selection, select this */ if (context->first) selectthis = true; else if (context->dim == dimNum) { /* * Within the same dimension, choose the new split if it has a * smaller overlap, or same overlap but better ratio. */ if (overlap < context->overlap || (overlap == context->overlap && ratio > context->ratio)) selectthis = true; } else { /* * Across dimensions, choose the new split if it has a smaller * *non-negative* overlap, or same *non-negative* overlap but * bigger range. This condition differs from the one described in * the article. On the datasets where leaf MBRs don't overlap * themselves, non-overlapping splits (i.e. splits which have zero * *non-negative* overlap) are frequently possible. In this case * splits tends to be along one dimension, because most distant * non-overlapping splits (i.e. having lowest negative overlap) * appears to be in the same dimension as in the previous split. * Therefore MBRs appear to be very prolonged along another * dimension, which leads to bad search performance. Using range * as the second split criteria makes MBRs more quadratic. Using * *non-negative* overlap instead of overlap as the first split * criteria gives to range criteria a chance to matter, because * non-overlapping splits are equivalent in this criteria. */ if (non_negative(overlap) < non_negative(context->overlap) || (range > context->range && non_negative(overlap) <= non_negative(context->overlap))) selectthis = true; } if (selectthis) { /* save information about selected split */ context->first = false; context->ratio = ratio; context->range = range; context->overlap = overlap; context->rightLower = rightLower; context->leftUpper = leftUpper; context->dim = dimNum; } } } /* * Compare common entries by their deltas. */ static int common_entry_cmp(const void *i1, const void *i2) { double delta1 = ((const CommonEntry *) i1)->delta, delta2 = ((const CommonEntry *) i2)->delta; if (delta1 < delta2) return -1; else if (delta1 > delta2) return 1; else return 0; } /* * -------------------------------------------------------------------------- * Double sorting split algorithm. This is used for both boxes and points. * * The algorithm finds split of boxes by considering splits along each axis. * Each entry is first projected as an interval on the X-axis, and different * ways to split the intervals into two groups are considered, trying to * minimize the overlap of the groups. Then the same is repeated for the * Y-axis, and the overall best split is chosen. The quality of a split is * determined by overlap along that axis and some other criteria (see * g_box_consider_split). * * After that, all the entries are divided into three groups: * * 1) Entries which should be placed to the left group * 2) Entries which should be placed to the right group * 3) "Common entries" which can be placed to any of groups without affecting * of overlap along selected axis. * * The common entries are distributed by minimizing penalty. * * For details see: * "A new double sorting-based node splitting algorithm for R-tree", A. Korotkov * http://syrcose.ispras.ru/2011/files/SYRCoSE2011_Proceedings.pdf#page=36 * -------------------------------------------------------------------------- */ static void do_picksplit(Box3D *boxes, OffsetNumber maxoff, GIST_SPLITVEC *v) { OffsetNumber i; ConsiderSplitContext context; Box3D *box, *leftBox, *rightBox; int dim, commonEntriesCount; SplitInterval *intervalsLower, *intervalsUpper; CommonEntry *commonEntries; int nentries; double leftBoxSize, rightBoxSize; memset(&context, 0, sizeof(ConsiderSplitContext)); nentries = context.entriesCount = maxoff - FirstOffsetNumber + 1; /* Allocate arrays for intervals along axes */ intervalsLower = (SplitInterval *) palloc(nentries * sizeof(SplitInterval)); intervalsUpper = (SplitInterval *) palloc(nentries * sizeof(SplitInterval)); /* * Calculate the overall minimum bounding box over all the entries. */ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { box = &boxes[i]; if (i == FirstOffsetNumber) context.boundingBox = *box; else adjustBox3D(&context.boundingBox, box); } /* * Iterate over axes for optimal split searching. */ context.first = true; /* nothing selected yet */ for (dim = 0; dim < 3; dim++) { coord_t leftUpper, rightLower; int i1, i2; /* Project each entry as an interval on the selected axis. */ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { box = &boxes[i]; intervalsLower[i - FirstOffsetNumber].lower = box->low.coord[dim]; intervalsLower[i - FirstOffsetNumber].upper = box->high.coord[dim]; } /* * Make two arrays of intervals: one sorted by lower bound and another * sorted by upper bound. */ memcpy(intervalsUpper, intervalsLower, sizeof(SplitInterval) * nentries); qsort(intervalsLower, nentries, sizeof(SplitInterval), interval_cmp_lower); qsort(intervalsUpper, nentries, sizeof(SplitInterval), interval_cmp_upper); /*---- * The goal is to form a left and right interval, so that every entry * interval is contained by either left or right interval (or both). * * For example, with the intervals (0,1), (1,3), (2,3), (2,4): * * 0 1 2 3 4 * +-+ * +---+ * +-+ * +---+ * * The left and right intervals are of the form (0,a) and (b,4). * We first consider splits where b is the lower bound of an entry. * We iterate through all entries, and for each b, calculate the * smallest possible a. Then we consider splits where a is the * uppper bound of an entry, and for each a, calculate the greatest * possible b. * * In the above example, the first loop would consider splits: * b=0: (0,1)-(0,4) * b=1: (0,1)-(1,4) * b=2: (0,3)-(2,4) * * And the second loop: * a=1: (0,1)-(1,4) * a=3: (0,3)-(2,4) * a=4: (0,4)-(2,4) */ /* * Iterate over lower bound of right group, finding smallest possible * upper bound of left group. */ i1 = 0; i2 = 0; rightLower = intervalsLower[i1].lower; leftUpper = intervalsUpper[i2].lower; while (true) { /* * Find next lower bound of right group. */ while (i1 < nentries && rightLower == intervalsLower[i1].lower) { leftUpper = Max(leftUpper, intervalsLower[i1].upper); i1++; } if (i1 >= nentries) break; rightLower = intervalsLower[i1].lower; /* * Find count of intervals which anyway should be placed to the * left group. */ while (i2 < nentries && intervalsUpper[i2].upper <= leftUpper) i2++; /* * Consider found split. */ g_box_consider_split(&context, dim, rightLower, i1, leftUpper, i2); } /* * Iterate over upper bound of left group finding greates possible * lower bound of right group. */ i1 = nentries - 1; i2 = nentries - 1; rightLower = intervalsLower[i1].upper; leftUpper = intervalsUpper[i2].upper; while (true) { /* * Find next upper bound of left group. */ while (i2 >= 0 && leftUpper == intervalsUpper[i2].upper) { rightLower = Min(rightLower, intervalsUpper[i2].lower); i2--; } if (i2 < 0) break; leftUpper = intervalsUpper[i2].upper; /* * Find count of intervals which anyway should be placed to the * right group. */ while (i1 >= 0 && intervalsLower[i1].lower >= rightLower) i1--; /* * Consider found split. */ g_box_consider_split(&context, dim, rightLower, i1 + 1, leftUpper, i2 + 1); } } /* * If we failed to find any acceptable splits, use trivial split. */ if (context.first) { fallbackSplit(boxes, maxoff, v); return; } /* * Ok, we have now selected the split across one axis. * * While considering the splits, we already determined that there will be * enough entries in both groups to reach the desired ratio, but we did * not memorize which entries go to which group. So determine that now. */ /* Allocate vectors for results */ v->spl_left = (OffsetNumber *) palloc(nentries * sizeof(OffsetNumber)); v->spl_right = (OffsetNumber *) palloc(nentries * sizeof(OffsetNumber)); v->spl_nleft = 0; v->spl_nright = 0; /* Allocate bounding boxes of left and right groups */ leftBox = palloc0(sizeof(Box3D)); rightBox = palloc0(sizeof(Box3D)); leftBoxSize = sizeBox3D(leftBox); rightBoxSize = sizeBox3D(rightBox); /* * Allocate an array for "common entries" - entries which can be placed to * either group without affecting overlap along selected axis. */ commonEntriesCount = 0; commonEntries = (CommonEntry *) palloc(nentries * sizeof(CommonEntry)); /* Helper macros to place an entry in the left or right group */ #define PLACE_LEFT(box, off) \ do { \ if (v->spl_nleft > 0) \ adjustBox3D(leftBox, box); \ else \ *leftBox = *(box); \ v->spl_left[v->spl_nleft++] = off; \ } while(0) #define PLACE_RIGHT(box, off) \ do { \ if (v->spl_nright > 0) \ adjustBox3D(rightBox, box); \ else \ *rightBox = *(box); \ v->spl_right[v->spl_nright++] = off; \ } while(0) /* * Distribute entries which can be distributed unambiguously, and collect * common entries. */ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { coord_t lower, upper; /* * Get upper and lower bounds along selected axis. */ box = &boxes[i]; lower = box->low.coord[context.dim]; upper = box->high.coord[context.dim]; if (upper <= context.leftUpper) { /* Fits to the left group */ if (lower >= context.rightLower) { /* Fits also to the right group, so "common entry" */ commonEntries[commonEntriesCount++].index = i; } else { /* Doesn't fit to the right group, so join to the left group */ PLACE_LEFT(box, i); /* checkBox3D(leftBox); */ } } else { /* * Each entry should fit on either left or right group. Since this * entry didn't fit on the left group, it better fit in the right * group. */ Assert(lower >= context.rightLower); /* Doesn't fit to the left group, so join to the right group */ PLACE_RIGHT(box, i); /* checkBox3D(rightBox); */ } } /* * Distribute "common entries", if any. */ if (commonEntriesCount > 0) { /* * Calculate minimum number of entries that must be placed in both * groups, to reach LIMIT_RATIO. */ int m = ceil(LIMIT_RATIO * (double) nentries); /* * Calculate delta between penalties of join "common entries" to * different groups. */ for (i = 0; i < commonEntriesCount; i++) { box = &boxes[i]; commonEntries[i].delta = Abs((unionSizeBox3D(leftBox, box) - leftBoxSize) - (unionSizeBox3D(rightBox, box) - rightBoxSize)); } /* * Sort "common entries" by calculated deltas in order to distribute * the most ambiguous entries first. */ qsort(commonEntries, commonEntriesCount, sizeof(CommonEntry), common_entry_cmp); /* * Distribute "common entries" between groups. */ for (i = 0; i < commonEntriesCount; i++) { box = &boxes[commonEntries[i].index]; /* * Check if we have to place this entry in either group to achieve * LIMIT_RATIO. */ if (v->spl_nleft + (commonEntriesCount - i) <= m) { PLACE_LEFT(box, commonEntries[i].index); /* checkBox3D(leftBox); */ } else if (v->spl_nright + (commonEntriesCount - i) <= m) { PLACE_RIGHT(box, commonEntries[i].index); /* checkBox3D(rightBox); */ } else { /* Otherwise select the group by minimal penalty */ if (unionSizeBox3D(leftBox, box) - leftBoxSize < unionSizeBox3D(rightBox, box) - rightBoxSize) { PLACE_LEFT(box, commonEntries[i].index); /* checkBox3D(leftBox); */ } else { PLACE_RIGHT(box, commonEntries[i].index); /* checkBox3D(rightBox); */ } } } } /* * checkBox3D(leftBox); checkBox3D(rightBox); */ v->spl_ldatum = PointerGetDatum(leftBox); v->spl_rdatum = PointerGetDatum(rightBox); } Datum g_spherekey_picksplit(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); OffsetNumber i, maxoff; Box3D *boxes; maxoff = entryvec->n - 1; boxes = (Box3D *) palloc(sizeof(Box3D) * entryvec->n); for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) boxes[i] = *((Box3D *) DatumGetPointer(entryvec->vector[i].key)); do_picksplit(boxes, maxoff, v); PG_RETURN_POINTER(v); } /* * The GiST Penalty method for boxes. We have to make panalty as fast as * possible ( offen called ! ) */ Datum g_spherekey_penalty(PG_FUNCTION_ARGS) { GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0); GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1); float *result = (float *) PG_GETARG_POINTER(2); Box3D *o = (Box3D *) DatumGetPointer(origentry->key); if (newentry != NULL) { Box3D *n = (Box3D *) DatumGetPointer(newentry->key); *result = (float) (((uint64) (Max(o->high.coord[0], n->high.coord[0]) - Min(o->low.coord[0], n->low.coord[0])) >> 10) * ((uint64) (Max(o->high.coord[1], n->high.coord[1]) - Min(o->low.coord[1], n->low.coord[1])) >> 10) * ((uint64) (Max(o->high.coord[2], n->high.coord[2]) - Min(o->low.coord[2], n->low.coord[2])) >> 10) - ((uint64) (o->high.coord[0] - o->low.coord[0]) >> 10) * ((uint64) (o->high.coord[1] - o->low.coord[1]) >> 10) * ((uint64) (o->high.coord[2] - o->low.coord[2]) >> 10)); PG_RETURN_POINTER(result); } else { PG_RETURN_POINTER(NULL); } } pgsphere/gist.h000066400000000000000000000071201332443031700140120ustar00rootroot00000000000000#ifndef __PGS_GIST_H__ #define __PGS_GIST_H__ #include "key.h" /* * GIST index declarations */ /* An alias for unsigned char */ typedef unsigned char uchar; /* PGS_KEY_REL Key relationships */ #define SCKEY_DISJ 0 /* two keys are disjunct */ #define SCKEY_OVERLAP 1 /* two keys are overlapping */ #define SCKEY_IN 2 /* first key contains second key */ #define SCKEY_SAME 3 /* keys are equal */ uchar spherekey_interleave(const int32 *k1, const int32 *k2); /* * For given "query" of "pgstype" of PGS_DATA_TYPES type, puts key of cached * query into "key" pointer. Returns true when given query is equal to * current query. */ bool gq_cache_get_value(unsigned pgstype, const void *query, int32 **key); /* * Copy current query, type and its key value to cache. */ void gq_cache_set_value(unsigned pgstype, const void *query, const int32 *key); /* * Input function of key value. Just a dummy. But PostgreSQL need this * function to create a data type. */ Datum spherekey_in(PG_FUNCTION_ARGS); /* * Output function of key value. Just a dummy. But PostgreSQL need this * function to create a data type. */ Datum spherekey_out(PG_FUNCTION_ARGS); /* * GIST's decompress method. This function does nothing. */ Datum g_spherekey_decompress(PG_FUNCTION_ARGS); /* * GIST's compress method for circle. Creates the key value from a spherical * circle. */ Datum g_scircle_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for point. Creates the key value from a spherical point. */ Datum g_spoint_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for line. Creates the key value from a spherical line. */ Datum g_sline_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for path. Creates the key value from a spherical path. */ Datum g_spath_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for polygon. Creates the key value from a spherical * polygon. */ Datum g_spoly_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for ellipse. Creates the key value from a spherical * ellipse. */ Datum g_sellipse_compress(PG_FUNCTION_ARGS); /* * GIST's compress method for box. Creates the key value from a spherical box. */ Datum g_sbox_compress(PG_FUNCTION_ARGS); /* * The GiST Union method for boxes. Returns the minimal bounding box that * encloses all the entries in entryvec. */ Datum g_spherekey_union(PG_FUNCTION_ARGS); /* * GIST's equality method. */ Datum g_spherekey_same(PG_FUNCTION_ARGS); /* * GIST's consistent method for a point. */ Datum g_spoint_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for a circle. */ Datum g_scircle_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for a line. */ Datum g_sline_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for a path. */ Datum g_spath_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for a polygon. */ Datum g_spoly_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for an ellipse. */ Datum g_sellipse_consistent(PG_FUNCTION_ARGS); /* * GIST's consistent method for a box. */ Datum g_sbox_consistent(PG_FUNCTION_ARGS); /* * GIST's penalty method. */ Datum g_spherekey_penalty(PG_FUNCTION_ARGS); /* * GIST's picksplit method. This method is using the double sorting node * splitting algorithm for R-Trees. See "A new double sorting-based node * splitting algorithm for R-tree", A. Korotkov. */ Datum g_spherekey_picksplit(PG_FUNCTION_ARGS); Datum pointkey_in(PG_FUNCTION_ARGS); Datum pointkey_out(PG_FUNCTION_ARGS); Datum pointkey_volume(PG_FUNCTION_ARGS); Datum pointkey_area(PG_FUNCTION_ARGS); Datum pointkey_perimeter(PG_FUNCTION_ARGS); #endif pgsphere/gnomo.c000066400000000000000000000033721332443031700141630ustar00rootroot00000000000000#include #include #include /* Point */ #include /* SPoint from pgsphere */ #include PG_FUNCTION_INFO_V1(gnomonic_proj); PG_FUNCTION_INFO_V1(gnomonic_inv); /* * Direct gnomonic projection. * * point gnomonic_proj(spoint spherical_point, spoint tangential_point) */ Datum gnomonic_proj(PG_FUNCTION_ARGS) { Point* g = (Point*) palloc(sizeof(Point)); SPoint* p = (SPoint*) PG_GETARG_POINTER(0); SPoint* t = (SPoint*) PG_GETARG_POINTER(1); double delta_lng = p->lng - t->lng; double sin_lat = sin(p->lat); double cos_lat = cos(p->lat); double sin_lat_t = sin(t->lat); double cos_lat_t = cos(t->lat); double sin_delta = sin(delta_lng); double cos_delta = cos(delta_lng); double cos_lat__cos_delta = cos_lat * cos_delta; double cos_dist = sin_lat_t * sin_lat + cos_lat_t * cos_lat__cos_delta; g->x = cos_lat * sin_delta / cos_dist; g->y = (cos_lat_t * sin_lat - sin_lat_t * cos_lat__cos_delta) / cos_dist; if (p->lng == t->lng && p->lat == t->lat) { g->x = 0; g->y = 0; } PG_RETURN_POINTER(g); } /* * Inverse gnomonic projection. * * spoint gnomonic_inv(point plane_point, spoint tangential_point) */ Datum gnomonic_inv(PG_FUNCTION_ARGS) { SPoint* p = (SPoint*) palloc(sizeof(SPoint)); Point* g = (Point*) PG_GETARG_POINTER(0); SPoint* t = (SPoint*) PG_GETARG_POINTER(1); double rho_sq = g->x * g->x + g->y * g->y; double rho = sqrt(rho_sq); double cos_c = 1 / sqrt(1 + rho_sq); double sin_c = 1 / sqrt(1 + 1 / rho_sq); double cos_lat_t = cos(t->lat); double sin_lat_t = sin(t->lat); p->lng = t->lng + atan2(g->x * sin_c, rho * cos_lat_t * cos_c - g->y * sin_lat_t * sin_c); p->lat = asin(cos_c * sin_lat_t + g->y *sin_c * cos_lat_t / rho); PG_RETURN_POINTER(p); } pgsphere/gnomo.sql.in000066400000000000000000000010011332443031700151300ustar00rootroot00000000000000-- gnomonic projection and its inverse CREATE FUNCTION gnomonic_proj(spoint, spoint) RETURNS point AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION gnomonic_proj(spoint, spoint) IS 'gnomonic projection, the second argument is the tangential point'; CREATE FUNCTION gnomonic_inv(point, spoint) RETURNS spoint AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION gnomonic_inv(point, spoint) IS 'inverse of gnomonic projection, the second argument is the tangential point'; pgsphere/gq_cache.c000066400000000000000000000057561332443031700146060ustar00rootroot00000000000000#include "gist.h" /* * GIST's query cache */ /* Holds the parent type of PGS_DATA_TYPES for cached key. */ static unsigned keytype = 0; /* the cached key */ static int32 kcache[6]; /* pointer to cached query */ static void *cquery = NULL; /* Holds the count of points, if cached query is a path or polygon. */ static int32 npts = 0; /* If query type and value are equal, this value is true */ static bool res = false; /* * Depending on type of PGS_DATA_TYPES, compare current query and cached query. * If query cache and current query are equal, set ref to true. */ #define GQ_MEMCMP(type) \ do \ { \ if (keytype == PGS_TYPE_##type) \ { \ if (memcmp((void *) cquery, (void *) query, sizeof(type)) == 0) res = true; \ } \ } while(0); bool gq_cache_get_value(unsigned pgstype, const void *query, int32 **key) { if (keytype == 0) { return false; } else { res = false; switch (pgstype) { case PGS_TYPE_SPoint: GQ_MEMCMP(SPoint); break; case PGS_TYPE_SCIRCLE: GQ_MEMCMP(SCIRCLE); break; case PGS_TYPE_SELLIPSE: GQ_MEMCMP(SELLIPSE); break; case PGS_TYPE_SLine: GQ_MEMCMP(SLine); break; case PGS_TYPE_SBOX: GQ_MEMCMP(SBOX); break; case PGS_TYPE_SPATH: if (keytype == pgstype && ((SPATH *) query)->npts == npts) { if (memcmp((void *) cquery, (void *) &((SPATH *) query)->p, ((SPATH *) query)->size) == 0) res = true; } break; case PGS_TYPE_SPOLY: if (keytype == pgstype && ((SPOLY *) query)->npts == npts) { if (memcmp((void *) cquery, (void *) &((SPOLY *) query)->p, ((SPOLY *) query)->size) == 0) res = true; } break; default: res = false; break; } if (res) { *key = &kcache[0]; } return res; } return false; } /* * Depending on type of PGS_DATA_TYPES, copy current query to cache. */ #define GQ_MEMCPY(type) \ do \ { \ cquery = (void *) malloc(sizeof(type)); \ memcpy((void *) cquery, (void *) query, sizeof(type)); \ } while(0); void gq_cache_set_value(unsigned pgstype, const void *query, const int32 *key) { if (cquery) { free(cquery); cquery = NULL; } keytype = pgstype; switch (pgstype) { case PGS_TYPE_SPoint: GQ_MEMCPY(SPoint); break; case PGS_TYPE_SCIRCLE: GQ_MEMCPY(SCIRCLE); break; case PGS_TYPE_SELLIPSE: GQ_MEMCPY(SELLIPSE); break; case PGS_TYPE_SLine: GQ_MEMCPY(SLine); break; case PGS_TYPE_SBOX: GQ_MEMCPY(SBOX); break; case PGS_TYPE_SPATH: cquery = (void *) malloc(((SPATH *) query)->size); npts = ((SPATH *) query)->npts; memcpy((void *) cquery, (void *) &((SPATH *) query)->p, ((SPATH *) query)->size); break; case PGS_TYPE_SPOLY: cquery = (void *) malloc(((SPOLY *) query)->size); npts = ((SPOLY *) query)->npts; memcpy((void *) cquery, (void *) &((SPOLY *) query)->p, ((SPOLY *) query)->size); break; default: keytype = 0; } if (keytype > 0) { memcpy((void *) &kcache[0], (void *) key, KEYSIZE); } } pgsphere/key.c000066400000000000000000000212041332443031700136260ustar00rootroot00000000000000#include "key.h" #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif /* Functions to create the key values */ /* * Unites a key with the key value of a point. */ static void key_add_point(int32 *key, const SPoint *p) { int32 k[6]; spherepoint_gen_key(&k[0], p); spherekey_union_two(key, &k[0]); } void spherekey_union_two(int32 *kunion, const int32 *key) { kunion[0] = Min(kunion[0], key[0]); kunion[1] = Min(kunion[1], key[1]); kunion[2] = Min(kunion[2], key[2]); kunion[3] = Max(kunion[3], key[3]); kunion[4] = Max(kunion[4], key[4]); kunion[5] = Max(kunion[5], key[5]); } bool spherekey_inter_two(int32 *kinter, const int32 *key) { if (kinter[3] < key[0] || key[3] < kinter[0]) return false; if (kinter[4] < key[1] || key[4] < kinter[1]) return false; if (kinter[5] < key[2] || key[5] < kinter[2]) return false; kinter[0] = Max(kinter[0], key[0]); kinter[1] = Max(kinter[1], key[1]); kinter[2] = Max(kinter[2], key[2]); kinter[3] = Min(kinter[3], key[3]); kinter[4] = Min(kinter[4], key[4]); kinter[5] = Min(kinter[5], key[5]); return true; } void spherepoint_gen_key(int32 *k, const SPoint *sp) { Vector3D v; const int32 ks = MAXCVALUE; spoint_vector3d(&v, sp); if (v.x < -1.0) v.x = -1.0; if (v.y < -1.0) v.y = -1.0; if (v.z < -1.0) v.z = -1.0; if (v.x > 1.0) v.x = 1.0; if (v.y > 1.0) v.y = 1.0; if (v.z > 1.0) v.z = 1.0; k[0] = v.x * ks; k[1] = v.y * ks; k[2] = v.z * ks; k[3] = v.x * ks; k[4] = v.y * ks; k[5] = v.z * ks; } void spherecircle_gen_key(int32 *k, const SCIRCLE *c) { double r, d; const int32 ks = MAXCVALUE; int i; Vector3D v[8]; Vector3D tv; Vector3D mm[2]; SEuler se; r = sin(c->radius); d = cos(c->radius); v[0].x = -r; v[0].y = -r; v[0].z = d; v[1].x = -r; v[1].y = +r; v[1].z = d; v[2].x = +r; v[2].y = -r; v[2].z = d; v[3].x = +r; v[3].y = +r; v[3].z = d; v[4].x = -r; v[4].y = -r; v[4].z = 1.0; v[5].x = -r; v[5].y = +r; v[5].z = 1.0; v[6].x = +r; v[6].y = -r; v[6].z = 1.0; v[7].x = +r; v[7].y = +r; v[7].z = 1.0; se.psi_a = EULER_AXIS_X; se.theta_a = EULER_AXIS_Z; se.phi_a = EULER_AXIS_X; se.phi = PIH - c->center.lat; se.theta = PIH + c->center.lng; se.psi = 0.0; /* min */ mm[0].x = mm[0].y = mm[0].z = 1.0; /* max */ mm[1].x = mm[1].y = mm[1].z = -1.0; for (i = 0; i < 8; i++) { euler_vector_trans(&tv, &v[i], &se); if (tv.x >= -1.0 && tv.x <= 1.0) { mm[0].x = Min(mm[0].x, tv.x); mm[1].x = Max(mm[1].x, tv.x); } else if (tv.x < -1.0) { mm[0].x = -1.0; } else if (tv.x > 1.0) { mm[1].x = 1.0; } if (tv.y >= -1.0 && tv.y <= 1.0) { mm[0].y = Min(mm[0].y, tv.y); mm[1].y = Max(mm[1].y, tv.y); } else if (tv.y < -1.0) { mm[0].y = -1.0; } else if (tv.y > 1.0) { mm[1].y = 1.0; } if (tv.z >= -1.0 && tv.z <= 1.0) { mm[0].z = Min(mm[0].z, tv.z); mm[1].z = Max(mm[1].z, tv.z); } else if (tv.z < -1.0) { mm[0].z = -1.0; } else if (tv.z > 1.0) { mm[1].z = 1.0; } } k[0] = mm[0].x * ks; k[1] = mm[0].y * ks; k[2] = mm[0].z * ks; k[3] = mm[1].x * ks; k[4] = mm[1].y * ks; k[5] = mm[1].z * ks; } void sphereellipse_gen_key(int32 *k, const SELLIPSE *e) { double r[2], d; const int32 ks = MAXCVALUE; int i; Vector3D v[8]; Vector3D tv; Vector3D mm[2]; SEuler se; r[0] = sin(e->rad[0]); r[1] = sin(e->rad[1]); d = cos(e->rad[0]); v[0].x = d; v[0].y = -r[0]; v[0].z = -r[1]; v[1].x = d; v[1].y = +r[0]; v[1].z = -r[1]; v[2].x = d; v[2].y = -r[0]; v[2].z = +r[1]; v[3].x = d; v[3].y = +r[0]; v[3].z = +r[1]; v[4].x = 1.0; v[4].y = -r[0]; v[4].z = -r[1]; v[5].x = 1.0; v[5].y = +r[0]; v[5].z = -r[1]; v[6].x = 1.0; v[6].y = -r[0]; v[6].z = +r[1]; v[7].x = 1.0; v[7].y = +r[0]; v[7].z = +r[1]; sellipse_trans(&se, e); /* min */ mm[0].x = mm[0].y = mm[0].z = 1.0; /* max */ mm[1].x = mm[1].y = mm[1].z = -1.0; for (i = 0; i < 8; i++) { euler_vector_trans(&tv, &v[i], &se); if (tv.x >= -1.0 && tv.x <= 1.0) { mm[0].x = Min(mm[0].x, tv.x); mm[1].x = Max(mm[1].x, tv.x); } else if (tv.x < -1.0) { mm[0].x = -1.0; } else if (tv.x > 1.0) { mm[1].x = 1.0; } if (tv.y >= -1.0 && tv.y <= 1.0) { mm[0].y = Min(mm[0].y, tv.y); mm[1].y = Max(mm[1].y, tv.y); } else if (tv.y < -1.0) { mm[0].y = -1.0; } else if (tv.y > 1.0) { mm[1].y = 1.0; } if (tv.z >= -1.0 && tv.z <= 1.0) { mm[0].z = Min(mm[0].z, tv.z); mm[1].z = Max(mm[1].z, tv.z); } else if (tv.z < -1.0) { mm[0].z = -1.0; } else if (tv.z > 1.0) { mm[1].z = 1.0; } } k[0] = mm[0].x * ks; k[1] = mm[0].y * ks; k[2] = mm[0].z * ks; k[3] = mm[1].x * ks; k[4] = mm[1].y * ks; k[5] = mm[1].z * ks; } void sphereline_gen_key(int32 *k, const SLine *sl) { const int32 ks = MAXCVALUE; SPoint p[3]; sline_begin(&p[0], sl); sline_end(&p[1], sl); if (FPzero(sl->length)) { Vector3D vbeg, vend; spoint_vector3d(&vbeg, &p[0]); spoint_vector3d(&vend, &p[1]); k[0] = Min(vbeg.x, vend.x) * ks; k[1] = Min(vbeg.y, vend.y) * ks; k[2] = Min(vbeg.z, vend.z) * ks; k[3] = Max(vbeg.x, vend.x) * ks; k[4] = Max(vbeg.y, vend.y) * ks; k[5] = Max(vbeg.z, vend.z) * ks; } else { Vector3D v[4], vt, vr[2]; SEuler se; float8 l, ls, lc; int8 i; sphereline_to_euler(&se, sl); l = sl->length / 2.0; ls = sin(l); lc = cos(l); se.phi += l; v[0].x = lc; v[0].y = ((lc < 0) ? (-1.0) : (-ls)); v[1].x = 1.0; v[1].y = ((lc < 0) ? (-1.0) : (-ls)); v[2].x = lc; v[2].y = ((lc < 0) ? (+1.0) : (+ls)); v[3].x = 1.0; v[3].y = ((lc < 0) ? (+1.0) : (+ls)); v[0].z = v[1].z = v[2].z = v[3].z = 0.0; vr[0].x = vr[0].y = vr[0].z = 1.0; vr[1].x = vr[1].y = vr[1].z = -1.0; for (i = 0; i < 4; i++) { euler_vector_trans(&vt, &v[i], &se); if (vt.x < -1.0) { vt.x = -1.0; } if (vt.y < -1.0) { vt.y = -1.0; } if (vt.z < -1.0) { vt.z = -1.0; } if (vt.x > 1.0) { vt.x = 1.0; } if (vt.y > 1.0) { vt.y = 1.0; } if (vt.z > 1.0) { vt.z = 1.0; } vr[0].x = Min(vr[0].x, vt.x); vr[1].x = Max(vr[1].x, vt.x); vr[0].y = Min(vr[0].y, vt.y); vr[1].y = Max(vr[1].y, vt.y); vr[0].z = Min(vr[0].z, vt.z); vr[1].z = Max(vr[1].z, vt.z); } k[0] = vr[0].x * ks; k[1] = vr[0].y * ks; k[2] = vr[0].z * ks; k[3] = vr[1].x * ks; k[4] = vr[1].y * ks; k[5] = vr[1].z * ks; } } /* * Creates the key of a polygon. */ void spherepoly_gen_key(int32 *key, const SPOLY *sp) { int32 i; SLine l; SPoint p; int32 tk[6]; bool start = true; for (i = 0; i < sp->npts; i++) { sline_from_points(&l, &sp->p[i], &sp->p[(i + 1) % sp->npts]); sphereline_gen_key(&tk[0], &l); if (start) { start = false; memcpy((void *) key, (void *) &tk[0], KEYSIZE); } else { key[0] = Min(key[0], tk[0]); key[1] = Min(key[1], tk[1]); key[2] = Min(key[2], tk[2]); key[3] = Max(key[3], tk[3]); key[4] = Max(key[4], tk[4]); key[5] = Max(key[5], tk[5]); } p.lng = 0.0; p.lat = PIH; if (spoly_contains_point(sp, &p)) { key[5] = MAXCVALUE; } p.lat = -PIH; if (spoly_contains_point(sp, &p)) { key[2] = -MAXCVALUE; } p.lat = 0.0; if (spoly_contains_point(sp, &p)) { key[3] = MAXCVALUE; } p.lng = PI; if (spoly_contains_point(sp, &p)) { key[0] = -MAXCVALUE; } p.lng = PIH; if (spoly_contains_point(sp, &p)) { key[4] = MAXCVALUE; } p.lng = PI + PIH; if (spoly_contains_point(sp, &p)) { key[1] = -MAXCVALUE; } } } void spherepath_gen_key(int32 *key, const SPATH *sp) { int32 i; SLine l; int32 tk[6]; bool start = true; for (i=0; i < sp->npts - 1; i++) { sline_from_points(&l, &sp->p[i], &sp->p[i + 1]); sphereline_gen_key(&tk[0], &l); if (start) { start = false; memcpy((void *) key, (void *) &tk[0], KEYSIZE); } else { key[0] = Min(key[0], tk[0]); key[1] = Min(key[1], tk[1]); key[2] = Min(key[2], tk[2]); key[3] = Max(key[3], tk[3]); key[4] = Max(key[4], tk[4]); key[5] = Max(key[5], tk[5]); } } } void spherebox_gen_key(int32 *key, const SBOX *box) { SPoint p; float8 d; key[0] = key[1] = key[2] = MAXCVALUE; key[3] = key[4] = key[5] = -MAXCVALUE; /* add the 4 edges */ key_add_point(key, &box->sw); key_add_point(key, &box->ne); p.lng = box->sw.lng; p.lat = box->ne.lat; key_add_point(key, &p); p.lng = box->ne.lng; p.lat = box->sw.lat; key_add_point(key, &p); /* latitude closest to equator */ if (FPge(box->ne.lat, 0.0) && FPle(box->sw.lat, 0.0)) { p.lat = 0.0; } else if (fabs(box->ne.lat) > fabs(box->sw.lat)) { p.lat = box->sw.lat; } else { p.lat = box->ne.lat; } for (d = 0.0; d < (PID - 0.1); d += PIH) { p.lng = d; if (sbox_cont_point(box, &p)) { key_add_point(key, &p); } } } pgsphere/key.h000066400000000000000000000103371332443031700136400ustar00rootroot00000000000000#ifndef __PGS_KEY_H__ #define __PGS_KEY_H__ #include "types.h" /* Declarations of key build functions */ #define KEYSIZE 24 /* the key size for one entry */ #define BPCKSIZE (KEYSIZE/6) /* the key size for one entry per coordinate */ /* * The coordinate value has to be between -MAXCVALUE .. MAXCVALUE */ #define MAXCVALUE ( (1 << (8 * BPCKSIZE - 2)) - 1 ) typedef struct { int32 vl_len_; union { struct { float4 lat, lng; }; struct { int32 k[6]; }; }; } GiSTSPointKey; #define INTERNAL_KEY_SIZE (VARHDRSZ + sizeof(int32) * 6) #define LEAF_KEY_SIZE (VARHDRSZ + sizeof(float4) * 2) #define IS_LEAF(key) (VARSIZE(key) == LEAF_KEY_SIZE) #define ALLOC_LEAF_KEY(key) do { \ key = (GiSTSPointKey *)palloc0(LEAF_KEY_SIZE); \ SET_VARSIZE(key, LEAF_KEY_SIZE); \ } while (0) ; #define ALLOC_INTERNAL_KEY(key) do { \ key = (GiSTSPointKey *)palloc0(INTERNAL_KEY_SIZE); \ SET_VARSIZE(key, INTERNAL_KEY_SIZE); \ } while (0) ; /* * Returns the union of two keys. Result is placed into 'kunion'. */ void spherekey_union_two(int32 *kunion, const int32 *key); /* * Returns the intersection of two keys. Returns NULL if there is * no intersection. Result is placed into 'kinter'. */ bool spherekey_inter_two(int32 *kinter, const int32 *key); /* * Generates the key of a spherical point and returns it. Result is placed * into 'k'. */ void spherepoint_gen_key(int32 *k, const SPoint *sp); /* * Generates the circle's key and returns it. Result is placed into 'k'. */ void spherecircle_gen_key(int32 *k, const SCIRCLE *c); /* * Generates the key of a spherical ellipse and returns it. Result is placed * into 'k'. */ void sphereellipse_gen_key(int32 *k, const SELLIPSE *e); /* * Generates the key of a spherical line and returns it. Result is placed * into 'k'. */ void sphereline_gen_key(int32 *k, const SLine *sl); /* * Generates the key of a polygon and returns it. Result is placed into 'k'. */ void spherepoly_gen_key(int32 *k, const SPOLY *sp); /* * Generates the key of a path and returns it. Result is placed into 'k'. */ void spherepath_gen_key(int32 *k, const SPATH *sp); /* * Generates the key of a box and returns it. Result is placed into 'k'. */ void spherebox_gen_key(int32 *key, const SBOX *box); /* * Returns true if the first key is less than the second key. */ Datum spherekey_lt(PG_FUNCTION_ARGS); /* * Returns true if the first key is less or equal than the second key. */ Datum spherekey_le(PG_FUNCTION_ARGS); /* * Returns true if two keys are equal. */ Datum spherekey_eq(PG_FUNCTION_ARGS); /* * Returns true if two keys are not equal. */ Datum spherekey_eq_neg(PG_FUNCTION_ARGS); /* * Returns true if the first key is greater or equal than the second key. */ Datum spherekey_ge(PG_FUNCTION_ARGS); /* * Returns true if the first key is greater than the second key. */ Datum spherekey_gt(PG_FUNCTION_ARGS); /* * Returns relationship between the two keys. * Calls skey_cmp(const int32 *, const int32 *) for two keys. */ Datum spherekey_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical points. * Calls skey_cmp(const int32 *, const int32 *) for two points. */ Datum spherepoint_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical circles. * Calls skey_cmp(const int32 *, const int32 *) for two circles. */ Datum spherecircle_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical ellipses. * Calls skey_cmp(const int32 *, const int32 *) for two ellipses. */ Datum sphereellipse_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical lines. * Calls skey_cmp(const int32 *, const int32 *) for two lines. */ Datum sphereline_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical paths. * Calls skey_cmp(const int32 *, const int32 *) for two paths. */ Datum spherepath_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical polygons. * Calls skey_cmp(const int32 *, const int32 *) for two polygons. */ Datum spherepoly_cmp(PG_FUNCTION_ARGS); /* * Returns relationship between the keys of two spherical boxes. * Calls skey_cmp(const int32 *, const int32 *) for two boxes. */ Datum spherebox_cmp(PG_FUNCTION_ARGS); #endif pgsphere/line.c000066400000000000000000000475501332443031700140010ustar00rootroot00000000000000#include "line.h" /* Line functions */ PG_FUNCTION_INFO_V1(sphereline_in); PG_FUNCTION_INFO_V1(sphereline_from_point); PG_FUNCTION_INFO_V1(sphereline_from_points); PG_FUNCTION_INFO_V1(sphereline_from_trans); PG_FUNCTION_INFO_V1(sphereline_meridian); PG_FUNCTION_INFO_V1(sphereline_swap_beg_end); PG_FUNCTION_INFO_V1(sphereline_turn); PG_FUNCTION_INFO_V1(sphereline_begin); PG_FUNCTION_INFO_V1(sphereline_end); PG_FUNCTION_INFO_V1(sphereline_length); PG_FUNCTION_INFO_V1(sphereline_cont_point); PG_FUNCTION_INFO_V1(sphereline_cont_point_neg); PG_FUNCTION_INFO_V1(sphereline_cont_point_com); PG_FUNCTION_INFO_V1(sphereline_cont_point_com_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_line); PG_FUNCTION_INFO_V1(spherecircle_cont_line_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_line_com); PG_FUNCTION_INFO_V1(spherecircle_cont_line_com_neg); PG_FUNCTION_INFO_V1(sphereline_overlap_circle); PG_FUNCTION_INFO_V1(sphereline_overlap_circle_neg); PG_FUNCTION_INFO_V1(sphereline_overlap_circle_com); PG_FUNCTION_INFO_V1(sphereline_overlap_circle_com_neg); PG_FUNCTION_INFO_V1(sphereline_equal); PG_FUNCTION_INFO_V1(sphereline_equal_neg); PG_FUNCTION_INFO_V1(sphereline_crosses); PG_FUNCTION_INFO_V1(sphereline_crosses_neg); PG_FUNCTION_INFO_V1(sphereline_overlap); PG_FUNCTION_INFO_V1(sphereline_overlap_neg); PG_FUNCTION_INFO_V1(spheretrans_from_line); PG_FUNCTION_INFO_V1(spheretrans_line); PG_FUNCTION_INFO_V1(spheretrans_line_inverse); /* * Swaps the beginning and ending of the line. */ static void sline_swap_beg_end(SLine *out, const SLine *in) { SLine l; SEuler se; l.length = in->length; l.phi = -in->length; l.theta = PI; l.psi = 0.0; seuler_set_zxz(&se); se.phi = in->phi; se.theta = in->theta; se.psi = in->psi; euler_sline_trans(out, &l, &se); } bool sline_eq(const SLine *l1, const SLine *l2) { if (FPne(l1->length, l2->length)) { return false; } else { SEuler e1, e2; seuler_set_zxz(&e1); seuler_set_zxz(&e2); e1.phi = l1->phi; e1.theta = l1->theta; e1.psi = l1->psi; e2.phi = (FPeq(l2->length, PID)) ? (l1->phi) : (l2->phi); e2.theta = l2->theta; e2.psi = l2->psi; return (strans_eq(&e1, &e2)); } return false; } bool sline_from_points(SLine *sl, const SPoint *pbeg, const SPoint *pend) { SEuler se; float8 l; l = spoint_dist(pbeg, pend); if (FPeq(l, PI)) { if (FPeq(pbeg->lng, pend->lng)) { sline_meridian(sl, pbeg->lng); return true; } return false; } if (spherevector_to_euler(&se, pbeg, pend)) { sl->phi = se.phi; sl->theta = se.theta; sl->psi = se.psi; sl->length = l; } else { sl->phi = PIH; sl->theta = pbeg->lat; sl->psi = pbeg->lng - PIH; sl->length = 0.0; } return (true); } void sline_meridian(SLine *sl, float8 lng) { sl->phi = -PIH; sl->theta = PIH; sl->psi = (lng < 0.0) ? lng + PID : lng; sl->length = PI; } void sline_begin(SPoint *p, const SLine *l) { const SPoint tmp = {0.0, 0.0}; SEuler se; sphereline_to_euler(&se, l); euler_spoint_trans(p, &tmp, &se); } void sline_end(SPoint *p, const SLine *l) { SPoint tmp = {0.0, 0.0}; SEuler se; tmp.lng = l->length; sphereline_to_euler(&se, l); euler_spoint_trans(p, &tmp, &se); } /* * Place begin of a line "l" as vector "v". */ static void sline_vector_begin(Vector3D *v, const SLine *l) { const Vector3D tmp = {1.0, 0.0, 0.0}; SEuler se; sphereline_to_euler(&se, l); euler_vector_trans(v, &tmp, &se); } /* * Place end of a line "l" as vector "v". */ static void sline_vector_end(Vector3D *v, const SLine *l) { Vector3D tmp = {0.0, 0.0, 0.0}; SEuler se; tmp.x = cos(l->length); tmp.y = sin(l->length); sphereline_to_euler(&se, l); euler_vector_trans(v, &tmp, &se); } void sline_min_max_lat(const SLine *sl, float8 *minlat, float8 *maxlat) { float8 inc = sl->theta - floor(sl->theta / PID) * PID; inc = (inc > PI) ? (PID - inc) : (inc); if (FPzero(inc) || FPeq(inc, PI)) { *minlat = *maxlat = 0.0; return; } else { SEuler se; SLine nl; SPoint tp; float8 lng; seuler_set_zxz(&se); se.phi = -sl->psi; se.theta = (inc > PIH) ? (PI - 2 * inc) : (0.0); se.psi = 0.0; euler_sline_trans(&nl, sl, &se); /* Now ascending node at (0,0), line ascending */ sline_begin(&tp, &nl); *minlat = *maxlat = tp.lat; sline_end(&tp, &nl); *minlat = Min(tp.lat, *minlat); *maxlat = Max(tp.lat, *maxlat); for (lng = PIH; lng < PID; lng += PI) { tp.lng = lng; tp.lat = (lng < PI) ? (inc) : (-inc); if (spoint_at_sline(&tp, &nl)) { *minlat = Min(tp.lat, *minlat); *maxlat = Max(tp.lat, *maxlat); } } } } int32 sphereline_latitude_points(const SLine *sl, float8 lat, SPoint *p1, SPoint *p2) { float8 inc = sl->theta - floor(sl->theta / PID) * PID; int32 ret = 0; if (FPgt(lat, PIH)) return 0; if (FPlt(lat, -PIH)) return 0; inc = (inc > PI) ? (PID - inc) : (inc); if (FPzero(inc) || FPeq(inc, PI)) { if (FPzero(lat)) return -1; else return 0; } else { SLine nl; float8 rot = (inc > PIH) ? (sl->psi - PIH) : (sl->psi + PIH); bool p1b, p2b; /* Transform maximum latitude of full line to longitude 0.0 */ memcpy((void *) &nl, (void *) sl, sizeof(SLine)); nl.psi = (inc > PIH) ? (PIH) : (-PIH); p1->lat = p2->lat = lat; p1->lng = p2->lng = 0.0; if (FPeq(inc, PIH)) { p1->lng = PIH; p2->lng = -PIH; ret = 2; } else { float8 ainc; ainc = fabs(inc - ((inc > PIH) ? (PI) : (0.0))); if (FPgt(lat, ainc)) return 0; else if (FPlt(lat, -ainc)) return 0; else if (FPeq(lat, ainc)) { p1->lng = 0.0; ret = 1; } else if (FPeq(lat, -ainc)) { p1->lng = PI; ret = 1; } else { p1->lng = acos(sin(lat) * cos(ainc) / (sin(ainc) * cos(lat))); p2->lng = PID - p1->lng; ret = 2; } } if (ret == 1) { p1b = spoint_at_sline(p1, &nl); if (!p1b) { ret = 0; } } else if (ret == 2) { p1b = spoint_at_sline(p1, &nl); p2b = spoint_at_sline(p2, &nl); if (p1b && p2b) { ret = 2; } else if (!p1b && p2b) { ret = 1; memcpy((void *) p1, (void *) p2, sizeof(SPoint)); } else if (p1b && !p2b) { ret = 1; } else { ret = 0; } } if (ret > 0) { p1->lng += rot; p2->lng += rot; spoint_check(p1); spoint_check(p2); } } return ret; } int8 sphereline_circle_pos(const SLine *sl, const SCIRCLE *sc) { float8 i, mi; const float8 step = (PI - 0.01); SPoint p[2] = {{0.0, 0.0}, {0.0, 0.0}}; SCIRCLE c; bool bbeg, bend; SEuler se; int contain; if (FPzero(sl->length)) { /* line is point */ sline_begin(&p[0], sl); if (spoint_in_circle(&p[0], &c)) { return PGS_CIRCLE_CONT_LINE; } else { return PGS_CIRCLE_LINE_AVOID; } } contain = 0; sphereline_to_euler_inv(&se, sl); euler_scircle_trans(&c, sc, &se); mi = sl->length / step; /* split line in segments and check for each of it */ for (i = 0.0; i < mi; i += 1.0) { p[0].lng = i * step; p[1].lng = (((i + 1.0) > mi) ? (sl->length) : ((i + 1.0) * step)); bbeg = spoint_in_circle(&p[0], &c); bend = spoint_in_circle(&p[1], &c); if (bbeg && bend) { contain++; } else if (bbeg || bend) { return PGS_CIRCLE_LINE_OVER; } else if (FPle(((c.center.lat < 0) ? (-c.center.lat) : (c.center.lat)), c.radius) && FPge(c.center.lng, p[0].lng) && FPle(c.center.lng, p[1].lng)) { return PGS_CIRCLE_LINE_OVER; } else if (contain > 0) { return PGS_CIRCLE_LINE_OVER; } } if (contain > 0 && contain == (floor(mi) + 1)) { return PGS_CIRCLE_CONT_LINE; } return PGS_CIRCLE_LINE_AVOID; } bool sline_circle_touch(const SLine *sl, const SCIRCLE *sc) { /* we assume here, line and circle overlap */ SEuler se; SCIRCLE tc; sphereline_to_euler_inv(&se, sl); euler_scircle_trans(&tc, sc, &se); if (FPge(tc.center.lng, 0.0) && FPle(tc.center.lng, sl->length)) { if (FPeq(fabs(tc.center.lat), sc->radius)) { return true; } return false; } else { SPoint p; p.lng = p.lat = 0.0; if (FPeq(spoint_dist(&p, &tc.center), sc->radius)) { return true; } p.lng = sl->length; if (FPeq(spoint_dist(&p, &tc.center), sc->radius)) { return true; } return false; } } int8 sline_sline_pos(const SLine *l1, const SLine *l2) { const SLine *il1, *il2; Vector3D v[2][2], vtmp; SEuler se; SLine sl1, sl2, lseg; SPoint p[4]; const float8 seg_length = (PI - 0.1); float8 seg_begin; if (sline_eq(l1, l2)) { return PGS_LINE_EQUAL; } sline_swap_beg_end(&sl1, l1); if (sline_eq(&sl1, l2)) { return PGS_LINE_CONT_LINE; } /* transform the larger line into equator ( begin at (0,0) ) */ if (FPge(l1->length, l2->length)) { il1 = l1; il2 = l2; } else { il1 = l2; il2 = l1; } if (FPzero(il1->length)) { /* both are points */ return PGS_LINE_AVOID; } sl1.phi = sl1.theta = sl1.psi = 0.0; p[0].lat = p[0].lng = p[1].lat = 0.0; sl1.length = p[1].lng = il1->length; v[0][0].x = 1.0; v[0][0].y = 0.0; v[0][0].z = 0.0; v[0][1].x = cos(il1->length); v[0][1].y = sin(il1->length); v[0][1].z = 0.0; sphereline_to_euler_inv(&se, il1); sline_vector_begin(&vtmp, il2); euler_vector_trans(&v[1][0], &vtmp, &se); sline_vector_end(&vtmp, il2); euler_vector_trans(&v[1][1], &vtmp, &se); vector3d_spoint(&p[2], &v[1][0]); vector3d_spoint(&p[3], &v[1][1]); /* check connected lines */ if (FPgt(il2->length, 0.0) && (vector3d_eq(&v[0][0], &v[1][0]) || vector3d_eq(&v[0][0], &v[1][1]) || vector3d_eq(&v[0][1], &v[1][0]) || vector3d_eq(&v[0][1], &v[1][1]))) { return PGS_LINE_CONNECT; } /* Check, sl2 is at equator */ if (FPzero(p[2].lat) && FPzero(p[3].lat)) { bool a1 = spoint_at_sline(&p[2], &sl1); bool a2 = spoint_at_sline(&p[3], &sl1); if (a1 && a2) { if (il1 == l2) { return PGS_LINE_OVER; } else { return PGS_LINE_CONT_LINE; } } else if (a1 || a2) { return PGS_LINE_OVER; } return PGS_LINE_AVOID; } /* Now sl2 is not at equator */ if (FPle(il2->length, seg_length)) { bool a1 = (FPge(p[2].lat, 0.0) && FPle(p[3].lat, 0.0)); /* sl2 crosses equator desc. */ bool a2 = (FPle(p[2].lat, 0.0) && FPge(p[3].lat, 0.0)); /* sl2 crosses equator asc. */ if (a1 || a2) { SPoint sp; euler_sline_trans(&sl2, il2, &se); sphereline_to_euler_inv(&se, &sl2); sp.lng = ((a1) ? (PI) : (0.0)) - se.phi; /* node */ sp.lat = 0; spoint_check(&sp); if (FPge(sp.lng, 0.0) && FPle(sp.lng, p[1].lng)) { return PGS_LINE_CROSS; } } return PGS_LINE_AVOID; } /* * We split the smaller line in segments with length less than 180 deg */ euler_sline_trans(&sl2, il2, &se); for (seg_begin = 0.0; seg_begin < il2->length; seg_begin += seg_length) { lseg.length = ((seg_begin + seg_length) > il2->length) ? (il2->length - seg_begin) : seg_length; lseg.phi = sl2.phi + seg_begin; lseg.theta = sl2.theta; lseg.psi = sl2.psi; if (sline_sline_pos(&sl1, &lseg) != PGS_LINE_AVOID) { return PGS_LINE_CROSS; } } return PGS_LINE_AVOID; } void sphereline_to_euler_inv(SEuler *se, const SLine *sl) { sphereline_to_euler(se, sl); spheretrans_inv(se); } void sphereline_to_euler(SEuler *se, const SLine *sl) { seuler_set_zxz(se); se->phi = sl->phi; se->theta = sl->theta; se->psi = sl->psi; } void euler_sline_trans(SLine *out, const SLine *in, const SEuler *se) { SEuler stmp[2]; sphereline_to_euler(&stmp[0], in); seuler_trans_zxz(&stmp[1], &stmp[0], se); out->phi = stmp[1].phi; out->theta = stmp[1].theta; out->psi = stmp[1].psi; out->length = in->length; } bool spoint_at_sline(const SPoint *p, const SLine *sl) { SEuler se; SPoint sp; sphereline_to_euler_inv(&se, sl); euler_spoint_trans(&sp, p, &se); if (FPzero(sp.lat)) { if (FPge(sp.lng, 0.0) && FPle(sp.lng, sl->length)) { return true; } else { return false; } } else { return false; } } void sline_center(SPoint *c, const SLine *sl) { SEuler se; SPoint p; p.lng = sl->length / 2.0; p.lat = 0.0; sphereline_to_euler(&se, sl); euler_spoint_trans(c, &p, &se); } Datum sphereline_in(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) palloc(sizeof(SLine)); char *c = PG_GETARG_CSTRING(0); unsigned char etype[3]; float8 eang[3], length; SEuler se, stmp, so; int i; void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); if (get_line(&eang[0], &eang[1], &eang[2], etype, &length)) { for (i = 0; i < 3; i++) { switch (i) { case 0: se.phi_a = etype[i]; break; case 1: se.theta_a = etype[i]; break; case 2: se.psi_a = etype[i]; break; } } se.phi = eang[0]; se.theta = eang[1]; se.psi = eang[2]; stmp.phi = stmp.theta = stmp.psi = 0.0; stmp.phi_a = stmp.theta_a = stmp.psi_a = EULER_AXIS_Z; seuler_trans_zxz(&so, &se, &stmp); sl->phi = so.phi; sl->theta = so.theta; sl->psi = so.psi; if (FPge(length, PID)) { length = PID; } sl->length = length; } else { reset_buffer(); pfree(sl); sl = NULL; elog(ERROR, "sphereline_in: parse error"); } reset_buffer(); PG_RETURN_POINTER(sl); } Datum sphereline_equal(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sline_eq(l1, l2)); } Datum sphereline_equal_neg(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!sline_eq(l1, l2)); } Datum sphereline_from_point(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) palloc(sizeof(SLine)); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); sline_from_points(sl, p, p); PG_RETURN_POINTER(sl); } Datum sphereline_from_points(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) palloc(sizeof(SLine)); SPoint *beg = (SPoint *) PG_GETARG_POINTER(0); SPoint *end = (SPoint *) PG_GETARG_POINTER(1); if (!sline_from_points(sl, beg, end)) { pfree(sl); sl = NULL; elog(ERROR, "sphereline_from_points: length of line must be not equal 180 degrees"); } PG_RETURN_POINTER(sl); } Datum sphereline_from_trans(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) palloc(sizeof(SLine)); SEuler *se = (SEuler *) PG_GETARG_POINTER(0); float8 l = PG_GETARG_FLOAT8(1); if (FPlt(l, 0.0)) { pfree(sl); elog(ERROR, "sphereline_from_trans: length of line must be >= 0"); PG_RETURN_NULL(); } else { SEuler tmp; if (FPgt(l, PID)) { l = PID; } strans_zxz(&tmp, se); sl->phi = tmp.phi; sl->theta = tmp.theta; sl->psi = tmp.psi; sl->length = l; } PG_RETURN_POINTER(sl); } Datum sphereline_meridian(PG_FUNCTION_ARGS) { SLine *out = (SLine *) palloc(sizeof(SLine)); float8 lng = PG_GETARG_FLOAT8(0); sline_meridian(out, lng); PG_RETURN_POINTER(out); } Datum sphereline_swap_beg_end(PG_FUNCTION_ARGS) { SLine *in = (SLine *) PG_GETARG_POINTER(0); SLine *out = (SLine *) palloc(sizeof(SLine)); sline_swap_beg_end(out, in); PG_RETURN_POINTER(out); } Datum sphereline_turn(PG_FUNCTION_ARGS) { SLine *in = (SLine *) PG_GETARG_POINTER(0); if (FPzero(in->length)) { PG_RETURN_NULL(); } else { SLine *out = (SLine *) palloc(sizeof(SLine)); SEuler se; SLine tmp; tmp.phi = 0.0; tmp.theta = PI; tmp.psi = 0.0; tmp.length = PID - in->length; sphereline_to_euler(&se, in); euler_sline_trans(out, &tmp, &se); PG_RETURN_POINTER(out); } PG_RETURN_NULL(); } Datum sphereline_begin(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); SPoint *sp = (SPoint *) palloc(sizeof(SPoint)); sline_begin(sp, sl); PG_RETURN_POINTER(sp); } Datum sphereline_end(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); SPoint *sp = (SPoint *) palloc(sizeof(SPoint)); sline_end(sp, sl); PG_RETURN_POINTER(sp); } Datum sphereline_length(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(sl->length); } Datum spherecircle_cont_line(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b == PGS_CIRCLE_CONT_LINE); } Datum spherecircle_cont_line_neg(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); SLine *l = (SLine *) PG_GETARG_POINTER(1); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b != PGS_CIRCLE_CONT_LINE); } Datum spherecircle_cont_line_com(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b == PGS_CIRCLE_CONT_LINE); } Datum spherecircle_cont_line_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); SLine *l = (SLine *) PG_GETARG_POINTER(0); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b != PGS_CIRCLE_CONT_LINE); } Datum sphereline_overlap_circle(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b > PGS_CIRCLE_LINE_AVOID); } Datum sphereline_overlap_circle_neg(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(0); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(1); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b == PGS_CIRCLE_LINE_AVOID); } Datum sphereline_overlap_circle_com(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b > PGS_CIRCLE_LINE_AVOID); } Datum sphereline_overlap_circle_com_neg(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(1); SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); int8 b = sphereline_circle_pos(l, c); PG_RETURN_BOOL(b == PGS_CIRCLE_LINE_AVOID); } Datum sphereline_crosses(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); int8 r = sline_sline_pos(l1, l2); PG_RETURN_BOOL(r == PGS_LINE_CROSS); } Datum sphereline_crosses_neg(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); int8 r = sline_sline_pos(l1, l2); PG_RETURN_BOOL(r != PGS_LINE_CROSS); } Datum sphereline_overlap(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sline_sline_pos(l1, l2) > PGS_LINE_AVOID); } Datum sphereline_overlap_neg(PG_FUNCTION_ARGS) { SLine *l1 = (SLine *) PG_GETARG_POINTER(0); SLine *l2 = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(sline_sline_pos(l1, l2) == PGS_LINE_AVOID); } Datum sphereline_cont_point(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(spoint_at_sline(p, l)); } Datum sphereline_cont_point_neg(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!spoint_at_sline(p, l)); } Datum sphereline_cont_point_com(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(spoint_at_sline(p, l)); } Datum sphereline_cont_point_com_neg(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(1); SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!spoint_at_sline(p, l)); } Datum spheretrans_line(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SLine *ret = (SLine *) palloc(sizeof(SLine)); euler_sline_trans(ret, sl, se); PG_RETURN_POINTER(ret); } Datum spheretrans_line_inverse(PG_FUNCTION_ARGS) { Datum sl = PG_GETARG_DATUM(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SEuler tmp; Datum ret; spheretrans_inverse(&tmp, se); ret = DirectFunctionCall2(spheretrans_line, sl, PointerGetDatum(&tmp)); PG_RETURN_DATUM(ret); } Datum spheretrans_from_line(PG_FUNCTION_ARGS) { SLine *l = (SLine *) PG_GETARG_POINTER(0); SEuler *e = (SEuler *) palloc(sizeof(SEuler)); sphereline_to_euler(e, l); PG_RETURN_POINTER(e); } pgsphere/line.h000066400000000000000000000162631332443031700140030ustar00rootroot00000000000000#ifndef __PGS_LINE_H__ #define __PGS_LINE_H__ #include "circle.h" /* Spherical line declarations. */ /* * Spherical line data structures. */ typedef struct { float8 phi, /* the first rotation angle around z axis */ theta, /* the second rotation angle around x axis */ psi; /* the last rotation angle around z axis */ float8 length; /* the length of the line */ } SLine; /* PGS_RELATIONSHIPS Object relationships */ /* PGS_CIRCLE_LINE_REL Circle and line */ #define PGS_CIRCLE_LINE_AVOID 0 /* circle avoids line */ #define PGS_CIRCLE_CONT_LINE 1 /* circle contains line */ #define PGS_CIRCLE_LINE_OVER 2 /* circle overlaps line */ /* PGS_LINE_LINE_REL Line and line */ #define PGS_LINE_AVOID 1 /* line avoids other line */ #define PGS_LINE_EQUAL 2 /* lines are equal */ #define PGS_LINE_CONT_LINE 3 /* line contains line */ #define PGS_LINE_CROSS 4 /* lines cross each other */ #define PGS_LINE_CONNECT 5 /* line are "connected" */ #define PGS_LINE_OVER 6 /* lines overlap each other */ /* * Makes a line with the starting point 'pbeg' and the ending point 'pend'. Result * is placed into sl. * * Returns false if the distance between the 'pbeg' and the 'pend' is 180deg. */ bool sline_from_points(SLine *sl, const SPoint *pbeg, const SPoint *pend); /* * Returns a meridian line of a given longitude in radians. The result is placed * into 'sl'. */ void sline_meridian(SLine *sl, float8 lng); /* * Returns the starting point of a line 'l'. Result is placed into 'p'. */ void sline_begin(SPoint *p, const SLine *l); /* * Returns the ending point of a line 'l'. Result is placed into 'p'. */ void sline_end(SPoint *p, const SLine *l); /* * Puts the minimum and the maximum latitudes of a spherical line 's1' into 'minlat' * and 'maxlat'. */ void sline_min_max_lat(const SLine *sl, float8 *minlat, float8 *maxlat); /* * Calculates spherical points with a latitude 'lat' on a spherical line. * * Returns the number of found points or <0 if undefined. */ int32 sphereline_latitude_points(const SLine *sl, float8 lat, SPoint *p1, SPoint *p2); /* * Returns true if two lines are equal. */ bool sline_eq(const SLine *l1, const SLine *l2); /* * Returns the relationship between a line and a circle as PGS_CIRCLE_LINE_REL * int8 value. */ int8 sphereline_circle_pos(const SLine *sl, const SCIRCLE *sc); /* * Assuming that a line and a circle overlap, this function returns true * if the line and the circle are touching. Make sure that the line and the * circle overlap before calling this function! Otherwise, the result will be * undefined. * * See sphereline_circle_pos (const SLine *, const SCIRCLE *) */ bool sline_circle_touch(const SLine *sl, const SCIRCLE *sc); /* * Returns the relationship between two lines as PGS_LINE_LINE_REL int8 value. */ int8 sline_sline_pos(const SLine *l1, const SLine *l2); /* * Checks whether a point is on a line. */ bool spoint_at_sline(const SPoint *p, const SLine *sl); /* * Returns the Euler transformation of a line. * * See spheretrans_from_line(PG_FUNCTION_ARGS) */ void sphereline_to_euler(SEuler *se, const SLine *sl); /* * Returns the inverse Euler transformation of a line. * * See spheretrans_from_line(PG_FUNCTION_ARGS) */ void sphereline_to_euler_inv(SEuler *se, const SLine *sl); /* * Transforms a line using an Euler transformation. * * out - pointer to the resulting line * in - pointer to the original line * se - pointer to the Euler transformation * * See spheretrans_line (PG_FUNCTION_ARGS) */ void euler_sline_trans(SLine *out, const SLine *in, const SEuler *se); /* * Puts the center of a line 'sl' into point 'c'. */ void sline_center(SPoint *c, const SLine *sl); /* * The input function for spherical line. */ Datum sphereline_in(PG_FUNCTION_ARGS); /* * Create a line from a spherical point. */ Datum sphereline_from_point(PG_FUNCTION_ARGS); /* * This function creates a spherical line using a starting point * and an ending point. The distance between the points must not be * equal to 180deg. */ Datum sphereline_from_points(PG_FUNCTION_ARGS); /* * This function creates a spherical line using a given Euler transformation * and the length of a line. If the length is less than zero, an error occurs. * If the length is larger than 360deg, it is set to 360deg. */ Datum sphereline_from_trans(PG_FUNCTION_ARGS); /* * This function creates a meridian running from south to north. * The float8 param provides the longitude in radians. */ Datum sphereline_meridian(PG_FUNCTION_ARGS); /* * Swaps the starting point and the ending point of a line. */ Datum sphereline_swap_beg_end(PG_FUNCTION_ARGS); /* * Turns the line while preserving the starting & ending points. */ Datum sphereline_turn(PG_FUNCTION_ARGS); /* * Returns the beginning of a line. */ Datum sphereline_begin(PG_FUNCTION_ARGS); /* * Returns the ending of a line. */ Datum sphereline_end(PG_FUNCTION_ARGS); /* * Returns the length of a line in radians. */ Datum sphereline_length(PG_FUNCTION_ARGS); /* * Checks whether a line contains a point. */ Datum sphereline_cont_point(PG_FUNCTION_ARGS); /* * Checks whether a line doesn't contain a point. */ Datum sphereline_cont_point_neg(PG_FUNCTION_ARGS); /* * Checks whether a line contains a point. */ Datum sphereline_cont_point_com(PG_FUNCTION_ARGS); /* * Checks whether a line doesn't contain a point. */ Datum sphereline_cont_point_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a line. */ Datum spherecircle_cont_line(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a line. */ Datum spherecircle_cont_line_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a line. */ Datum spherecircle_cont_line_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a line. */ Datum spherecircle_cont_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a line overlap. */ Datum sphereline_overlap_circle(PG_FUNCTION_ARGS); /* * Checks whether circle and a line don't overlap. */ Datum sphereline_overlap_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a line overlap. */ Datum sphereline_overlap_circle_com(PG_FUNCTION_ARGS); /* * Checks whether circle and a line don't overlap. */ Datum sphereline_overlap_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two lines are equal. */ Datum sphereline_equal(PG_FUNCTION_ARGS); /* * Checks whether two lines are not equal. */ Datum sphereline_equal_neg(PG_FUNCTION_ARGS); /* * Checks whether two lines cross each other. */ Datum sphereline_crosses(PG_FUNCTION_ARGS); /* * Checks whether two lines don't cross each other. */ Datum sphereline_crosses_neg(PG_FUNCTION_ARGS); /* * Checks whether two lines overlap. */ Datum sphereline_overlap(PG_FUNCTION_ARGS); /* * Checks whether two lines are overlap. */ Datum sphereline_overlap_neg(PG_FUNCTION_ARGS); /* * Returns an Euler transformation. An inverse transformation with it puts * the line into equator beginning at (0,0) and ending at (0,length). */ Datum spheretrans_from_line(PG_FUNCTION_ARGS); /* * Transforms a line with an Euler transformation. */ Datum spheretrans_line(PG_FUNCTION_ARGS); /* * Transforms a line with an inverse Euler transformation. */ Datum spheretrans_line_inverse(PG_FUNCTION_ARGS); #endif pgsphere/output.c000066400000000000000000000251671332443031700144120ustar00rootroot00000000000000#include "types.h" /* Output functions */ /* Output modes */ #define OUTPUT_RAD 1 /* output in radians */ #define OUTPUT_DEG 2 /* output in degrees */ #define OUTPUT_DMS 3 /* output in degrees, minutes, seconds */ #define OUTPUT_HMS 4 /* output in hour, minutes, seconds */ /*. * Holds the current output modus. * Default is radians. */ static unsigned char sphere_output = OUTPUT_RAD; static short int sphere_output_precision = DBL_DIG; PG_FUNCTION_INFO_V1(set_sphere_output); PG_FUNCTION_INFO_V1(spherepoint_out); PG_FUNCTION_INFO_V1(spherecircle_out); PG_FUNCTION_INFO_V1(sphereline_out); PG_FUNCTION_INFO_V1(spheretrans_out); PG_FUNCTION_INFO_V1(spherepoly_out); PG_FUNCTION_INFO_V1(spherepath_out); PG_FUNCTION_INFO_V1(sphereellipse_out); PG_FUNCTION_INFO_V1(spherebox_out); PG_FUNCTION_INFO_V1(set_sphere_output_precision); PG_FUNCTION_INFO_V1(pg_sphere_version); /* * Sets the output modus. */ Datum set_sphere_output(PG_FUNCTION_ARGS); /* * Sets the output precision. */ Datum set_sphere_output_precision(PG_FUNCTION_ARGS); /* * The output function of spherical point. */ Datum spherepoint_out(PG_FUNCTION_ARGS); /* * The output function of spherical circle. */ Datum spherecircle_out(PG_FUNCTION_ARGS); /* * The output function of spherical line. */ Datum sphereline_out(PG_FUNCTION_ARGS); /* * The output function of Euler transformation. */ Datum spheretrans_out(PG_FUNCTION_ARGS); /* * The output function of spherical polygon. */ Datum spherepoly_out(PG_FUNCTION_ARGS); /* * The output function of spherical path. */ Datum spherepath_out(PG_FUNCTION_ARGS); /* * The output function of spherical ellipse. */ Datum sphereellipse_out(PG_FUNCTION_ARGS); /* * The output function of spherical box. */ Datum spherebox_out(PG_FUNCTION_ARGS); /* * Returns pg_sphere version. */ Datum pg_sphere_version(PG_FUNCTION_ARGS); /* * Converts radians to DEG ( degrees, minutes, seconds ) * * rad - input in radians * deg - pointer to degrees * min - pointer to minutes * sec - pointer to seconds */ static void rad_to_dms(double rad, unsigned int *deg, unsigned int *min, double *sec) { double rsign = rad < 0 ? -1 : 1; const double sec_dig = pow(10, FLT_DIG); rad *= (rsign * RADIANS); *deg = floor(rad); *min = floor(60 * (rad - *deg)); *sec = rad * 3600 - *min * 60 - *deg * 3600; *sec = rint((double) (*sec * sec_dig)) / sec_dig; if (*sec >= 60.0) { *sec -= 60.0; (*min)++; } if (*min >= 60) { *min -= 60; (*deg)++; } } Datum set_sphere_output_precision(PG_FUNCTION_ARGS) { short int c = PG_GETARG_INT16(0); char *buf = (char *) palloc(20); if (c > DBL_DIG) c = DBL_DIG; if (c < 1) c = DBL_DIG; sphere_output_precision = c; sprintf(buf, "SET %d", c); PG_RETURN_CSTRING(buf); } Datum set_sphere_output(PG_FUNCTION_ARGS) { char *c = PG_GETARG_CSTRING(0); char *buf = (char *) palloc(20); if (strcmp(c, "RAD") == 0) { sphere_output = OUTPUT_RAD; } else if (strcmp(c, "DEG") == 0) { sphere_output = OUTPUT_DEG; } else if (strcmp(c, "DMS") == 0) { sphere_output = OUTPUT_DMS; } else if (strcmp(c, "HMS") == 0) { sphere_output = OUTPUT_HMS; } else { elog(ERROR, "Unknown format"); pfree(buf); PG_RETURN_NULL(); } sprintf(buf, "SET %s", c); PG_RETURN_CSTRING(buf); } Datum spherepoint_out(PG_FUNCTION_ARGS) { SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(255); unsigned int latdeg, latmin, lngdeg, lngmin; double latsec, lngsec; latdeg = latmin = lngdeg = lngmin = 0; latsec = lngsec = 0.0; switch (sphere_output) { case OUTPUT_DEG: sprintf(buffer, "(%.*gd , %.*gd)", sphere_output_precision, RADIANS * sp->lng, sphere_output_precision, RADIANS * sp->lat); break; case OUTPUT_DMS: rad_to_dms(sp->lng, &lngdeg, &lngmin, &lngsec); rad_to_dms(sp->lat, &latdeg, &latmin, &latsec); sprintf(buffer, "(%3ud %2um %.*gs , %c%2ud %2um %.*gs)", lngdeg, lngmin, sphere_output_precision, lngsec, (sp->lat < 0) ? ('-') : ('+'), latdeg, latmin, sphere_output_precision, latsec); break; case OUTPUT_HMS: rad_to_dms(sp->lng / 15, &lngdeg, &lngmin, &lngsec); rad_to_dms(sp->lat, &latdeg, &latmin, &latsec); sprintf(buffer, "(%3uh %2um %.*gs , %c%2ud %2um %.*gs)", lngdeg, lngmin, sphere_output_precision, lngsec, (sp->lat < 0) ? ('-') : ('+'), latdeg, latmin, sphere_output_precision, latsec); break; default: sprintf(buffer, "(%.*g , %.*g)", sphere_output_precision, sp->lng, sphere_output_precision, sp->lat); break; } PG_RETURN_CSTRING(buffer); } Datum spherecircle_out(PG_FUNCTION_ARGS) { SCIRCLE *c = (SCIRCLE *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(255); char *pointstr = DatumGetPointer( DirectFunctionCall1(spherepoint_out, PointerGetDatum(&c->center))); unsigned int rdeg, rmin; double rsec; rdeg = rmin = 0; rsec = 0.0; switch (sphere_output) { case OUTPUT_DEG: sprintf(buffer, "<%s , %.*gd>", pointstr, sphere_output_precision, RADIANS * c->radius); break; case OUTPUT_HMS: case OUTPUT_DMS: rad_to_dms(c->radius, &rdeg, &rmin, &rsec); sprintf(buffer, "<%s , %2ud %2um %.*gs>", pointstr, rdeg, rmin, sphere_output_precision, rsec); break; default: sprintf(buffer, "<%s , %.*g>", pointstr, sphere_output_precision, c->radius); break; } pfree(pointstr); PG_RETURN_CSTRING(buffer); } Datum sphereellipse_out(PG_FUNCTION_ARGS) { SELLIPSE *e = (SELLIPSE *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(255); char *pointstr; unsigned int rdeg[3], rmin[3]; double rsec[3]; SPoint sp; sp.lng = e->psi; sp.lat = -e->theta; pointstr = DatumGetPointer(DirectFunctionCall1(spherepoint_out, PointerGetDatum(&sp))); switch (sphere_output) { case OUTPUT_DEG: sprintf(buffer, "<{ %.*gd , %.*gd }, %s , %.*gd>", sphere_output_precision, RADIANS * (e->rad[0]), sphere_output_precision, RADIANS * (e->rad[1]), pointstr, sphere_output_precision, RADIANS * (e->phi)); break; case OUTPUT_HMS: case OUTPUT_DMS: rad_to_dms(e->rad[0], &rdeg[0], &rmin[0], &rsec[0]); rad_to_dms(e->rad[1], &rdeg[1], &rmin[1], &rsec[1]); rad_to_dms(e->phi, &rdeg[2], &rmin[2], &rsec[2]); sprintf(buffer, "<{ %2ud %2um %.*gs , %2ud %2um %.*gs }, %s , %2ud %2um %.*gs>", rdeg[0], rmin[0], sphere_output_precision, rsec[0], rdeg[1], rmin[1], sphere_output_precision, rsec[1], pointstr, rdeg[2], rmin[2], sphere_output_precision, rsec[2]); break; default: sprintf( buffer, "<{ %.*g , %.*g }, %s , %.*g>", sphere_output_precision, e->rad[0], sphere_output_precision, e->rad[1], pointstr, sphere_output_precision, e->phi); break; } pfree(pointstr); PG_RETURN_CSTRING(buffer); } Datum sphereline_out(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); char *out = (char *) palloc(255); char *tstr = NULL; SEuler se; unsigned int rdeg, rmin; double rsec; rdeg = rmin = 0; rsec = 0.0; seuler_set_zxz(&se); se.phi = sl->phi; se.theta = sl->theta; se.psi = sl->psi; tstr = DatumGetPointer(DirectFunctionCall1(spheretrans_out, PointerGetDatum(&se))); switch (sphere_output) { case OUTPUT_DEG: sprintf(out, "( %s ), %.*gd", tstr, sphere_output_precision, RADIANS * sl->length ); break; case OUTPUT_HMS: case OUTPUT_DMS: rad_to_dms(sl->length, &rdeg, &rmin, &rsec); sprintf(out, "( %s ), %2ud %2um %.*gs", tstr, rdeg, rmin, sphere_output_precision, rsec); break; default: sprintf(out, "( %s ), %.*g", tstr, sphere_output_precision, sl->length ); break; } PG_RETURN_CSTRING(out); } Datum spheretrans_out(PG_FUNCTION_ARGS) { SEuler *se = (SEuler *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(255); char buf[100]; char etype[4]; SPoint val[3]; unsigned char i, t = 0; unsigned int rdeg, rmin; double rsec; val[0].lat = val[1].lat = val[2].lat = 0.0; val[0].lng = se->phi; val[1].lng = se->theta; val[2].lng = se->psi; spoint_check(&val[0]); spoint_check(&val[1]); spoint_check(&val[2]); buffer[0] = '\0'; for (i = 0; i < 3; i++) { rdeg = rmin = 0; rsec = 0.0; switch (sphere_output) { case OUTPUT_DEG: sprintf(&buf[0], "%.*gd", sphere_output_precision, RADIANS * val[i].lng); break; case OUTPUT_HMS: case OUTPUT_DMS: rad_to_dms(val[i].lng, &rdeg, &rmin, &rsec); sprintf(&buf[0], "%2ud %2um %.*gs", rdeg, rmin, sphere_output_precision, rsec); break; default: sprintf(&buf[0], "%.*g", sphere_output_precision, val[i].lng); break; } strcat(&buf[0], ", "); strcat(buffer, &buf[0]); } for (i = 0; i < 3; i++) { switch (i) { case 0: t = se->phi_a; break; case 1: t = se->theta_a; break; case 2: t = se->psi_a; break; } switch (t) { case EULER_AXIS_X: etype[i] = 'X'; break; case EULER_AXIS_Y: etype[i] = 'Y'; break; case EULER_AXIS_Z: etype[i] = 'Z'; break; } } etype[3] = '\0'; strcat(buffer, etype); PG_RETURN_CSTRING(buffer); } Datum spherepath_out(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); int32 i; char *out = (char *) palloc(128 * path->npts); char *tmp; strcpy(out, "{"); for (i = 0; i < path->npts; i++) { if (i > 0) { strcat(out, ","); } tmp = DatumGetPointer(DirectFunctionCall1(spherepoint_out, PointerGetDatum(&path->p[i]))); strcat(out, tmp); pfree(tmp); } strcat(out, "}"); PG_RETURN_CSTRING(out); } Datum spherepoly_out(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); int32 i; char *out = (char *) palloc(128 * poly->npts); char *tmp; strcpy(out, "{"); for (i = 0; i < poly->npts; i++) { if (i > 0) { strcat(out, ","); } tmp = DatumGetPointer(DirectFunctionCall1(spherepoint_out, PointerGetDatum(&poly->p[i]))); strcat(out, tmp); pfree(tmp); } strcat(out, "}"); PG_RETURN_CSTRING(out); } Datum spherebox_out(PG_FUNCTION_ARGS) { SBOX *box = (SBOX *) PG_GETARG_POINTER(0); char *buffer = (char *) palloc(255); char *str1 = DatumGetPointer( DirectFunctionCall1(spherepoint_out, PointerGetDatum(&box->sw))); char *str2 = DatumGetPointer( DirectFunctionCall1(spherepoint_out, PointerGetDatum(&box->ne))); sprintf(buffer, "(%s, %s)", str1, str2); pfree(str1); pfree(str2); PG_RETURN_CSTRING(buffer); } Datum pg_sphere_version(PG_FUNCTION_ARGS) { char *buffer = (char *) palloc(20); sprintf(buffer, "1.1.5"); PG_RETURN_CSTRING(buffer); } pgsphere/path.c000066400000000000000000000507201332443031700137770ustar00rootroot00000000000000#include "path.h" /* * Path functions */ PG_FUNCTION_INFO_V1(spherepath_in); PG_FUNCTION_INFO_V1(spherepath_get_point); PG_FUNCTION_INFO_V1(spherepath_point); PG_FUNCTION_INFO_V1(spherepath_equal); PG_FUNCTION_INFO_V1(spherepath_equal_neg); PG_FUNCTION_INFO_V1(spherepath_length); PG_FUNCTION_INFO_V1(spherepath_npts); PG_FUNCTION_INFO_V1(spherepath_swap); PG_FUNCTION_INFO_V1(spherepath_cont_point); PG_FUNCTION_INFO_V1(spherepath_cont_point_neg); PG_FUNCTION_INFO_V1(spherepath_cont_point_com); PG_FUNCTION_INFO_V1(spherepath_cont_point_com_neg); PG_FUNCTION_INFO_V1(spherepath_overlap_line); PG_FUNCTION_INFO_V1(spherepath_overlap_line_neg); PG_FUNCTION_INFO_V1(spherepath_overlap_line_com); PG_FUNCTION_INFO_V1(spherepath_overlap_line_com_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_path); PG_FUNCTION_INFO_V1(spherecircle_cont_path_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_path_com); PG_FUNCTION_INFO_V1(spherecircle_cont_path_com_neg); PG_FUNCTION_INFO_V1(spherecircle_overlap_path); PG_FUNCTION_INFO_V1(spherecircle_overlap_path_neg); PG_FUNCTION_INFO_V1(spherecircle_overlap_path_com); PG_FUNCTION_INFO_V1(spherecircle_overlap_path_com_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_path); PG_FUNCTION_INFO_V1(spherepoly_cont_path_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_path_com); PG_FUNCTION_INFO_V1(spherepoly_cont_path_com_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_path); PG_FUNCTION_INFO_V1(spherepoly_overlap_path_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_path_com); PG_FUNCTION_INFO_V1(spherepoly_overlap_path_com_neg); PG_FUNCTION_INFO_V1(spherepath_overlap_path); PG_FUNCTION_INFO_V1(spherepath_overlap_path_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_path); PG_FUNCTION_INFO_V1(sphereellipse_cont_path_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_path_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_path_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_path); PG_FUNCTION_INFO_V1(sphereellipse_overlap_path_neg); PG_FUNCTION_INFO_V1(sphereellipse_overlap_path_com); PG_FUNCTION_INFO_V1(sphereellipse_overlap_path_com_neg); PG_FUNCTION_INFO_V1(spheretrans_path); PG_FUNCTION_INFO_V1(spheretrans_path_inverse); PG_FUNCTION_INFO_V1(spherepath_add_point); PG_FUNCTION_INFO_V1(spherepath_add_points_finalize); /* * Converts an array of spherical points to SPATH. * * arr - pointer to the array of spherical points * nelem - count of elements * * Returns pointer to created spherical polygon. */ static SPATH * spherepath_from_array(SPoint *arr, int32 nelem) { SPATH *path = NULL; if (nelem < 2) { elog(ERROR, "spherepath_from_array: more than one point needed"); return NULL; } else { int32 i; float8 scheck; int32 size; for (i = 0; i < nelem; i++) { spoint_check(&arr[i]); } /* check duplicate points */ i = 0; while (i < (nelem - 1)) { if (nelem < 2) break; if (spoint_eq(&arr[i], &arr[i + 1])) { if (i < (nelem - 2)) { memmove((void *) &arr[i + 1], (void *) &arr[i + 2], (nelem - i - 2) * sizeof(SPoint)); } nelem--; continue; } i++; } if (nelem < 2) { elog(ERROR, "spherepath_from_array: more than one point needed"); return NULL; } size = offsetof(SPATH, p[0]) +sizeof(path->p[0]) * nelem; path = (SPATH *) palloc(size); SET_VARSIZE(path, size); path->npts = nelem; for (i = 0; i < nelem; i++) { if (i > 0) { scheck = spoint_dist(&arr[i - 1], &arr[i]); if (FPeq(scheck, PI)) { elog(ERROR, "spherepath_from_array: a path segment length must be not equal 180 degrees."); return NULL; } } memcpy((void *) &path->p[i], (void *) &arr[i], sizeof(SPoint)); } } return (path); } /* * Performs an Euler transformation on a path. * * out - pointer to the result path * in - pointer to the input path * se - pointer to the Euler transformation * * Returns the pointer to the result path. */ static void euler_spath_trans(SPATH *out, const SPATH *in, const SEuler *se) { int32 i; out->size = in->size; out->npts = in->npts; for (i = 0; i < in->npts; i++) euler_spoint_trans(&out->p[i], &in->p[i], se); } /* * Returns the relationship between a path and a circle as * PGS_CIRCLE_PATH_REL int8 value. */ static int8 path_circle_pos(const SPATH *path, const SCIRCLE *circ) { int8 pos; int32 i; SLine sl; int32 n; const int8 sc_in = (1 << PGS_CIRCLE_CONT_LINE); const int8 sc_ov = (1 << PGS_CIRCLE_LINE_OVER); const int8 sc_os = (1 << PGS_CIRCLE_LINE_AVOID); n = path->npts - 1; pos = 0; if (FPzero(circ->radius)) { bool pcp = spath_cont_point(path, &circ->center); if (pcp) { return PGS_CIRCLE_PATH_OVER; } else { return PGS_CIRCLE_PATH_AVOID; } } for (i = 0; i < n; i++) { spath_segment(&sl, path, i); pos |= (1 << sphereline_circle_pos(&sl, circ)); if (pos & sc_ov) { return PGS_CIRCLE_PATH_OVER; } } if (pos == sc_in) { /* all lines inside circle */ /* circle contains path */ return PGS_CIRCLE_CONT_PATH; } else if (pos == sc_os) { /* all lines outside circle */ /* circle outside path */ return PGS_CIRCLE_PATH_AVOID; } /* circle and path overlap */ return PGS_CIRCLE_PATH_OVER; } /* * Checks whether a path and a line overlap. */ static bool path_line_overlap(const SPATH *path, const SLine *line) { int32 i; SLine sl; int32 n; n = path->npts - 1; for (i = 0; i < n; i++) { spath_segment(&sl, path, i); if (sline_sline_pos(&sl, line) != PGS_LINE_AVOID) { return true; } } return false; } /* * Returns the relationship between a path and a circle as * PGS_ELLIPSE_PATH_REL int8 value. * * path - pointer to the path * ell - pointer to the ellipse */ static int8 path_ellipse_pos(const SPATH *path, const SELLIPSE *ell) { int8 pos; int32 i; SLine sl; int32 n; const int8 sc_in = (1 << PGS_ELLIPSE_CONT_LINE); const int8 sc_ov = (1 << PGS_ELLIPSE_LINE_OVER); const int8 sc_os = (1 << PGS_ELLIPSE_LINE_AVOID); pos = 0; n = path->npts - 1; if (FPzero(ell->rad[0])) { bool pcp; SPoint cen; sellipse_center(&cen, ell); pcp = spath_cont_point(path, &cen); if (pcp) { return PGS_ELLIPSE_PATH_OVER; } else { return PGS_ELLIPSE_PATH_AVOID; } } if (FPzero(ell->rad[1])) { SLine l; sellipse_line(&l, ell); /* TODO implement ellipse contains path if ellipse is a line */ if (path_line_overlap(path, &l)) { return PGS_ELLIPSE_PATH_OVER; } else { return PGS_ELLIPSE_PATH_AVOID; } } for (i = 0; i < n; i++) { spath_segment(&sl, path, i); pos |= (1 << sellipse_line_pos(ell, &sl)); if (pos & sc_ov) { return PGS_ELLIPSE_PATH_OVER; } } if (pos == sc_in) { /* all lines inside ellipse */ /* ellipse contains path */ return PGS_ELLIPSE_CONT_PATH; } else if (pos == sc_os) { /* all lines outside ellipse */ /* ellipse outside path */ return PGS_ELLIPSE_PATH_AVOID; } /* ellipse and path overlap */ return PGS_ELLIPSE_PATH_OVER; } /* * Checks whether two paths overlap. */ static bool path_overlap(const SPATH *path1, const SPATH *path2) { int32 i; SLine sl; for (i = 0; i < path1->npts; i++) { spath_segment(&sl, path1, i); if (path_line_overlap(path2, &sl)) { /* overlap */ return true; } } return false; } /* * Returns the relationship between a path and a polygon as * PGS_POLY_PATH_REL int8 value. */ static int8 path_poly_pos(const SPATH *path, const SPOLY *poly) { int32 i; SLine sl; int8 pos, res; int32 n; const int8 sp_os = (1 << PGS_LINE_POLY_AVOID); const int8 sp_ct = (1 << PGS_POLY_CONT_LINE); const int8 sp_ov = (1 << PGS_LINE_POLY_OVER); n = path->npts - 1; pos = res = 0; for (i = 0; i < n; i++) { spath_segment(&sl, path, i); pos = (1 << poly_line_pos(poly, &sl)); if (pos == sp_ov) { return PGS_POLY_PATH_OVER; /* overlap */ } res |= pos; } if (res == sp_os) { return PGS_POLY_PATH_AVOID; } if (res == sp_ct) { return PGS_POLY_CONT_PATH; } return PGS_POLY_OVER; } /* * Returns the i-th point of a path. * * sp - pointer to the result point * path - pointer to the path * i - number of the point * * See spath_point(SPoint * , SPATH *, float8) */ static bool spath_get_point(SPoint *sp, const SPATH *path, int32 i) { if (i >= 0 && i < path->npts) { memcpy((void *) sp, (void *) &path->p[i], sizeof(SPoint)); return true; } return false; } /* * This function interpolates between points. Returns the f-th point * of a path. * * sp - pointer to the result point * path - pointer to the path * f - 'number' of the point * * See spherepath_point(PG_FUNCTION_ARGS) */ static bool spath_point(SPoint *sp, const SPATH *path, float8 f) { SLine sl; int32 i; i = (int32) floor(f); if (spath_segment(&sl, path, i)) { SEuler se; SPoint tp; sphereline_to_euler(&se, &sl); tp.lng = sl.length * (f - (float8) i); tp.lat = 0.0; euler_spoint_trans(sp, &tp, &se); return true; } else { return false; } } /* * Checks whether two paths are equal. */ bool spath_eq(const SPATH *p1, const SPATH *p2) { if (p1->npts == p2->npts) { int32 i; bool ret; ret = true; for (i = 0; i < p1->npts; i++) { if (!spoint_eq(&p1->p[i], &p2->p[i])) { ret = false; break; } } return ret; } return false; } bool spath_cont_point(const SPATH *path, const SPoint *sp) { int32 n; bool ret; SLine sl; int32 i; n = path->npts - 1; ret = false; for (i = 0; i < n; i++) { spath_segment(&sl, path, i); if (spoint_at_sline(sp, &sl)) { ret = true; break; } } return ret; } bool spath_segment(SLine *sl, const SPATH *path, int32 i) { if (i >= 0 && i < (path->npts - 1)) { sline_from_points(sl, &path->p[i], &path->p[i + 1]); return true; } return false; } Datum spherepath_in(PG_FUNCTION_ARGS) { SPATH *path; char *c = PG_GETARG_CSTRING(0); int32 i, nelem; void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); nelem = get_path_count(); if (nelem > 1) { SPoint arr[nelem]; for (i = 0; i < nelem; i++) { get_path_elem(i, &arr[i].lng, &arr[i].lat); } path = spherepath_from_array(&arr[0], nelem); } else { reset_buffer(); elog(ERROR, "spherepath_in: more than one point needed"); PG_RETURN_NULL(); } reset_buffer(); PG_RETURN_POINTER(path); } Datum spherepath_get_point(PG_FUNCTION_ARGS) { int32 i; SPATH *path = PG_GETARG_SPATH(0); SPoint *sp = (SPoint *) palloc(sizeof(SPoint)); i = PG_GETARG_INT32(1); if (spath_get_point(sp, path, i - 1)) { PG_RETURN_POINTER(sp); } pfree(sp); PG_RETURN_NULL(); } Datum spherepath_point(PG_FUNCTION_ARGS) { float8 i; SPATH *path = PG_GETARG_SPATH(0); SPoint *sp = (SPoint *) palloc(sizeof(SPoint)); i = PG_GETARG_FLOAT8(1); if (spath_point(sp, path, i - 1)) { PG_RETURN_POINTER(sp); } pfree(sp); PG_RETURN_NULL(); } Datum spherepath_equal(PG_FUNCTION_ARGS) { SPATH *p1 = PG_GETARG_SPATH(0); SPATH *p2 = PG_GETARG_SPATH(1); PG_RETURN_BOOL(spath_eq(p1, p2)); } Datum spherepath_equal_neg(PG_FUNCTION_ARGS) { SPATH *p1 = PG_GETARG_SPATH(0); SPATH *p2 = PG_GETARG_SPATH(1); PG_RETURN_BOOL(!spath_eq(p1, p2)); } Datum spherepath_length(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); int32 i; SLine l; float8 sum; int32 n; n = path->npts - 1; sum = 0.0; for (i = 0; i < n; i++) { spath_segment(&l, path, i); sum += l.length; } PG_RETURN_FLOAT8(sum); } Datum spherepath_npts(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_INT32(path->npts); } Datum spherepath_swap(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); int32 i; int32 n; SPATH *ret = (SPATH *) palloc(VARSIZE(path)); n = path->npts - 1; for (i = 0; i < n; i++) { memcpy((void *) &ret->p[i], (void *) &path->p[n - i], sizeof(SPoint)); } ret->size = path->size; ret->npts = path->npts; PG_RETURN_POINTER(ret); } Datum spherepath_cont_point(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); SPoint *sp = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(spath_cont_point(path, sp)); } Datum spherepath_cont_point_neg(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); SPoint *sp = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!spath_cont_point(path, sp)); } Datum spherepath_cont_point_com(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(1); SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(spath_cont_point(path, sp)); } Datum spherepath_cont_point_com_neg(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(1); SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!spath_cont_point(path, sp)); } Datum spherepath_overlap_line(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(path_line_overlap(path, line)); } Datum spherepath_overlap_line_neg(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!path_line_overlap(path, line)); } Datum spherepath_overlap_line_com(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(path_line_overlap(path, line)); } Datum spherepath_overlap_line_com_neg(PG_FUNCTION_ARGS) { SPATH *path = PG_GETARG_SPATH(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!path_line_overlap(path, line)); } Datum spherecircle_cont_path(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_circle_pos(path, circ) == PGS_CIRCLE_CONT_PATH); } Datum spherecircle_cont_path_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_circle_pos(path, circ) != PGS_CIRCLE_CONT_PATH); } Datum spherecircle_cont_path_com(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_circle_pos(path, circ) == PGS_CIRCLE_CONT_PATH); } Datum spherecircle_cont_path_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_circle_pos(path, circ) != PGS_CIRCLE_CONT_PATH); } Datum spherecircle_overlap_path(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_circle_pos(path, circ) > PGS_CIRCLE_PATH_AVOID); } Datum spherecircle_overlap_path_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_circle_pos(path, circ) == PGS_CIRCLE_PATH_AVOID); } Datum spherecircle_overlap_path_com(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_circle_pos(path, circ) > PGS_CIRCLE_PATH_AVOID); } Datum spherecircle_overlap_path_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_circle_pos(path, circ) == PGS_CIRCLE_PATH_AVOID); } Datum spherepoly_cont_path(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_poly_pos(path, poly) == PGS_POLY_CONT_PATH); } Datum spherepoly_cont_path_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_poly_pos(path, poly) != PGS_POLY_CONT_PATH); } Datum spherepoly_cont_path_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_poly_pos(path, poly) == PGS_POLY_CONT_PATH); } Datum spherepoly_cont_path_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_poly_pos(path, poly) != PGS_POLY_CONT_PATH); } Datum spherepoly_overlap_path(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_poly_pos(path, poly) != PGS_POLY_PATH_AVOID); } Datum spherepoly_overlap_path_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_poly_pos(path, poly) == PGS_POLY_PATH_AVOID); } Datum spherepoly_overlap_path_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_poly_pos(path, poly) != PGS_POLY_PATH_AVOID); } Datum spherepoly_overlap_path_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_poly_pos(path, poly) == PGS_POLY_PATH_AVOID); } Datum spherepath_overlap_path(PG_FUNCTION_ARGS) { SPATH *p1 = PG_GETARG_SPATH(0); SPATH *p2 = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_overlap(p1, p2)); } Datum spherepath_overlap_path_neg(PG_FUNCTION_ARGS) { SPATH *p1 = PG_GETARG_SPATH(0); SPATH *p2 = PG_GETARG_SPATH(1); PG_RETURN_BOOL(!path_overlap(p1, p2)); } Datum sphereellipse_cont_path(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_ellipse_pos(path, ell) == PGS_ELLIPSE_CONT_PATH); } Datum sphereellipse_cont_path_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_ellipse_pos(path, ell) != PGS_ELLIPSE_CONT_PATH); } Datum sphereellipse_cont_path_com(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_ellipse_pos(path, ell) == PGS_ELLIPSE_CONT_PATH); } Datum sphereellipse_cont_path_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_ellipse_pos(path, ell) != PGS_ELLIPSE_CONT_PATH); } Datum sphereellipse_overlap_path(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_ellipse_pos(path, ell) != PGS_ELLIPSE_PATH_AVOID); } Datum sphereellipse_overlap_path_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPATH *path = PG_GETARG_SPATH(1); PG_RETURN_BOOL(path_ellipse_pos(path, ell) == PGS_ELLIPSE_PATH_AVOID); } Datum sphereellipse_overlap_path_com(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_ellipse_pos(path, ell) != PGS_ELLIPSE_PATH_AVOID); } Datum sphereellipse_overlap_path_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPATH *path = PG_GETARG_SPATH(0); PG_RETURN_BOOL(path_ellipse_pos(path, ell) == PGS_ELLIPSE_PATH_AVOID); } Datum spheretrans_path(PG_FUNCTION_ARGS) { SPATH *sp = PG_GETARG_SPATH(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SPATH *out = (SPATH *) palloc(VARSIZE(sp)); euler_spath_trans(out, sp, se); PG_RETURN_POINTER(out); } Datum spheretrans_path_inverse(PG_FUNCTION_ARGS) { Datum sp = PG_GETARG_DATUM(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SEuler tmp; Datum ret; spheretrans_inverse(&tmp, se); ret = DirectFunctionCall2( spheretrans_path, sp, PointerGetDatum(&tmp)); PG_RETURN_DATUM(ret); } Datum spherepath_add_point(PG_FUNCTION_ARGS) { SPATH *path = (SPATH *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); int32 size = 0; SPATH *path_new = NULL; if (p == NULL) { PG_RETURN_POINTER(path); } if (path == NULL) { size = offsetof(SPATH, p[0]) + sizeof(SPoint); path = (SPATH *) palloc(size); memcpy((void *) &path->p[0], (void *) p, sizeof(SPoint)); SET_VARSIZE(path, size); path->npts = 1; PG_RETURN_POINTER(path); } path = PG_GETARG_SPATH(0); /* skip if equal */ if (spoint_eq(p, &path->p[path->npts - 1])) { PG_RETURN_POINTER(path); } /* Skip if distance is equal 180deg */ if (FPeq(spoint_dist(p, &path->p[path->npts - 1]), PI)) { elog(NOTICE, "spath(spoint): Skip point, distance of previous point is 180deg"); } size = offsetof(SPATH, p[0]) + sizeof(SPoint) * (path->npts + 1); path_new = palloc(size); memcpy((void *) path_new, (void *) path, VARSIZE(path)); path_new->npts++; SET_VARSIZE(path_new, size); memcpy((void *) &path_new->p[path->npts], (void *) p, sizeof(SPoint)); PG_RETURN_POINTER(path_new); } Datum spherepath_add_points_finalize(PG_FUNCTION_ARGS) { SPATH *path = (SPATH *) PG_GETARG_POINTER(0); if (path == NULL) { PG_RETURN_NULL(); } path = PG_GETARG_SPATH(0); if (path->npts < 2) { elog(NOTICE, "spath(spoint): At least 2 points required"); pfree(path); PG_RETURN_NULL(); } PG_RETURN_POINTER(path); } pgsphere/path.h000066400000000000000000000147451332443031700140130ustar00rootroot00000000000000#ifndef __PGS_PATH_H__ #define __PGS_PATH_H__ #include "polygon.h" /* Path declarations */ /* * The definition of spherical path using a list of * spherical points. */ typedef struct { int32 size; /* total size in bytes */ int32 npts; /* count of points */ SPoint p[1]; /* variable length array of SPoints */ } SPATH; /* Path and circle */ #define PGS_CIRCLE_PATH_AVOID 0 /* circle avoids path */ #define PGS_CIRCLE_CONT_PATH 1 /* circle contains path */ #define PGS_CIRCLE_PATH_OVER 2 /* circle overlaps path */ /* Path and polygon */ #define PGS_POLY_PATH_AVOID 0 /* polygon avoids path */ #define PGS_POLY_CONT_PATH 1 /* polygon contains path */ #define PGS_POLY_PATH_OVER 2 /* polygon and path overlap */ /* Path and ellipse */ #define PGS_ELLIPSE_PATH_AVOID 0 /* ellipse avoids path */ #define PGS_ELLIPSE_CONT_PATH 1 /* ellipse contains path */ #define PGS_ELLIPSE_PATH_OVER 2 /* ellipse overlaps path */ #define PG_GETARG_SPATH(arg) \ ( (SPATH *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(arg))) ) /* * Checks whether two paths are equal. */ bool spath_eq(const SPATH *p1, const SPATH *p2); /* * Checks whether a path contains a point. */ bool spath_cont_point(const SPATH *path, const SPoint *sp); /* * Returns the i-th line segment of a path. * * sl - pointer to line segment * path - pointer to path * i - number of * * Returns the pointer to the line segment or NULL if fails. */ bool spath_segment(SLine *sl, const SPATH *path, int32 i); /* * Input function of path. */ Datum spherepath_in(PG_FUNCTION_ARGS); /* * Returns the n-th point of a path. * * See spherepath_get_point(PG_FUNCTION_ARGS) */ Datum spherepath_get_point(PG_FUNCTION_ARGS); /* * This function interpolates between points of path. Returns the * n-th point of a path where n is a float. * * See spherepath_point(PG_FUNCTION_ARGS) */ Datum spherepath_point(PG_FUNCTION_ARGS); /* * Checks whether two paths are equal. */ Datum spherepath_equal(PG_FUNCTION_ARGS); /* * Checks whether two paths aren't equal. */ Datum spherepath_equal_neg(PG_FUNCTION_ARGS); /* * Returns the length of a path. */ Datum spherepath_length(PG_FUNCTION_ARGS); /* * Returns the number of points in a path. */ Datum spherepath_npts(PG_FUNCTION_ARGS); /* * Changes the direction of a path. */ Datum spherepath_swap(PG_FUNCTION_ARGS); /* * Checks whether a path contains a point. */ Datum spherepath_cont_point(PG_FUNCTION_ARGS); /* * Checks whether a path doesn't contain a point. */ Datum spherepath_cont_point_neg(PG_FUNCTION_ARGS); /* * Checks whether a path contains a point. */ Datum spherepath_cont_point_com(PG_FUNCTION_ARGS); /* * Checks whether a path doesn't contain a point. */ Datum spherepath_cont_point_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a path and a line overlap. */ Datum spherepath_overlap_line(PG_FUNCTION_ARGS); /* * Checks whether a path and a line don't overlap. */ Datum spherepath_overlap_line_neg(PG_FUNCTION_ARGS); /* * Checks whether path and line overlap. */ Datum spherepath_overlap_line_com(PG_FUNCTION_ARGS); /* * Checks whether a path and a line don't overlap. */ Datum spherepath_overlap_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a path. */ Datum spherecircle_cont_path(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a path. */ Datum spherecircle_cont_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a path. */ Datum spherecircle_cont_path_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a path. */ Datum spherecircle_cont_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a path overlap. */ Datum spherecircle_overlap_path(PG_FUNCTION_ARGS); /* * Checks whether a circle and a path don't overlap. */ Datum spherecircle_overlap_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle and a path overlap. */ Datum spherecircle_overlap_path_com(PG_FUNCTION_ARGS); /* * Checks whether a circle and a path don't overlap. */ Datum spherecircle_overlap_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a path. */ Datum spherepoly_cont_path(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a path. */ Datum spherepoly_cont_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains path. */ Datum spherepoly_cont_path_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a path. */ Datum spherepoly_cont_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a path overlap. */ Datum spherepoly_overlap_path(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a path don't overlap. */ Datum spherepoly_overlap_path_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a path overlap. */ Datum spherepoly_overlap_path_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a path don't overlap. */ Datum spherepoly_overlap_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two paths overlap. */ Datum spherepath_overlap_path(PG_FUNCTION_ARGS); /* * Checks whether two paths don't overlap. */ Datum spherepath_overlap_path_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains path. */ Datum sphereellipse_cont_path(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a path. */ Datum sphereellipse_cont_path_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a path. */ Datum sphereellipse_cont_path_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a path. */ Datum sphereellipse_cont_path_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a path overlap. */ Datum sphereellipse_overlap_path(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a path don't overlap. */ Datum sphereellipse_overlap_path_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a path overlap. */ Datum sphereellipse_overlap_path_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse and a path don't overlap. */ Datum sphereellipse_overlap_path_com_neg(PG_FUNCTION_ARGS); /* * Performs an Euler transformation on a path. */ Datum spheretrans_path(PG_FUNCTION_ARGS); /* * Performs an inverse Euler transformation on a path. */ Datum spheretrans_path_inverse(PG_FUNCTION_ARGS); /* * State transition function for aggregate function spath(spoint). Never * call this function outside an aggregate function! * * Adds a point to a path. */ Datum spherepath_add_point(PG_FUNCTION_ARGS); /* * Finalize function for adding spoints to a path. */ Datum spherepath_add_points_finalize(PG_FUNCTION_ARGS); #endif pgsphere/pg_sphere.control000066400000000000000000000002701332443031700162500ustar00rootroot00000000000000# pg_sphere extension comment = 'spherical objects with useful functions, operators and index support' default_version = '1.0' module_pathname = '$libdir/pg_sphere' relocatable = true pgsphere/pg_sphere.h000066400000000000000000000035201332443031700150200ustar00rootroot00000000000000#ifndef __PGS_PGSPHERE_H__ #define __PGS_PGSPHERE_H__ /* Base declarations and includes */ /* * pgSphere is an extra module for PostgreSQL which adds spherical data types. It provides: * * - input and output of data * - containing, overlapping, and other operators * - various input and converting functions and operators * - circumference and area of an object * - spherical transformation * - indexing of spherical data types * - several input and output formats * * Hence, you can do a fast search and analysis for objects with spherical * attributes as used in geographical, astronomical, or other applications * using PostgreSQL. For instance, you can manage data of geographical * objects around the world and astronomical data like star and other * catalogs conveniently using an SQL interface. * * The aim of pgSphere is to * provide uniform access to spherical data. Because PostgreSQL itself * supports a lot of software interfaces, you can now use the same database * with different utilities and applications. */ #include #include #include #include #include #define PI 3.14159265358979323846 /* pi */ #define PIH 1.57079632679489661923 /* pi/2 */ #define PID 6.2831853071795864769 /* 2*pi */ #define RADIANS 57.295779513082320877 /* 180/pi */ #define PI_EPS 4.4408920985006261617e-16 /* 2 ** -51 */ #define Sqr(a) ( (a) * (a) ) /* square function as macro */ #include "postgres.h" #include "fmgr.h" #include "utils/geo_decls.h" #include "utils/array.h" #include "utils/elog.h" #include "utils/builtins.h" #include "catalog/pg_type.h" #include "access/skey.h" #include "access/gist.h" #include "access/itup.h" #ifdef EPSILON #undef EPSILON #endif #define EPSILON 1.0E-09 /* precision of floating point values */ void sphere_yyparse(void); #endif pgsphere/pgs_box.sql.in000066400000000000000000000705401332443031700154700ustar00rootroot00000000000000-- ************************** -- -- spherical box functions -- -- ************************** CREATE FUNCTION sbox(spoint, spoint) RETURNS sbox AS 'MODULE_PATHNAME', 'spherebox_in_from_points' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox(spoint, spoint) IS 'returns a spherical box from south-west corner(arg1) and north-east corner(arg2)'; CREATE FUNCTION sw(sbox) RETURNS spoint AS 'MODULE_PATHNAME', 'spherebox_sw' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sw(sbox) IS 'south-west corner of spherical box'; CREATE FUNCTION se(sbox) RETURNS spoint AS 'MODULE_PATHNAME', 'spherebox_se' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION se(sbox) IS 'south-east corner of spherical box'; CREATE FUNCTION nw(sbox) RETURNS spoint AS 'MODULE_PATHNAME', 'spherebox_nw' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION nw(sbox) IS 'north-west corner of spherical box'; CREATE FUNCTION ne(sbox) RETURNS spoint AS 'MODULE_PATHNAME', 'spherebox_ne' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION ne(sbox) IS 'north-east corner of spherical box'; CREATE FUNCTION area(sbox) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherebox_area' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION area(sbox) IS 'area of a spherical box'; -- -- circumference -- CREATE FUNCTION circum(sbox) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherebox_circ' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION circum(sbox) IS 'circumference of spherical box'; CREATE OPERATOR @-@ ( RIGHTARG = sbox, PROCEDURE = circum ); COMMENT ON OPERATOR @-@ (NONE, sbox) IS 'circumference of spherical box'; -- -- equal -- CREATE FUNCTION sbox_equal(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_equal(sbox, sbox) IS 'returns true, if spherical boxes are equal'; CREATE OPERATOR = ( LEFTARG = sbox, RIGHTARG = sbox, COMMUTATOR = =, NEGATOR = <>, PROCEDURE = sbox_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (sbox, sbox) IS 'true, if spherical boxes are equal'; -- -- not equal -- CREATE FUNCTION sbox_equal_neg (sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_equal_neg (sbox, sbox) IS 'returns true, if spherical boxes are not equal'; CREATE OPERATOR <> ( LEFTARG = sbox, RIGHTARG = sbox, COMMUTATOR = <>, NEGATOR = =, PROCEDURE = sbox_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (sbox, sbox) IS 'true, if spherical boxes are not equal'; -- -- box contains box -- CREATE FUNCTION sbox_contains_box(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_box' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_box(sbox, sbox) IS 'true if spherical box contains spherical box'; -- -- box is contained by box -- CREATE FUNCTION sbox_contains_box_com(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_box_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_box_com(sbox, sbox) IS 'true if spherical box contains spherical box'; -- -- box does not contain box -- CREATE FUNCTION sbox_contains_box_neg(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_box_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_box_neg(sbox, sbox) IS 'true if spherical box does not contain spherical box'; -- -- box is not contained by box -- CREATE FUNCTION sbox_contains_box_com_neg(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_box_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_box_com_neg(sbox, sbox) IS 'true if spherical box does not contain spherical box'; -- -- box overlaps box -- CREATE FUNCTION sbox_overlap_box(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_box' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_box(sbox, sbox) IS 'true if spherical box overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_overlap_box, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, sbox) IS 'true if spherical box overlap spherical box'; -- -- box does not overlap box -- CREATE FUNCTION sbox_overlap_box_neg(sbox, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_box_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_box_neg(sbox, sbox) IS 'true if spherical box does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_overlap_box_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, sbox) IS 'true if spherical box does not overlap spherical box'; -- -- point is contained by box -- CREATE FUNCTION sbox_cont_point_com(spoint, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_point_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_cont_point_com(spoint, sbox) IS 'true if spherical point is contained by spherical box'; -- -- point is not contained by box -- CREATE FUNCTION sbox_cont_point_com_neg(spoint, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_point_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_cont_point_com_neg (spoint, sbox) IS 'true if spherical point is not contained by spherical box'; -- -- box contains point -- CREATE FUNCTION sbox_cont_point(sbox, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_cont_point (sbox, spoint) IS 'true if spherical box contains spherical point'; -- -- box does not contain point -- CREATE FUNCTION sbox_cont_point_neg(sbox, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_point_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_cont_point_neg (sbox, spoint) IS 'true if spherical box does not contain spherical point'; -- -- box contains circle -- CREATE FUNCTION sbox_contains_circle(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_circle(sbox, scircle) IS 'true if spherical box contains spherical circle'; -- -- circle is contained by box -- CREATE FUNCTION sbox_contains_circle_com(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_circle_com(scircle, sbox) IS 'true if spherical box contains spherical circle'; -- -- box does not contain circle -- CREATE FUNCTION sbox_contains_circle_neg(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_circle_neg(sbox, scircle) IS 'true if spherical box does not contain spherical circle'; -- -- circle is not contained by box -- CREATE FUNCTION sbox_contains_circle_com_neg(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_circle_com_neg(scircle, sbox) IS 'true if spherical box does not contain spherical circle'; -- -- circle contains box -- CREATE FUNCTION scircle_contains_box(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_box' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_box(scircle, sbox) IS 'true if spherical circle contains spherical box'; -- -- box is contained by circle -- CREATE FUNCTION scircle_contains_box_com(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_box_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_box_com(sbox, scircle) IS 'true if spherical circle contains spherical box'; -- -- circle does not contain box -- CREATE FUNCTION scircle_contains_box_neg(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_box_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_box_neg(scircle, sbox) IS 'true if spherical circle does not contain spherical box'; -- -- box is not contained by circle -- CREATE FUNCTION scircle_contains_box_com_neg(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_box_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_box_com_neg(sbox, scircle) IS 'true if spherical circle does not contain spherical box'; -- -- circle overlaps box -- CREATE FUNCTION sbox_overlap_circle(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_circle(sbox, scircle) IS 'true if spherical circle overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_overlap_circle, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, scircle) IS 'true if spherical circle overlap spherical box'; -- -- box overlaps circle -- CREATE FUNCTION sbox_overlap_circle_com(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_circle_com(scircle, sbox) IS 'true if spherical circle overlap spherical box'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_overlap_circle_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, sbox) IS 'true if spherical circle overlap spherical box'; -- -- circle does not overlap box -- CREATE FUNCTION sbox_overlap_circle_neg(sbox, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_circle_neg(sbox, scircle) IS 'true if spherical circle does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_overlap_circle_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, scircle) IS 'true if spherical circle does not overlap spherical box'; -- -- box does not overlap circle -- CREATE FUNCTION sbox_overlap_circle_com_neg(scircle, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_circle_com_neg(scircle, sbox) IS 'true if spherical circle does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_overlap_circle_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, sbox) IS 'true if spherical circle does not overlap spherical box'; -- -- box contains line -- CREATE FUNCTION sbox_contains_line(sbox, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_line(sbox, sline) IS 'true if spherical box contains spherical line'; -- -- line is contained by box -- CREATE FUNCTION sbox_contains_line_com(sline, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_line_com(sline, sbox) IS 'true if spherical box contains spherical line'; -- -- box does not contain line -- CREATE FUNCTION sbox_contains_line_neg(sbox, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_line_neg(sbox, sline) IS 'true if spherical box does not contain spherical line'; -- -- line is not contained by box -- CREATE FUNCTION sbox_contains_line_com_neg(sline, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_line_com_neg(sline, sbox) IS 'true if spherical box does not contain spherical line'; -- -- line overlaps box -- CREATE FUNCTION sbox_overlap_line(sbox, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_line(sbox, sline) IS 'true if spherical line overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_overlap_line, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, sline) IS 'true if spherical line overlap spherical box'; -- -- box overlaps line -- CREATE FUNCTION sbox_overlap_line_com(sline, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_line_com(sline, sbox) IS 'true if spherical line overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_overlap_line_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, sbox) IS 'true if spherical line overlap spherical box'; -- -- line does not overlap box -- CREATE FUNCTION sbox_overlap_line_neg(sbox, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_line_neg(sbox, sline) IS 'true if spherical line does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_overlap_line_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, sline) IS 'true if spherical line does not overlap spherical box'; -- -- box does not overlap line -- CREATE FUNCTION sbox_overlap_line_com_neg(sline, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_line_com_neg(sline, sbox) IS 'true if spherical line does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_overlap_line_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, sbox) IS 'true if spherical line does not overlap spherical box'; -- -- box contains ellipse -- CREATE FUNCTION sbox_contains_ellipse(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_ellipse(sbox, sellipse) IS 'true if spherical box contains spherical ellipse'; -- -- ellipse is contained by box -- CREATE FUNCTION sbox_contains_ellipse_com(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_ellipse_com(sellipse, sbox) IS 'true if spherical box contains spherical ellipse'; -- -- box does not contain ellipse -- CREATE FUNCTION sbox_contains_ellipse_neg(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_ellipse_neg(sbox, sellipse) IS 'true if spherical box does not contain spherical ellipse'; -- -- ellipse is not contained by box -- CREATE FUNCTION sbox_contains_ellipse_com_neg(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_ellipse_com_neg(sellipse, sbox) IS 'true if spherical box does not contain spherical ellipse'; -- -- ellipse contains box -- CREATE FUNCTION sellipse_contains_box(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_box' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_box(sellipse, sbox) IS 'true if spherical ellipse contains spherical box'; -- -- box is contained by ellipse -- CREATE FUNCTION sellipse_contains_box_com(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_box_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_box_com(sbox, sellipse) IS 'true if spherical ellipse contains spherical box'; -- -- ellipse does not contain box -- CREATE FUNCTION sellipse_contains_box_neg(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_box_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_box_neg(sellipse, sbox) IS 'true if spherical ellipse does not contain spherical box'; -- -- box is not contained by ellipse -- CREATE FUNCTION sellipse_contains_box_com_neg(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_box_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_box_com_neg(sbox, sellipse) IS 'true if spherical ellipse does not contain spherical box'; -- -- ellipse overlaps box -- CREATE FUNCTION sbox_overlap_ellipse(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_ellipse(sbox, sellipse) IS 'true if spherical ellipse overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_overlap_ellipse, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, sellipse) IS 'true if spherical ellipse overlap spherical box'; -- -- box overlaps ellipse -- CREATE FUNCTION sbox_overlap_ellipse_com(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_ellipse_com(sellipse, sbox) IS 'true if spherical ellipse overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_overlap_ellipse_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, sbox) IS 'true if spherical ellipse overlap spherical box'; -- -- ellipse does not overlap box -- CREATE FUNCTION sbox_overlap_ellipse_neg(sbox, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_ellipse_neg(sbox, sellipse) IS 'true if spherical ellipse does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_overlap_ellipse_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, sellipse) IS 'true if spherical ellipse does not overlap spherical box'; -- -- box does not overlap ellipse -- CREATE FUNCTION sbox_overlap_ellipse_com_neg(sellipse, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_ellipse_com_neg(sellipse, sbox) IS 'true if spherical ellipse does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_overlap_ellipse_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, sbox) IS 'true if spherical ellipse does not overlap spherical box'; -- -- box contains polygon -- CREATE FUNCTION sbox_contains_poly(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_poly(sbox, spoly) IS 'true if spherical box contains spherical polygon'; -- -- polygon is contained by box -- CREATE FUNCTION sbox_contains_poly_com(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_poly_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_poly_com(spoly, sbox) IS 'true if spherical box contains spherical polygon'; -- -- box does not contain polygon -- CREATE FUNCTION sbox_contains_poly_neg(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_poly_neg(sbox, spoly) IS 'true if spherical box does not contain spherical polygon'; -- -- polygon is not contained by box -- CREATE FUNCTION sbox_contains_poly_com_neg(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_poly_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_poly_com_neg(spoly, sbox) IS 'true if spherical box does not contain spherical polygon'; -- -- polygon contains box -- CREATE FUNCTION spoly_contains_box(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_box' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_box(spoly, sbox) IS 'true if spherical polygon contains spherical box'; -- -- box is contained by polygon -- CREATE FUNCTION spoly_contains_box_com(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_box_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_box_com(sbox, spoly) IS 'true if spherical polygon contains spherical box'; -- -- polygon does not contain box -- CREATE FUNCTION spoly_contains_box_neg(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_box_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_box_neg(spoly, sbox) IS 'true if spherical polygon does not contain spherical box'; -- -- box is not contained by polygon -- CREATE FUNCTION spoly_contains_box_com_neg(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_box_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_box_com_neg(sbox, spoly) IS 'true if spherical polygon does not contain spherical box'; -- -- polygon overlaps box -- CREATE FUNCTION sbox_overlap_poly(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_poly(sbox, spoly) IS 'true if spherical polygon overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_overlap_poly, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, spoly) IS 'true if spherical polygon overlap spherical box'; -- -- box overlaps polygon -- CREATE FUNCTION sbox_overlap_poly_com(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_poly_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_poly_com(spoly, sbox) IS 'true if spherical polygon overlap spherical box'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_overlap_poly_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, sbox) IS 'true if spherical polygon overlap spherical box'; -- -- polygon does not overlap box -- CREATE FUNCTION sbox_overlap_poly_neg(sbox, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_poly_neg(sbox, spoly) IS 'true if spherical polygon does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_overlap_poly_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, spoly) IS 'true if spherical polygon does not overlap spherical box'; -- -- box does not overlap polygon -- CREATE FUNCTION sbox_overlap_poly_com_neg(spoly, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_poly_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_poly_com_neg(spoly, sbox) IS 'true if spherical polygon does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_overlap_poly_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, sbox) IS 'true if spherical polygon does not overlap spherical box'; -- -- box contains path -- CREATE FUNCTION sbox_contains_path(sbox, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_path(sbox, spath) IS 'true if spherical box contains spherical path'; -- -- path is contained by box -- CREATE FUNCTION sbox_contains_path_com(spath, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_path_com(spath, sbox) IS 'true if spherical box contains spherical path'; -- -- box does not contain path -- CREATE FUNCTION sbox_contains_path_neg(sbox, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_path_neg(sbox, spath) IS 'true if spherical box does not contain spherical path'; -- -- path is not contained by box -- CREATE FUNCTION sbox_contains_path_com_neg(spath, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_cont_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_contains_path_com_neg(spath, sbox) IS 'true if spherical box does not contain spherical path'; -- -- path overlaps box -- CREATE FUNCTION sbox_overlap_path(sbox, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_path(sbox, spath) IS 'true if spherical path overlap spherical box'; CREATE OPERATOR && ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_overlap_path, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sbox, spath) IS 'true if spherical path overlap spherical box'; -- -- box overlaps path -- CREATE FUNCTION sbox_overlap_path_com(spath, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_path_com(spath, sbox) IS 'true if spherical path overlap spherical box'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_overlap_path_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, sbox) IS 'true if spherical path overlap spherical box'; -- -- path does not overlap box -- CREATE FUNCTION sbox_overlap_path_neg(sbox, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_path_neg(sbox, spath) IS 'true if spherical path does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_overlap_path_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sbox, spath) IS 'true if spherical path does not overlap spherical box'; -- -- box does not overlap path -- CREATE FUNCTION sbox_overlap_path_com_neg(spath, sbox) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherebox_overlap_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sbox_overlap_path_com_neg(spath, sbox) IS 'true if spherical path does not overlap spherical box'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_overlap_path_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, sbox) IS 'true if spherical path does not overlap spherical box'; pgsphere/pgs_circle.sql.in000066400000000000000000000225661332443031700161460ustar00rootroot00000000000000-- **************************** -- -- spherical circle functions -- -- **************************** CREATE FUNCTION area(scircle) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_area' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION area(scircle) IS 'area of spherical circle'; CREATE FUNCTION radius(scircle) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_radius' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION radius(scircle) IS 'radius of spherical circle'; CREATE FUNCTION scircle(spoint, float8) RETURNS scircle AS 'MODULE_PATHNAME' , 'spherecircle_by_center' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle(spoint, float8) IS 'spherical circle with spherical point as center and float8 as radius in radians'; -- -- Casting point as circle -- CREATE FUNCTION scircle(spoint) RETURNS scircle AS 'MODULE_PATHNAME' , 'spherepoint_to_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle(spoint) IS 'spherical circle with radius 0 and spherical point as center'; CREATE CAST (spoint AS scircle) WITH FUNCTION scircle(spoint) AS IMPLICIT; -- ************************** -- -- spherical circle operators -- -- ************************** -- -- equal -- CREATE FUNCTION scircle_equal(scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_equal(scircle, scircle) IS 'returns true, if spherical circles are equal'; CREATE OPERATOR = ( LEFTARG = scircle, RIGHTARG = scircle, COMMUTATOR = = , NEGATOR = <>, PROCEDURE = scircle_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (scircle, scircle) IS 'true, if spherical circles are equal'; -- -- not equal -- CREATE FUNCTION scircle_equal_neg(scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_equal_neg(scircle, scircle) IS 'returns true, if spherical circles are not equal'; CREATE OPERATOR <> ( LEFTARG = scircle, RIGHTARG = scircle, COMMUTATOR = <>, NEGATOR = = , PROCEDURE = scircle_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (scircle, scircle) IS 'true, if spherical circles are not equal'; -- -- overlap -- CREATE FUNCTION scircle_overlap(scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_overlap' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap(scircle, scircle) IS 'true if spherical circles overlap'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_overlap, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, scircle) IS 'true if spherical circles overlap'; -- -- not overlap -- CREATE FUNCTION scircle_overlap_neg(scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_overlap_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap_neg(scircle, scircle) IS 'true if spherical circles do not overlap'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_overlap_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, scircle) IS 'true if spherical circles do not overlap'; -- -- center of circle -- CREATE FUNCTION center(scircle) RETURNS spoint AS 'MODULE_PATHNAME' , 'spherecircle_center' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION center(scircle) IS 'center of spherical circle'; CREATE OPERATOR @@ ( RIGHTARG = scircle, PROCEDURE = center ); COMMENT ON OPERATOR @@ (NONE , scircle) IS 'center of spherical circle'; -- -- circumference -- CREATE FUNCTION circum(scircle) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_circ' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION circum(scircle) IS 'circumference of spherical circle'; CREATE OPERATOR @-@ ( RIGHTARG = scircle, PROCEDURE = circum ); COMMENT ON OPERATOR @-@ (NONE , scircle) IS 'circumference of spherical circle'; -- -- circle is contained by circle -- CREATE FUNCTION scircle_contained_by_circle(scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_in_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contained_by_circle(scircle, scircle) IS 'true if spherical circle is contained by spherical circle'; -- -- circle is not contained by circle -- CREATE FUNCTION scircle_contained_by_circle_neg (scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contained_by_circle_neg (scircle, scircle) IS 'true if spherical circle is not contained by spherical circle'; -- -- circle contains circle -- CREATE FUNCTION scircle_contains_circle (scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_circle (scircle, scircle) IS 'true if spherical circle contains spherical circle'; -- -- circle does not contain circle -- CREATE FUNCTION scircle_contains_circle_neg (scircle, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_circle_neg (scircle, scircle) IS 'true if spherical circle does not contain spherical circle'; -- -- point is contained by circle -- CREATE FUNCTION spoint_contained_by_circle(spoint, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherepoint_in_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_contained_by_circle(spoint, scircle) IS 'true if spherical point is contained by spherical circle'; -- -- point is not contained by circle -- CREATE FUNCTION spoint_contained_by_circle_neg(spoint, scircle) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_contained_by_circle_neg (spoint, scircle) IS 'true if spherical point is not contained by spherical circle '; -- -- circle contains point -- CREATE FUNCTION spoint_contained_by_circle_com(scircle, spoint) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_contained_by_circle_com (scircle, spoint) IS 'true if spherical circle contains spherical point '; -- -- circle does not contain point -- CREATE FUNCTION spoint_contained_by_circle_com_neg(scircle, spoint) RETURNS BOOL AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_contained_by_circle_com_neg (scircle, spoint) IS 'true if spherical circle does not contain spherical point '; -- -- distance between circles -- CREATE FUNCTION dist(scircle, scircle) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_distance' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION dist(scircle, scircle) IS 'distance between two spherical circles'; CREATE OPERATOR <-> ( LEFTARG = scircle, RIGHTARG = scircle, COMMUTATOR = '<->', PROCEDURE = dist ); COMMENT ON OPERATOR <-> (scircle, scircle) IS 'distance between two spherical circles'; -- -- distance between circle and point -- CREATE FUNCTION dist(scircle, spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_point_distance' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION dist(scircle, spoint) IS 'distance between spherical circle and spherical point'; CREATE OPERATOR <-> ( LEFTARG = scircle, RIGHTARG = spoint, COMMUTATOR = '<->', PROCEDURE = dist ); COMMENT ON OPERATOR <-> (scircle, spoint) IS 'distance between spherical circle and spherical point'; -- -- distance between point and circle -- CREATE FUNCTION dist(spoint, scircle) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherecircle_point_distance_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION dist(spoint, scircle) IS 'distance between spherical circle and spherical point'; CREATE OPERATOR <-> ( LEFTARG = spoint, RIGHTARG = scircle, COMMUTATOR = '<->', PROCEDURE = dist ); COMMENT ON OPERATOR <-> (spoint, scircle) IS 'distance between spherical circle and spherical point'; -- -- Transformation of circle -- CREATE FUNCTION strans_circle(scircle, strans) RETURNS scircle AS 'MODULE_PATHNAME' , 'spheretrans_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_circle (scircle, strans) IS 'returns a transformated spherical circle'; CREATE OPERATOR + ( LEFTARG = scircle, RIGHTARG = strans, PROCEDURE = strans_circle ); COMMENT ON OPERATOR + (scircle, strans) IS 'transforms a spherical circle '; CREATE FUNCTION strans_circle_inverse(scircle, strans) RETURNS scircle AS 'MODULE_PATHNAME' , 'spheretrans_circle_inverse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_circle_inverse (scircle, strans) IS 'returns a inverse transformated spherical circle'; CREATE OPERATOR - ( LEFTARG = scircle, RIGHTARG = strans, PROCEDURE = strans_circle_inverse ); COMMENT ON OPERATOR - (scircle, strans) IS 'transforms inverse a spherical circle '; pgsphere/pgs_contains_ops.sql.in000066400000000000000000001154611332443031700174010ustar00rootroot00000000000000--- scircle vs scircle CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contains_circle, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, scircle) IS 'true if spherical circle (LHS) contains spherical circle (RHS)'; CREATE OPERATOR <@ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contained_by_circle, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (scircle, scircle) IS 'true if spherical circle (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contains_circle_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, scircle) IS 'true if spherical circle (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contained_by_circle_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (scircle, scircle) IS 'true if spherical circle (LHS) is not contained by spherical circle (RHS)'; --- spoint vs scircle CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = spoint, PROCEDURE = spoint_contained_by_circle_com, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, spoint) IS 'true if spherical circle (LHS) contains spherical point (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = scircle, PROCEDURE = spoint_contained_by_circle, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, scircle) IS 'true if spherical point (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = spoint, PROCEDURE = spoint_contained_by_circle_com_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, spoint) IS 'true if spherical circle (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = scircle, PROCEDURE = spoint_contained_by_circle_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, scircle) IS 'true if spherical point (LHS) is not contained by spherical circle (RHS)'; --- spoly vs spoly CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, spoly) IS 'true if spherical polygon (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoly, spoly) IS 'true if spherical polygon (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, spoly) IS 'true if spherical polygon (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoly, spoly) IS 'true if spherical polygon (LHS) is not contained by spherical polygon (RHS)'; -- spoly vs spoint CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = spoint, PROCEDURE = spoly_contains_point, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, spoint) IS 'true if spherical polygon (LHS) contains spherical point (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = spoly, PROCEDURE = spoly_contains_point_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, spoly) IS 'true if spherical point (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = spoint, PROCEDURE = spoly_contains_point_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, spoint) IS 'true if spherical polygon (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = spoly, PROCEDURE = spoly_contains_point_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, spoly) IS 'true if spherical point (LHS) is not contained by spherical polygon (RHS)'; --- scircle vs spoly CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = scircle_contains_polygon, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, spoly) IS 'true if spherical circle (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = scircle_contains_polygon_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoly, scircle) IS 'true if spherical polygon (LHS) is contained by spherical circle (LHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = scircle_contains_polygon_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, spoly) IS 'true if spherical circle (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = scircle_contains_polygon_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoly, scircle) IS 'true if spherical polygon (LHS) is not contained spherical circle (RHS)'; CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_contains_circle, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, scircle) IS 'true if spherical polygon (LHS) contains spherical circle (RHS)'; CREATE OPERATOR <@ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_contains_circle_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (scircle, spoly) IS 'true if spherical circle (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_contains_circle_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, scircle) IS 'true if spherical polygon (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_contains_circle_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (scircle, spoly) IS 'true if spherical circle (LHS) is not contained by spherical polygon (RHS)'; --- sbox vs sbox CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, sbox) IS 'true if spherical box (LHS) contains spherical box (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sbox, sbox) IS 'true if spherical box (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, sbox) IS 'true if spherical box (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sbox, sbox) IS 'true if spherical box (LHS) is not contained by spherical box (RHS)'; --- sbox vs spoint CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = spoint, PROCEDURE = sbox_cont_point, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, spoint) IS 'true if spherical box (LHS) contains spherical point (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = sbox, PROCEDURE = sbox_cont_point_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, sbox) IS 'true if spherical point (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = spoint, PROCEDURE = sbox_cont_point_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, spoint) IS 'true if spherical box (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = sbox, PROCEDURE = sbox_cont_point_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, sbox) IS 'true if spherical point (LHS) is not contained by spherical box (RHS)'; --- scircle vs sbox CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = scircle_contains_box, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, sbox) IS 'true if spherical circle (LHS) contains spherical box (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = scircle_contains_box_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sbox, scircle) IS 'true if spherical box (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = scircle_contains_box_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, sbox) IS 'true if spherical circle (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = scircle_contains_box_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sbox, scircle) IS 'true if spherical box (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_contains_circle, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, scircle) IS 'true if spherical box (LHS) contains spherical circle (RHS)'; CREATE OPERATOR <@ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_contains_circle_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (scircle, sbox) IS 'true if spherical circle (LHS) contains spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_contains_circle_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, scircle) IS 'true if spherical box (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_contains_circle_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (scircle, sbox) IS 'true if spherical circle (LHS) is not contained by spherical box (RHS)'; --- sbox vs spoly CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = spoly_contains_box, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, sbox) IS 'true if spherical polygon (LHS) contains spherical box (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = spoly_contains_box_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sbox, spoly) IS 'true if spherical box (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = spoly_contains_box_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, sbox) IS 'true if spherical polygon (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = spoly_contains_box_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sbox, spoly) IS 'true if spherical box (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_contains_poly, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, spoly) IS 'true if spherical box (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_contains_poly_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoly, sbox) IS 'true if spherical polygon (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_contains_poly_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, spoly) IS 'true if spherical box (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_contains_poly_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoly, sbox) IS 'true if spherical polygon (LHS) is not contained by spherical box (RHS)'; -- new stuff -- CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = sline, PROCEDURE = sline_contains_point_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, sline) IS 'true if spherical point (LHS) is contained by spherical line (RHS)'; CREATE OPERATOR @> ( LEFTARG = sline, RIGHTARG = spoint, PROCEDURE = sline_contains_point, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sline, spoint) IS 'true if spherical line (LHS) contains the spherical point (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sline, RIGHTARG = spoint, PROCEDURE = sline_contains_point_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sline, spoint) IS 'true if spherical line (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = sline, PROCEDURE = sline_contains_point_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, sline) IS 'true if spherical point (LHS) is not contained by spherical line (RHS)'; CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = scircle_contains_line, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, sline) IS 'true if spherical circle (LHS) contains spherical line (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = scircle_contains_line_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sline, scircle) IS 'true if spherical line (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = scircle_contains_line_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, sline) IS 'true if spherical circle (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = scircle_contains_line_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sline, scircle) IS 'true if spherical line (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_contains_line, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, sline) IS 'true if spherical polygon (LHS) contains spherical line (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_contains_line_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sline, spoly) IS 'true if spherical line (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_contains_line, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, sline) IS 'true if spherical polygon (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_contains_line_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sline, spoly) IS 'true if spherical line (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, sellipse) IS 'true if spherical ellipse (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, sellipse) IS 'true if spherical ellipse (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = spoint, PROCEDURE = sellipse_contains_point, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, spoint) IS 'true if spherical ellipse (LHS) contains spherical point (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_point_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, sellipse) IS 'true if spherical point (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = spoint, PROCEDURE = sellipse_contains_point_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, spoint) IS 'true if spherical ellipse (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_point_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, sellipse) IS 'true if spherical point (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_contains_ellipse, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, sellipse) IS 'true if spherical box (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_contains_ellipse_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sellipse, sbox) IS 'true if spherical ellipse (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_contains_ellipse_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, sellipse) IS 'true if spherical box (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_contains_ellipse_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sellipse, sbox) IS 'true if spherical ellipse (LHS) is not contained by spherical box (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sellipse_contains_box, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, sbox) IS 'true if spherical ellipse (LHS) contains spherical box (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_box_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sbox, sellipse) IS 'true if spherical box (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sellipse_contains_box_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, sbox) IS 'true if spherical ellipse (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_box_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sbox, sellipse) IS 'true if spherical box (LHS) is not containe by spherical ellipse (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_contains_circle, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, scircle) IS 'true if spherical ellipse (LHS) contains spherical circle (RHS)'; CREATE OPERATOR <@ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_circle_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (scircle, sellipse) IS 'true if spherical circle (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_contains_circle_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, scircle) IS 'true if spherical ellipse (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_circle_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (scircle, sellipse) IS 'true if spherical circle (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = scircle_contains_ellipse, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, sellipse) IS 'true if spherical circle (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = scircle_contains_ellipse_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sellipse, scircle) IS 'true if spherical ellipse (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = scircle_contains_ellipse_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, sellipse) IS 'true if spherical circle (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = scircle_contains_ellipse_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sellipse, scircle) IS 'true if spherical ellipse (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_contains_line, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, sline) IS 'true if spherical ellipse (LHS) contains spherical line (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_line_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sline, sellipse) IS 'true if spherical line is contained by spherical ellipse'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_contains_line_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, sline) IS 'true if spherical ellipse (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_line_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sline, sellipse) IS 'true if spherical line (LHS) is not contained by spherical line (RHS)'; CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_contains_ellipse, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, sellipse) IS 'true if spherical polygon (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_contains_ellipse_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sellipse, spoly) IS 'true if spherical ellipse (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_contains_ellipse_neg, COMMUTATOR = '!>@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, sellipse) IS 'true if spherical polygon (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_contains_ellipse_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sellipse, spoly) IS 'true if spherical ellipse (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = sellipse_contains_polygon, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, spoly) IS 'true if spherical ellipse (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_polygon_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoly, sellipse) IS 'true if spherical polygon (LHS) is contained by spherical elli[pse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = sellipse_contains_polygon_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, spoly) IS 'true if spherical ellipse (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_polygon_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoly, sellipse) IS 'true if spherical polygon (LHS) is not contained by spherical elli[pse (RHS)'; CREATE OPERATOR @> ( LEFTARG = spath, RIGHTARG = spoint, PROCEDURE = spath_contains_point, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spath, spoint) IS 'true if spherical path (LHS) contains spherical point (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spoint, RIGHTARG = spath, PROCEDURE = spath_contains_point_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spoint, spath) IS 'true if spherical point (LHS) is contained by spherical path (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spath, RIGHTARG = spoint, PROCEDURE = spath_contains_point_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spath, spoint) IS 'true if spherical path (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spoint, RIGHTARG = spath, PROCEDURE = spath_contains_point_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spoint, spath) IS 'true if spherical point (LHS) is not contained by spherical path (RHS)'; CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_contains_path, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, spath) IS 'true if spherical box (LHS) contains spherical path (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_contains_path_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spath, sbox) IS 'true if spherical path is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_contains_path_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, spath) IS 'true if spherical box (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_contains_path_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spath, sbox) IS 'true if spherical path (LHS) is not contained by spherical box (RHS)'; CREATE OPERATOR @> ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_contains_path, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (scircle, spath) IS 'true if spherical circle (LHS) contains spherical path (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_contains_path_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spath, scircle) IS 'true if spherical path (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !@> ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_contains_path_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (scircle, spath) IS 'true if spherical circle (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_contains_path_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spath, scircle) IS 'true if spherical path (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR @> ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_contains_path, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sellipse, spath) IS 'true if spherical ellipse (LHS) contains spherical path (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_path_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spath, sellipse) IS 'true if spherical path (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_contains_path_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sellipse, spath) IS 'true if spherical ellipse (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_path_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spath, sellipse) IS 'true if spherical path is not contained by spherical ellipse (RHS)'; CREATE OPERATOR @> ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_contains_path, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (spoly, spath) IS 'true if spherical polygon (LHS) contains spherical path (RHS)'; CREATE OPERATOR <@ ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_contains_path_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (spath, spoly) IS 'true if spherical path (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !@> ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_contains_path_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (spoly, spath) IS 'true if spherical polygon (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_contains_path_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (spath, spoly) IS 'true if spherical path (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR @> ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_contains_line, COMMUTATOR = '<@', NEGATOR = '!@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @> (sbox, sline) IS 'true if spherical box (LHS) contains spherical line (RHS)'; CREATE OPERATOR <@ ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_contains_line_com, COMMUTATOR = '@>', NEGATOR = '!<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <@ (sline, sbox) IS 'true if spherical line (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !@> ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_contains_line_neg, COMMUTATOR = '!<@', NEGATOR = '@>', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@> (sbox, sline) IS 'true if spherical box (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !<@ ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_contains_line_com_neg, COMMUTATOR = '!@>', NEGATOR = '<@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !<@ (sline, sbox) IS 'true if spherical line (LHS) is not contained by spherical box (RHS)'; pgsphere/pgs_contains_ops_compat.sql.in000066400000000000000000001147431332443031700207460ustar00rootroot00000000000000-- declare old-style contains operators -- (akin to built-in geometry operators before PostgreSQL 8.2), -- adapted from pgs_contains_ops.sql.in --- scircle vs scircle CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contains_circle, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, scircle) IS 'true if spherical circle (LHS) contains spherical circle (RHS)'; CREATE OPERATOR @ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contained_by_circle, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (scircle, scircle) IS 'true if spherical circle (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contains_circle_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, scircle) IS 'true if spherical circle (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !@ ( LEFTARG = scircle, RIGHTARG = scircle, PROCEDURE = scircle_contained_by_circle_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (scircle, scircle) IS 'true if spherical circle (LHS) is not contained by spherical circle (RHS)'; --- spoint vs scircle CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = spoint, PROCEDURE = spoint_contained_by_circle_com, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, spoint) IS 'true if spherical circle (LHS) contains spherical point (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = scircle, PROCEDURE = spoint_contained_by_circle, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, scircle) IS 'true if spherical point (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = spoint, PROCEDURE = spoint_contained_by_circle_com_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, spoint) IS 'true if spherical circle (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = scircle, PROCEDURE = spoint_contained_by_circle_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, scircle) IS 'true if spherical point (LHS) is not contained by spherical circle (RHS)'; --- spoly vs spoly CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, spoly) IS 'true if spherical polygon (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoly, spoly) IS 'true if spherical polygon (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, spoly) IS 'true if spherical polygon (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_contains_polygon_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoly, spoly) IS 'true if spherical polygon (LHS) is not contained by spherical polygon (RHS)'; -- spoly vs spoint CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = spoint, PROCEDURE = spoly_contains_point, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, spoint) IS 'true if spherical polygon (LHS) contains spherical point (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = spoly, PROCEDURE = spoly_contains_point_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, spoly) IS 'true if spherical point (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = spoint, PROCEDURE = spoly_contains_point_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, spoint) IS 'true if spherical polygon (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = spoly, PROCEDURE = spoly_contains_point_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, spoly) IS 'true if spherical point (LHS) is not contained by spherical polygon (RHS)'; --- scircle vs spoly CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = scircle_contains_polygon, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, spoly) IS 'true if spherical circle (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = scircle_contains_polygon_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoly, scircle) IS 'true if spherical polygon (LHS) is contained by spherical circle (LHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = scircle_contains_polygon_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, spoly) IS 'true if spherical circle (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = scircle_contains_polygon_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoly, scircle) IS 'true if spherical polygon (LHS) is not contained spherical circle (RHS)'; CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_contains_circle, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, scircle) IS 'true if spherical polygon (LHS) contains spherical circle (RHS)'; CREATE OPERATOR @ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_contains_circle_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (scircle, spoly) IS 'true if spherical circle (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_contains_circle_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, scircle) IS 'true if spherical polygon (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !@ ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_contains_circle_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (scircle, spoly) IS 'true if spherical circle (LHS) is not contained by spherical polygon (RHS)'; --- sbox vs sbox CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, sbox) IS 'true if spherical box (LHS) contains spherical box (RHS)'; CREATE OPERATOR @ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sbox, sbox) IS 'true if spherical box (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, sbox) IS 'true if spherical box (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sbox, RIGHTARG = sbox, PROCEDURE = sbox_contains_box_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sbox, sbox) IS 'true if spherical box (LHS) is not contained by spherical box (RHS)'; --- sbox vs spoint CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = spoint, PROCEDURE = sbox_cont_point, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, spoint) IS 'true if spherical box (LHS) contains spherical point (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = sbox, PROCEDURE = sbox_cont_point_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, sbox) IS 'true if spherical point (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = spoint, PROCEDURE = sbox_cont_point_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, spoint) IS 'true if spherical box (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = sbox, PROCEDURE = sbox_cont_point_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, sbox) IS 'true if spherical point (LHS) is not contained by spherical box (RHS)'; --- scircle vs sbox CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = scircle_contains_box, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, sbox) IS 'true if spherical circle (LHS) contains spherical box (RHS)'; CREATE OPERATOR @ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = scircle_contains_box_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sbox, scircle) IS 'true if spherical box (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = scircle_contains_box_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, sbox) IS 'true if spherical circle (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = scircle_contains_box_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sbox, scircle) IS 'true if spherical box (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_contains_circle, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, scircle) IS 'true if spherical box (LHS) contains spherical circle (RHS)'; CREATE OPERATOR @ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_contains_circle_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (scircle, sbox) IS 'true if spherical circle (LHS) contains spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = scircle, PROCEDURE = sbox_contains_circle_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, scircle) IS 'true if spherical box (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !@ ( LEFTARG = scircle, RIGHTARG = sbox, PROCEDURE = sbox_contains_circle_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (scircle, sbox) IS 'true if spherical circle (LHS) is not contained by spherical box (RHS)'; --- sbox vs spoly CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = spoly_contains_box, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, sbox) IS 'true if spherical polygon (LHS) contains spherical box (RHS)'; CREATE OPERATOR @ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = spoly_contains_box_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sbox, spoly) IS 'true if spherical box (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = spoly_contains_box_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, sbox) IS 'true if spherical polygon (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = spoly_contains_box_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sbox, spoly) IS 'true if spherical box (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_contains_poly, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, spoly) IS 'true if spherical box (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_contains_poly_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoly, sbox) IS 'true if spherical polygon (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = spoly, PROCEDURE = sbox_contains_poly_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, spoly) IS 'true if spherical box (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoly, RIGHTARG = sbox, PROCEDURE = sbox_contains_poly_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoly, sbox) IS 'true if spherical polygon (LHS) is not contained by spherical box (RHS)'; -- new stuff -- CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = sline, PROCEDURE = sline_contains_point_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, sline) IS 'true if spherical point (LHS) is contained by spherical line (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sline, RIGHTARG = spoint, PROCEDURE = sline_contains_point, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sline, spoint) IS 'true if spherical line (LHS) contains the spherical point (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sline, RIGHTARG = spoint, PROCEDURE = sline_contains_point_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sline, spoint) IS 'true if spherical line (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = sline, PROCEDURE = sline_contains_point_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, sline) IS 'true if spherical point (LHS) is not contained by spherical line (RHS)'; CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = scircle_contains_line, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, sline) IS 'true if spherical circle (LHS) contains spherical line (RHS)'; CREATE OPERATOR @ ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = scircle_contains_line_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sline, scircle) IS 'true if spherical line (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = scircle_contains_line_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, sline) IS 'true if spherical circle (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = scircle_contains_line_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sline, scircle) IS 'true if spherical line (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_contains_line, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, sline) IS 'true if spherical polygon (LHS) contains spherical line (RHS)'; CREATE OPERATOR @ ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_contains_line_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sline, spoly) IS 'true if spherical line (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_contains_line, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, sline) IS 'true if spherical polygon (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_contains_line_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sline, spoly) IS 'true if spherical line (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR @ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_ellipse_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sellipse, sellipse) IS 'true if spherical ellipse (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = spoint, PROCEDURE = sellipse_contains_point, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, spoint) IS 'true if spherical ellipse (LHS) contains spherical point (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_point_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, sellipse) IS 'true if spherical point (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = spoint, PROCEDURE = sellipse_contains_point_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, spoint) IS 'true if spherical ellipse (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_point_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, sellipse) IS 'true if spherical point (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_contains_ellipse, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, sellipse) IS 'true if spherical box (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR @ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_contains_ellipse_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sellipse, sbox) IS 'true if spherical ellipse (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sbox_contains_ellipse_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, sellipse) IS 'true if spherical box (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sbox_contains_ellipse_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sellipse, sbox) IS 'true if spherical ellipse (LHS) is not contained by spherical box (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sellipse_contains_box, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, sbox) IS 'true if spherical ellipse (LHS) contains spherical box (RHS)'; CREATE OPERATOR @ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_box_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sbox, sellipse) IS 'true if spherical box (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = sbox, PROCEDURE = sellipse_contains_box_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, sbox) IS 'true if spherical ellipse (LHS) does not contain spherical box (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sbox, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_box_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sbox, sellipse) IS 'true if spherical box (LHS) is not containe by spherical ellipse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_contains_circle, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, scircle) IS 'true if spherical ellipse (LHS) contains spherical circle (RHS)'; CREATE OPERATOR @ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_circle_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (scircle, sellipse) IS 'true if spherical circle (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_contains_circle_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, scircle) IS 'true if spherical ellipse (LHS) does not contain spherical circle (RHS)'; CREATE OPERATOR !@ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_circle_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (scircle, sellipse) IS 'true if spherical circle (LHS) is not contained by spherical ellipse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = scircle_contains_ellipse, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, sellipse) IS 'true if spherical circle (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR @ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = scircle_contains_ellipse_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sellipse, scircle) IS 'true if spherical ellipse (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = scircle_contains_ellipse_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, sellipse) IS 'true if spherical circle (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = scircle_contains_ellipse_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sellipse, scircle) IS 'true if spherical ellipse (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_contains_line, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, sline) IS 'true if spherical ellipse (LHS) contains spherical line (RHS)'; CREATE OPERATOR @ ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_line_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sline, sellipse) IS 'true if spherical line is contained by spherical ellipse'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_contains_line_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, sline) IS 'true if spherical ellipse (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_line_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sline, sellipse) IS 'true if spherical line (LHS) is not contained by spherical line (RHS)'; CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_contains_ellipse, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, sellipse) IS 'true if spherical polygon (LHS) contains spherical ellipse (RHS)'; CREATE OPERATOR @ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_contains_ellipse_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sellipse, spoly) IS 'true if spherical ellipse (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_contains_ellipse_neg, COMMUTATOR = '!>@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, sellipse) IS 'true if spherical polygon (LHS) does not contain spherical ellipse (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_contains_ellipse_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sellipse, spoly) IS 'true if spherical ellipse (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = sellipse_contains_polygon, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, spoly) IS 'true if spherical ellipse (LHS) contains spherical polygon (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_polygon_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoly, sellipse) IS 'true if spherical polygon (LHS) is contained by spherical elli[pse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = sellipse_contains_polygon_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, spoly) IS 'true if spherical ellipse (LHS) does not contain spherical polygon (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_polygon_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoly, sellipse) IS 'true if spherical polygon (LHS) is not contained by spherical elli[pse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = spath, RIGHTARG = spoint, PROCEDURE = spath_contains_point, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spath, spoint) IS 'true if spherical path (LHS) contains spherical point (RHS)'; CREATE OPERATOR @ ( LEFTARG = spoint, RIGHTARG = spath, PROCEDURE = spath_contains_point_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spoint, spath) IS 'true if spherical point (LHS) is contained by spherical path (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spath, RIGHTARG = spoint, PROCEDURE = spath_contains_point_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spath, spoint) IS 'true if spherical path (LHS) does not contain spherical point (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spoint, RIGHTARG = spath, PROCEDURE = spath_contains_point_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spoint, spath) IS 'true if spherical point (LHS) is not contained by spherical path (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_contains_path, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, spath) IS 'true if spherical box (LHS) contains spherical path (RHS)'; CREATE OPERATOR @ ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_contains_path_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spath, sbox) IS 'true if spherical path is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = spath, PROCEDURE = sbox_contains_path_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, spath) IS 'true if spherical box (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spath, RIGHTARG = sbox, PROCEDURE = sbox_contains_path_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spath, sbox) IS 'true if spherical path (LHS) is not contained by spherical box (RHS)'; CREATE OPERATOR ~ ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_contains_path, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (scircle, spath) IS 'true if spherical circle (LHS) contains spherical path (RHS)'; CREATE OPERATOR @ ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_contains_path_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spath, scircle) IS 'true if spherical path (LHS) is contained by spherical circle (RHS)'; CREATE OPERATOR !~ ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_contains_path_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (scircle, spath) IS 'true if spherical circle (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_contains_path_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spath, scircle) IS 'true if spherical path (LHS) is not contained by spherical circle (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_contains_path, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sellipse, spath) IS 'true if spherical ellipse (LHS) contains spherical path (RHS)'; CREATE OPERATOR @ ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_path_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spath, sellipse) IS 'true if spherical path (LHS) is contained by spherical ellipse (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_contains_path_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sellipse, spath) IS 'true if spherical ellipse (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_contains_path_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spath, sellipse) IS 'true if spherical path is not contained by spherical ellipse (RHS)'; CREATE OPERATOR ~ ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_contains_path, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (spoly, spath) IS 'true if spherical polygon (LHS) contains spherical path (RHS)'; CREATE OPERATOR @ ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_contains_path_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (spath, spoly) IS 'true if spherical path (LHS) is contained by spherical polygon (RHS)'; CREATE OPERATOR !~ ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_contains_path_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (spoly, spath) IS 'true if spherical polygon (LHS) does not contain spherical path (RHS)'; CREATE OPERATOR !@ ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_contains_path_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (spath, spoly) IS 'true if spherical path (LHS) is not contained by spherical polygon (RHS)'; CREATE OPERATOR ~ ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_contains_line, COMMUTATOR = '@', NEGATOR = '!~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR ~ (sbox, sline) IS 'true if spherical box (LHS) contains spherical line (RHS)'; CREATE OPERATOR @ ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_contains_line_com, COMMUTATOR = '~', NEGATOR = '!@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR @ (sline, sbox) IS 'true if spherical line (LHS) is contained by spherical box (RHS)'; CREATE OPERATOR !~ ( LEFTARG = sbox, RIGHTARG = sline, PROCEDURE = sbox_contains_line_neg, COMMUTATOR = '!@', NEGATOR = '~', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !~ (sbox, sline) IS 'true if spherical box (LHS) does not contain spherical line (RHS)'; CREATE OPERATOR !@ ( LEFTARG = sline, RIGHTARG = sbox, PROCEDURE = sbox_contains_line_com_neg, COMMUTATOR = '!~', NEGATOR = '@', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !@ (sline, sbox) IS 'true if spherical line (LHS) is not contained by spherical box (RHS)'; pgsphere/pgs_ellipse.sql.in000066400000000000000000000444571332443031700163450ustar00rootroot00000000000000-- **************************** -- -- spherical ellipse functions -- -- **************************** CREATE FUNCTION sellipse(spoint, float8, float8, float8) RETURNS sellipse AS 'MODULE_PATHNAME', 'sphereellipse_infunc' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse(spoint, float8, float8, float8) IS 'returns spherical ellipse from center, radius1, radius2 and inclination'; CREATE FUNCTION inc(sellipse) RETURNS float8 AS 'MODULE_PATHNAME', 'sphereellipse_incl' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION inc(sellipse) IS 'inclination of spherical ellipse'; CREATE FUNCTION lrad(sellipse) RETURNS float8 AS 'MODULE_PATHNAME', 'sphereellipse_rad1' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION lrad(sellipse) IS 'large radius of spherical ellipse'; CREATE FUNCTION srad(sellipse) RETURNS float8 AS 'MODULE_PATHNAME', 'sphereellipse_rad2' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION srad(sellipse) IS 'small radius of spherical ellipse'; -- -- Casting point as ellipse -- CREATE FUNCTION sellipse(spoint) RETURNS sellipse AS 'MODULE_PATHNAME', 'spherepoint_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse(spoint) IS 'returns spherical point as spherical ellipse'; CREATE CAST (spoint AS sellipse) WITH FUNCTION sellipse(spoint) AS IMPLICIT; -- -- Casting ellipse as circle -- CREATE FUNCTION scircle(sellipse) RETURNS scircle AS 'MODULE_PATHNAME', 'sphereellipse_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle(sellipse) IS 'spherical bounding circle of spherical ellipse'; CREATE CAST (sellipse AS scircle) WITH FUNCTION scircle(sellipse) AS IMPLICIT; -- -- Casting circle as ellipse -- CREATE FUNCTION sellipse(scircle) RETURNS sellipse AS 'MODULE_PATHNAME', 'spherecircle_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse(scircle) IS 'returns spherical circle as spherical ellipse'; CREATE CAST (scircle AS sellipse) WITH FUNCTION sellipse(scircle) AS IMPLICIT; -- -- Casting ellipse as Euler transformation -- CREATE FUNCTION strans(sellipse) RETURNS strans AS 'MODULE_PATHNAME', 'sphereellipse_trans' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans(sellipse) IS 'returns Euler transformation of spherical ellipse'; CREATE CAST (sellipse AS strans) WITH FUNCTION strans(sellipse) AS IMPLICIT; -- **************************** -- -- spherical ellipse operators -- -- **************************** CREATE FUNCTION center(sellipse) RETURNS spoint AS 'MODULE_PATHNAME', 'sphereellipse_center' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION center(sellipse) IS 'center of spherical ellipse'; CREATE OPERATOR @@ ( RIGHTARG = sellipse, PROCEDURE = center ); COMMENT ON OPERATOR @@ (NONE, sellipse) IS 'center of spherical ellipse'; -- -- equal -- CREATE FUNCTION sellipse_equal(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_equal(sellipse, sellipse) IS 'returns true, if spherical ellipses are equal'; CREATE OPERATOR = ( LEFTARG = sellipse, RIGHTARG = sellipse, COMMUTATOR = = , NEGATOR = <>, PROCEDURE = sellipse_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (sellipse, sellipse) IS 'true, if spherical ellipses are equal'; -- -- not equal -- CREATE FUNCTION sellipse_equal_neg(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_equal_neg(sellipse, sellipse) IS 'returns true, if spherical ellipses are not equal'; CREATE OPERATOR <> ( LEFTARG = sellipse, RIGHTARG = sellipse, COMMUTATOR = <>, NEGATOR = = , PROCEDURE = sellipse_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (sellipse, sellipse) IS 'true, if spherical ellipses are not equal'; -- -- ellipse contains ellipse -- CREATE FUNCTION sellipse_contains_ellipse(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_ellipse(sellipse, sellipse) IS 'true if spherical ellipse contains spherical ellipse'; -- -- ellipse is contained by ellipse -- CREATE FUNCTION sellipse_contains_ellipse_com(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_ellipse_com(sellipse, sellipse) IS 'true if spherical ellipse is contained by spherical ellipse'; -- -- ellipse does not contain ellipse -- CREATE FUNCTION sellipse_contains_ellipse_neg(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_ellipse_neg(sellipse, sellipse) IS 'true if spherical ellipse does not contain spherical ellipse'; -- -- ellipse is not contained by ellipse -- CREATE FUNCTION sellipse_contains_ellipse_com_neg(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_ellipse_com_neg(sellipse, sellipse) IS 'true if spherical ellipse is not contained by spherical ellipse'; -- -- ellipses overlap -- CREATE FUNCTION sellipse_overlap_ellipse(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_ellipse(sellipse, sellipse) IS 'true if spherical ellipse overlaps spherical ellipse'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_ellipse, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, sellipse) IS 'true if spherical ellipses overlap'; -- -- ellipses do not overlap -- CREATE FUNCTION sellipse_overlap_ellipse_neg(sellipse, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_ellipse_neg(sellipse, sellipse) IS 'true if spherical ellipse does not overlap spherical ellipse'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_ellipse_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, sellipse) IS 'true if spherical ellipse does not overlap spherical ellipse'; -- -- ellipse contains point -- CREATE FUNCTION sellipse_contains_point(sellipse, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_point(sellipse, spoint) IS 'true if spherical ellipse contains spherical point'; -- -- point is contained by ellipse -- CREATE FUNCTION sellipse_contains_point_com(spoint, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_point_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_point_com(spoint, sellipse) IS 'true if spherical ellipse contains spherical point'; -- -- ellipse does not contain point -- CREATE FUNCTION sellipse_contains_point_neg(sellipse, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_point_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_point_neg(sellipse, spoint) IS 'true if spherical ellipse contains spherical point'; -- -- point is not contained by ellipse -- CREATE FUNCTION sellipse_contains_point_com_neg(spoint, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_point_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_point_com_neg(spoint, sellipse) IS 'true if spherical ellipse contains spherical point'; -- -- Transformation of ellipse -- CREATE FUNCTION strans_ellipse(sellipse, strans) RETURNS sellipse AS 'MODULE_PATHNAME', 'spheretrans_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_ellipse (sellipse, strans) IS 'returns a transformated spherical ellipse'; CREATE OPERATOR + ( LEFTARG = sellipse, RIGHTARG = strans, PROCEDURE = strans_ellipse ); COMMENT ON OPERATOR + (sellipse, strans) IS 'transforms a spherical ellipse'; CREATE FUNCTION strans_ellipse_inverse (sellipse, strans) RETURNS sellipse AS 'MODULE_PATHNAME', 'spheretrans_ellipse_inv' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_ellipse_inverse (sellipse, strans) IS 'returns a inverse transformated spherical ellipse'; CREATE OPERATOR - ( LEFTARG = sellipse, RIGHTARG = strans, PROCEDURE = strans_ellipse_inverse ); COMMENT ON OPERATOR - (sellipse, strans) IS 'transforms inverse a spherical ellipse'; -- -- ellipse contains circle -- CREATE FUNCTION sellipse_contains_circle(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_circle(sellipse, scircle) IS 'true if spherical ellipse contains spherical circle'; -- -- circle is contained by ellipse -- CREATE FUNCTION sellipse_contains_circle_com(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_circle_com(scircle, sellipse) IS 'true if spherical ellipse contains spherical circle'; -- -- ellipse does not contain circle -- CREATE FUNCTION sellipse_contains_circle_neg(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_circle_neg(sellipse, scircle) IS 'true if spherical ellipse does not contain spherical circle'; -- -- circle is not contained by ellipse -- CREATE FUNCTION sellipse_contains_circle_com_neg(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_circle_com_neg(scircle, sellipse) IS 'true if spherical ellipse does not contain spherical circle'; -- -- circle contains ellipse -- CREATE FUNCTION scircle_contains_ellipse(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_ellipse(scircle, sellipse) IS 'true if spherical circle contains spherical ellipse'; -- -- ellipse is contained by circle -- CREATE FUNCTION scircle_contains_ellipse_com(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_ellipse_com(sellipse, scircle) IS 'true if spherical circle contains spherical ellipse'; -- -- circle does not contain ellipse -- CREATE FUNCTION scircle_contains_ellipse_neg(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_ellipse_neg(scircle, sellipse) IS 'true if spherical circle does not contain spherical ellipse'; -- -- ellipse is not contained by circle -- CREATE FUNCTION scircle_contains_ellipse_com_neg(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_ellipse_com_neg(sellipse, scircle) IS 'true if spherical circle does not contain spherical ellipse'; -- -- circle overlaps ellipse -- CREATE FUNCTION sellipse_overlap_circle(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_circle(sellipse, scircle) IS 'true if spherical circle overlap spherical ellipse'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_overlap_circle, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, scircle) IS 'true if spherical circle overlap spherical ellipse'; -- -- ellipse overlaps circle -- CREATE FUNCTION sellipse_overlap_circle_com(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_circle_com(scircle, sellipse) IS 'true if spherical circle overlap spherical ellipse'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_circle_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, sellipse) IS 'true if spherical circle overlap spherical ellipse'; -- -- circle does not overlap ellipse -- CREATE FUNCTION sellipse_overlap_circle_neg(sellipse, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_circle_neg(sellipse, scircle) IS 'true if spherical circle does not overlap spherical ellipse'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = scircle, PROCEDURE = sellipse_overlap_circle_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, scircle) IS 'true if spherical circle does not overlap spherical ellipse'; -- -- ellipse does not overlap circle -- CREATE FUNCTION sellipse_overlap_circle_com_neg(scircle, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_circle_com_neg(scircle, sellipse) IS 'true if spherical circle does not overlap spherical ellipse'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_circle_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, sellipse) IS 'true if spherical circle does not overlap spherical ellipse'; -- -- ellipse overlaps line -- CREATE FUNCTION sellipse_overlap_line (sellipse, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_line (sellipse, sline) IS 'returns true if spherical line overlaps spherical ellipse'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_overlap_line, COMMUTATOR = '&&', NEGATOR = '!&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, sline) IS 'true if spherical line overlaps spherical ellipse'; -- -- line overlaps ellipse -- CREATE FUNCTION sellipse_overlap_line_com(sline, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_line_com(sline, sellipse) IS 'returns true if spherical line overlaps spherical ellipse'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_line_com, COMMUTATOR = '&&', NEGATOR = '!&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, sellipse) IS 'true if spherical line overlaps spherical ellipse'; -- -- ellipse does not overlap line -- CREATE FUNCTION sellipse_overlap_line_neg (sellipse, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_line_neg (sellipse, sline) IS 'returns true if spherical line overlaps spherical ellipse'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = sline, PROCEDURE = sellipse_overlap_line_neg, COMMUTATOR = '!&&', NEGATOR = '&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, sline) IS 'true if spherical line does not overlap spherical ellipse'; -- -- line does not overlap ellipse -- CREATE FUNCTION sellipse_overlap_line_com_neg(sline, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_line_com_neg(sline, sellipse) IS 'returns true if spherical line does not overlap spherical ellipse'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_line_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, sellipse) IS 'true if spherical line does not overlap spherical ellipse'; -- -- ellipse contains line -- CREATE FUNCTION sellipse_contains_line(sellipse, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_line(sellipse, sline) IS 'returns true if spherical ellipse contains spherical line'; -- -- line is contained by ellipse -- CREATE FUNCTION sellipse_contains_line_com(sline, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_line_com(sline, sellipse) IS 'returns true if spherical ellipse contains spherical line'; -- -- ellipse does not contain line -- CREATE FUNCTION sellipse_contains_line_neg(sellipse, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_line_neg(sellipse, sline) IS 'returns true if spherical ellipse does not contain spherical line'; -- -- line is not contained by ellipse -- CREATE FUNCTION sellipse_contains_line_com_neg(sline, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_line_com_neg(sline, sellipse) IS 'returns true if spherical ellipse does not contain spherical line'; pgsphere/pgs_euler.sql.in000066400000000000000000000125321332443031700160110ustar00rootroot00000000000000 -- spherical transformation functions CREATE FUNCTION strans_zxz(strans) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_zxz' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_zxz(strans) IS 'returns Euler transformation as ZXZ transformation'; CREATE FUNCTION strans(FLOAT8, FLOAT8, FLOAT8) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_from_float8' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans(FLOAT8, FLOAT8, FLOAT8) IS 'returns an transformation object using Euler angles (ZXZ)'; CREATE FUNCTION strans(FLOAT8, FLOAT8, FLOAT8, CSTRING) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_from_float8_and_type' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans(FLOAT8, FLOAT8, FLOAT8, CSTRING) IS 'returns an transformation object using Euler angles and axis'; CREATE FUNCTION phi(strans) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spheretrans_phi' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION phi(strans) IS 'returns the first angle of Euler angles of a transformation object'; CREATE FUNCTION theta(strans) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spheretrans_theta' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION theta(strans) IS 'returns the second angle of Euler angles of a transformation object'; CREATE FUNCTION psi(strans) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spheretrans_psi' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION psi(strans) IS 'returns the third angle of Euler angles of a transformation object'; CREATE FUNCTION axes(strans) RETURNS CHARACTER(3) AS 'MODULE_PATHNAME', 'spheretrans_type' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION axes (strans) IS 'returns the axis of Euler angles of a transformation object'; -- spherical transformation operators CREATE FUNCTION strans_equal(strans, strans) RETURNS BOOL AS 'MODULE_PATHNAME', 'spheretrans_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_equal(strans, strans) IS 'returns true, if Euler transformations are equal'; CREATE OPERATOR = ( LEFTARG = strans, RIGHTARG = strans, COMMUTATOR = = , NEGATOR = <>, PROCEDURE = strans_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (strans, strans) IS 'true, if Euler transformations are equal'; CREATE FUNCTION strans_not_equal(strans, strans) RETURNS BOOL AS 'MODULE_PATHNAME', 'spheretrans_not_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_not_equal(strans, strans) IS 'returns true, if Euler transformations are not equal'; CREATE OPERATOR <> ( LEFTARG = strans, RIGHTARG = strans, COMMUTATOR = <>, NEGATOR = = , PROCEDURE = strans_not_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (strans, strans) IS 'true, if spherical Euler transformations are not equal'; CREATE FUNCTION strans(strans) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans(strans) IS 'returns Euler transformation'; CREATE OPERATOR + ( RIGHTARG = strans, PROCEDURE = strans ); COMMENT ON OPERATOR + (NONE, strans) IS 'returns Euler transformation'; CREATE FUNCTION strans_invert(strans) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_invert' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_invert(strans) IS 'returns inverse Euler transformation'; CREATE OPERATOR - ( RIGHTARG = strans, PROCEDURE = strans_invert ); COMMENT ON OPERATOR - (NONE, strans) IS 'inverts Euler transformation'; CREATE FUNCTION strans_point(spoint, strans) RETURNS spoint AS 'MODULE_PATHNAME', 'spheretrans_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_point (spoint, strans) IS 'returns a transformated spherical point'; CREATE OPERATOR + ( LEFTARG = spoint, RIGHTARG = strans, PROCEDURE = strans_point ); COMMENT ON OPERATOR + (spoint, strans) IS 'transforms a spherical point'; CREATE FUNCTION strans_point_inverse(spoint, strans) RETURNS spoint AS 'MODULE_PATHNAME', 'spheretrans_point_inverse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_point_inverse (spoint, strans) IS 'returns a inverse transformated spherical point'; CREATE OPERATOR - ( LEFTARG = spoint, RIGHTARG = strans, PROCEDURE = strans_point_inverse ); COMMENT ON OPERATOR - (spoint, strans) IS 'transforms inverse a spherical point'; CREATE FUNCTION strans_trans(strans, strans) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_trans' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_trans (strans, strans) IS 'returns a transformated Euler transformation'; CREATE OPERATOR + ( LEFTARG = strans, RIGHTARG = strans, PROCEDURE = strans_trans ); COMMENT ON OPERATOR + (strans, strans) IS 'transforms a Euler transformation'; CREATE FUNCTION strans_trans_inv(strans, strans) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_trans_inv' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_trans_inv (strans, strans) IS 'returns a inverse transformated Euler transformation'; CREATE OPERATOR - ( LEFTARG = strans, RIGHTARG = strans, PROCEDURE = strans_trans_inv ); COMMENT ON OPERATOR - (strans, strans) IS 'transforms inverse a Euler transformation'; pgsphere/pgs_gist.sql.in000066400000000000000000000331451332443031700156460ustar00rootroot00000000000000 -- Spherical key definition' CREATE FUNCTION spherekey_in(CSTRING) RETURNS spherekey AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION spherekey_out(spherekey) RETURNS CSTRING AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE spherekey ( internallength = 24, input = spherekey_in, output = spherekey_out ); CREATE FUNCTION pointkey_in(CSTRING) RETURNS pointkey AS 'MODULE_PATHNAME', 'pointkey_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION pointkey_out(pointkey) RETURNS CSTRING AS 'MODULE_PATHNAME', 'pointkey_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION pointkey_volume(pointkey) RETURNS float8 AS 'MODULE_PATHNAME', 'pointkey_volume' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION pointkey_area(pointkey) RETURNS float8 AS 'MODULE_PATHNAME', 'pointkey_area' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION pointkey_perimeter(pointkey) RETURNS float8 AS 'MODULE_PATHNAME', 'pointkey_perimeter' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE pointkey ( input = pointkey_in, output = pointkey_out, internallength = -1, ALIGNMENT = int4, STORAGE = PLAIN ); -- GIST common CREATE FUNCTION g_spherekey_decompress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spherekey_decompress' LANGUAGE 'c'; CREATE FUNCTION g_spherekey_union(bytea, internal) RETURNS spherekey AS 'MODULE_PATHNAME', 'g_spherekey_union' LANGUAGE 'c'; CREATE FUNCTION g_spherekey_penalty (internal, internal, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spherekey_penalty' LANGUAGE 'c' STRICT; CREATE FUNCTION g_spherekey_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spherekey_picksplit' LANGUAGE 'c'; CREATE FUNCTION g_spherekey_same (spherekey, spherekey, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spherekey_same' LANGUAGE 'c'; -- create the operator class for spherical points CREATE FUNCTION g_spoint_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spoint_compress' LANGUAGE 'c'; CREATE FUNCTION g_spoint_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spoint_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS spoint DEFAULT FOR TYPE spoint USING gist AS OPERATOR 1 = (spoint, spoint), OPERATOR 11 @ (spoint, scircle), OPERATOR 12 @ (spoint, sline), OPERATOR 13 @ (spoint, spath), OPERATOR 14 @ (spoint, spoly), OPERATOR 15 @ (spoint, sellipse), OPERATOR 16 @ (spoint, sbox), OPERATOR 37 <@ (spoint, scircle), OPERATOR 38 <@ (spoint, sline), OPERATOR 39 <@ (spoint, spath), OPERATOR 40 <@ (spoint, spoly), OPERATOR 41 <@ (spoint, sellipse), OPERATOR 42 <@ (spoint, sbox), FUNCTION 1 g_spoint_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_spoint_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical circle CREATE FUNCTION g_scircle_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_scircle_compress' LANGUAGE 'c'; CREATE FUNCTION g_scircle_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_scircle_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS scircle DEFAULT FOR TYPE scircle USING gist AS OPERATOR 1 = (scircle, scircle), OPERATOR 11 @ (scircle, scircle), OPERATOR 12 @ (scircle, spoly), OPERATOR 13 @ (scircle, sellipse), OPERATOR 14 @ (scircle, sbox), OPERATOR 21 ~ (scircle, spoint), OPERATOR 22 ~ (scircle, scircle), OPERATOR 23 ~ (scircle, sline), OPERATOR 24 ~ (scircle, spath), OPERATOR 25 ~ (scircle, spoly), OPERATOR 26 ~ (scircle, sellipse), OPERATOR 27 ~ (scircle, sbox), OPERATOR 31 && (scircle, scircle), OPERATOR 32 && (scircle, sline), OPERATOR 33 && (scircle, spath), OPERATOR 34 && (scircle, spoly), OPERATOR 35 && (scircle, sellipse), OPERATOR 36 && (scircle, sbox), OPERATOR 37 <@ (scircle, scircle), OPERATOR 38 <@ (scircle, spoly), OPERATOR 39 <@ (scircle, sellipse), OPERATOR 40 <@ (scircle, sbox), OPERATOR 43 @> (scircle, spoint), OPERATOR 44 @> (scircle, scircle), OPERATOR 45 @> (scircle, sline), OPERATOR 46 @> (scircle, spath), OPERATOR 47 @> (scircle, spoly), OPERATOR 48 @> (scircle, sellipse), OPERATOR 49 @> (scircle, sbox), FUNCTION 1 g_scircle_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_scircle_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical line CREATE FUNCTION g_sline_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sline_compress' LANGUAGE 'c'; CREATE FUNCTION g_sline_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sline_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS sline DEFAULT FOR TYPE sline USING gist AS OPERATOR 1 = (sline, sline), OPERATOR 2 # (sline, sline), OPERATOR 11 @ (sline, scircle), OPERATOR 12 @ (sline, spoly), OPERATOR 13 @ (sline, sellipse), OPERATOR 14 @ (sline, sbox), OPERATOR 21 ~ (sline, spoint), OPERATOR 31 && (sline, scircle), OPERATOR 32 && (sline, sline), OPERATOR 33 && (sline, spath), OPERATOR 34 && (sline, spoly), OPERATOR 35 && (sline, sellipse), OPERATOR 36 && (sline, sbox), OPERATOR 37 <@ (sline, scircle), OPERATOR 38 <@ (sline, spoly), OPERATOR 39 <@ (sline, sellipse), OPERATOR 40 <@ (sline, sbox), OPERATOR 43 @> (sline, spoint), FUNCTION 1 g_sline_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_sline_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical ellipse CREATE FUNCTION g_sellipse_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sellipse_compress' LANGUAGE 'c'; CREATE FUNCTION g_sellipse_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sellipse_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS sellipse DEFAULT FOR TYPE sellipse USING gist AS OPERATOR 1 = (sellipse, sellipse), OPERATOR 11 @ (sellipse, scircle), OPERATOR 12 @ (sellipse, spoly), OPERATOR 13 @ (sellipse, sellipse), OPERATOR 14 @ (sellipse, sbox), OPERATOR 21 ~ (sellipse, spoint), OPERATOR 22 ~ (sellipse, scircle), OPERATOR 23 ~ (sellipse, sline), OPERATOR 24 ~ (sellipse, spath), OPERATOR 25 ~ (sellipse, spoly), OPERATOR 26 ~ (sellipse, sellipse), OPERATOR 27 ~ (sellipse, sbox), OPERATOR 31 && (sellipse, scircle), OPERATOR 32 && (sellipse, sline), OPERATOR 33 && (sellipse, spath), OPERATOR 34 && (sellipse, spoly), OPERATOR 35 && (sellipse, sellipse), OPERATOR 36 && (sellipse, sbox), OPERATOR 37 <@ (sellipse, scircle), OPERATOR 38 <@ (sellipse, spoly), OPERATOR 39 <@ (sellipse, sellipse), OPERATOR 40 <@ (sellipse, sbox), OPERATOR 43 @> (sellipse, spoint), OPERATOR 44 @> (sellipse, scircle), OPERATOR 45 @> (sellipse, sline), OPERATOR 46 @> (sellipse, spath), OPERATOR 47 @> (sellipse, spoly), OPERATOR 48 @> (sellipse, sellipse), OPERATOR 49 @> (sellipse, sbox), FUNCTION 1 g_sellipse_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_sellipse_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical polygon CREATE FUNCTION g_spoly_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spoly_compress' LANGUAGE 'c'; CREATE FUNCTION g_spoly_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spoly_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS spoly DEFAULT FOR TYPE spoly USING gist AS OPERATOR 1 = (spoly, spoly), OPERATOR 11 @ (spoly, scircle), OPERATOR 12 @ (spoly, spoly), OPERATOR 13 @ (spoly, sellipse), OPERATOR 14 @ (spoly, sbox), OPERATOR 21 ~ (spoly, spoint), OPERATOR 22 ~ (spoly, scircle), OPERATOR 23 ~ (spoly, sline), OPERATOR 24 ~ (spoly, spath), OPERATOR 25 ~ (spoly, spoly), OPERATOR 26 ~ (spoly, sellipse), OPERATOR 27 ~ (spoly, sbox), OPERATOR 31 && (spoly, scircle), OPERATOR 32 && (spoly, sline), OPERATOR 33 && (spoly, spath), OPERATOR 34 && (spoly, spoly), OPERATOR 35 && (spoly, sellipse), OPERATOR 36 && (spoly, sbox), OPERATOR 37 <@ (spoly, scircle), OPERATOR 38 <@ (spoly, spoly), OPERATOR 39 <@ (spoly, sellipse), OPERATOR 40 <@ (spoly, sbox), OPERATOR 43 @> (spoly, spoint), OPERATOR 44 @> (spoly, scircle), OPERATOR 45 @> (spoly, sline), OPERATOR 46 @> (spoly, spath), OPERATOR 47 @> (spoly, spoly), OPERATOR 48 @> (spoly, sellipse), OPERATOR 49 @> (spoly, sbox), FUNCTION 1 g_spoly_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_spoly_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical path CREATE FUNCTION g_spath_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spath_compress' LANGUAGE 'c'; CREATE FUNCTION g_spath_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_spath_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS spath DEFAULT FOR TYPE spath USING gist AS OPERATOR 1 = (spath, spath), OPERATOR 11 @ (spath, scircle), OPERATOR 12 @ (spath, spoly), OPERATOR 13 @ (spath, sellipse), OPERATOR 14 @ (spath, sbox), OPERATOR 21 ~ (spath, spoint), OPERATOR 31 && (spath, scircle), OPERATOR 32 && (spath, sline), OPERATOR 33 && (spath, spath), OPERATOR 34 && (spath, spoly), OPERATOR 35 && (spath, sellipse), OPERATOR 36 && (spath, sbox), OPERATOR 37 <@ (spath, scircle), OPERATOR 38 <@ (spath, spoly), OPERATOR 39 <@ (spath, sellipse), OPERATOR 40 <@ (spath, sbox), OPERATOR 43 @> (spath, spoint), FUNCTION 1 g_spath_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_spath_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; -- create the operator class for spherical box CREATE FUNCTION g_sbox_compress(internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sbox_compress' LANGUAGE 'c'; CREATE FUNCTION g_sbox_consistent(internal, internal, int4, oid, internal) RETURNS internal AS 'MODULE_PATHNAME', 'g_sbox_consistent' LANGUAGE 'c'; CREATE OPERATOR CLASS sbox DEFAULT FOR TYPE sbox USING gist AS OPERATOR 1 = (sbox, sbox), OPERATOR 11 @ (sbox, scircle), OPERATOR 12 @ (sbox, spoly), OPERATOR 13 @ (sbox, sellipse), OPERATOR 14 @ (sbox, sbox), OPERATOR 21 ~ (sbox, spoint), OPERATOR 22 ~ (sbox, scircle), OPERATOR 23 ~ (sbox, sline), OPERATOR 24 ~ (sbox, spath), OPERATOR 25 ~ (sbox, spoly), OPERATOR 26 ~ (sbox, sellipse), OPERATOR 27 ~ (sbox, sbox), OPERATOR 31 && (sbox, scircle), OPERATOR 32 && (sbox, sline), OPERATOR 33 && (sbox, spath), OPERATOR 34 && (sbox, spoly), OPERATOR 35 && (sbox, sellipse), OPERATOR 36 && (sbox, sbox), OPERATOR 37 <@ (sbox, scircle), OPERATOR 38 <@ (sbox, spoly), OPERATOR 39 <@ (sbox, sellipse), OPERATOR 40 <@ (sbox, sbox), OPERATOR 43 @> (sbox, spoint), OPERATOR 44 @> (sbox, scircle), OPERATOR 45 @> (sbox, sline), OPERATOR 46 @> (sbox, spath), OPERATOR 47 @> (sbox, spoly), OPERATOR 48 @> (sbox, sellipse), OPERATOR 49 @> (sbox, sbox), FUNCTION 1 g_sbox_consistent (internal, internal, int4, oid, internal), FUNCTION 2 g_spherekey_union (bytea, internal), FUNCTION 3 g_sbox_compress (internal), FUNCTION 4 g_spherekey_decompress (internal), FUNCTION 5 g_spherekey_penalty (internal, internal, internal), FUNCTION 6 g_spherekey_picksplit (internal, internal), FUNCTION 7 g_spherekey_same (spherekey, spherekey, internal), STORAGE spherekey; pgsphere/pgs_line.sql.in000066400000000000000000000310101332443031700156140ustar00rootroot00000000000000-- **************************** -- -- spherical line functions -- -- **************************** CREATE FUNCTION sline(spoint, spoint) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_from_points' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline(spoint, spoint) IS 'returns a spherical line using begin (arg1) and end (arg2)'; CREATE FUNCTION sline(strans, float8) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_from_trans' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline(strans, float8) IS 'returns a spherical line using Euler transformation (arg1) and length (arg2)'; CREATE FUNCTION meridian(float8) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_meridian' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION meridian(float8) IS 'returns a spherical line as a meridian along longitude arg'; CREATE FUNCTION sl_beg(sline) RETURNS spoint AS 'MODULE_PATHNAME', 'sphereline_begin' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sl_beg(sline) IS 'returns the begin of a spherical line'; CREATE FUNCTION sl_end(sline) RETURNS spoint AS 'MODULE_PATHNAME', 'sphereline_end' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sl_end(sline) IS 'returns the end of a spherical line'; -- -- Cast line as Euler transformation -- CREATE FUNCTION strans(sline) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_from_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans(sline) IS 'converts line to a transformation (ZXZ)'; CREATE CAST (sline AS strans) WITH FUNCTION strans(sline) AS IMPLICIT; -- -- Cast point as line -- CREATE FUNCTION sline(spoint) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_from_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline(spoint) IS 'casts a spherical point to a spherical line'; CREATE CAST (spoint AS sline) WITH FUNCTION sline(spoint) AS IMPLICIT; -- *************************** -- -- spherical line operators -- -- *************************** -- -- equal -- CREATE FUNCTION sline_equal(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_equal(sline, sline) IS 'returns true, if spherical lines are equal'; CREATE OPERATOR = ( LEFTARG = sline, RIGHTARG = sline, COMMUTATOR = = , NEGATOR = <>, PROCEDURE = sline_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (sline, sline) IS 'true, if spherical lines are equal'; -- -- not equal -- CREATE FUNCTION sline_equal_neg(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_equal_neg(sline, sline) IS 'returns true, if spherical lines are not equal'; CREATE OPERATOR <> ( LEFTARG = sline, RIGHTARG = sline, COMMUTATOR = <>, NEGATOR = = , PROCEDURE = sline_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (sline, sline) IS 'true, if spherical lines are not equal'; -- -- length -- CREATE FUNCTION length(sline) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'sphereline_length' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION length(sline) IS 'returns the length of a spherical line (in radians)'; CREATE OPERATOR @-@ ( RIGHTARG = sline, PROCEDURE = length ); COMMENT ON OPERATOR @-@ (NONE, sline) IS 'length of spherical line'; -- -- swap begin and end -- CREATE FUNCTION swap(sline) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_swap_beg_end' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION swap(sline) IS 'returns a spherical line with swapped begin and end'; CREATE OPERATOR - ( RIGHTARG = sline, PROCEDURE = swap ); COMMENT ON OPERATOR - (NONE, sline) IS 'swaps begin and and of a spherical line'; -- -- turns path of line -- CREATE FUNCTION turn(sline) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_turn' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION turn(sline) IS 'returns a turned spherical line but keeps begin and end'; CREATE OPERATOR ! ( RIGHTARG = sline, PROCEDURE = turn ); COMMENT ON OPERATOR ! (NONE, sline) IS 'turns a spherical line, but keep begin and end,'; -- -- line crossing -- CREATE FUNCTION sline_crosses(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_crosses' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_crosses(sline, sline) IS 'returns true if spherical lines cross'; CREATE OPERATOR # ( LEFTARG = sline, RIGHTARG = sline, COMMUTATOR = #, NEGATOR = !#, PROCEDURE = sline_crosses, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR # (sline, sline) IS 'true, if spherical lines cross'; -- -- lines do not cross -- CREATE FUNCTION sline_crosses_neg(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_crosses_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_crosses_neg(sline, sline) IS 'returns true if spherical lines do not cross'; CREATE OPERATOR !# ( LEFTARG = sline, RIGHTARG = sline, COMMUTATOR = !#, NEGATOR = #, PROCEDURE = sline_crosses_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !# (sline, sline) IS 'true, if spherical lines do not cross'; -- -- lines overlap -- CREATE FUNCTION sline_overlap(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap(sline, sline) IS 'returns true if spherical lines overlap or cross'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = sline, PROCEDURE = sline_overlap, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, sline) IS 'true if spherical line overlap or cross'; -- -- lines do not overlap -- CREATE FUNCTION sline_overlap_neg(sline, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap_neg(sline, sline) IS 'returns true if spherical lines do not overlap or cross'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = sline, PROCEDURE = sline_overlap, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, sline) IS 'true if spherical lines do not overlap or cross'; -- -- line contains point -- CREATE FUNCTION sline_contains_point (sline, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_cont_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_contains_point (sline, spoint) IS 'returns true if spherical line contains spherical point'; -- -- point is contained by line -- CREATE FUNCTION sline_contains_point_com (spoint, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_cont_point_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_contains_point_com (spoint, sline) IS 'returns true if spherical line contains spherical point'; -- -- line does not contain point -- CREATE FUNCTION sline_contains_point_neg (sline, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_cont_point_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_contains_point_neg (sline, spoint) IS 'returns true if spherical line does not contain spherical point'; -- -- point is not contained by line -- CREATE FUNCTION sline_contains_point_com_neg (spoint, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_cont_point_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_contains_point_com_neg (spoint, sline) IS 'returns true if spherical line does not contain spherical point'; -- -- Transformation of line -- CREATE FUNCTION strans_line(sline, strans) RETURNS sline AS 'MODULE_PATHNAME', 'spheretrans_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_line (sline, strans) IS 'returns a transformated spherical line'; CREATE OPERATOR + ( LEFTARG = sline, RIGHTARG = strans, PROCEDURE = strans_line ); COMMENT ON OPERATOR + (sline, strans) IS 'transforms a spherical line'; CREATE FUNCTION strans_line_inverse(sline, strans) RETURNS sline AS 'MODULE_PATHNAME', 'spheretrans_line_inverse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_line_inverse (sline, strans) IS 'returns a inverse transformated spherical line'; CREATE OPERATOR - ( LEFTARG = sline, RIGHTARG = strans, PROCEDURE = strans_line_inverse ); COMMENT ON OPERATOR - (sline, strans) IS 'transforms inverse a spherical line'; -- -- line overlaps circle -- CREATE FUNCTION sline_overlap_circle(sline, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap_circle(sline, scircle) IS 'returns true if spherical line overlaps spherical circle'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = sline_overlap_circle, COMMUTATOR = '&&', NEGATOR = '!&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, scircle) IS 'true if spherical line overlaps spherical circle'; -- -- circle overlaps line -- CREATE FUNCTION sline_overlap_circle_com(scircle, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap_circle_com(scircle, sline) IS 'returns true if spherical line overlaps spherical circle'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = sline_overlap_circle_com, COMMUTATOR = '&&', NEGATOR = '!&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, sline) IS 'true if spherical line overlaps spherical circle'; -- -- line does not overlap circle -- CREATE FUNCTION sline_overlap_circle_neg(sline, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap_circle_neg(sline, scircle) IS 'returns true if spherical line does not overlap spherical circle'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = scircle, PROCEDURE = sline_overlap_circle_neg, COMMUTATOR = '!&&', NEGATOR = '&&' , RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, scircle) IS 'true if spherical line does not overlap spherical circle'; -- -- circle does not overlap line -- CREATE FUNCTION sline_overlap_circle_com_neg(scircle, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereline_overlap_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sline_overlap_circle_com_neg(scircle, sline) IS 'returns true if spherical line overlaps spherical circle'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = sline, PROCEDURE = sline_overlap_circle_com, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, sline) IS 'true if spherical line does not overlap spherical circle'; -- -- circle contains line -- CREATE FUNCTION scircle_contains_line(scircle, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_line(scircle, sline) IS 'returns true if spherical circle contains spherical line'; -- -- line is contained by circle -- CREATE FUNCTION scircle_contains_line_com(sline, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_line_com(sline, scircle) IS 'returns true if spherical circle contains spherical line'; -- -- circle does not contain line -- CREATE FUNCTION scircle_contains_line_neg(scircle, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_line_neg(scircle, sline) IS 'returns true if spherical circle does not contain spherical line'; -- -- line is not contained by circle -- CREATE FUNCTION scircle_contains_line_com_neg(sline, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_line_com_neg(sline, scircle) IS 'returns true if spherical circle does not contain spherical line'; pgsphere/pgs_path.sql.in000066400000000000000000000511441332443031700156330ustar00rootroot00000000000000 -- ****************************** -- -- spherical path functions -- -- ****************************** CREATE FUNCTION npoints(spath) RETURNS INT4 AS 'MODULE_PATHNAME', 'spherepath_npts' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION npoints(spath) IS 'returns number of points of spherical path'; CREATE FUNCTION spoint(spath, int4) RETURNS spoint AS 'MODULE_PATHNAME', 'spherepath_get_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint(spath, int4) IS 'returns n-th point of spherical path'; CREATE FUNCTION spoint(spath, float8) RETURNS spoint AS 'MODULE_PATHNAME', 'spherepath_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint(spath, float8) IS 'returns n-th point of spherical path using linear interpolation'; -- ****************************** -- -- spherical path operators -- -- ****************************** -- -- equal -- CREATE FUNCTION spath_equal(spath, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_equal(spath, spath) IS 'returns true, if spherical paths are equal'; CREATE OPERATOR = ( LEFTARG = spath, RIGHTARG = spath, COMMUTATOR = = , NEGATOR = <>, PROCEDURE = spath_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (spath, spath) IS 'true, if spherical paths are equal'; -- -- not equal -- CREATE FUNCTION spath_equal_neg(spath, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_equal_neg(spath, spath) IS 'returns true, if spherical paths are equal'; CREATE OPERATOR <> ( LEFTARG = spath, RIGHTARG = spath, COMMUTATOR = <>, NEGATOR = = , PROCEDURE = spath_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (spath, spath) IS 'true, if spherical paths are not equal'; -- -- length -- CREATE FUNCTION length(spath) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepath_length' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION length(spath) IS 'returns length of spherical path'; CREATE OPERATOR @-@ ( RIGHTARG = spath, PROCEDURE = length ); COMMENT ON OPERATOR @-@ (NONE, spath) IS 'returns length of spherical path'; -- -- change the direction of path -- CREATE FUNCTION swap(spath) RETURNS spath AS 'MODULE_PATHNAME', 'spherepath_swap' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION swap(spath) IS 'returns a swapped spherical path (changed direction)'; CREATE OPERATOR - ( RIGHTARG = spath, PROCEDURE = swap ); COMMENT ON OPERATOR - (NONE, spath) IS 'changes the direction of a spherical path'; -- -- paths overlap -- CREATE FUNCTION spath_overlap_path(spath, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_path(spath, spath) IS 'true if spherical path overlaps spherical path'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = spath, PROCEDURE = spath_overlap_path, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, spath) IS 'true if spherical paths overlap'; -- -- paths do not overlap -- CREATE FUNCTION spath_overlap_path_neg(spath, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_path_neg(spath, spath) IS 'true if spherical path does not overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = spath, PROCEDURE = spath_overlap_path, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, spath) IS 'true if spherical path does not overlap spherical path'; -- -- path contains point -- CREATE FUNCTION spath_contains_point(spath, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_cont_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_contains_point(spath, spoint) IS 'true if spherical path contains spherical point'; -- -- point is contained by path -- CREATE FUNCTION spath_contains_point_com(spoint, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_cont_point_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_contains_point_com(spoint, spath) IS 'true if spherical path contains spherical point'; -- -- path does not contain point -- CREATE FUNCTION spath_contains_point_neg(spath, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_cont_point_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_contains_point_neg(spath, spoint) IS 'true if spherical path does not contain spherical point'; -- -- point is not contained by path -- CREATE FUNCTION spath_contains_point_com_neg(spoint, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_cont_point_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_contains_point_com_neg(spoint, spath) IS 'true if spherical path does not contain spherical point'; -- -- Transformation of path -- CREATE FUNCTION strans_path(spath, strans) RETURNS spath AS 'MODULE_PATHNAME', 'spheretrans_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_path (spath, strans) IS 'returns a transformated spherical path'; CREATE OPERATOR + ( LEFTARG = spath, RIGHTARG = strans, PROCEDURE = strans_path ); COMMENT ON OPERATOR + (spath, strans) IS 'transforms a spherical path'; CREATE FUNCTION strans_path_inverse(spath, strans) RETURNS spath AS 'MODULE_PATHNAME', 'spheretrans_path_inverse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_path_inverse (spath, strans) IS 'returns a inverse transformated spherical path'; CREATE OPERATOR - ( LEFTARG = spath, RIGHTARG = strans, PROCEDURE = strans_path_inverse ); COMMENT ON OPERATOR - (spath, strans) IS 'transforms inverse a spherical path'; -- -- circle contains path -- CREATE FUNCTION scircle_contains_path(scircle, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_path(scircle, spath) IS 'true if spherical circle contains spherical path'; -- -- path is contained by circle -- CREATE FUNCTION scircle_contains_path_com(spath, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_path_com(spath, scircle) IS 'true if spherical circle contains spherical path'; -- -- circle does not contains path -- CREATE FUNCTION scircle_contains_path_neg(scircle, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_path_neg(scircle, spath) IS 'true if spherical circle does not contain spherical path'; -- -- path is not contained by circle -- CREATE FUNCTION scircle_contains_path_com_neg(spath, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_path_com_neg(spath, scircle) IS 'true if spherical circle does not contain spherical path'; -- -- circle overlaps path -- CREATE FUNCTION scircle_overlap_path(scircle, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_overlap_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap_path(scircle, spath) IS 'true if spherical circle overlap spherical path'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_overlap_path, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, spath) IS 'true if spherical circle overlap spherical path'; -- -- path overlaps circle -- CREATE FUNCTION scircle_overlap_path_com(spath, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_overlap_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap_path_com(spath, scircle) IS 'true if spherical circle overlap spherical path'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_overlap_path_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, scircle) IS 'true if spherical circle overlap spherical path'; -- -- circle does not overlap path -- CREATE FUNCTION scircle_overlap_path_neg(scircle, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_overlap_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap_path_neg(scircle, spath) IS 'true if spherical circle does not overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = spath, PROCEDURE = scircle_overlap_path_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, spath) IS 'true if spherical circle does not overlap spherical path'; -- -- path does not overlap circle -- CREATE FUNCTION scircle_overlap_path_com_neg(spath, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_overlap_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_overlap_path_com_neg(spath, scircle) IS 'true if spherical circle overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = scircle, PROCEDURE = scircle_overlap_path_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, scircle) IS 'true if spherical circle does not overlap spherical path'; -- -- path overlaps line -- CREATE FUNCTION spath_overlap_line(spath, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_line(spath, sline) IS 'true if spherical path overlaps spherical line'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = sline, PROCEDURE = spath_overlap_line, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, sline) IS 'true if spherical line overlap spherical path'; -- -- line overlaps path -- CREATE FUNCTION spath_overlap_line_com(sline, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_line_com(sline, spath) IS 'true if spherical path overlaps spherical line'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = spath, PROCEDURE = spath_overlap_line_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, spath) IS 'true if spherical line overlap spherical path'; -- -- path does not overlap line -- CREATE FUNCTION spath_overlap_line_neg(spath, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_line_neg(spath, sline) IS 'true if spherical path does not overlap spherical line'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = sline, PROCEDURE = spath_overlap_line_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, sline) IS 'true if spherical line does not overlap spherical path'; -- -- line does not overlap path -- CREATE FUNCTION spath_overlap_line_com_neg(sline, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepath_overlap_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spath_overlap_line_com_neg(sline, spath) IS 'true if spherical path does not overlap spherical line'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = spath, PROCEDURE = spath_overlap_line_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, spath) IS 'true if spherical line does not overlap spherical path'; -- -- ellipse contains path -- CREATE FUNCTION sellipse_contains_path(sellipse, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_path(sellipse, spath) IS 'true if spherical ellipse contains spherical path'; -- -- path is contained by ellipse -- CREATE FUNCTION sellipse_contains_path_com(spath, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_path_com(spath, sellipse) IS 'true if spherical ellipse contains spherical path'; -- -- ellipse does not contains path -- CREATE FUNCTION sellipse_contains_path_neg(sellipse, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_path_neg(sellipse, spath) IS 'true if spherical ellipse does not contain spherical path'; -- -- path is not contained by ellipse -- CREATE FUNCTION sellipse_contains_path_com_neg(spath, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_path_com_neg(spath, sellipse) IS 'true if spherical ellipse does not contain spherical path'; -- -- ellipse overlaps path -- CREATE FUNCTION sellipse_overlap_path(sellipse, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_path(sellipse, spath) IS 'true if spherical ellipse overlap spherical path'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_overlap_path, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, spath) IS 'true if spherical ellipse overlap spherical path'; -- -- path overlaps ellipse -- CREATE FUNCTION sellipse_overlap_path_com(spath, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_path_com(spath, sellipse) IS 'true if spherical ellipse overlap spherical path'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_path_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, sellipse) IS 'true if spherical ellipse overlap spherical path'; -- -- ellipse does not overlap path -- CREATE FUNCTION sellipse_overlap_path_neg(sellipse, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_path_neg(sellipse, spath) IS 'true if spherical ellipse does not overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = spath, PROCEDURE = sellipse_overlap_path_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, spath) IS 'true if spherical ellipse does not overlap spherical path'; -- -- path does not overlap ellipse -- CREATE FUNCTION sellipse_overlap_path_com_neg(spath, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_overlap_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_overlap_path_com_neg(spath, sellipse) IS 'true if spherical ellipse overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = sellipse, PROCEDURE = sellipse_overlap_path_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, sellipse) IS 'true if spherical ellipse does not overlap spherical path'; -- -- polygon contains path -- CREATE FUNCTION spoly_contains_path(spoly, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_path(spoly, spath) IS 'true if spherical polygon contains spherical path'; -- -- path is contained by polygon -- CREATE FUNCTION spoly_contains_path_com(spath, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_path_com(spath, spoly) IS 'true if spherical polygon contains spherical path'; -- -- polygon does not contains path -- CREATE FUNCTION spoly_contains_path_neg(spoly, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_path_neg(spoly, spath) IS 'true if spherical polygon does not contain spherical path'; -- -- path is not contained by polygon -- CREATE FUNCTION spoly_contains_path_com_neg(spath, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_path_com_neg(spath, spoly) IS 'true if spherical polygon does not contain spherical path'; -- -- polygon overlaps path -- CREATE FUNCTION spoly_overlap_path(spoly, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_path' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_path(spoly, spath) IS 'true if spherical polygon overlap spherical path'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_overlap_path, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, spath) IS 'true if spherical polygon overlap spherical path'; -- -- path overlaps polygon -- CREATE FUNCTION spoly_overlap_path_com(spath, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_path_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_path_com(spath, spoly) IS 'true if spherical polygon overlap spherical path'; CREATE OPERATOR && ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_overlap_path_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spath, spoly) IS 'true if spherical polygon overlap spherical path'; -- -- polygon does not overlap path -- CREATE FUNCTION spoly_overlap_path_neg(spoly, spath) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_path_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_path_neg(spoly, spath) IS 'true if spherical polygon does not overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = spath, PROCEDURE = spoly_overlap_path_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, spath) IS 'true if spherical polygon does not overlap spherical path'; -- -- path does not overlap polygon -- CREATE FUNCTION spoly_overlap_path_com_neg(spath, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_path_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_path_com_neg(spath, spoly) IS 'true if spherical polygon overlap spherical path'; CREATE OPERATOR !&& ( LEFTARG = spath, RIGHTARG = spoly, PROCEDURE = spoly_overlap_path_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spath, spoly) IS 'true if spherical polygon does not overlap spherical path'; -- -- Aggregate functions to add points to path -- CREATE FUNCTION spath_add_point_aggr (spath, spoint) RETURNS spath AS 'MODULE_PATHNAME', 'spherepath_add_point' LANGUAGE 'c' IMMUTABLE; COMMENT ON FUNCTION spath_add_point_aggr (spath, spoint) IS 'adds a spherical point to spherical path. Do not use it standalone!'; CREATE FUNCTION spath_add_points_fin_aggr (spath) RETURNS spath AS 'MODULE_PATHNAME', 'spherepath_add_points_finalize' LANGUAGE 'c' IMMUTABLE STRICT ; COMMENT ON FUNCTION spath_add_points_fin_aggr (spath) IS 'Finalize spherical point adding to spherical path. Do not use it standalone!'; CREATE AGGREGATE spath ( sfunc = spath_add_point_aggr, basetype = spoint, stype = spath, finalfunc = spath_add_points_fin_aggr ); pgsphere/pgs_point.sql.in000066400000000000000000000070401332443031700160240ustar00rootroot00000000000000-- ************************** -- -- spherical point functions -- -- ************************** CREATE FUNCTION pg_sphere_version() RETURNS CSTRING AS 'MODULE_PATHNAME', 'pg_sphere_version' LANGUAGE 'c'; CREATE FUNCTION spoint(FLOAT8, FLOAT8) RETURNS spoint AS 'MODULE_PATHNAME', 'spherepoint_from_long_lat' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION set_sphere_output_precision(INT4) RETURNS CSTRING AS 'MODULE_PATHNAME', 'set_sphere_output_precision' LANGUAGE 'c'; CREATE FUNCTION set_sphere_output(CSTRING) RETURNS CSTRING AS 'MODULE_PATHNAME', 'set_sphere_output' LANGUAGE 'c'; COMMENT ON FUNCTION spoint(FLOAT8, FLOAT8) IS 'returns a spherical point from longitude (arg1), latitude (arg2)'; CREATE FUNCTION long(spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_long' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION long(spoint) IS 'longitude of spherical point'; CREATE FUNCTION lat(spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_lat' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION lat(spoint) IS 'latitude of spherical point'; CREATE FUNCTION x(spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_x' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION x(spoint) IS 'cartesian x value of spherical point'; CREATE FUNCTION y(spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_y' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION y(spoint) IS 'cartesian y value of spherical point'; CREATE FUNCTION xyz(spoint) RETURNS FLOAT8[] AS 'MODULE_PATHNAME', 'spherepoint_xyz' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION xyz(spoint) IS 'cartesian values of spherical point'; CREATE FUNCTION z(spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_z' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION z(spoint) IS 'cartesian z value of spherical point'; -- *************************** -- -- spherical point operators -- -- *************************** -- -- equal -- CREATE FUNCTION spoint_equal(spoint, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoint_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_equal(spoint, spoint) IS 'returns true, if spherical points are equal'; CREATE OPERATOR = ( LEFTARG = spoint, RIGHTARG = spoint, COMMUTATOR = =, NEGATOR = <>, PROCEDURE = spoint_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (spoint, spoint) IS 'true, if spherical points are equal'; -- -- not equal -- CREATE FUNCTION spoint_equal_neg (spoint, spoint) RETURNS BOOL AS 'SELECT NOT spoint_equal($1,$2);' LANGUAGE 'sql' IMMUTABLE STRICT; COMMENT ON FUNCTION spoint_equal_neg (spoint, spoint) IS 'returns true, if spherical points are not equal'; CREATE OPERATOR <> ( LEFTARG = spoint, RIGHTARG = spoint, COMMUTATOR = <>, NEGATOR = =, PROCEDURE = spoint_equal_neg, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (spoint, spoint) IS 'true, if spherical points are not equal'; -- -- distance between points -- CREATE FUNCTION dist(spoint, spoint) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoint_distance' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION dist(spoint, spoint) IS 'distance between spherical points'; CREATE OPERATOR <-> ( LEFTARG = spoint, RIGHTARG = spoint, COMMUTATOR = '<->', PROCEDURE = dist ); COMMENT ON OPERATOR <-> (spoint, spoint) IS 'distance between spherical points'; pgsphere/pgs_polygon.sql.in000066400000000000000000000532541332443031700163720ustar00rootroot00000000000000 -- spherical polygon functions CREATE FUNCTION npoints(spoly) RETURNS INT4 AS 'MODULE_PATHNAME', 'spherepoly_npts' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION npoints(spoly) IS 'returns number of points of spherical polygon'; CREATE FUNCTION area(spoly) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoly_area' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION area(spoly) IS 'returns area of spherical polygon'; -- **************************** -- -- spherical polygon operators -- -- **************************** -- -- equal -- CREATE FUNCTION spoly_equal(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_equal' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_equal(spoly, spoly) IS 'returns true, if spherical polygons are equal'; CREATE OPERATOR = ( LEFTARG = spoly, RIGHTARG = spoly, COMMUTATOR = =, NEGATOR = <>, PROCEDURE = spoly_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR = (spoly, spoly) IS 'true, if spherical polygons are equal'; -- -- not equal -- CREATE FUNCTION spoly_not_equal(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_equal_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_not_equal(spoly, spoly) IS 'returns true, if spherical polygons are not equal'; CREATE OPERATOR <> ( LEFTARG = spoly, RIGHTARG = spoly, COMMUTATOR = <>, NEGATOR = =, PROCEDURE = spoly_not_equal, RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR <> (spoly, spoly) IS 'true, if spherical polygons are not equal'; -- -- circumference -- CREATE FUNCTION circum(spoly) RETURNS FLOAT8 AS 'MODULE_PATHNAME', 'spherepoly_circ' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION circum(spoly) IS 'returns circumference of spherical polygon'; CREATE OPERATOR @-@ ( RIGHTARG = spoly, PROCEDURE = circum ); COMMENT ON OPERATOR @-@ (NONE, spoly) IS 'returns circumference of spherical polygon'; -- -- polygon contains polygon -- CREATE FUNCTION spoly_contains_polygon(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_polygon(spoly, spoly) IS 'true if spherical polygon contains spherical polygon'; -- -- polygon is contained by polygon -- CREATE FUNCTION spoly_contains_polygon_com(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_poly_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_polygon_com(spoly, spoly) IS 'true if spherical polygon is contained by spherical polygon'; -- -- polygon does not contain polygon -- CREATE FUNCTION spoly_contains_polygon_neg(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_polygon_neg(spoly, spoly) IS 'true if spherical polygon does not contain spherical polygon'; -- -- polygon is not contained by polygon -- CREATE FUNCTION spoly_contains_polygon_com_neg(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_poly_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_polygon_com_neg(spoly, spoly) IS 'true if spherical polygon is not contained by spherical polygon'; -- -- polygons overlap -- CREATE FUNCTION spoly_overlap_polygon(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_polygon(spoly, spoly) IS 'true if spherical polygon overlaps spherical polygon'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_overlap_polygon, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, spoly) IS 'true if spherical polygons overlap'; -- -- polygons do not overlap -- CREATE FUNCTION spoly_overlap_polygon_neg(spoly, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_polygon_neg(spoly, spoly) IS 'true if spherical polygon does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = spoly, PROCEDURE = spoly_overlap_polygon, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, spoly) IS 'true if spherical polygon does not overlap spherical polygon'; -- -- polygon contains point -- CREATE FUNCTION spoly_contains_point(spoly, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_point' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_point(spoly, spoint) IS 'true if spherical polygon contains spherical point'; -- -- point is contained by polygon -- CREATE FUNCTION spoly_contains_point_com(spoint, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_point_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_point_com(spoint, spoly) IS 'true if spherical polygon contains spherical point'; -- -- polygon does not contain point -- CREATE FUNCTION spoly_contains_point_neg(spoly, spoint) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_point_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_point_neg(spoly, spoint) IS 'true if spherical polygon does not contain spherical point'; -- -- point is not contained by polygon -- CREATE FUNCTION spoly_contains_point_com_neg(spoint, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_point_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_point_com_neg(spoint, spoly) IS 'true if spherical polygon does not contain spherical point'; -- -- Transformation of polygon -- CREATE FUNCTION strans_poly(spoly, strans) RETURNS spoly AS 'MODULE_PATHNAME', 'spheretrans_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_poly (spoly, strans) IS 'returns a transformated spherical polygon'; CREATE OPERATOR + ( LEFTARG = spoly, RIGHTARG = strans, PROCEDURE = strans_poly ); COMMENT ON OPERATOR + (spoly, strans) IS 'transforms a spherical polygon'; CREATE FUNCTION strans_poly_inverse(spoly, strans) RETURNS spoly AS 'MODULE_PATHNAME', 'spheretrans_poly_inverse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION strans_poly_inverse (spoly, strans) IS 'returns a inverse transformated spherical polygon'; CREATE OPERATOR - ( LEFTARG = spoly, RIGHTARG = strans, PROCEDURE = strans_poly_inverse ); COMMENT ON OPERATOR - (spoly, strans) IS 'transforms inverse a spherical polygon'; -- -- polygon contains circle -- CREATE FUNCTION spoly_contains_circle(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_circle(spoly, scircle) IS 'true if spherical polygon contains spherical circle'; -- -- circle is contained by polygon -- CREATE FUNCTION spoly_contains_circle_com(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_circle_com(scircle, spoly) IS 'true if spherical polygon contains spherical circle'; -- -- polygon does not contain circle -- CREATE FUNCTION spoly_contains_circle_neg(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_circle_neg(spoly, scircle) IS 'true if spherical polygon does not contain spherical circle'; -- -- circle is not contained by polygon -- CREATE FUNCTION spoly_contains_circle_com_neg(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_circle_com_neg(scircle, spoly) IS 'true if spherical polygon does not contain spherical circle'; -- -- circle contains polygon -- CREATE FUNCTION scircle_contains_polygon(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_polygon(scircle, spoly) IS 'true if spherical circle contains spherical polygon'; -- -- polygon is contained by circle -- CREATE FUNCTION scircle_contains_polygon_com(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_poly_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_polygon_com(spoly, scircle) IS 'true if spherical circle contains spherical polygon'; -- -- circle does not contain polygon -- CREATE FUNCTION scircle_contains_polygon_neg(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_polygon_neg(scircle, spoly) IS 'true if spherical circle does not contain spherical polygon'; -- -- polygon is not contained by circle -- CREATE FUNCTION scircle_contains_polygon_com_neg(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherecircle_cont_poly_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION scircle_contains_polygon_com_neg(spoly, scircle) IS 'true if spherical circle does not contain spherical polygon'; -- -- circle overlaps polygon -- CREATE FUNCTION spoly_overlap_circle(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_circle' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_circle(spoly, scircle) IS 'true if spherical circle overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_overlap_circle, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, scircle) IS 'true if spherical circle overlap spherical polygon'; -- -- polygon overlaps circle -- CREATE FUNCTION spoly_overlap_circle_com(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_circle_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_circle_com(scircle, spoly) IS 'true if spherical circle overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_overlap_circle_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (scircle, spoly) IS 'true if spherical circle overlap spherical polygon'; -- -- circle does not overlap polygon -- CREATE FUNCTION spoly_overlap_circle_neg(spoly, scircle) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_circle_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_circle_neg(spoly, scircle) IS 'true if spherical circle does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = scircle, PROCEDURE = spoly_overlap_circle_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, scircle) IS 'true if spherical circle does not overlap spherical polygon'; -- -- polygon does not overlap circle -- CREATE FUNCTION spoly_overlap_circle_com_neg(scircle, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_circle_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_circle_com_neg(scircle, spoly) IS 'true if spherical circle does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = scircle, RIGHTARG = spoly, PROCEDURE = spoly_overlap_circle_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (scircle, spoly) IS 'true if spherical circle does not overlap spherical polygon'; -- -- polygon contains line -- CREATE FUNCTION spoly_contains_line(spoly, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_line(spoly, sline) IS 'true if spherical polygon contains spherical line'; -- -- line is contained by polygon -- CREATE FUNCTION spoly_contains_line_com(sline, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_line_com(sline, spoly) IS 'true if spherical polygon contains spherical line'; -- -- polygon does not contain line -- CREATE FUNCTION spoly_contains_line_neg(spoly, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_line_neg(spoly, sline) IS 'true if spherical polygon does not contain spherical line'; -- -- line is not contained by polygon -- CREATE FUNCTION spoly_contains_line_com_neg(sline, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_line_com_neg(sline, spoly) IS 'true if spherical polygon does not contain spherical line'; -- -- line overlaps polygon -- CREATE FUNCTION spoly_overlap_line(spoly, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_line' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_line(spoly, sline) IS 'true if spherical line overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_overlap_line, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, sline) IS 'true if spherical line overlap spherical polygon'; -- -- polygon overlaps line -- CREATE FUNCTION spoly_overlap_line_com(sline, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_line_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_line_com(sline, spoly) IS 'true if spherical line overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_overlap_line_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sline, spoly) IS 'true if spherical line overlap spherical polygon'; -- -- line does not overlap polygon -- CREATE FUNCTION spoly_overlap_line_neg(spoly, sline) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_line_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_line_neg(spoly, sline) IS 'true if spherical line does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = sline, PROCEDURE = spoly_overlap_line_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, sline) IS 'true if spherical line does not overlap spherical polygon'; -- -- polygon does not overlap line -- CREATE FUNCTION spoly_overlap_line_com_neg(sline, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_line_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_line_com_neg(sline, spoly) IS 'true if spherical line does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = sline, RIGHTARG = spoly, PROCEDURE = spoly_overlap_line_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sline, spoly) IS 'true if spherical line does not overlap spherical polygon'; -- -- polygon contains ellipse -- CREATE FUNCTION spoly_contains_ellipse(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_ellipse(spoly, sellipse) IS 'true if spherical polygon contains spherical ellipse'; -- -- ellipse is contained by polygon -- CREATE FUNCTION spoly_contains_ellipse_com(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_ellipse_com(sellipse, spoly) IS 'true if spherical polygon contains spherical ellipse'; -- -- polygon does not contain ellipse -- CREATE FUNCTION spoly_contains_ellipse_neg(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_ellipse_neg(spoly, sellipse) IS 'true if spherical polygon does not contain spherical ellipse'; -- -- ellipse is not contained by polygon -- CREATE FUNCTION spoly_contains_ellipse_com_neg(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_cont_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_contains_ellipse_com_neg(sellipse, spoly) IS 'true if spherical polygon does not contain spherical ellipse'; -- -- ellipse contains polygon -- CREATE FUNCTION sellipse_contains_polygon(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_poly' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_polygon(sellipse, spoly) IS 'true if spherical ellipse contains spherical polygon'; -- -- polygon is contained by ellipse -- CREATE FUNCTION sellipse_contains_polygon_com(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_poly_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_polygon_com(spoly, sellipse) IS 'true if spherical ellipse contains spherical polygon'; -- -- ellipse does not contain polygon -- CREATE FUNCTION sellipse_contains_polygon_neg(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_poly_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_polygon_neg(sellipse, spoly) IS 'true if spherical ellipse does not contain spherical polygon'; -- -- polygon is not contained by ellipse -- CREATE FUNCTION sellipse_contains_polygon_com_neg(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'sphereellipse_cont_poly_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION sellipse_contains_polygon_com_neg(spoly, sellipse) IS 'true if spherical ellipse does not contain spherical polygon'; -- -- ellipse overlaps polygon -- CREATE FUNCTION spoly_overlap_ellipse(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_ellipse' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_ellipse(spoly, sellipse) IS 'true if spherical ellipse overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_overlap_ellipse, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (spoly, sellipse) IS 'true if spherical ellipse overlap spherical polygon'; -- -- polygon overlaps ellipse -- CREATE FUNCTION spoly_overlap_ellipse_com(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_ellipse_com' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_ellipse_com(sellipse, spoly) IS 'true if spherical ellipse overlap spherical polygon'; CREATE OPERATOR && ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_overlap_ellipse_com, COMMUTATOR = '&&', NEGATOR = '!&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR && (sellipse, spoly) IS 'true if spherical ellipse overlap spherical polygon'; -- -- ellipse does not overlap polygon -- CREATE FUNCTION spoly_overlap_ellipse_neg(spoly, sellipse) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_ellipse_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_ellipse_neg(spoly, sellipse) IS 'true if spherical ellipse does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = spoly, RIGHTARG = sellipse, PROCEDURE = spoly_overlap_ellipse_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (spoly, sellipse) IS 'true if spherical ellipse does not overlap spherical polygon'; -- -- polygon does not overlap ellipse -- CREATE FUNCTION spoly_overlap_ellipse_com_neg(sellipse, spoly) RETURNS BOOL AS 'MODULE_PATHNAME', 'spherepoly_overlap_ellipse_com_neg' LANGUAGE 'c' IMMUTABLE STRICT; COMMENT ON FUNCTION spoly_overlap_ellipse_com_neg(sellipse, spoly) IS 'true if spherical ellipse does not overlap spherical polygon'; CREATE OPERATOR !&& ( LEFTARG = sellipse, RIGHTARG = spoly, PROCEDURE = spoly_overlap_ellipse_com_neg, COMMUTATOR = '!&&', NEGATOR = '&&', RESTRICT = contsel, JOIN = contjoinsel ); COMMENT ON OPERATOR !&& (sellipse, spoly) IS 'true if spherical ellipse does not overlap spherical polygon'; -- -- Aggregate functions to add points to polygon -- CREATE FUNCTION spoly_add_point_aggr (spoly, spoint) RETURNS spoly AS 'MODULE_PATHNAME', 'spherepoly_add_point' LANGUAGE 'c' IMMUTABLE; COMMENT ON FUNCTION spoly_add_point_aggr (spoly, spoint) IS 'adds a spherical point to spherical polygon. Do not use it standalone!'; CREATE FUNCTION spoly_add_points_fin_aggr (spoly) RETURNS spoly AS 'MODULE_PATHNAME', 'spherepoly_add_points_finalize' LANGUAGE 'c' IMMUTABLE STRICT ; COMMENT ON FUNCTION spoly_add_points_fin_aggr (spoly) IS 'Finalize spherical point adding to spherical polygon. Do not use it standalone!'; CREATE AGGREGATE spoly ( sfunc = spoly_add_point_aggr, basetype = spoint, stype = spoly, finalfunc = spoly_add_points_fin_aggr ); pgsphere/pgs_types.sql.in000066400000000000000000000063411332443031700160420ustar00rootroot00000000000000 -- Creates a type 'spherical point' CREATE FUNCTION spoint_in(CSTRING) RETURNS spoint AS 'MODULE_PATHNAME', 'spherepoint_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION spoint_out(spoint) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spherepoint_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE spoint ( internallength = 16, input = spoint_in, output = spoint_out ); -- Creates a type 'spherical transformation' CREATE FUNCTION strans_in(CSTRING) RETURNS strans AS 'MODULE_PATHNAME', 'spheretrans_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION strans_out(strans) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spheretrans_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE strans ( internallength = 32, input = strans_in, output = strans_out ); -- Creates a type 'spherical circle' CREATE FUNCTION scircle_in(CSTRING) RETURNS scircle AS 'MODULE_PATHNAME', 'spherecircle_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION scircle_out(scircle) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spherecircle_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE scircle ( internallength = 24, input = scircle_in, output = scircle_out ); -- Creates a type 'spherical line' CREATE FUNCTION sline_in(CSTRING) RETURNS sline AS 'MODULE_PATHNAME', 'sphereline_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION sline_out(sline) RETURNS CSTRING AS 'MODULE_PATHNAME', 'sphereline_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE sline ( internallength = 32, input = sline_in, output = sline_out ); -- Creates a type 'spherical ellipse' CREATE FUNCTION sellipse_in(CSTRING) RETURNS sellipse AS 'MODULE_PATHNAME', 'sphereellipse_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION sellipse_out(sellipse) RETURNS CSTRING AS 'MODULE_PATHNAME', 'sphereellipse_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE sellipse ( internallength = 40, input = sellipse_in, output = sellipse_out ); -- Creates a type 'spherical polygon' CREATE FUNCTION spoly_in(CSTRING) RETURNS spoly AS 'MODULE_PATHNAME', 'spherepoly_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION spoly_out(spoly) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spherepoly_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE spoly ( internallength = VARIABLE, input = spoly_in, output = spoly_out, storage = external ); -- Creates a type 'spherical path' CREATE FUNCTION spath_in(CSTRING) RETURNS spath AS 'MODULE_PATHNAME', 'spherepath_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION spath_out(spath) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spherepath_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE spath ( internallength = VARIABLE, input = spath_in, output = spath_out, storage = external ); -- Creates a type 'spherical box' CREATE FUNCTION sbox_in(CSTRING) RETURNS sbox AS 'MODULE_PATHNAME', 'spherebox_in' LANGUAGE 'c' IMMUTABLE STRICT; CREATE FUNCTION sbox_out(sbox) RETURNS CSTRING AS 'MODULE_PATHNAME', 'spherebox_out' LANGUAGE 'c' IMMUTABLE STRICT; CREATE TYPE sbox ( internallength = 32, input = sbox_in, output = sbox_out ); pgsphere/point.c000066400000000000000000000114121332443031700141670ustar00rootroot00000000000000#include "point.h" /* This file contains definitions for spherical point functions. */ PG_FUNCTION_INFO_V1(spherepoint_in); PG_FUNCTION_INFO_V1(spherepoint_from_long_lat); PG_FUNCTION_INFO_V1(spherepoint_distance); PG_FUNCTION_INFO_V1(spherepoint_long); PG_FUNCTION_INFO_V1(spherepoint_lat); PG_FUNCTION_INFO_V1(spherepoint_x); PG_FUNCTION_INFO_V1(spherepoint_y); PG_FUNCTION_INFO_V1(spherepoint_z); PG_FUNCTION_INFO_V1(spherepoint_xyz); PG_FUNCTION_INFO_V1(spherepoint_equal); bool spoint_eq(const SPoint *p1, const SPoint *p2) { Vector3D a, b; spoint_vector3d(&a, p1); spoint_vector3d(&b, p2); return (vector3d_eq(&a, &b)); } void spoint_check(SPoint *spoint) { bool lat_is_neg = (spoint->lat < 0) ? true : false; if (spoint->lng < 0 || spoint->lng > PID) spoint->lng = spoint->lng - floor(spoint->lng / (PID)) * PID; if (spoint->lat < -PIH || spoint->lat > PIH) spoint->lat = spoint->lat - floor(spoint->lat / (PID)) * PID; if (spoint->lng < 0.0) { spoint->lng += (PID); } if (spoint->lat > PI) { spoint->lat -= (2 * PI); } if (spoint->lat > PIH) { spoint->lat = (PI - spoint->lat); spoint->lng += ((spoint->lng < PI) ? (PI) : (-PI)); } if (spoint->lat < -PIH) { spoint->lat = (-PI - spoint->lat); spoint->lng += ((spoint->lng < PI) ? (PI) : (-PI)); } if (FPeq(spoint->lat, PIH) && lat_is_neg) spoint->lat = -PIH; if (FPeq(spoint->lng, PID)) { spoint->lng = 0.0; } if (FPzero(spoint->lng)) { spoint->lng = 0.0; } if (FPzero(spoint->lat)) { spoint->lat = 0.0; } } void vector3d_spoint(SPoint *p, const Vector3D *v) { double rho = sqrt((v->x) * (v->x) + (v->y) * (v->y)); if (0.0 == rho) { if (FPzero(v->z)) { p->lat = 0.0; } else if (v->z > 0) { p->lat = PIH; } else if (v->z < 0) { p->lat = -PIH; } } else { p->lat = atan(v->z / rho); } p->lng = atan2(v->y, v->x); if (FPzero(p->lng)) { p->lng = 0.0; } else if (p->lng < 0.0) { p->lng += PID; } } void spoint_vector3d(Vector3D *v, const SPoint *p) { v->x = cos(p->lng) * cos(p->lat); v->y = sin(p->lng) * cos(p->lat); v->z = sin(p->lat); } Datum spherepoint_in(PG_FUNCTION_ARGS) { SPoint *sp = (SPoint *) palloc(sizeof(SPoint)); char *c = PG_GETARG_CSTRING(0); double lng, lat; void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); if (get_point(&lng, &lat)) { sp->lng = lng; sp->lat = lat; spoint_check(sp); } else { reset_buffer(); pfree(sp); sp = NULL; elog(ERROR, "spherepoint_in: parse error"); } reset_buffer(); PG_RETURN_POINTER(sp); } Datum spherepoint_from_long_lat(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) palloc(sizeof(SPoint)); p->lng = PG_GETARG_FLOAT8(0); p->lat = PG_GETARG_FLOAT8(1); spoint_check(p); PG_RETURN_POINTER(p); } static double norm2(double a, double b) { return sqrt(a * a + b * b); } float8 spoint_dist(const SPoint *p1, const SPoint *p2) { float8 dl = p1->lng - p2->lng; /* use Vincenty's formula for the inverse geodesic problem on the sphere */ float8 f = atan2(norm2(cos(p2->lat) * sin(dl), cos(p1->lat) * sin(p2->lat) - sin(p1->lat) * cos(p2->lat) * cos(dl)), sin(p1->lat) * sin(p2->lat) + cos(p1->lat) * cos(p2->lat) * cos(dl)); if (FPzero(f)) { return 0.0; } else { return f; } } Datum spherepoint_distance(PG_FUNCTION_ARGS) { SPoint *p1 = (SPoint *) PG_GETARG_POINTER(0); SPoint *p2 = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_FLOAT8(spoint_dist(p1, p2)); } Datum spherepoint_long(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(p->lng); } Datum spherepoint_lat(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_FLOAT8(p->lat); } Datum spherepoint_x(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); Vector3D v; spoint_vector3d(&v, p); PG_RETURN_FLOAT8(v.x); } Datum spherepoint_y(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); Vector3D v; spoint_vector3d(&v, p); PG_RETURN_FLOAT8(v.y); } Datum spherepoint_z(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); Vector3D v; spoint_vector3d(&v, p); PG_RETURN_FLOAT8(v.z); } Datum spherepoint_xyz(PG_FUNCTION_ARGS) { SPoint *p = (SPoint *) PG_GETARG_POINTER(0); Datum dret[3]; ArrayType *result; Vector3D v; spoint_vector3d(&v, p); dret[0] = Float8GetDatumFast(v.x); dret[1] = Float8GetDatumFast(v.y); dret[2] = Float8GetDatumFast(v.z); #ifdef USE_FLOAT8_BYVAL result = construct_array(dret, 3, FLOAT8OID, sizeof(float8), true, 'd'); #else result = construct_array(dret, 3, FLOAT8OID, sizeof(float8), false, 'd'); #endif PG_RETURN_ARRAYTYPE_P(result); } Datum spherepoint_equal(PG_FUNCTION_ARGS) { SPoint *p1 = (SPoint *) PG_GETARG_POINTER(0); SPoint *p2 = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(spoint_eq(p1, p2)); } pgsphere/point.h000066400000000000000000000035371332443031700142050ustar00rootroot00000000000000#ifndef __PGS_POINT_H__ #define __PGS_POINT_H__ #include "vector3d.h" #include "sbuffer.h" /* This file contains declarations for spherical point and functions. */ /* * The data structure definition of a spherical point. */ typedef struct { float8 lng; /* longitude value in radians */ float8 lat; /* latitude value in radians */ } SPoint; /* * Calculate the distance between two spherical points in radians. */ float8 spoint_dist(const SPoint *p1, const SPoint *p2); /* * Check whether two points are equal. */ bool spoint_eq(const SPoint *p1, const SPoint *p2); /* * Check the longitude and latitude values of a spherical point. */ void spoint_check(SPoint *spoint); /* * Transforms a 3d vector into a spherical point. */ void vector3d_spoint(SPoint *p, const Vector3D *v); /* * Transforms a spherical point into a 3d vector. */ void spoint_vector3d(Vector3D *v, const SPoint *p); /* * Take the input and store it as a spherical point. */ Datum spherepoint_in(PG_FUNCTION_ARGS); /* * Create a spherical point from longitude and latitude both in radians. */ Datum spherepoint_from_long_lat(PG_FUNCTION_ARGS); /* * Calculate the distance between two spherical points. */ Datum spherepoint_distance(PG_FUNCTION_ARGS); /* * Longitude of a spherical point. */ Datum spherepoint_long(PG_FUNCTION_ARGS); /* * Latitude of a spherical point. */ Datum spherepoint_lat(PG_FUNCTION_ARGS); /* * Cartesian x-value of a spherical point. */ Datum spherepoint_x(PG_FUNCTION_ARGS); /* * Cartesian y-value of a spherical point. */ Datum spherepoint_y(PG_FUNCTION_ARGS); /* * Cartesian z-value of a spherical point. */ Datum spherepoint_z(PG_FUNCTION_ARGS); /* * Cartesian values of a spherical point as an array. */ Datum spherepoint_xyz(PG_FUNCTION_ARGS); /* * Check whether two points are equal. */ Datum spherepoint_equal(PG_FUNCTION_ARGS); #endif pgsphere/polygon.c000066400000000000000000000712131332443031700145320ustar00rootroot00000000000000#include "polygon.h" /* Polygon functions */ PG_FUNCTION_INFO_V1(spherepoly_in); PG_FUNCTION_INFO_V1(spherepoly_equal); PG_FUNCTION_INFO_V1(spherepoly_equal_neg); PG_FUNCTION_INFO_V1(spherepoly_circ); PG_FUNCTION_INFO_V1(spherepoly_npts); PG_FUNCTION_INFO_V1(spherepoly_area); PG_FUNCTION_INFO_V1(spherepoly_cont_point); PG_FUNCTION_INFO_V1(spherepoly_cont_point_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_point_com); PG_FUNCTION_INFO_V1(spherepoly_cont_point_com_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_circle); PG_FUNCTION_INFO_V1(spherepoly_cont_circle_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_circle_com); PG_FUNCTION_INFO_V1(spherepoly_cont_circle_com_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_poly); PG_FUNCTION_INFO_V1(spherecircle_cont_poly_neg); PG_FUNCTION_INFO_V1(spherecircle_cont_poly_com); PG_FUNCTION_INFO_V1(spherecircle_cont_poly_com_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_circle); PG_FUNCTION_INFO_V1(spherepoly_overlap_circle_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_circle_com); PG_FUNCTION_INFO_V1(spherepoly_overlap_circle_com_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_line); PG_FUNCTION_INFO_V1(spherepoly_cont_line_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_line_com); PG_FUNCTION_INFO_V1(spherepoly_cont_line_com_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_line); PG_FUNCTION_INFO_V1(spherepoly_overlap_line_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_line_com); PG_FUNCTION_INFO_V1(spherepoly_overlap_line_com_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_poly); PG_FUNCTION_INFO_V1(spherepoly_cont_poly_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_poly_com); PG_FUNCTION_INFO_V1(spherepoly_cont_poly_com_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_poly); PG_FUNCTION_INFO_V1(spherepoly_overlap_poly_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_ellipse); PG_FUNCTION_INFO_V1(spherepoly_cont_ellipse_neg); PG_FUNCTION_INFO_V1(spherepoly_cont_ellipse_com); PG_FUNCTION_INFO_V1(spherepoly_cont_ellipse_com_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_poly); PG_FUNCTION_INFO_V1(sphereellipse_cont_poly_neg); PG_FUNCTION_INFO_V1(sphereellipse_cont_poly_com); PG_FUNCTION_INFO_V1(sphereellipse_cont_poly_com_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_ellipse); PG_FUNCTION_INFO_V1(spherepoly_overlap_ellipse_neg); PG_FUNCTION_INFO_V1(spherepoly_overlap_ellipse_com); PG_FUNCTION_INFO_V1(spherepoly_overlap_ellipse_com_neg); PG_FUNCTION_INFO_V1(spheretrans_poly); PG_FUNCTION_INFO_V1(spheretrans_poly_inverse); PG_FUNCTION_INFO_V1(spherepoly_add_point); PG_FUNCTION_INFO_V1(spherepoly_add_points_finalize); /* * Writes "center" of a polygon into 'v'. * * v - pointer to the center of a polygon * poly - pointer to the polygon */ static void spherepoly_center(Vector3D *v, const SPOLY *poly) { int32 i; Vector3D v1, v2; v1.x = 2.0; v1.y = 2.0; v1.z = 2.0; v2.x = -2.0; v2.y = -2.0; v2.z = -2.0; for (i = 0; i < poly->npts; i++) { spoint_vector3d(v, &poly->p[i]); v1.x = Min(v->x, v1.x); v1.y = Min(v->y, v1.y); v1.z = Min(v->z, v1.z); v2.x = Max(v->x, v2.x); v2.y = Max(v->y, v2.y); v2.z = Max(v->z, v2.z); } v->x = (v1.x + v2.x) / 2.0; v->y = (v1.y + v2.y) / 2.0; v->z = (v1.z + v2.z) / 2.0; } /* * Checks if line segments cross. */ static bool spherepoly_check(const SPOLY *poly) { int32 i, k; SLine sli, slk; Vector3D v; SPoint p; SEuler se; int8 pos; spherepoly_center(&v, poly); /* If 0-vector */ if (FPzero(v.x) && FPzero(v.y) && FPzero(v.z)) { return false; } for (i = 0; i < poly->npts; i++) { spoly_segment(&sli, poly, i); for (k = (i + 1); k < poly->npts; k++) { spoly_segment(&slk, poly, k); pos = sline_sline_pos(&sli, &slk); if (!(pos == PGS_LINE_CONNECT || pos == PGS_LINE_AVOID)) { return false; } } } vector3d_spoint(&p, &v); se.phi_a = EULER_AXIS_Z; se.theta_a = EULER_AXIS_X; se.psi_a = EULER_AXIS_Z; se.phi = -PIH - p.lng; se.theta = p.lat - PIH; se.psi = 0.0; for (i = 0; i < poly->npts; i++) { euler_spoint_trans(&p, &poly->p[i], &se); /* less _and_ equal are important !! */ /* Do not change it! */ if (FPle(p.lat, 0.0)) { return false; } } return true; } /* * Converts an array of spherical points to SPOLY. * * arr - pointer to the array of spherical points * nelem - number of the elements * * Returns the pointer to the created spherical polygon. */ static SPOLY * spherepoly_from_array(SPoint *arr, int32 nelem) { SPOLY *poly = NULL; if (nelem < 3) { elog(ERROR, "spherepoly_from_array: more than two points needed"); return NULL; } else { int32 i; float8 scheck; int32 size; for (i = 0; i < nelem; i++) { spoint_check(&arr[i]); } /* check duplicate points */ i = 0; while (i < (nelem - 1)) { if (nelem < 3) break; if (spoint_eq(&arr[i], &arr[i + 1])) { if (i < (nelem - 2)) { memmove((void *) &arr[i + 1], (void *) &arr[i + 2], (nelem - i - 2) * sizeof(SPoint)); } nelem--; continue; } i++; } if (spoint_eq(&arr[0], &arr[nelem - 1])) { nelem--; } if (nelem < 3) { elog(ERROR, "spherepoly_from_array: more than two points needed"); return NULL; } size = offsetof(SPOLY, p[0]) +sizeof(SPoint) * nelem; poly = (SPOLY *) palloc(size); SET_VARSIZE(poly, size); poly->npts = nelem; for (i = 0; i < nelem; i++) { if (i == 0) { scheck = spoint_dist(&arr[nelem - 1], &arr[0]); } else { scheck = spoint_dist(&arr[i - 1], &arr[i]); } if (FPeq(scheck, PI)) { elog(ERROR, "spherepoly_from_array: a polygon segment length must be not equal 180 degrees."); return NULL; } memcpy((void *) &poly->p[i], (void *) &arr[i], sizeof(SPoint)); } } if (!spherepoly_check(poly)) { elog(ERROR, "spherepoly_from_array: a line segment overlaps or polygon too large"); pfree(poly); return NULL; } return poly; } /* * Performs a transform of a polygon using an Euler transformation. * * se - pointer to the Euler transformation * in - pointer to the polygon * out - pointer to the transformed polygon */ static void euler_spoly_trans(SPOLY *out, const SPOLY *in, const SEuler *se) { int32 i; out->size = in->size; out->npts = in->npts; for (i = 0; i < in->npts; i++) euler_spoint_trans(&out->p[i], &in->p[i], se); } /* * Returns the relationship between polygon and circle as * PGS_CIRCLE_POLY_REL int8 value. */ static int8 poly_circle_pos(const SPOLY *poly, const SCIRCLE *circ) { int8 pos = 0; int32 i; SLine sl; bool pcp; const int8 sc_in = (1 << PGS_CIRCLE_CONT_LINE); const int8 sc_ov = (1 << PGS_CIRCLE_LINE_OVER); const int8 sc_os = (1 << PGS_CIRCLE_LINE_AVOID); pcp = spoly_contains_point(poly, &circ->center); if (FPzero(circ->radius)) { if (pcp) { return PGS_POLY_CONT_CIRCLE; } else { return PGS_CIRCLE_POLY_AVOID; } } for (i = 0; i < poly->npts; i++) { spoly_segment(&sl, poly, i); pos |= (1 << sphereline_circle_pos(&sl, circ)); if (((pos & sc_in) && (pos & sc_os)) || (pos & sc_ov)) { return PGS_CIRCLE_POLY_OVER; /* overlaps */ } } if ((pos & sc_in) == pos) { /* all lines inside circle */ /* circle contains polygon */ return PGS_CIRCLE_CONT_POLY; } else if ((pos & sc_os) == pos) { /* all lines outside circle */ if (pcp) { /* polygon contains circle */ return PGS_POLY_CONT_CIRCLE; } else { /* circle outside polygon */ return PGS_CIRCLE_POLY_AVOID; } } /* circle and polygon overlap */ return PGS_CIRCLE_POLY_OVER; } /* * Returns the relationship between a polygon and an ellipse * as PGS_ELLIPSE_POLY_REL int8 value. */ static int8 poly_ellipse_pos(const SPOLY *poly, const SELLIPSE *ell) { int8 pos = 0; int32 i; SLine sl; bool pcp; SPoint cen; const int8 sc_in = (1 << PGS_ELLIPSE_CONT_LINE); const int8 sc_ov = (1 << PGS_ELLIPSE_LINE_OVER); const int8 sc_os = (1 << PGS_ELLIPSE_LINE_AVOID); sellipse_center(&cen, ell); pcp = spoly_contains_point(poly, &cen); if (FPzero(ell->rad[0])) { if (pcp) { return PGS_POLY_CONT_ELLIPSE; } else { return PGS_ELLIPSE_POLY_AVOID; } } if (FPzero(ell->rad[1])) { SLine l; int8 res; sellipse_line(&l, ell); res = poly_line_pos(poly, &l); if (res == PGS_LINE_POLY_AVOID) { return PGS_ELLIPSE_POLY_AVOID; } else if (res == PGS_POLY_CONT_LINE) { return PGS_POLY_CONT_ELLIPSE; } else { return PGS_ELLIPSE_POLY_OVER; } } for (i = 0; i < poly->npts; i++) { spoly_segment(&sl, poly, i); pos |= (1 << sellipse_line_pos(ell, &sl)); if (((pos & sc_in) && (pos & sc_os)) || (pos & sc_ov)) { return PGS_ELLIPSE_POLY_OVER; /* overlaps */ } } if ((pos & sc_in) == pos) { /* all lines inside ellipse */ /* ellipse contains polygon */ return PGS_ELLIPSE_CONT_POLY; } else if ((pos & sc_os) == pos) { /* all lines outside ellipse */ if (pcp) { /* polygon contains ellipse */ return PGS_POLY_CONT_ELLIPSE; } else { /* ellipse outside polygon */ return PGS_ELLIPSE_POLY_AVOID; } } /* ellipse and polygon overlap */ return PGS_ELLIPSE_POLY_OVER; } /* * Returns the relationship between two polygons as * PGS_POLY_REL int8 value. * * p1 - pointer to the first polygon * p2 - pointer to the second polygon * * If 'recheck' is true, swaps 'p1' and 'p2'. */ static int8 poly_poly_pos(const SPOLY *p1, const SPOLY *p2, bool recheck) { int32 i; SLine sl; int8 pos = 0, res = 0; const int8 sp_os = (1 << PGS_LINE_POLY_AVOID); const int8 sp_ct = (1 << PGS_POLY_CONT_LINE); const int8 sp_ov = (1 << PGS_LINE_POLY_OVER); for (i = 0; i < p2->npts; i++) { spoly_segment(&sl, p2, i); pos = (1 << poly_line_pos(p1, &sl)); if (pos == sp_ov) { return PGS_POLY_OVER; /* overlap */ } res |= pos; } if (res == sp_os) { if (!recheck) { pos = poly_poly_pos(p2, p1, true); } if (pos == PGS_POLY_CONT) { return PGS_POLY_OVER; } else { return PGS_POLY_AVOID; } } if (res == sp_ct) { return PGS_POLY_CONT; } return PGS_POLY_OVER; } /* * Checks whether two polygons are equal. * * If 'dir' is true, check with reverse polygon of 'p2'. */ bool spoly_eq(const SPOLY *p1, const SPOLY *p2, bool dir) { bool ret = false; if (p1->npts == p2->npts) { int32 i, k, cntr, shift; for (shift = 0; shift < p1->npts; shift++) { cntr = 0; for (i = 0; i < p1->npts; i++) { k = (dir) ? (p1->npts - i - 1) : (i); k += shift; k = (k < p1->npts) ? (k) : (k - p1->npts); if (spoint_eq(&p1->p[i], &p2->p[k])) { cntr++; } } if (cntr == p1->npts) { ret = true; break; } } /* Try other direction if not equal */ if (!dir && !ret) { ret = spoly_eq(p1, p2, true); } } return ret; } /* * Returns the i-th line segment of a polygon. * * sl - pointer to the line segment * poly - pointer to the polygon * i - number of the segment */ bool spoly_segment(SLine *sl, const SPOLY *poly, int32 i) { if (i >= 0 && i < poly->npts) { if (i == (poly->npts - 1)) sline_from_points(sl, &poly->p[i], &poly->p[0]); else sline_from_points(sl, &poly->p[i], &poly->p[i + 1]); return true; } else { return false; } } /* * Checks whether a polygon contains a point. * * pg - pointer to the polygon * sp - pointer to the point */ bool spoly_contains_point(const SPOLY *pg, const SPoint *sp) { int32 i; SLine sl; bool res = false; float8 scp; Vector3D vc, vp; /* First check if point is outside polygon (behind) */ spherepoly_center(&vc, pg); spoint_vector3d(&vp, sp); scp = vector3d_scalar(&vp, &vc); if (FPle(scp, 0.0)) { return false; } /* Check whether point is edge */ for (i = 0; i < pg->npts; i++) { if (spoint_eq(&pg->p[i], sp)) { return true; } } /* Check whether point is on a line segment */ for (i = 0; i < pg->npts; i++) { spoly_segment(&sl, pg, i); if (spoint_at_sline(sp, &sl)) { return true; } } do { SEuler se, te; SPoint p, lp[2]; bool a1, a2, eqa; int32 cntr = 0; SPOLY *tmp = (SPOLY *) palloc(VARSIZE(pg)); /* * Make a transformation, so the point is (0,0) */ se.phi_a = EULER_AXIS_Z; se.theta_a = EULER_AXIS_X; se.psi_a = EULER_AXIS_Z; se.phi = PIH - sp->lng; se.theta = -sp->lat; se.psi = -PIH; euler_spoly_trans(tmp, pg, &se); p.lng = 0.0; p.lat = 0.0; /* Check whether an edge is on equator. */ /* If yes, rotate randomized around 0,0 */ cntr = 0; do { eqa = false; for (i = 0; i < pg->npts; i++) { if (FPzero(tmp->p[i].lat)) { if (FPeq(cos(tmp->p[i].lng), -1.0)) { return false; } else { eqa = true; break; } } } if (eqa) { SPOLY *ttt = (SPOLY *) palloc(VARSIZE(pg)); srand(cntr); se.phi_a = se.theta_a = se.psi_a = EULER_AXIS_X; se.phi = ((double) rand() / RAND_MAX) * PID; se.theta = 0.0; se.psi = 0.0; euler_spoly_trans(ttt, tmp, &se); memcpy((void *) tmp, (void *) ttt, VARSIZE(pg)); pfree(ttt); } if (cntr > 10000) { elog(WARNING, "Bug found in spoly_contains_point"); elog(ERROR, "Please report it to pg_sphere team!"); return false; } cntr++; } while (eqa); /* Count line segment crossing "equator" */ cntr = 0; for (i = 0; i < pg->npts; i++) { /* create a single line from segment */ spoly_segment(&sl, tmp, i); sline_begin(&lp[0], &sl); sline_end(&lp[1], &sl); a1 = (FPgt(lp[0].lat, 0.0) && FPlt(lp[1].lat, 0.0)); a2 = (FPlt(lp[0].lat, 0.0) && FPgt(lp[1].lat, 0.0)); if (a1 || a2) { /* if crossing */ sphereline_to_euler_inv(&te, &sl); if (a2) { /* crossing ascending */ p.lng = PID - te.phi; } else { p.lng = PI - te.phi; } spoint_check(&p); if (p.lng < PI) { /* crossing between 0 and 180 deg */ cntr++; } } } pfree(tmp); if (cntr % 2) { res = true; } } while (0); return res; } /* * Returns the relationship between a polygon and a line as * PGS_LINE_POLY_REL int8 value. * * poly - pointer to the polygon * line - pointer to the line */ int8 poly_line_pos(const SPOLY *poly, const SLine *line) { int32 i; SLine sl; SPoint slbeg, slend; int8 p1, p2, pos, res; const int8 sl_os = (1 << PGS_LINE_AVOID); const int8 sl_cl = (1 << PGS_LINE_CONT_LINE); const int8 sl_cr = (1 << PGS_LINE_CROSS); const int8 sl_cn = (1 << PGS_LINE_CONNECT); const int8 sl_ov = (1 << PGS_LINE_OVER); const int8 sl_eq = (1 << PGS_LINE_EQUAL); pos = 0; res = 0; sline_begin(&slbeg, line); sline_end(&slend, line); p1 = spoly_contains_point(poly, &slbeg); p2 = spoly_contains_point(poly, &slend); for (i = 0; i < poly->npts; i++) { spoly_segment(&sl, poly, i); pos = (1 << sline_sline_pos(&sl, line)); if (pos == sl_eq) { pos = sl_cl; /* is contain */ } if (pos == sl_ov) { return PGS_LINE_POLY_OVER; /* overlap */ } /* Recheck line crossing */ if (pos == sl_cr) { bool bal, eal; bal = spoint_at_sline(&slbeg, &sl); eal = spoint_at_sline(&slend, &sl); if (!bal && !eal) { return PGS_LINE_POLY_OVER; /* overlap */ } if ((bal && p2) || (eal && p1)) { pos = sl_cl; /* is contain */ } else { return PGS_LINE_POLY_OVER; /* overlap */ } } res |= pos; } if ((res & sl_cl) && ((res - sl_cl - sl_os - sl_cn - 1) < 0)) { return PGS_POLY_CONT_LINE; } else if (p1 && p2 && ((res - sl_os - sl_cn - 1) < 0)) { return PGS_POLY_CONT_LINE; } else if (!p1 && !p2 && ((res - sl_os - 1) < 0)) { return PGS_LINE_POLY_AVOID; } return PGS_LINE_POLY_OVER; } Datum spherepoly_in(PG_FUNCTION_ARGS) { SPOLY *poly; char *c = PG_GETARG_CSTRING(0); int32 i, nelem; void sphere_yyparse(void); init_buffer(c); sphere_yyparse(); nelem = get_path_count(); if (nelem > 2) { SPoint arr[nelem]; for (i = 0; i < nelem; i++) { get_path_elem(i, &arr[i].lng, &arr[i].lat); } poly = spherepoly_from_array(&arr[0], nelem); } else { reset_buffer(); elog(ERROR, "spherepoly_in: more than two points needed"); PG_RETURN_NULL(); } reset_buffer(); PG_RETURN_POINTER(poly); } Datum spherepoly_equal(PG_FUNCTION_ARGS) { SPOLY *p1 = PG_GETARG_SPOLY(0); SPOLY *p2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(spoly_eq(p1, p2, false)); } Datum spherepoly_equal_neg(PG_FUNCTION_ARGS) { SPOLY *p1 = PG_GETARG_SPOLY(0); SPOLY *p2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(!spoly_eq(p1, p2, false)); } Datum spherepoly_circ(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); int32 i; SLine l; float8 sum = 0.0; for (i = 0; i < poly->npts; i++) { spoly_segment(&l, poly, i); sum += l.length; } PG_RETURN_FLOAT8(sum); } Datum spherepoly_npts(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); PG_RETURN_INT32(poly->npts); } Datum spherepoly_area(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); int32 i; SPoint s[poly->npts + 2]; SPoint stmp[2]; SEuler se; float8 sum = 0.0; memcpy((void *) &s[1], (void *) &poly->p[0], poly->npts * sizeof(SPoint)); memcpy((void *) &s[0], (void *) &s[poly->npts], sizeof(SPoint)); memcpy((void *) &s[poly->npts + 1], (void *) &s[1], sizeof(SPoint)); se.psi = 0; se.phi_a = EULER_AXIS_Z; se.theta_a = EULER_AXIS_X; se.psi_a = EULER_AXIS_Z; for (i = 1; i <= poly->npts; i++) { se.phi = -PIH - s[i].lng; se.theta = s[i].lat - PIH; euler_spoint_trans(&stmp[0], &s[i - 1], &se); euler_spoint_trans(&stmp[1], &s[i + 1], &se); stmp[1].lng -= stmp[0].lng; if (FPlt(stmp[1].lng, 0.0)) { stmp[1].lng += PID; } sum += stmp[1].lng; } sum -= (PI * (poly->npts - 2)); if (FPge(sum, PID)) { sum = 2 * PID - sum; } if (FPzero(sum)) { sum = 0.0; } PG_RETURN_FLOAT8(sum); } Datum spherepoly_cont_point(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPoint *sp = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(spoly_contains_point(poly, sp)); } Datum spherepoly_cont_point_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SPoint *sp = (SPoint *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(!spoly_contains_point(poly, sp)); } Datum spherepoly_cont_point_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(spoly_contains_point(poly, sp)); } Datum spherepoly_cont_point_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SPoint *sp = (SPoint *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(!spoly_contains_point(poly, sp)); } Datum spherepoly_cont_circle(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPOLY *poly = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_POLY_CONT_CIRCLE); } Datum spherepoly_cont_circle_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); SPOLY *poly = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) != PGS_POLY_CONT_CIRCLE); } Datum spherepoly_cont_circle_com(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPOLY *poly = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_POLY_CONT_CIRCLE); } Datum spherepoly_cont_circle_com_neg(PG_FUNCTION_ARGS) { SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); SPOLY *poly = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) != PGS_POLY_CONT_CIRCLE); } Datum spherecircle_cont_poly(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_CIRCLE_CONT_POLY); } Datum spherecircle_cont_poly_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) != PGS_CIRCLE_CONT_POLY); } Datum spherecircle_cont_poly_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_CIRCLE_CONT_POLY); } Datum spherecircle_cont_poly_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) != PGS_CIRCLE_CONT_POLY); } Datum spherepoly_overlap_circle(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) > PGS_CIRCLE_POLY_AVOID); } Datum spherepoly_overlap_circle_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_CIRCLE_POLY_AVOID); } Datum spherepoly_overlap_circle_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) > PGS_CIRCLE_POLY_AVOID); } Datum spherepoly_overlap_circle_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SCIRCLE *circ = (SCIRCLE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_circle_pos(poly, circ) == PGS_CIRCLE_POLY_AVOID); } Datum spherepoly_cont_line(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_line_pos(poly, line) == PGS_POLY_CONT_LINE); } Datum spherepoly_cont_line_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_line_pos(poly, line) != PGS_POLY_CONT_LINE); } Datum spherepoly_cont_line_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_line_pos(poly, line) == PGS_POLY_CONT_LINE); } Datum spherepoly_cont_line_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_line_pos(poly, line) != PGS_POLY_CONT_LINE); } Datum spherepoly_overlap_line(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_line_pos(poly, line) > PGS_LINE_POLY_AVOID); } Datum spherepoly_overlap_line_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SLine *line = (SLine *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_line_pos(poly, line) == PGS_LINE_POLY_AVOID); } Datum spherepoly_overlap_line_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_line_pos(poly, line) > PGS_LINE_POLY_AVOID); } Datum spherepoly_overlap_line_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SLine *line = (SLine *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_line_pos(poly, line) == PGS_LINE_POLY_AVOID); } Datum spherepoly_cont_poly(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(0); SPOLY *poly2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) == PGS_POLY_CONT); } Datum spherepoly_cont_poly_neg(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(0); SPOLY *poly2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) != PGS_POLY_CONT); } Datum spherepoly_cont_poly_com(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(1); SPOLY *poly2 = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) == PGS_POLY_CONT); } Datum spherepoly_cont_poly_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(1); SPOLY *poly2 = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) != PGS_POLY_CONT); } Datum spherepoly_overlap_poly(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(0); SPOLY *poly2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) > PGS_POLY_AVOID); } Datum spherepoly_overlap_poly_neg(PG_FUNCTION_ARGS) { SPOLY *poly1 = PG_GETARG_SPOLY(0); SPOLY *poly2 = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_poly_pos(poly1, poly2, false) == PGS_POLY_AVOID); } Datum spherepoly_cont_ellipse(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPOLY *poly = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_POLY_CONT_ELLIPSE); } Datum spherepoly_cont_ellipse_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); SPOLY *poly = PG_GETARG_SPOLY(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) != PGS_POLY_CONT_ELLIPSE); } Datum spherepoly_cont_ellipse_com(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPOLY *poly = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_POLY_CONT_ELLIPSE); } Datum spherepoly_cont_ellipse_com_neg(PG_FUNCTION_ARGS) { SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); SPOLY *poly = PG_GETARG_SPOLY(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) != PGS_POLY_CONT_ELLIPSE); } Datum sphereellipse_cont_poly(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_ELLIPSE_CONT_POLY); } Datum sphereellipse_cont_poly_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) != PGS_ELLIPSE_CONT_POLY); } Datum sphereellipse_cont_poly_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_ELLIPSE_CONT_POLY); } Datum sphereellipse_cont_poly_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) != PGS_ELLIPSE_CONT_POLY); } Datum spherepoly_overlap_ellipse(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) > PGS_ELLIPSE_POLY_AVOID); } Datum spherepoly_overlap_ellipse_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(0); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(1); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_ELLIPSE_POLY_AVOID); } Datum spherepoly_overlap_ellipse_com(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) > PGS_ELLIPSE_POLY_AVOID); } Datum spherepoly_overlap_ellipse_com_neg(PG_FUNCTION_ARGS) { SPOLY *poly = PG_GETARG_SPOLY(1); SELLIPSE *ell = (SELLIPSE *) PG_GETARG_POINTER(0); PG_RETURN_BOOL(poly_ellipse_pos(poly, ell) == PGS_ELLIPSE_POLY_AVOID); } Datum spheretrans_poly(PG_FUNCTION_ARGS) { SPOLY *sp = PG_GETARG_SPOLY(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SPOLY *out = (SPOLY *) palloc(VARSIZE(sp)); euler_spoly_trans(out, sp, se); PG_RETURN_POINTER(out); } Datum spheretrans_poly_inverse(PG_FUNCTION_ARGS) { Datum sp = PG_GETARG_DATUM(0); SEuler *se = (SEuler *) PG_GETARG_POINTER(1); SEuler tmp; Datum ret; spheretrans_inverse(&tmp, se); ret = DirectFunctionCall2(spheretrans_poly, sp, PointerGetDatum(&tmp)); PG_RETURN_DATUM(ret); } Datum spherepoly_add_point(PG_FUNCTION_ARGS) { SPOLY *poly = (SPOLY *) PG_GETARG_POINTER(0); SPoint *p = (SPoint *) PG_GETARG_POINTER(1); int32 size = 0; SPOLY *poly_new = NULL; if (p == NULL) { PG_RETURN_POINTER(poly); } if (poly == NULL) { size = offsetof(SPOLY, p[0]) +sizeof(SPoint); poly = (SPOLY *) palloc(size); memcpy((void *) &poly->p[0], (void *) p, sizeof(SPoint)); SET_VARSIZE(poly, size); poly->npts = 1; PG_RETURN_POINTER(poly); } poly = PG_GETARG_SPOLY(0); /* skip if equal */ if (spoint_eq(p, &poly->p[poly->npts - 1])) { PG_RETURN_POINTER(poly); } /* Skip if distance is equal 180deg */ if (FPeq(spoint_dist(p, &poly->p[poly->npts - 1]), PI)) { elog(NOTICE, "spoly(spoint): Skip point, distance of previous point is 180deg"); } size = offsetof(SPOLY, p[0]) +sizeof(SPoint) * (poly->npts + 1); poly_new = palloc(size); memcpy((void *) poly_new, (void *) poly, VARSIZE(poly)); poly_new->npts++; SET_VARSIZE(poly_new, size); memcpy((void *) &poly_new->p[poly->npts], (void *) p, sizeof(SPoint)); PG_RETURN_POINTER(poly_new); } Datum spherepoly_add_points_finalize(PG_FUNCTION_ARGS) { SPOLY *poly = (SPOLY *) PG_GETARG_POINTER(0); if (poly == NULL) { PG_RETURN_NULL(); } poly = PG_GETARG_SPOLY(0); if (poly->npts < 3) { elog(NOTICE, "spoly(spoint): At least 3 points required"); pfree(poly); PG_RETURN_NULL(); } /* Skip if distance is equal to 180deg */ if (FPeq(spoint_dist(&poly->p[0], &poly->p[poly->npts - 1]), PI)) { elog(NOTICE, "spoly(spoint): Cannot close polygon. Distance between first and last point is 180deg"); pfree(poly); PG_RETURN_NULL(); } if (!spherepoly_check(poly)) { elog(NOTICE, "spoly(spoint): a line segment overlaps or polygon too large"); pfree(poly); PG_RETURN_NULL(); } PG_RETURN_POINTER(poly); } pgsphere/polygon.h000066400000000000000000000177201332443031700145420ustar00rootroot00000000000000#ifndef __PGS_POLYGON_H__ #define __PGS_POLYGON_H__ #include "ellipse.h" /* Polygon declarations */ /* * The definition of spherical polygon using a list of * spherical points. */ typedef struct { int32 size; /* total size in bytes */ int32 npts; /* count of points */ SPoint p[1]; /* variable length array of SPoints */ } SPOLY; /* Polygon and ellipse */ #define PGS_ELLIPSE_POLY_AVOID 0 /* ellipse avoids polygon */ #define PGS_POLY_CONT_ELLIPSE 1 /* polygon contains ellipse */ #define PGS_ELLIPSE_CONT_POLY 2 /* ellipse contains polygon */ #define PGS_ELLIPSE_POLY_OVER 3 /* ellipse overlaps polygon */ /* Polygon and circle */ #define PGS_CIRCLE_POLY_AVOID 0 /* circle avoids polygon */ #define PGS_POLY_CONT_CIRCLE 1 /* polygon contains circle */ #define PGS_CIRCLE_CONT_POLY 2 /* circle contains polygon */ #define PGS_CIRCLE_POLY_OVER 3 /* circle overlap polygon */ /* Polygon and line */ #define PGS_LINE_POLY_AVOID 0 /* line avoids polygon */ #define PGS_POLY_CONT_LINE 1 /* polygon contains line */ #define PGS_LINE_POLY_OVER 2 /* line overlap polygon */ /* Polygon and polygon */ #define PGS_POLY_AVOID 0 /* polygon avoids other polygon */ #define PGS_POLY_CONT 1 /* polygon contains other polygon */ #define PGS_POLY_OVER 2 /* polygons overlap */ #define PG_GETARG_SPOLY( arg ) \ ( (SPOLY *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(arg))) ) /* * Checks whether two polygons are equal. * * p1 - pointer to the first polygon * p2 - pointer to the second polygon * * If 'dir' is true, check with reverse polygon of 'p2'. */ bool spoly_eq(const SPOLY *p1, const SPOLY *p2, bool dir); /* * Returns the i-th line segment of a polygon. * * sl - pointer to the line segment * poly - pointer to the polygon * i - number of the segment */ bool spoly_segment(SLine *sl, const SPOLY *poly, int32 i); /* * Checks whether a polygon contains a point. * * pg - pointer to the polygon * sp - pointer to the point */ bool spoly_contains_point(const SPOLY *pg, const SPoint *sp); /* * Returns the relationship between a polygon and a line as * PGS_LINE_POLY_REL int8 value. * * poly - pointer to the polygon * line - pointer to the line */ int8 poly_line_pos(const SPOLY *poly, const SLine *line); /* * Input of a spherical polygon. */ Datum spherepoly_in(PG_FUNCTION_ARGS); /* * Checks whether two polygons are equal. */ Datum spherepoly_equal(PG_FUNCTION_ARGS); /* * Checks whether two polygons are not equal. */ Datum spherepoly_equal_neg(PG_FUNCTION_ARGS); /* * Circumstance of a polygon. Returns circumference in radians * (float8 datum). */ Datum spherepoly_circ(PG_FUNCTION_ARGS); /* * Count points (edges) of a polygon. */ Datum spherepoly_npts(PG_FUNCTION_ARGS); /* * Returns area of a polygon. */ Datum spherepoly_area(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a point. */ Datum spherepoly_cont_point(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a point. */ Datum spherepoly_cont_point_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a point. */ Datum spherepoly_cont_point_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a point. */ Datum spherepoly_cont_point_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a circle. */ Datum spherepoly_cont_circle(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a circle. */ Datum spherepoly_cont_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a circle. */ Datum spherepoly_cont_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a circle. */ Datum spherepoly_cont_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a polygon. */ Datum spherecircle_cont_poly(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a polygon. */ Datum spherecircle_cont_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether a circle contains a polygon. */ Datum spherecircle_cont_poly_com(PG_FUNCTION_ARGS); /* * Checks whether a circle doesn't contain a polygon. */ Datum spherecircle_cont_poly_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a circle overlap. */ Datum spherepoly_overlap_circle(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a circle don't overlap. */ Datum spherepoly_overlap_circle_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a circle overlap. */ Datum spherepoly_overlap_circle_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a circle don't overlap. */ Datum spherepoly_overlap_circle_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a line. */ Datum spherepoly_cont_line(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a line. */ Datum spherepoly_cont_line_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains a line. */ Datum spherepoly_cont_line_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain a line. */ Datum spherepoly_cont_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a line overlap. */ Datum spherepoly_overlap_line(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a line don't overlap. */ Datum spherepoly_overlap_line_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a line overlap. */ Datum spherepoly_overlap_line_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon and a line don't overlap. */ Datum spherepoly_overlap_line_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains other polygon. */ Datum spherepoly_cont_poly(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain other polygon. */ Datum spherepoly_cont_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains other polygon. */ Datum spherepoly_cont_poly_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain other polygon. */ Datum spherepoly_cont_poly_com_neg(PG_FUNCTION_ARGS); /* * Checks whether two polygons overlap. */ Datum spherepoly_overlap_poly(PG_FUNCTION_ARGS); /* * Checks whether two polygons don't overlap. */ Datum spherepoly_overlap_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains an ellipse. */ Datum spherepoly_cont_ellipse(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain an ellipse. */ Datum spherepoly_cont_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon contains an ellipse. */ Datum spherepoly_cont_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon doesn't contain an ellipse. */ Datum spherepoly_cont_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a polygon. */ Datum sphereellipse_cont_poly(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a polygon. */ Datum sphereellipse_cont_poly_neg(PG_FUNCTION_ARGS); /* * Checks whether an ellipse contains a polygon. */ Datum sphereellipse_cont_poly_com(PG_FUNCTION_ARGS); /* * Checks whether an ellipse doesn't contain a polygon. */ Datum sphereellipse_cont_poly_com_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and an ellipse overlap. */ Datum spherepoly_overlap_ellipse(PG_FUNCTION_ARGS); /* * Checks whether a polygon and an ellipse don't overlap. */ Datum spherepoly_overlap_ellipse_neg(PG_FUNCTION_ARGS); /* * Checks whether a polygon and an ellipse overlap. */ Datum spherepoly_overlap_ellipse_com(PG_FUNCTION_ARGS); /* * Checks whether a polygon and an ellipse don't overlap. */ Datum spherepoly_overlap_ellipse_com_neg(PG_FUNCTION_ARGS); /* * Performs inverse transform on a polygon using an Euler transformation. */ Datum spheretrans_poly(PG_FUNCTION_ARGS); /* * Performs inverse transform on a polygon using an Euler transformation. */ Datum spheretrans_poly_inverse(PG_FUNCTION_ARGS); /* * State transition function for the aggregate function spoly(spoint). Never * call this function outside an aggregate function! Adds a point to a polygon. */ Datum spherepoly_add_point(PG_FUNCTION_ARGS); /* * Finalize function for adding spoints to a polygon. */ Datum spherepoly_add_points_finalize(PG_FUNCTION_ARGS); #endif pgsphere/sbuffer.c000066400000000000000000000133331332443031700144760ustar00rootroot00000000000000#include "pg_sphere.h" #include "sbuffer.h" /* Functions to buffer the parser input. */ /* Maximum count of buffered angles. */ #define MAX_BUF_ANGLE 20 /* The type of parsed spherical object. */ unsigned char spheretype; /* The angle buffer. */ float8 bufangle[MAX_BUF_ANGLE]; /* A simple spherical point. */ typedef struct { double lng; /* longitude */ double lat; /* latitude */ } bpoint; /* Spherical point buffer. */ struct { int m; /* count of buffered points */ bpoint *p; /* pointer to array of points */ } bufpoints; /* ID of line's length angle. */ int bufline; /* * First element is the ID of spherical point ( center ). * Second element is the ID of radius angle. */ int bufcircle[2]; /* Buffer of ellipse. */ int bufellipse[5]; /* Buffer of IDs of Euler transformation values. */ int bufeuler[3]; /* Structure to buffer the axes of Euler transformation. */ struct { unsigned char phi, /* first axis */ theta, /* second axis */ psi; /* third axis */ } bufeulertype; /* Current angle ID. */ int bufapos; /* Current point ID. */ int bufspos; /* Pointer to input buffer. */ char *parse_buffer; void set_spheretype(unsigned char st) { spheretype = st; } void init_buffer(char *buffer) { spheretype = STYPE_UNKNOWN; parse_buffer = buffer; bufapos = 0; bufspos = 0; bufeulertype.phi = bufeulertype.psi = EULER_AXIS_Z; bufeulertype.theta = EULER_AXIS_X; bufpoints.m = 2; bufpoints.p = (bpoint *) palloc(bufpoints.m * sizeof(bpoint)); } void reset_buffer(void) { sphere_flush_scanner_buffer(); pfree(bufpoints.p); bufpoints.p = NULL; bufpoints.m = 0; init_buffer(NULL); } int set_angle_sign(int apos, int s) { if (bufangle[apos] > 0 && s < 0) { bufangle[apos] *= -1; } if (bufangle[apos] < 0 && s > 0) { bufangle[apos] *= -1; } return apos; } int set_angle(unsigned char is_deg, float8 a) { if (is_deg) { a /= RADIANS; } bufangle[bufapos] = a; bufapos++; return (bufapos - 1); } int set_point(int lngpos, int latpos) { if (bufspos >= bufpoints.m) { bpoint *p = bufpoints.p; int i = (bufpoints.m * 2); bufpoints.p = (bpoint *) palloc(i * sizeof(bpoint)); memcpy((void *) bufpoints.p, (void *) p, bufpoints.m * sizeof(bpoint)); bufpoints.m = i; pfree(p); } bufpoints.p[bufspos].lng = bufangle[lngpos]; bufpoints.p[bufspos].lat = bufangle[latpos]; bufspos++; lngpos = 0; latpos = 0; if ((bufapos + 3) > MAX_BUF_ANGLE) { bufapos = 0; } return (bufspos - 1); } void set_circle(int spos, int rpos) { bufcircle[0] = spos; bufcircle[1] = rpos; } void set_ellipse(int r1, int r2, int sp, int inc) { bufellipse[0] = r1; bufellipse[1] = r2; bufellipse[2] = sp; bufellipse[3] = inc; } void set_line(int length) { bufline = length; } void set_euler(int phi, int theta, int psi, char *etype) { int i; unsigned char t = 0; bufeuler[0] = phi; bufeuler[1] = theta; bufeuler[2] = psi; for (i = 0; i < 3; i++) { switch (etype[i]) { case 'x': case 'X': t = EULER_AXIS_X; break; case 'y': case 'Y': t = EULER_AXIS_Y; break; case 'z': case 'Z': t = EULER_AXIS_Z; break; } switch (i) { case 0: bufeulertype.phi = t; break; case 1: bufeulertype.theta = t; break; case 2: bufeulertype.psi = t; break; } } } int get_point(double *lng, double *lat) { if (spheretype == STYPE_POINT) { *lng = bufpoints.p[0].lng; *lat = bufpoints.p[0].lat; return 1; } else { return 0; } } int get_line(double *phi, double *theta, double *psi, unsigned char *etype, double *length) { int i; if (spheretype != STYPE_LINE) { return 0; } *phi = bufangle[bufeuler[0]]; *theta = bufangle[bufeuler[1]]; *psi = bufangle[bufeuler[2]]; for (i = 0; i < 3; i++) { switch (i) { case 0: etype[i] = bufeulertype.phi; break; case 1: etype[i] = bufeulertype.theta; break; case 2: etype[i] = bufeulertype.psi; break; } } *length = bufangle[bufline]; return 1; } int get_euler(double *phi, double *theta, double *psi, unsigned char *etype) { int i; if (spheretype != STYPE_EULER) { return 0; } *phi = bufangle[bufeuler[0]]; *theta = bufangle[bufeuler[1]]; *psi = bufangle[bufeuler[2]]; for (i = 0; i < 3; i++) { switch (i) { case 0: etype[i] = bufeulertype.phi; break; case 1: etype[i] = bufeulertype.theta; break; case 2: etype[i] = bufeulertype.psi; break; } } return 1; } int get_circle(double *lng, double *lat, double *radius) { if (spheretype == STYPE_CIRCLE) { *lng = bufpoints.p[bufcircle[0]].lng; *lat = bufpoints.p[bufcircle[0]].lat; *radius = bufangle[bufcircle[1]]; return 1; } else { return 0; } } int get_ellipse(double *lng, double *lat, double *r1, double *r2, double *inc) { if (spheretype == STYPE_ELLIPSE) { *lng = bufpoints.p[bufellipse[2]].lng; *lat = bufpoints.p[bufellipse[2]].lat; *r1 = bufangle[bufellipse[0]]; *r2 = bufangle[bufellipse[1]]; *inc = bufangle[bufellipse[3]]; return 1; } else { return 0; } } int get_path_count(void) { return (bufspos); } int get_path_elem(int spos, double *lng, double *lat) { if (spheretype == STYPE_PATH) { *lng = bufpoints.p[spos].lng; *lat = bufpoints.p[spos].lat; return 1; } else { return 0; } } int get_box(double *lng1, double *lat1, double *lng2, double *lat2) { if (spheretype == STYPE_BOX) { *lng1 = bufpoints.p[0].lng; *lat1 = bufpoints.p[0].lat; *lng2 = bufpoints.p[1].lng; *lat2 = bufpoints.p[1].lat; return 1; } return 0; } int get_buffer(char *buf, int offset) { int slen = strlen(parse_buffer); if (!parse_buffer || !(slen > 0)) { return 0; } if (slen >= offset) { slen = offset; } memcpy((void *) buf, (void *) parse_buffer, slen); parse_buffer += slen; return slen; } pgsphere/sbuffer.h000066400000000000000000000122001332443031700144730ustar00rootroot00000000000000#ifndef __PGS_SBUFFER_H__ #define __PGS_SBUFFER_H__ /* Parser buffer declarations */ #define STYPE_UNKNOWN 0 /* unknown type */ #define STYPE_POINT 1 /* input is spherical type */ #define STYPE_CIRCLE 2 /* input is spherical circle */ #define STYPE_LINE 3 /* input is spherical line */ #define STYPE_EULER 4 /* input is Euler transformation */ #define STYPE_PATH 5 /* input is spherical path or polygon */ #define STYPE_ELLIPSE 6 /* input is spherical ellipse */ #define STYPE_BOX 7 /* input is spherical box */ /* PGS_EULER_AXIS Euler axis */ #define EULER_AXIS_X 1 /* x - axis for Euler transformation */ #define EULER_AXIS_Y 2 /* y - axis for Euler transformation */ #define EULER_AXIS_Z 3 /* z - axis for Euler transformation */ int sphere_yylex(); void sphere_yyerror(const char *str); void sphere_flush_scanner_buffer(void); /* Sets the data type */ void set_spheretype(unsigned char st); /* Initialize the input buffer */ void init_buffer(char *buffer); /* Resets the input buffer */ void reset_buffer(void); /* * Read the "offset" number of bytes from "buf" buffer. * Returns the number of read bytes. */ int get_buffer(char *buf, int offset); /* * Input of an angle. When is_deg > 0 then "a" is in degrees, * otherwise it's in radians. Returns the unique ID (position) of the angle. */ int set_angle(unsigned char is_deg, double a); /* * Set the sign of an angle. "apos" is the angle. "s" is a sign of the angle * ( < 0 .. - , > 0 .. + ). Returns the unique ID (position) of the angle. */ int set_angle_sign(int apos, int s); /* * Creates a spherical point. "lngpos" is the ID of a longitude angle, "latpos" * is the ID of a latitude angle. Returns the unique ID (position) of the spherical * point. */ int set_point(int lngpos, int latpos); /* * Creates a spherical circle. "spos" is the ID of a spherical point, "rpos" * is the ID of a radius angle. */ void set_circle(int spos, int rpos); /* * Sets the length of a spherical line. "length" is the ID of a length angle. */ void set_line(int length); /* * Creates an Euler transformation. "phi" is the ID of a first angle, * "theta" is the ID of a second angle, "psi" is the ID of a third angle, * "etype" is the three letter code of Euler transformation axes. */ void set_euler(int phi, int theta, int psi, char *etype); /* * Creates a spherical ellipse. "r1" is the ID of a first radius angle, * "r2" is the ID of a second radius angle, "sp" is the ID of a spherical * point ( center ), "inc" is the ID of an inclination angle. */ void set_ellipse(int r1, int r2, int sp, int inc); /* * Returns the point parameters. "lng" is the pointer to a longitude * value, "lat" is the pointer to a latitude value. Returns 0 if user * input is a spherical point. */ int get_point(double *lng, double *lat); /* * Returns the circle parameters. "lng" is pointer to a longitude * value of its center, "lat" is pointer to the latitude value of the center, * "radius" is the pointer to the radius value. Returns 0 if user input * is a spherical circle. */ int get_circle(double *lng, double *lat, double *radius); /* * Returns the ellipse parameters. "lng" is the pointer to a longitude value * of its center, "lat" is the pointer to a latitude value of the center, "r1" * is the pointer to a first radius value, "r2" is the pointer to a second * radius value, "inc" is the pointer to an inclination angle. Returns 0 if user * input is a spherical ellipse. */ int get_ellipse(double *lng, double *lat, double *r1, double *r2, double *inc); /* * Returns the line parameters. "phi" is the pointer to the first angle * of Euler transformation, "theta" is the pointer to the second angle of Euler * transformation, "psi" is the pointer to the third angle of Euler transformation, * "etype" is the pointer to the axes value of Euler transformation, "length" is * the pointer to the length value. Returns 0 if user input is a spherical line. */ int get_line(double *phi, double *theta, double *psi, unsigned char *etype, double *length); /* * Returns the Euler transformation parameters. "phi" is the pointer to the * first angle of Euler transformation, "theta" is the pointer to the second * angle of Euler transformation, "psi" is the pointer to the third angle of Euler * transformation, "etype" is the pointer to the axes value of Euler transformation. * Returns 0 if user input is an Euler transformation. */ int get_euler(double *phi, double *theta, double *psi, unsigned char *etype); /* * Returns the number of path elements. */ int get_path_count(void); /* * Returns the elements of a path. "spos" is the number of element, "lng" is * the ID of longitude angle, "lat" is the ID of a latitude angle. Returns 0 * if user input is a path or a polygon and "spos" is valid. */ int get_path_elem(int spos, double *lng, double *lat); /* * Returns the elements of a box. "lng1" is the ID of the first longitude * angle, "lat1" is the ID of the first latitude angle, "lng2" is the ID of * the second longitude angle, "lat2" is the ID of the second latitude angle. * Returns 0 if user input is a box. */ int get_box(double *lng1, double *lat1, double *lng2, double *lat2); #endif pgsphere/sparse.c000066400000000000000000001562671332443031700143550ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Substitute the variable and function names. */ #define yyparse sphere_yyparse #define yylex sphere_yylex #define yyerror sphere_yyerror #define yydebug sphere_yydebug #define yynerrs sphere_yynerrs #define yylval sphere_yylval #define yychar sphere_yychar /* Copy the first part of user declarations. */ #line 1 "sparse.y" /* yacc.c:339 */ #include #include #include "postgres.h" #include "utils/elog.h" #include "sbuffer.h" #define YYMALLOC palloc #define YYFREE pfree void sphere_yyerror(const char *str) { reset_buffer(); elog(ERROR, "parsing: %s", str); } static double human2dec(double d, double m, double s) { if (m < 0 || m >= 60 || s < 0 || s >= 60) { char err[255]; sprintf(err, "minutes or seconds invalid (min:%f sec:%f)", m, s); sphere_yyerror(err); return 0; } else { if (d < 0) return (-s / 3600.0 - m / 60.0) + d; else return (s / 3600.0 + m / 60.0) + d; } } #line 110 "sparse.c" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* In a future release of Bison, this section will be replaced by #include "sparse.h". */ #ifndef YY_SPHERE_YY_SPARSE_H_INCLUDED # define YY_SPHERE_YY_SPARSE_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int sphere_yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { HOUR = 258, DEG = 259, MIN = 260, SEC = 261, COMMA = 262, OPENCIRC = 263, CLOSECIRC = 264, OPENPOINT = 265, CLOSEPOINT = 266, OPENARR = 267, CLOSEARR = 268, SIGN = 269, INT = 270, FLOAT = 271, EULERAXIS = 272 }; #endif /* Tokens. */ #define HOUR 258 #define DEG 259 #define MIN 260 #define SEC 261 #define COMMA 262 #define OPENCIRC 263 #define CLOSECIRC 264 #define OPENPOINT 265 #define CLOSEPOINT 266 #define OPENARR 267 #define CLOSEARR 268 #define SIGN 269 #define INT 270 #define FLOAT 271 #define EULERAXIS 272 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 41 "sparse.y" /* yacc.c:355 */ int i; double d; char c[3]; #line 190 "sparse.c" /* yacc.c:355 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE sphere_yylval; int sphere_yyparse (void); #endif /* !YY_SPHERE_YY_SPARSE_H_INCLUDED */ /* Copy the second part of user declarations. */ #line 207 "sparse.c" /* yacc.c:358 */ #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE # if (defined __GNUC__ \ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C # define YY_ATTRIBUTE(Spec) __attribute__(Spec) # else # define YY_ATTRIBUTE(Spec) /* empty */ # endif #endif #ifndef YY_ATTRIBUTE_PURE # define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) #endif #ifndef YY_ATTRIBUTE_UNUSED # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif #if !defined _Noreturn \ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) # if defined _MSC_VER && 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn YY_ATTRIBUTE ((__noreturn__)) # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 31 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 128 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 18 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 16 /* YYNRULES -- Number of rules. */ #define YYNRULES 46 /* YYNSTATES -- Number of states. */ #define YYNSTATES 109 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 272 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex, without out-of-bounds checking. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 64, 64, 66, 70, 71, 72, 73, 74, 75, 76, 81, 82, 87, 88, 89, 90, 91, 92, 93, 94, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 114, 115, 120, 121, 127, 135, 143, 147, 155, 163, 164, 168, 173, 181, 182 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "HOUR", "DEG", "MIN", "SEC", "COMMA", "OPENCIRC", "CLOSECIRC", "OPENPOINT", "CLOSEPOINT", "OPENARR", "CLOSEARR", "SIGN", "INT", "FLOAT", "EULERAXIS", "$accept", "commands", "command", "number", "angle_lat_us", "angle_long_us", "angle_long", "angle_lat", "spherepoint", "spherecircle", "eulertrans", "sphereline", "spherepointlist", "spherepath", "sphereellipse", "spherebox", YY_NULLPTR }; #endif # ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272 }; # endif #define YYPACT_NINF -18 #define yypact_value_is_default(Yystate) \ (!!((Yystate) == (-18))) #define YYTABLE_NINF -29 #define yytable_value_is_error(Yytable_value) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int8 yypact[] = { 58, 9, 33, -4, -2, 27, 11, 26, -18, -18, -18, 31, 35, -18, -18, -18, -18, -18, -18, 19, 38, 43, 52, 54, 34, 60, -4, -18, 41, 48, -18, -18, 19, -4, 62, 91, 92, -18, 68, 38, 63, -4, 93, -18, 3, 94, -18, -18, 96, 97, -18, 98, -18, 69, 65, -18, 38, 89, 71, 86, 99, 100, -18, 95, 101, -2, -18, -18, 76, 76, -18, 19, 38, 103, 104, -18, 102, -18, -18, 2, 106, -18, -18, -18, -18, 105, 108, 109, 76, -18, 110, 113, 114, 115, -18, -18, 107, 117, -4, 13, 118, -18, -18, 119, 87, 69, 120, 111, -18 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 0, 0, 0, 12, 11, 0, 3, 21, 32, 0, 4, 5, 7, 6, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 23, 22, 1, 0, 0, 0, 12, 11, 13, 0, 0, 0, 0, 0, 41, 0, 12, 11, 29, 12, 11, 24, 0, 46, 0, 15, 14, 0, 0, 0, 12, 11, 13, 34, 0, 0, 0, 42, 43, 0, 26, 25, 0, 0, 12, 11, 16, 0, 37, 35, 15, 14, 36, 45, 40, 12, 30, 27, 38, 18, 17, 0, 12, 11, 16, 31, 28, 0, 19, 0, 18, 17, 39, 20, 0, 19, 0, 20, 0, 44 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -18, -18, -18, -17, -12, 0, 5, 16, -1, -18, 126, -18, -18, -18, -18, -18 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 7, 8, 9, 62, 10, 51, 63, 12, 13, 14, 15, 26, 16, 17, 18 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { 21, 23, 25, 37, 27, 11, 19, 22, 38, -23, 66, 47, 50, 5, 6, 30, 67, 91, 92, 19, -26, 20, 37, 61, 34, 44, 31, 57, 84, 46, 28, 29, 52, 4, 5, 6, 37, 75, 32, 37, 64, 61, 33, 19, 76, 42, 78, 4, 5, 6, 39, 85, 86, 35, 36, 37, 45, 46, 27, 40, 78, 41, 93, 48, 49, 83, 1, 43, 2, 53, 3, 97, 4, 5, 6, 56, 87, 58, 59, 60, 73, 74, 104, 72, 35, 36, 59, 60, 37, 28, 79, 84, 46, 106, -27, 54, 55, 103, 77, 68, 65, 69, 70, 80, 0, 71, 81, -21, 88, 89, 0, 94, 82, -22, 95, 90, 96, 98, 99, 100, 108, 107, -24, 102, 101, -25, 105, -28, 24 }; static const yytype_int8 yycheck[] = { 1, 2, 3, 20, 4, 0, 10, 2, 20, 7, 7, 28, 29, 15, 16, 4, 13, 15, 16, 10, 7, 12, 39, 40, 19, 26, 0, 39, 15, 16, 3, 4, 33, 14, 15, 16, 53, 54, 7, 56, 41, 58, 7, 10, 56, 11, 58, 14, 15, 16, 7, 68, 69, 15, 16, 72, 15, 16, 58, 7, 72, 7, 79, 15, 16, 65, 8, 7, 10, 7, 12, 88, 14, 15, 16, 7, 71, 14, 15, 16, 15, 16, 99, 14, 15, 16, 15, 16, 105, 3, 4, 15, 16, 6, 7, 4, 4, 98, 9, 5, 7, 5, 5, 4, -1, 7, 11, 7, 5, 5, -1, 6, 11, 7, 6, 13, 7, 7, 5, 5, 9, 105, 7, 6, 17, 7, 7, 7, 2 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 8, 10, 12, 14, 15, 16, 19, 20, 21, 23, 24, 26, 27, 28, 29, 31, 32, 33, 10, 12, 26, 24, 26, 28, 26, 30, 23, 3, 4, 4, 0, 7, 7, 24, 15, 16, 21, 22, 7, 7, 7, 11, 7, 26, 15, 16, 21, 15, 16, 21, 24, 26, 7, 4, 4, 7, 22, 14, 15, 16, 21, 22, 25, 26, 7, 7, 13, 5, 5, 5, 7, 14, 15, 16, 21, 22, 9, 22, 4, 4, 11, 11, 23, 15, 21, 21, 24, 5, 5, 13, 15, 16, 21, 6, 6, 7, 21, 7, 5, 5, 17, 6, 26, 21, 7, 6, 25, 9 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 18, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 1, 2, 2, 3, 4, 4, 5, 6, 3, 5, 6, 1, 2, 1, 2, 5, 5, 5, 7, 5, 2, 3, 4, 11, 5, 3 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*----------------------------------------. | Print this symbol's value on YYOUTPUT. | `----------------------------------------*/ static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) { FILE *yyo = yyoutput; YYUSE (yyo); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # endif YYUSE (yytype); } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) { YYFPRINTF (yyoutput, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) { unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], &(yyvsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T yystrlen (const char *yystr) { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (void) { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: 'yyss': related to states. 'yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 4: #line 70 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_POINT ); } #line 1347 "sparse.c" /* yacc.c:1646 */ break; case 5: #line 71 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_CIRCLE ); } #line 1353 "sparse.c" /* yacc.c:1646 */ break; case 6: #line 72 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_LINE ); } #line 1359 "sparse.c" /* yacc.c:1646 */ break; case 7: #line 73 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_EULER ); } #line 1365 "sparse.c" /* yacc.c:1646 */ break; case 8: #line 74 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_PATH ); } #line 1371 "sparse.c" /* yacc.c:1646 */ break; case 9: #line 75 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_ELLIPSE ); } #line 1377 "sparse.c" /* yacc.c:1646 */ break; case 10: #line 76 "sparse.y" /* yacc.c:1646 */ { set_spheretype( STYPE_BOX ); } #line 1383 "sparse.c" /* yacc.c:1646 */ break; case 11: #line 81 "sparse.y" /* yacc.c:1646 */ { (yyval.d) = (yyvsp[0].d); } #line 1389 "sparse.c" /* yacc.c:1646 */ break; case 12: #line 82 "sparse.y" /* yacc.c:1646 */ { (yyval.d) = (yyvsp[0].i); } #line 1395 "sparse.c" /* yacc.c:1646 */ break; case 13: #line 87 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(0, (yyvsp[0].d) ); } #line 1401 "sparse.c" /* yacc.c:1646 */ break; case 14: #line 88 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-1].d), 0, 0) ); } #line 1407 "sparse.c" /* yacc.c:1646 */ break; case 15: #line 89 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-1].i), 0, 0) ); } #line 1413 "sparse.c" /* yacc.c:1646 */ break; case 16: #line 90 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-2].i), (yyvsp[0].d), 0) ); } #line 1419 "sparse.c" /* yacc.c:1646 */ break; case 17: #line 91 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-3].i), (yyvsp[-1].d), 0) ); } #line 1425 "sparse.c" /* yacc.c:1646 */ break; case 18: #line 92 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-3].i), (yyvsp[-1].i), 0) ); } #line 1431 "sparse.c" /* yacc.c:1646 */ break; case 19: #line 93 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-4].i), (yyvsp[-2].i), (yyvsp[0].d)) ); } #line 1437 "sparse.c" /* yacc.c:1646 */ break; case 20: #line 94 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-5].i), (yyvsp[-3].i), (yyvsp[-1].d)) ); } #line 1443 "sparse.c" /* yacc.c:1646 */ break; case 21: #line 99 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(0, (yyvsp[0].d)); } #line 1449 "sparse.c" /* yacc.c:1646 */ break; case 22: #line 100 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-1].d), 0, 0)); } #line 1455 "sparse.c" /* yacc.c:1646 */ break; case 23: #line 101 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-1].i), 0, 0)); } #line 1461 "sparse.c" /* yacc.c:1646 */ break; case 24: #line 102 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-2].i), (yyvsp[0].d), 0)); } #line 1467 "sparse.c" /* yacc.c:1646 */ break; case 25: #line 103 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-3].i), (yyvsp[-1].d), 0)); } #line 1473 "sparse.c" /* yacc.c:1646 */ break; case 26: #line 104 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-3].i), (yyvsp[-1].i), 0)); } #line 1479 "sparse.c" /* yacc.c:1646 */ break; case 27: #line 105 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-4].i), (yyvsp[-2].i), (yyvsp[0].d))); } #line 1485 "sparse.c" /* yacc.c:1646 */ break; case 28: #line 106 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, human2dec((yyvsp[-5].i), (yyvsp[-3].i), (yyvsp[-1].d))); } #line 1491 "sparse.c" /* yacc.c:1646 */ break; case 29: #line 107 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, 15 * human2dec((yyvsp[-2].i), (yyvsp[0].d), 0)); } #line 1497 "sparse.c" /* yacc.c:1646 */ break; case 30: #line 108 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, 15 * human2dec((yyvsp[-4].i), (yyvsp[-2].i), (yyvsp[0].d))); } #line 1503 "sparse.c" /* yacc.c:1646 */ break; case 31: #line 109 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle(1, 15 * human2dec((yyvsp[-5].i), (yyvsp[-3].i), (yyvsp[-1].d))); } #line 1509 "sparse.c" /* yacc.c:1646 */ break; case 32: #line 114 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle_sign((yyvsp[0].i), 1); } #line 1515 "sparse.c" /* yacc.c:1646 */ break; case 33: #line 115 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle_sign((yyvsp[0].i), (yyvsp[-1].i)); } #line 1521 "sparse.c" /* yacc.c:1646 */ break; case 34: #line 120 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle_sign((yyvsp[0].i), 1); } #line 1527 "sparse.c" /* yacc.c:1646 */ break; case 35: #line 121 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_angle_sign((yyvsp[0].i), (yyvsp[-1].i)); } #line 1533 "sparse.c" /* yacc.c:1646 */ break; case 36: #line 128 "sparse.y" /* yacc.c:1646 */ { (yyval.i) = set_point((yyvsp[-3].i), (yyvsp[-1].i)); } #line 1541 "sparse.c" /* yacc.c:1646 */ break; case 37: #line 136 "sparse.y" /* yacc.c:1646 */ { set_circle((yyvsp[-3].i), (yyvsp[-1].i)); } #line 1549 "sparse.c" /* yacc.c:1646 */ break; case 38: #line 144 "sparse.y" /* yacc.c:1646 */ { set_euler((yyvsp[-4].i), (yyvsp[-2].i), (yyvsp[0].i), "ZXZ"); } #line 1557 "sparse.c" /* yacc.c:1646 */ break; case 39: #line 148 "sparse.y" /* yacc.c:1646 */ { set_euler((yyvsp[-6].i), (yyvsp[-4].i), (yyvsp[-2].i), (yyvsp[0].c)); } #line 1565 "sparse.c" /* yacc.c:1646 */ break; case 40: #line 156 "sparse.y" /* yacc.c:1646 */ { set_line ((yyvsp[0].i)); } #line 1573 "sparse.c" /* yacc.c:1646 */ break; case 43: #line 168 "sparse.y" /* yacc.c:1646 */ { } #line 1579 "sparse.c" /* yacc.c:1646 */ break; case 44: #line 174 "sparse.y" /* yacc.c:1646 */ { set_ellipse((yyvsp[-8].i), (yyvsp[-6].i), (yyvsp[-3].i), (yyvsp[-1].i)); } #line 1587 "sparse.c" /* yacc.c:1646 */ break; case 45: #line 181 "sparse.y" /* yacc.c:1646 */ { } #line 1593 "sparse.c" /* yacc.c:1646 */ break; case 46: #line 182 "sparse.y" /* yacc.c:1646 */ { } #line 1599 "sparse.c" /* yacc.c:1646 */ break; #line 1603 "sparse.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif return yyresult; } pgsphere/sparse.h000066400000000000000000000053351332443031700143470ustar00rootroot00000000000000/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ #ifndef YY_SPHERE_YY_SPARSE_H_INCLUDED # define YY_SPHERE_YY_SPARSE_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int sphere_yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { HOUR = 258, DEG = 259, MIN = 260, SEC = 261, COMMA = 262, OPENCIRC = 263, CLOSECIRC = 264, OPENPOINT = 265, CLOSEPOINT = 266, OPENARR = 267, CLOSEARR = 268, SIGN = 269, INT = 270, FLOAT = 271, EULERAXIS = 272 }; #endif /* Tokens. */ #define HOUR 258 #define DEG 259 #define MIN 260 #define SEC 261 #define COMMA 262 #define OPENCIRC 263 #define CLOSECIRC 264 #define OPENPOINT 265 #define CLOSEPOINT 266 #define OPENARR 267 #define CLOSEARR 268 #define SIGN 269 #define INT 270 #define FLOAT 271 #define EULERAXIS 272 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 41 "sparse.y" /* yacc.c:1909 */ int i; double d; char c[3]; #line 94 "sparse.h" /* yacc.c:1909 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE sphere_yylval; int sphere_yyparse (void); #endif /* !YY_SPHERE_YY_SPARSE_H_INCLUDED */ pgsphere/sparse.y000066400000000000000000000101501332443031700143570ustar00rootroot00000000000000%{ #include #include #include "postgres.h" #include "utils/elog.h" #include "sbuffer.h" #define YYMALLOC palloc #define YYFREE pfree void sphere_yyerror(const char *str) { reset_buffer(); elog(ERROR, "parsing: %s", str); } static double human2dec(double d, double m, double s) { if (m < 0 || m >= 60 || s < 0 || s >= 60) { char err[255]; sprintf(err, "minutes or seconds invalid (min:%f sec:%f)", m, s); sphere_yyerror(err); return 0; } else { if (d < 0) return (-s / 3600.0 - m / 60.0) + d; else return (s / 3600.0 + m / 60.0) + d; } } %} %token HOUR DEG MIN SEC COMMA %token OPENCIRC CLOSECIRC OPENPOINT CLOSEPOINT %token OPENARR CLOSEARR %union { int i; double d; char c[3]; } %token SIGN %token INT %token FLOAT %token EULERAXIS %left COMMA %type number %type angle_lat %type angle_lat_us %type angle_long %type angle_long_us %type spherepoint %type spherepointlist %type spherepath %% commands: /* empty */ | command ; command: spherepoint { set_spheretype( STYPE_POINT ); } | spherecircle { set_spheretype( STYPE_CIRCLE ); } | sphereline { set_spheretype( STYPE_LINE ); } | eulertrans { set_spheretype( STYPE_EULER ); } | spherepath { set_spheretype( STYPE_PATH ); } | sphereellipse { set_spheretype( STYPE_ELLIPSE ); } | spherebox { set_spheretype( STYPE_BOX ); } ; /* unsigned number */ number : FLOAT { $$ = $1; } | INT { $$ = $1; } ; /* unsigned longitude */ angle_lat_us : number { $$ = set_angle(0, $1 ); } | FLOAT DEG { $$ = set_angle(1, human2dec($1, 0, 0) ); } | INT DEG { $$ = set_angle(1, human2dec($1, 0, 0) ); } | INT DEG number { $$ = set_angle(1, human2dec($1, $3, 0) ); } | INT DEG FLOAT MIN { $$ = set_angle(1, human2dec($1, $3, 0) ); } | INT DEG INT MIN { $$ = set_angle(1, human2dec($1, $3, 0) ); } | INT DEG INT MIN number { $$ = set_angle(1, human2dec($1, $3, $5) ); } | INT DEG INT MIN number SEC { $$ = set_angle(1, human2dec($1, $3, $5) ); } ; /* unsigned latitude */ angle_long_us : number { $$ = set_angle(0, $1); } | FLOAT DEG { $$ = set_angle(1, human2dec($1, 0, 0)); } | INT DEG { $$ = set_angle(1, human2dec($1, 0, 0)); } | INT DEG number { $$ = set_angle(1, human2dec($1, $3, 0)); } | INT DEG FLOAT MIN { $$ = set_angle(1, human2dec($1, $3, 0)); } | INT DEG INT MIN { $$ = set_angle(1, human2dec($1, $3, 0)); } | INT DEG INT MIN number { $$ = set_angle(1, human2dec($1, $3, $5)); } | INT DEG INT MIN number SEC { $$ = set_angle(1, human2dec($1, $3, $5)); } | INT HOUR number { $$ = set_angle(1, 15 * human2dec($1, $3, 0)); } | INT HOUR INT MIN number { $$ = set_angle(1, 15 * human2dec($1, $3, $5)); } | INT HOUR INT MIN number SEC { $$ = set_angle(1, 15 * human2dec($1, $3, $5)); } ; /* longitude */ angle_long : angle_long_us { $$ = set_angle_sign($1, 1); } | SIGN angle_long_us { $$ = set_angle_sign($2, $1); } ; /* latitude */ angle_lat : angle_lat_us { $$ = set_angle_sign($1, 1); } | SIGN angle_lat_us { $$ = set_angle_sign($2, $1); } ; /* spherical point */ spherepoint: OPENPOINT angle_long COMMA angle_lat CLOSEPOINT { $$ = set_point($2, $4); } ; /* spherical circle */ spherecircle: OPENCIRC spherepoint COMMA angle_lat_us CLOSECIRC { set_circle($2, $4); } ; /* Euler transformation */ eulertrans : angle_long COMMA angle_long COMMA angle_long { set_euler($1, $3, $5, "ZXZ"); } | angle_long COMMA angle_long COMMA angle_long COMMA EULERAXIS { set_euler($1, $3, $5, $7); } ; /* spherical line */ sphereline : OPENPOINT eulertrans CLOSEPOINT COMMA angle_long_us { set_line ($5); } ; /* Path and polygons */ spherepointlist : spherepoint COMMA | spherepointlist spherepoint COMMA ; spherepath : OPENARR spherepointlist spherepoint CLOSEARR { } ; /* ellipses */ sphereellipse: OPENCIRC OPENARR angle_lat_us COMMA angle_lat_us CLOSEARR COMMA spherepoint COMMA angle_lat CLOSECIRC { set_ellipse($3, $5, $8, $10); } ; /* boxes */ spherebox: OPENPOINT spherepoint COMMA spherepoint CLOSEPOINT { } | spherepoint COMMA spherepoint { } ; pgsphere/sql/000077500000000000000000000000001332443031700134725ustar00rootroot00000000000000pgsphere/sql/bounding_box_gist.sql000066400000000000000000000032411332443031700177160ustar00rootroot00000000000000CREATE TABLE bbox_ellipse (e sellipse not null); INSERT INTO bbox_ellipse VALUES ('<{10d, 0.1d}, (0d,0d), 0d>'); SELECT spoint '(5d, 0d)' @ sellipse '<{10d, 0.1d}, (0d,0d), 0d>' AS inside; SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e; -- The ellipse has semi-major axis length of 10 degrees along the equator, -- so (lon,lat) = (5,0) should be inside. CREATE INDEX idx_bbox_ellipse ON bbox_ellipse USING gist (e); ANALYZE bbox_ellipse; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e; CREATE TABLE bbox_poly (p spoly not null); INSERT INTO bbox_poly VALUES ('{(40d,-40d), (0d,80d), (-40d,-40d)}'); SELECT spoint '(0d, 0d)' @ spoly '{(40d,-40d), (0d,80d), (-40d,-40d)}' AS inside; SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p; CREATE INDEX idx_bbox_poly ON bbox_poly USING gist (p); ANALYZE bbox_poly; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p; CREATE TABLE bbox_path (p spath not null); INSERT INTO bbox_path VALUES ('{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}'); SELECT sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS crossing; SELECT spoint '(0d, 0d)' @ spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS inside; SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p; SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p; CREATE INDEX idx_bbox_path ON bbox_path USING gist (p); ANALYZE bbox_path; SET enable_seqscan=false; SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p; SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p; pgsphere/sql/box.sql000066400000000000000000000736351332443031700150210ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- -- sbox and spoint -- SELECT spoint '(0d,90d)' @ sbox '((0d,80d),(360d,90d))' ; SELECT sbox '((309d,309d),(313d,313d))' ~ spoint '(310d,310d)' ; SELECT spoint '(310d,310d)' @ sbox '((309d,309d),(313d,313d))' ; SELECT sbox '((309d,309d),(313d,313d))' ~ spoint '(10d,10d)' ; SELECT spoint '(10d,10d)' @ sbox '((309d,309d),(313d,313d))' ; SELECT sbox '((309d,309d),(313d,313d))' !~ spoint '(310d,310d)' ; SELECT spoint '(310d,310d)' !@ sbox '((309d,309d),(313d,313d))' ; SELECT sbox '((309d,309d),(313d,313d))' !~ spoint '(10d,10d)' ; SELECT spoint '(10d,10d)' !@ sbox '((309d,309d),(313d,313d))' ; SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(10d,10d)'; SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(10d,20d)'; SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(20d,10d)'; SELECT sbox '((10d,10d),(20d,20d))' ~ spoint '(20d,20d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,10d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,20d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,10d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,20d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(310d,15d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(315d,20d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(315d,10d)'; SELECT sbox '((310d,10d),(320d,20d))' ~ spoint '(320d,15d)'; SELECT spoint '(320d, 15d)' @ sbox '((310d,10d),(320d,20d))' ; SELECT spoint '(140d,-15d)' @ sbox '((310d,10d),(320d,20d))' ; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(300d,20d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(330d,20d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(0d,20d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(10d,20d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(30d,20d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,10d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,15d)'; SELECT sbox '((310d,10d),(20d,20d))' ~ spoint '(180d,20d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(300d,10d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-80d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-85d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(320d,-90d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(180d,-90d)'; SELECT sbox '((310d,-90d),(20d,-80d))' ~ spoint '(180d,-89.99d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(300d,10d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,80d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,85d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(320d,90d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(180d,90d)'; SELECT sbox '((310d,80d),(20d,90d))' ~ spoint '(180d,89.99d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(300d,10d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-80d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-85d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(320d,-90d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(180d,-90d)'; SELECT sbox '((0d,-90d),(360d,-80d))' ~ spoint '(180d,-89.99d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(300d,10d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,80d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,85d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(320d,90d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(180d,90d)'; SELECT sbox '((0d,80d),(360d,90d))' ~ spoint '(180d,89.99d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d,-11d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d,-10d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, -5d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 0d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 5d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 20d)'; SELECT sbox '((0d,-10d),(360d,20d))' ~ spoint '(270d, 21d)'; SELECT spoint '(320d, 15d)' !@ sbox '((310d,10d),(320d,20d))' ; SELECT spoint '(140d,-15d)' !@ sbox '((310d,10d),(320d,20d))' ; SELECT sbox '((10d,10d),(20d,20d))' !~ spoint '(10d,10d)'; SELECT sbox '((270d,-10d),(300d,20d))' !~ spoint '(10d,10d)'; -- -- sbox (as point) and spoint -- SELECT sbox '((310d,310d),(310d,310d))' ~ spoint '(310d,310d)' ; SELECT spoint '(310d,310d)' @ sbox '((310d,310d),(310d,310d))' ; SELECT sbox '((310d,310d),(310d,310d))' ~ spoint '(10d,10d)' ; SELECT spoint '(11d,11d)' @ sbox '((310d,310d),(310d,310d))' ; -- -- sbox and circle -- -- Check negators / commutators SELECT scircle '<(0d, 70d),1d>' && sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' && scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 70d),1d>' !&& sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !&& scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 50d),1d>' && sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' && scircle '<(0d, 50d),1d>'; SELECT scircle '<(0d, 50d),1d>' !&& sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !&& scircle '<(0d, 50d),1d>'; SELECT scircle '<(0d, 70d),1d>' @ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' @ scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 70d),1d>' !@ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !@ scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 50d),1d>' @ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' @ scircle '<(0d, 50d),1d>'; SELECT scircle '<(0d, 50d),1d>' !@ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !@ scircle '<(0d, 50d),1d>'; SELECT scircle '<(0d, 70d),1d>' ~ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' ~ scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 70d),1d>' !~ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !~ scircle '<(0d, 70d),1d>'; SELECT scircle '<(0d, 50d),1d>' ~ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' ~ scircle '<(0d, 50d),1d>'; SELECT scircle '<(0d, 50d),1d>' !~ sbox '((-10d, 60d),(10d, 80d))'; SELECT sbox '((-10d, 60d),(10d, 80d))' !~ scircle '<(0d, 50d),1d>'; -- Other Checks SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 90d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-90d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 90d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-90d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 89d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-89d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 89d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-89d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(360d, 88d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(360d,-88d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(360d, 88d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(360d,-88d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 90d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-90d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 90d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-90d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 89d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-89d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 89d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-89d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(270d, 88d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(270d,-88d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(270d, 88d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(270d,-88d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 90d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-90d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 90d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-90d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 89d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-89d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 89d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-89d))'; SELECT scircle '<(0d, 90d),1d>' @ sbox '((0d, 80d),(90d, 88d))'; SELECT scircle '<(0d,-90d),1d>' @ sbox '((0d,-80d),(90d,-88d))'; SELECT scircle '<(0d, 90d),1d>' && sbox '((0d, 80d),(90d, 88d))'; SELECT scircle '<(0d,-90d),1d>' && sbox '((0d,-80d),(90d,-88d))'; SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 90d))'; SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-90d))'; SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 90d))'; SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-90d))'; SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 89d))'; SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-89d))'; SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 89d))'; SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-89d))'; SELECT scircle '<(0d, 89d),1d>' @ sbox '((0d, 80d),(90d, 88d))'; SELECT scircle '<(0d,-89d),1d>' @ sbox '((0d,-80d),(90d,-88d))'; SELECT scircle '<(0d, 89d),1d>' && sbox '((0d, 80d),(90d, 88d))'; SELECT scircle '<(0d,-89d),1d>' && sbox '((0d,-80d),(90d,-88d))'; SELECT scircle '<(0d, 90d),10d>' @ sbox '((0d, 80d),(360d, 90d))'; SELECT scircle '<(0d, 90d),10d>' ~ sbox '((0d, 80d),(360d, 90d))'; SELECT scircle '<(0d, 90d),10d>' && sbox '((0d, 80d),(360d, 90d))'; -- -- sbox and line -- SELECT sline( spoint '(0d,0d)', spoint '(0d,10d)' ) @ sbox '((0d,0d),(10d,10d))'; SELECT sline( spoint '(0d,0d)', spoint '(0d,0d)' ) @ sbox '((0d,0d),(10d,10d))'; SELECT sline( spoint '(0d,10d)', spoint '(10d,10d)' ) @ sbox '((0d,0d),(10d,10d))'; SELECT sline( spoint '(0d,0d)', spoint '(0d,10d)' ) && sbox '((0d,0d),(10d,10d))'; SELECT sline( spoint '(0d,0d)', spoint '(0d,0d)' ) && sbox '((0d,0d),(10d,10d))'; SELECT sline( spoint '(0d,10d)', spoint '(10d,10d)' ) && sbox '((0d,0d),(10d,10d))'; -- sbox is point, sline is point SELECT sbox '((310d,310d),(310d,310d))' ~ sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) ; SELECT sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) @ sbox '((310d,310d),(310d,310d))' ; SELECT sbox '((310d,310d),(310d,310d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; SELECT sline ( spoint '(11d,11d)' , spoint '(11d,11d)' ) @ sbox '((310d,310d),(310d,310d))' ; SELECT sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) @ sbox '((310d,90d),(310d,90d))' ; SELECT sbox '((310d,90d),(310d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; SELECT sbox '((310d,310d),(310d,310d))' && sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) ; SELECT sline ( spoint '(310d,310d)', spoint '(310d,310d)' ) && sbox '((310d,310d),(310d,310d))' ; SELECT sbox '((310d,310d),(310d,310d))' && sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; SELECT sline ( spoint '(11d,11d)' , spoint '(11d,11d)' ) && sbox '((310d,310d),(310d,310d))' ; SELECT sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) && sbox '((310d,90d),(310d,90d))' ; SELECT sbox '((310d,90d),(310d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; -- sbox is point only SELECT sbox '((310d,10d),(310d,10d))' ~ sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) ; SELECT sbox '((310d,10d),(310d,10d))' && sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) ; SELECT sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) @ sbox '((310d,10d),(310d,10d))' ; SELECT sline ( spoint '(310d,10d)', spoint '(310d,20d)' ) && sbox '((310d,10d),(310d,10d))' ; SELECT sbox '((310d,10d),(310d,10d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,20d)' ) ; SELECT sbox '((310d,10d),(310d,10d))' && sline ( spoint '(10d,10d)', spoint '(10d,20d)' ) ; SELECT sline ( spoint '(11d,11d)' , spoint '(21d,11d)' ) @ sbox '((310d,10d),(310d,10d))' ; SELECT sline ( spoint '(11d,11d)' , spoint '(21d,11d)' ) && sbox '((310d,10d),(310d,10d))' ; SELECT sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) @ sbox '((310d,90d),(310d,90d))' ; SELECT sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) && sbox '((310d,90d),(310d,90d))' ; SELECT sbox '((310d,90d),(310d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) ; SELECT sbox '((310d,90d),(310d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,80d)' ) ; -- sline is point only SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) ; SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) ; SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) ; SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) ; SELECT sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) @ sbox '((310d,10d),(320d,20d))' ; SELECT sline ( spoint '(310d,10d)', spoint '(310d,10d)' ) && sbox '((310d,10d),(320d,20d))' ; SELECT sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) @ sbox '((310d,10d),(320d,20d))' ; SELECT sline ( spoint '(315d,15d)', spoint '(315d,15d)' ) && sbox '((310d,10d),(320d,20d))' ; SELECT sbox '((310d,10d),(320d,20d))' ~ sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; SELECT sbox '((310d,10d),(320d,20d))' && sline ( spoint '(10d,10d)', spoint '(10d,10d)' ) ; SELECT sline ( spoint '(11d, 11d)' , spoint '(11d,11d)' ) @ sbox '((310d,10d),(320d,20d))' ; SELECT sline ( spoint '(11d, 11d)' , spoint '(11d,11d)' ) && sbox '((310d,10d),(320d,20d))' ; SELECT sline ( spoint '(11d, 90d)' , spoint '(11d,90d)' ) @ sbox '((310d,80d),(320d,90d))' ; SELECT sline ( spoint '(11d, 90d)' , spoint '(11d,90d)' ) && sbox '((310d,80d),(320d,90d))' ; SELECT sline ( spoint '(11d, 85d)' , spoint '(11d,85d)' ) @ sbox '((310d,80d),(320d,90d))' ; SELECT sline ( spoint '(11d, 85d)' , spoint '(11d,85d)' ) && sbox '((310d,80d),(320d,90d))' ; SELECT sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) @ sbox '((310d,80d),(320d,90d))' ; SELECT sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) && sbox '((310d,80d),(320d,90d))' ; SELECT sbox '((310d,80d),(320d,90d))' ~ sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; SELECT sbox '((310d,80d),(320d,90d))' && sline ( spoint '(11d,90d)' , spoint '(11d,90d)' ) ; SELECT sbox '((310d,80d),(320d,90d))' ~ sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) ; SELECT sbox '((310d,80d),(320d,90d))' && sline ( spoint '(315d,85d)' , spoint '(315d,85d)' ) ; -- sline / sbox near pole SELECT sbox '((20d,80d),(200d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,85d)' ) ; SELECT sbox '((20d,80d),(200d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,85d)' ) ; SELECT sbox '((10d,80d),(210d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; SELECT sbox '((10d,80d),(210d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; SELECT sbox '((10d,80d),(211d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; SELECT sbox '((10d,80d),(211d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,81d)' ) ; SELECT sbox '((190d,80d),(199d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(199d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(200d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(200d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(210d,90d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(210d,90d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((200d,80d),(210d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((200d,80d),(210d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((210d,80d),(220d,90d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((210d,80d),(220d,90d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(199d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(199d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(200d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(200d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(210d,88d))' ~ sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((190d,80d),(210d,88d))' && sline ( spoint '(200d,85d)', spoint '(20d,90d)' ) ; SELECT sbox '((200d,80d),(210d,88d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((200d,80d),(210d,88d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((210d,80d),(220d,88d))' ~ sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; SELECT sbox '((210d,80d),(220d,88d))' && sline ( spoint '(200d,81d)', spoint '(20d,90d)' ) ; -- sbox near equator SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,85d)', spoint '( 20d, 85d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,85d)', spoint '( 20d, 85d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(190d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(190d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(205d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(205d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(202d, 0d)', spoint '(207d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(202d, 0d)', spoint '(207d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,-5d)', spoint '(200d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,-5d)', spoint '(200d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,-5d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,-5d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,-5d)', spoint '(200d, 15d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,-5d)', spoint '(200d, 15d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,-5d)', spoint '(205d, 15d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,-5d)', spoint '(205d, 15d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(209d, 9d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(209d, 9d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 1d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 1d)', spoint '(211d, 11d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 0d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(201d, 1d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(201d, 1d)', spoint '(205d, 5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(210d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(205d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(205d, 10d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(199d,-1d)', spoint '(200d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(199d,-1d)', spoint '(200d, 0d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d,10d)', spoint '(200d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d,10d)', spoint '(200d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d,10d)', spoint '(205d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d,10d)', spoint '(205d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(210d,10d)', spoint '(210d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(210d,10d)', spoint '(210d, 20d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(200d, 0d)', spoint '(200d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(200d, 0d)', spoint '(200d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(205d, 0d)', spoint '(205d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(205d, 0d)', spoint '(205d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline ( spoint '(210d, 0d)', spoint '(210d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' && sline ( spoint '(210d, 0d)', spoint '(210d, -5d)' ) ; SELECT sbox '((200d,0d),(210d,10d))' ~ sline '( -10d, -10d, 200d, ZXZ ), 20d' ; SELECT sbox '((200d,0d),(210d,10d))' && sline '( -10d, -10d, 200d, ZXZ ), 20d' ; -- general position SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, 0d)', spoint '(190d, 0d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, 0d)', spoint '(190d, 0d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -50d)', spoint '(190d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -50d)', spoint '(190d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -40d)', spoint '(189d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -40d)', spoint '(189d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -50d)', spoint '(189d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -50d)', spoint '(189d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -40d)', spoint '(191d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -40d)', spoint '(191d, -40d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -50d)', spoint '(191d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -50d)', spoint '(191d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(170d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(170d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(170d, -40d)', spoint '(190d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(171d, -41d)', spoint '(189d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(171d, -41d)', spoint '(189d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -39d)', spoint '(180d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -39d)', spoint '(180d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(180d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(180d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(180d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(180d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(180d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(180d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(180d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(180d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -39d)', spoint '(182d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -39d)', spoint '(182d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(182d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(182d, -51d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -40d)', spoint '(182d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -40d)', spoint '(182d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(182d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(182d, -50d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(180d, -41d)', spoint '(182d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' && sline ( spoint '(180d, -41d)', spoint '(182d, -49d)' ) ; SELECT sbox '((170d,-50d),(190d,-40d))' ~ sline ( spoint '(170d, -40d)', spoint '(190d, -40d)' ) ; -- all less/equals/greater permutations of spoint coordinates with respect to a fixed sbox select 'f' as expected, spoint(0.50, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.50, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.50, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.50, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.50, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.75, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(0.75, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(0.75, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(0.75, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(0.75, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.00, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.00, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.00, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.00, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.00, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.25, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.25, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.25, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 't' as expected, spoint(1.25, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.25, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.50, 0.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.50, 0.75) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.50, 1.00) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.50, 1.25) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; select 'f' as expected, spoint(1.50, 1.50) <@ sbox(spoint(0.75, 0.75), spoint(1.25, 1.25)) as actual; -- wide spherical boxes pgsphere/sql/circle.sql000066400000000000000000000211311332443031700154520ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- Input/Output --- SELECT set_sphere_output( 'RAD' ); SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT set_sphere_output( 'DEG' ); SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT set_sphere_output( 'DMS' ); SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT set_sphere_output( 'HMS' ); SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT set_sphere_output( 'DMS' ); -- Functions -- checking spherical circle operators SELECT scircle '<(0, 90d),1>' = '<(0, 90d),1>' ; SELECT scircle '<(0,-90d),1>' <> '<(0, 90d),1>' ; -- float8 dist(scircle,scircle) SELECT 180.0*dist('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle,'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*dist('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); -- spoint center(scircle) SELECT center('< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle); SELECT center('< (1h 2m 30s , +90d 0m 0s), 1.0d >'::scircle); -- scircle scircle(spoint) SELECT scircle('(0d,0d)'::spoint); SELECT scircle('(0d,90d)'::spoint); SELECT scircle('(0d,-90d)'::spoint); -- Operators -- = operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (25h 0m 0s,+1d), 1d 30m >'::scircle ; SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle='< (13h 0m 0s,+85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle='< (13h 0m 0s,-85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle='< (2h 0m 0s,+90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle='< (2h 0m 0s,-90d), 1.5d >'::scircle ; -- should be "false" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,-1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 2.5d >'::scircle ; -- <> operator -- should be "false" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (25h 0m 0s,+1d), 1d 30m >'::scircle ; SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle <> '< (13h 0m 0s,+85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle <> '< (13h 0m 0s,-85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle <> '< (2h 0m 0s,+90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle <> '< (2h 0m 0s,-90d), 1.5d >'::scircle ; -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,-1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 2.5d >'::scircle ; -- && operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,-1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0s,0d), 15d >'::scircle; SELECT '< (2h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0.1s,0d), 15d >'::scircle; SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (23h 0m 0.1s,0d), 15d >'::scircle; -- should be "false" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle && '< (1h 0m 0s,-1d), 0.5d >'::scircle; SELECT '< (1d 0m 0s,+1d), 1.0d >'::scircle && '< (0d 0m 0s,0d), 0.1d >'::scircle; -- @@ operator SELECT @@ '< (1h 2m 3s , +1d 2m 3s), 1.0d >'::scircle; SELECT @@ '< (1h 2m 3s , +90d 0m 0s), 1.0d >'::scircle; -- <-> operator SELECT 180.0*('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle<->'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); SELECT 180.0*('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); -- scircle @ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (2d 0m 0s,+1d), 0.5d >'::scircle @ '< (1d 0m 0s,0d), 3.5d >'::scircle; SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; -- should be "false" SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (2h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (2d 0m 0s,+1d), 1.5d >'::scircle @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; -- scircle ~ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1d 0m 0s,0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; -- should be "false" SELECT '< (2h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; -- spoint @ scircle operator -- should be "true" SELECT '(1h 0m 0s,+1d) '::spoint @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '(2d 0m 0s,+1d) '::spoint @ '< (1d 0m 0s, 0d), 3.5d >'::scircle; SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; -- should be "false" SELECT '(1h 0m 0s,+1d )'::spoint @ '< (2h 0m 0s,-1d), 1.5d >'::scircle; SELECT '(3d 30m 0s,+1d )'::spoint @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; SELECT '(1h 0m 0s,+88.99d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,-88.99d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; -- spoint ~ scircle operator -- should be "true" SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d) '::spoint; SELECT '< (1d 0m 0s, 0d), 3.5d >'::scircle ~ '(2d 0m 0s,+1d) '::spoint; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; -- should be "false" SELECT '< (2h 0m 0s,-1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d )'::spoint; SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '(3d 30m 0s,+1d )'::spoint; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+88.99d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-88.99d)'::spoint; pgsphere/sql/circle_extended.sql000066400000000000000000000072751332443031700173470ustar00rootroot00000000000000-- indexed operations..... SET enable_indexscan=off; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; SET enable_indexscan=on; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; -- "Cross-correlation" about 30 seconds on PIII-750 select count(spoint_data.sp) from spoint_data,scircle_data where spoint_data.sp @ scircle_data.sc; pgsphere/sql/contains_ops.sql000066400000000000000000000341401332443031700167140ustar00rootroot00000000000000 -- scircle vs spoint select 'scircle @> spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) @> spoint(1.0,1.0) as actual; select 'scircle @> spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> spoint(2.0,2.0) as actual; select 'spoint <@ scircle', 't' as expected, spoint(1.0,1.0) <@ scircle(spoint(1.0,1.0),0.1) as actual; select 'spoint <@ scircle', 'f' as expected, spoint(2.0,2.0) <@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !@> spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !@> spoint(1.0,1.0) as actual; select 'scircle !@> spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> spoint(2.0,2.0) as actual; select 'spoint !<@ scircle', 'f' as expected, spoint(1.0,1.0) !<@ scircle(spoint(1.0,1.0),0.1) as actual; select 'spoint !<@ scircle', 't' as expected, spoint(2.0,2.0) !<@ scircle(spoint(1.0,1.0),0.1) as actual; -- sbox vs spoint select 'sbox @> spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> spoint(1.1,1.1) as actual; select 'sbox @> spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> spoint(2.0,2.0) as actual; select 'spoint <@ sbox', 't' as expected, spoint(1.1,1.1) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'spoint <@ sbox', 'f' as expected, spoint(2.0,2.0) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !@> spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> spoint(1.1,1.1) as actual; select 'sbox !@> spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> spoint(2.0,2.0) as actual; select 'spoint !<@ sbox', 'f' as expected, spoint(1.1,1.1) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'spoint !<@ sbox', 't' as expected, spoint(2.0,2.0) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; -- spoly vs spoint select 'spoly @> spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> spoint(1.1,1.1) as actual; select 'spoly @> spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> spoint(2.0,2.0) as actual; select 'spoint <@ spoly', 't' as expected, spoint(1.1,1.1) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoint <@ spoly', 'f' as expected, spoint(2.0,2.0) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !@> spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> spoint(1.1,1.1) as actual; select 'spoly !@> spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> spoint(2.0,2.0) as actual; select 'spoint !<@ spoly', 'f' as expected, spoint(1.1,1.1) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoint !<@ spoly', 't' as expected, spoint(2.0,2.0) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; -- scircle vs scircle select 'scircle @> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(1.0,1.0),0.05) as actual; select 'scircle @> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(2.0,2.0),0.05) as actual; select 'scircle @> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) @> scircle(spoint(1.0,1.0),0.2) as actual; select 'scircle <@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.05) <@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle <@ scircle', 'f' as expected, scircle(spoint(2.0,2.0),0.05) <@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle <@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.2) <@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !@> scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(1.0,1.0),0.05) as actual; select 'scircle !@> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(2.0,2.0),0.05) as actual; select 'scircle !@> scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !@> scircle(spoint(1.0,1.0),0.2) as actual; select 'scircle !<@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.05) !<@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !<@ scircle', 't' as expected, scircle(spoint(2.0,2.0),0.05) !<@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !<@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.2) !<@ scircle(spoint(1.0,1.0),0.1) as actual; -- sbox vs scircle select 'sbox @> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(1.1,1.1),0.01) as actual; select 'sbox @> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(2.0,2.0),0.01) as actual; select 'sbox @> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @> scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle <@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle <@ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.01) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle <@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) <@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !@> scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(1.1,1.1),0.01) as actual; select 'sbox !@> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(2.0,2.0),0.01) as actual; select 'sbox !@> scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@> scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle !<@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !<@ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.01) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !<@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) !<@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; -- select 'scircle @> sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle @> sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.2) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle @> sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) @> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox <@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(1.1,1.1),0.2) as actual; select 'sbox <@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(2.0,2.0),0.2) as actual; select 'sbox <@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) <@ scircle(spoint(1.1,1.1),0.01) as actual; select 'scircle !@> sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !@> sbox', 't' as expected, scircle(spoint(2.0,2.0),0.2) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !@> sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) !@> sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !<@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(1.1,1.1),0.2) as actual; select 'sbox !<@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(2.0,2.0),0.2) as actual; select 'sbox !<@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !<@ scircle(spoint(1.1,1.1),0.01) as actual; -- spoly vs scircle select 'spoly @> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(1.1,1.1),0.01) as actual; select 'spoly @> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(2.0,2.0),0.2) as actual; select 'spoly @> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @> scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle <@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.01) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle <@ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.01) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle <@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.2) <@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !@> scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(1.1,1.1),0.01) as actual; select 'spoly !@> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(2.0,2.0),0.2) as actual; select 'spoly !@> scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@> scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle !<@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !<@ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.01) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !<@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.2) !<@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; -- select 'scircle @> spoly', 't' as expected, scircle(spoint(1.1,1.1),0.5) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle @> spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.5) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle @> spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.05) @> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly <@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(1.1,1.1),0.5) as actual; select 'spoly <@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(2.0,2.0),0.5) as actual; select 'spoly <@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly <@ scircle(spoint(1.1,1.1),0.05) as actual; select 'scircle !@> spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.5) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !@> spoly', 't' as expected, scircle(spoint(2.0,2.0),0.5) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !@> spoly', 't' as expected, scircle(spoint(1.1,1.1),0.05) !@> '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !<@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(1.1,1.1),0.5) as actual; select 'spoly !<@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(2.0,2.0),0.5) as actual; select 'spoly !<@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !<@ scircle(spoint(1.1,1.1),0.05) as actual; -- sbox vs spoly select 'sbox @> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'sbox @> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'sbox @> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) @> '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly as actual; select 'spoly <@ sbox', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly <@ sbox', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly <@ sbox', 'f' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly <@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'sbox !@> spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'sbox !@> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'sbox !@> spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !@> '{(0.9,0.9),(1.1,0.9),(1.1,1.1),(0.9,1.1)}'::spoly as actual; select 'spoly !<@ sbox', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly !<@ sbox', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly !<@ sbox', 't' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly !<@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; -- spoly vs spoly select 'spoly @> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; select 'spoly @> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'spoly @> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @> '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; select 'spoly <@ spoly', 't' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly <@ spoly', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly <@ spoly', 'f' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly <@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !@> spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; select 'spoly !@> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'spoly !@> spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@> '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; select 'spoly !<@ spoly', 'f' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !<@ spoly', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !<@ spoly', 't' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly !<@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; pgsphere/sql/contains_ops_compat.sql000066400000000000000000000336101332443031700202600ustar00rootroot00000000000000 -- scircle vs spoint select 'scircle ~ spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) ~ spoint(1.0,1.0) as actual; select 'scircle ~ spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ spoint(2.0,2.0) as actual; select 'spoint @ scircle', 't' as expected, spoint(1.0,1.0) @ scircle(spoint(1.0,1.0),0.1) as actual; select 'spoint @ scircle', 'f' as expected, spoint(2.0,2.0) @ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !~ spoint', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !~ spoint(1.0,1.0) as actual; select 'scircle !~ spoint', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ spoint(2.0,2.0) as actual; select 'spoint !@ scircle', 'f' as expected, spoint(1.0,1.0) !@ scircle(spoint(1.0,1.0),0.1) as actual; select 'spoint !@ scircle', 't' as expected, spoint(2.0,2.0) !@ scircle(spoint(1.0,1.0),0.1) as actual; -- sbox vs spoint select 'sbox ~ spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ spoint(1.1,1.1) as actual; select 'sbox ~ spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ spoint(2.0,2.0) as actual; select 'spoint @ sbox', 't' as expected, spoint(1.1,1.1) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'spoint @ sbox', 'f' as expected, spoint(2.0,2.0) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !~ spoint', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ spoint(1.1,1.1) as actual; select 'sbox !~ spoint', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ spoint(2.0,2.0) as actual; select 'spoint !@ sbox', 'f' as expected, spoint(1.1,1.1) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'spoint !@ sbox', 't' as expected, spoint(2.0,2.0) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; -- spoly vs spoint select 'spoly ~ spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ spoint(1.1,1.1) as actual; select 'spoly ~ spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ spoint(2.0,2.0) as actual; select 'spoint @ spoly', 't' as expected, spoint(1.1,1.1) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoint @ spoly', 'f' as expected, spoint(2.0,2.0) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !~ spoint', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ spoint(1.1,1.1) as actual; select 'spoly !~ spoint', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ spoint(2.0,2.0) as actual; select 'spoint !@ spoly', 'f' as expected, spoint(1.1,1.1) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoint !@ spoly', 't' as expected, spoint(2.0,2.0) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; -- scircle vs scircle select 'scircle ~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(1.0,1.0),0.05) as actual; select 'scircle ~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(2.0,2.0),0.05) as actual; select 'scircle ~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) ~ scircle(spoint(1.0,1.0),0.2) as actual; select 'scircle @ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.05) @ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle @ scircle', 'f' as expected, scircle(spoint(2.0,2.0),0.05) @ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle @ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.2) @ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !~ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(1.0,1.0),0.05) as actual; select 'scircle !~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(2.0,2.0),0.05) as actual; select 'scircle !~ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.1) !~ scircle(spoint(1.0,1.0),0.2) as actual; select 'scircle !@ scircle', 'f' as expected, scircle(spoint(1.0,1.0),0.05) !@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !@ scircle', 't' as expected, scircle(spoint(2.0,2.0),0.05) !@ scircle(spoint(1.0,1.0),0.1) as actual; select 'scircle !@ scircle', 't' as expected, scircle(spoint(1.0,1.0),0.2) !@ scircle(spoint(1.0,1.0),0.1) as actual; -- sbox vs scircle select 'sbox ~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(1.1,1.1),0.01) as actual; select 'sbox ~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(2.0,2.0),0.01) as actual; select 'sbox ~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) ~ scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle @ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle @ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.01) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle @ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) @ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !~ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(1.1,1.1),0.01) as actual; select 'sbox !~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(2.0,2.0),0.01) as actual; select 'sbox !~ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !~ scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle !@ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !@ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.01) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !@ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) !@ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; -- select 'scircle ~ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.2) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle ~ sbox', 'f' as expected, scircle(spoint(2.0,2.0),0.2) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle ~ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.01) ~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox @ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(1.1,1.1),0.2) as actual; select 'sbox @ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(2.0,2.0),0.2) as actual; select 'sbox @ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) @ scircle(spoint(1.1,1.1),0.01) as actual; select 'scircle !~ sbox', 'f' as expected, scircle(spoint(1.1,1.1),0.2) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !~ sbox', 't' as expected, scircle(spoint(2.0,2.0),0.2) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'scircle !~ sbox', 't' as expected, scircle(spoint(1.1,1.1),0.01) !~ sbox(spoint(1.0,1.0),spoint(1.2,1.2)) as actual; select 'sbox !@ scircle', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(1.1,1.1),0.2) as actual; select 'sbox !@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(2.0,2.0),0.2) as actual; select 'sbox !@ scircle', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.2,1.2)) !@ scircle(spoint(1.1,1.1),0.01) as actual; -- spoly vs scircle select 'spoly ~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(1.1,1.1),0.01) as actual; select 'spoly ~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(2.0,2.0),0.2) as actual; select 'spoly ~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly ~ scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle @ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.01) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle @ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.01) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle @ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.2) @ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !~ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(1.1,1.1),0.01) as actual; select 'spoly !~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(2.0,2.0),0.2) as actual; select 'spoly !~ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !~ scircle(spoint(1.1,1.1),0.2) as actual; select 'scircle !@ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.01) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !@ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.01) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !@ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.2) !@ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; -- select 'scircle ~ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.5) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle ~ spoly', 'f' as expected, scircle(spoint(2.0,2.0),0.5) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle ~ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.05) ~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly @ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(1.1,1.1),0.5) as actual; select 'spoly @ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(2.0,2.0),0.5) as actual; select 'spoly @ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly @ scircle(spoint(1.1,1.1),0.05) as actual; select 'scircle !~ spoly', 'f' as expected, scircle(spoint(1.1,1.1),0.5) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !~ spoly', 't' as expected, scircle(spoint(2.0,2.0),0.5) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'scircle !~ spoly', 't' as expected, scircle(spoint(1.1,1.1),0.05) !~ '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly as actual; select 'spoly !@ scircle', 'f' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(1.1,1.1),0.5) as actual; select 'spoly !@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(2.0,2.0),0.5) as actual; select 'spoly !@ scircle', 't' as expected, '{(1.0,1.0),(1.2,1.0),(1.2,1.2),(1.0,1.2)}'::spoly !@ scircle(spoint(1.1,1.1),0.05) as actual; -- sbox vs spoly select 'sbox ~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'sbox ~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'sbox ~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) ~ '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly as actual; select 'spoly @ sbox', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly @ sbox', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly @ sbox', 'f' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly @ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'sbox !~ spoly', 'f' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'sbox !~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'sbox !~ spoly', 't' as expected, sbox(spoint(1.0,1.0),spoint(1.5,1.5)) !~ '{(0.9,0.9),(1.1,0.9),(1.1,1.1),(0.9,1.1)}'::spoly as actual; select 'spoly !@ sbox', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly !@ sbox', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; select 'spoly !@ sbox', 't' as expected, '{(0.9 , 0.9),(1.1 , 0.9),(1.1 , 1.1),(0.9 , 1.1)}'::spoly !@ sbox(spoint(1.0,1.0),spoint(1.5,1.5)) as actual; -- spoly vs spoly select 'spoly ~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; select 'spoly ~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'spoly ~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly ~ '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; select 'spoly @ spoly', 't' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly @ spoly', 'f' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly @ spoly', 'f' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly @ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !~ spoly', 'f' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly as actual; select 'spoly !~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly as actual; select 'spoly !~ spoly', 't' as expected, '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly !~ '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly as actual; select 'spoly !@ spoly', 'f' as expected, '{(1.11,1.11),(1.19,1.11),(1.19,1.19),(1.11,1.19)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !@ spoly', 't' as expected, '{(2.1,2.1),(2.2,1.1),(2.2,1.2),(2.1,1.2)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; select 'spoly !@ spoly', 't' as expected, '{(0.9,0.9),(1.2,0.9),(1.2,1.2),(0.9,1.2)}'::spoly !@ '{(1.1,1.1),(1.2,1.1),(1.2,1.2),(1.1,1.2)}'::spoly as actual; pgsphere/sql/ellipse.sql000066400000000000000000000452241332443031700156570ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- ellipse tests --equal operator SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),0d>'; SELECT sellipse '<{0d,0d},(170d,-12d),0d>' = sellipse '<{0d,0d},(170d,-12d),-2d>'; SELECT sellipse '<{5d,5d},(170d,-12d),0d>' = sellipse '<{5d,5d},(170d,-12d),-2d>'; SELECT sellipse '<{5d,2d},(170d,-12d),0d>' = sellipse '<{5d,2d},(170d,-12d),-2d>'; -- not equal SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d),-2d>'; SELECT sellipse '<{5d,2d},(170d,-12d),0d>' != sellipse '<{5d,2d},(170d,-12d), 0d>'; SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' = sellipse '<{10d,5d},(300d,0d), 180d>' ; SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' = sellipse '<{10d,5d},(300d,0d), 270d>' ; -- ellipse and point SELECT spoint '(280d,-20d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoint '(280d,-10d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoint '(280d,-9.9d)' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d,-10d)' ; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoint '(280d, -9d)' ; SELECT spoint '(280d,-10d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoint '(280d,-9.9d)' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d,-10d)' ; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoint '(280d, -9d)' ; SELECT spoint '(0d, 90d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(0d, -90d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(0d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(90d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(180d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(270d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(9d, 0d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(0d, 9d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; SELECT spoint '(0d, 4d)' @ sellipse '<{10d,5d},(0d,0d),0d>' ; -- --ellipse and circle (@,&&) -- -- negators and commutators SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d, -9d),0d>' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-10d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d, -9d),0d>' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d,-10d),0d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ scircle '<(280d, -9d),0d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d,-10d),0d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ scircle '<(280d, -9d),0d>'; SELECT scircle '<(280d,-10d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d, 0d),2d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-10d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d, 0d),2d>' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d,-10d),2d>' ; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && scircle '<(280d, 0d),2d>' ; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d,-10d),2d>' ; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& scircle '<(280d, 0d),2d>' ; SELECT scircle '<(280d,-10d),0d>' && sellipse '<{10d,5d},(280d,-20d),90d>'; -- ellipse is circle SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-10d),2d>' ; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),2d>' ; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-16d),2d>' ; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT scircle '<(280d,-16d),2d>' && sellipse '<{5d,5d},(280d,-20d),90d>'; -- ellipse is line SELECT scircle '<(280d,-10d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-16d),0d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),15d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-10d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),0d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-10d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-16d),2d>' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-10d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT scircle '<(280d,-18d),2d>' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ scircle '<(280d,-18d),15d>' ; -- --ellipse and line (@,&&) -- -- negators and commutators SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ) !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d, -8d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d, -9d)', spoint '(280d,-12d)' ); SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& sline ( spoint '(280d,-11d)', spoint '(280d,-12d)' ); -- line is point , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; -- line is point , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; -- line is point , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -8d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; -- line is a real line , ellipse is point SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{0d,0d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{0d,0d},(280d, -8d),90d>'; -- line is a real line , ellipse is circle SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,5d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,5d},(280d, -8d),90d>'; -- line is a real line , ellipse is line SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{5d,0d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{5d,0d},(280d, -8d),90d>'; -- line is a real line , ellipse is a real ellipse SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) @ sellipse '<{10d,5d},(280d, -8d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sline ( spoint '(280d, -8d)', spoint '(280d, -9d)' ) && sellipse '<{10d,5d},(280d, -8d),90d>'; -- -- ellipse and ellipse -- -- check @ SELECT sellipse '<{10d, 5d},(300d,0d), 0d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; SELECT sellipse '<{10d, 5d},(300d,0d), 90d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; SELECT sellipse '<{10d, 5d},(300d,0d),180d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; SELECT sellipse '<{10d, 5d},(300d,0d),270d>' @ sellipse '<{10d,5d},(300d,0d),0d>'; SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; -- negators , commutator @,&& SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' @ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' && sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !@ sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{ 2d, 1d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 52d,6d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d, 5d},( 90d,9d), 0d>' !&& sellipse '<{10d,5d},(50d,5d),45d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' ~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' && sellipse '<{10d, 5d},( 90d,9d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !~ sellipse '<{10d, 5d},( 90d,9d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{ 2d, 1d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 52d,6d), 0d>'; SELECT sellipse '<{10d,5d},(50d,5d),45d>' !&& sellipse '<{10d, 5d},( 90d,9d), 0d>'; -- left ellipse is point right ellipse is point SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{0d,0d},(50d,-5d),45d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{0d,0d},(50d,-5d),45d>'; -- left ellipse is line right ellipse is point SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 0d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 0d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; -- left ellipse is circle right ellipse is point SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 5d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; -- left ellipse is real ellipse right ellipse is point SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' @ sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 3d},( 50d, -2d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; SELECT sellipse '<{ 5d, 3d},( 50d,-12d), 90d>' && sellipse '<{0d,0d},(50d,-5d),0d>'; -- left ellipse is point right ellipse is line SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; -- left ellipse is line right ellipse is line SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; -- left ellipse is circle right ellipse is line SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' @ sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-5d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-8d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-6d), 0d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d, 6d), 90d>' && sellipse '<{5d,0d},(50d,-5d),90d>'; -- left ellipse is point right ellipse is circle SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-5d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d,-6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 0d, 0d},( 50d, 6d), 0d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; -- left ellipse is line right ellipse is circle SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 0d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 0d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 0d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; -- left ellipse is circle right ellipse is circle SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' @ sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 3d, 3d},( 50d,-4d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-5d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d,-6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; SELECT sellipse '<{ 5d, 5d},( 50d, 6d), 90d>' && sellipse '<{5d,5d},(50d,-5d),90d>'; pgsphere/sql/euler.sql000066400000000000000000000003401332443031700153240ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- checking Euler transformation operators SELECT strans '-10d,0d,10d,ZZZ' = '-10d,0d,10d,XXX' ; SELECT strans '-40d,0d,40d,ZZZ' <> '-40d,0d,40d,XXX' ; pgsphere/sql/gnomo.sql000066400000000000000000000243761332443031700153460ustar00rootroot00000000000000SET extra_float_digits TO -3; SELECT set_sphere_output_precision(12); select gnomonic_proj(spoint '(0.95, -0.455)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(0.95, -0.45)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(0.95, -0.445)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1, -0.455)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1, -0.45)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1, -0.445)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1.05, -0.455)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1.05, -0.45)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(1.05, -0.445)', spoint '(1, -0.45)'); select gnomonic_proj(spoint '(0.95, 0.045)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(0.95, 0.05)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(0.95, 0.055)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1, 0.045)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1, 0.05)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1, 0.055)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1.05, 0.045)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1.05, 0.05)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(1.05, 0.055)', spoint '(1, 0.05)'); select gnomonic_proj(spoint '(0.95, 0.545)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(0.95, 0.55)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(0.95, 0.555)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1, 0.545)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1, 0.55)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1, 0.555)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1.05, 0.545)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1.05, 0.55)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(1.05, 0.555)', spoint '(1, 0.55)'); select gnomonic_proj(spoint '(2.95, -0.455)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(2.95, -0.45)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(2.95, -0.445)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3, -0.455)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3, -0.45)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3, -0.445)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3.05, -0.455)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3.05, -0.45)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(3.05, -0.445)', spoint '(3, -0.45)'); select gnomonic_proj(spoint '(2.95, 0.045)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(2.95, 0.05)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(2.95, 0.055)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3, 0.045)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3, 0.05)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3, 0.055)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3.05, 0.045)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3.05, 0.05)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(3.05, 0.055)', spoint '(3, 0.05)'); select gnomonic_proj(spoint '(2.95, 0.545)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(2.95, 0.55)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(2.95, 0.555)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3, 0.545)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3, 0.55)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3, 0.555)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3.05, 0.545)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3.05, 0.55)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(3.05, 0.555)', spoint '(3, 0.55)'); select gnomonic_proj(spoint '(4.95, -0.455)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(4.95, -0.45)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(4.95, -0.445)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5, -0.455)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5, -0.45)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5, -0.445)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5.05, -0.455)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5.05, -0.45)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(5.05, -0.445)', spoint '(5, -0.45)'); select gnomonic_proj(spoint '(4.95, 0.045)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(4.95, 0.05)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(4.95, 0.055)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5, 0.045)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5, 0.05)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5, 0.055)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5.05, 0.045)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5.05, 0.05)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(5.05, 0.055)', spoint '(5, 0.05)'); select gnomonic_proj(spoint '(4.95, 0.545)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(4.95, 0.55)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(4.95, 0.555)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5, 0.545)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5, 0.55)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5, 0.555)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5.05, 0.545)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5.05, 0.55)', spoint '(5, 0.55)'); select gnomonic_proj(spoint '(5.05, 0.555)', spoint '(5, 0.55)'); select gnomonic_inv(point '(0.95, -0.455)', spoint '(1, -0.45)'); select gnomonic_inv(point '(0.95, -0.45)', spoint '(1, -0.45)'); select gnomonic_inv(point '(0.95, -0.445)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1, -0.455)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1, -0.45)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1, -0.445)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1.05, -0.455)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1.05, -0.45)', spoint '(1, -0.45)'); select gnomonic_inv(point '(1.05, -0.445)', spoint '(1, -0.45)'); select gnomonic_inv(point '(0.95, 0.045)', spoint '(1, 0.05)'); select gnomonic_inv(point '(0.95, 0.05)', spoint '(1, 0.05)'); select gnomonic_inv(point '(0.95, 0.055)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1, 0.045)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1, 0.05)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1, 0.055)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1.05, 0.045)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1.05, 0.05)', spoint '(1, 0.05)'); select gnomonic_inv(point '(1.05, 0.055)', spoint '(1, 0.05)'); select gnomonic_inv(point '(0.95, 0.545)', spoint '(1, 0.55)'); select gnomonic_inv(point '(0.95, 0.55)', spoint '(1, 0.55)'); select gnomonic_inv(point '(0.95, 0.555)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1, 0.545)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1, 0.55)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1, 0.555)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1.05, 0.545)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1.05, 0.55)', spoint '(1, 0.55)'); select gnomonic_inv(point '(1.05, 0.555)', spoint '(1, 0.55)'); select gnomonic_inv(point '(2.95, -0.455)', spoint '(3, -0.45)'); select gnomonic_inv(point '(2.95, -0.45)', spoint '(3, -0.45)'); select gnomonic_inv(point '(2.95, -0.445)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3, -0.455)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3, -0.45)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3, -0.445)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3.05, -0.455)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3.05, -0.45)', spoint '(3, -0.45)'); select gnomonic_inv(point '(3.05, -0.445)', spoint '(3, -0.45)'); select gnomonic_inv(point '(2.95, 0.045)', spoint '(3, 0.05)'); select gnomonic_inv(point '(2.95, 0.05)', spoint '(3, 0.05)'); select gnomonic_inv(point '(2.95, 0.055)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3, 0.045)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3, 0.05)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3, 0.055)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3.05, 0.045)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3.05, 0.05)', spoint '(3, 0.05)'); select gnomonic_inv(point '(3.05, 0.055)', spoint '(3, 0.05)'); select gnomonic_inv(point '(2.95, 0.545)', spoint '(3, 0.55)'); select gnomonic_inv(point '(2.95, 0.55)', spoint '(3, 0.55)'); select gnomonic_inv(point '(2.95, 0.555)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3, 0.545)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3, 0.55)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3, 0.555)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3.05, 0.545)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3.05, 0.55)', spoint '(3, 0.55)'); select gnomonic_inv(point '(3.05, 0.555)', spoint '(3, 0.55)'); select gnomonic_inv(point '(4.95, -0.455)', spoint '(5, -0.45)'); select gnomonic_inv(point '(4.95, -0.45)', spoint '(5, -0.45)'); select gnomonic_inv(point '(4.95, -0.445)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5, -0.455)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5, -0.45)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5, -0.445)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5.05, -0.455)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5.05, -0.45)', spoint '(5, -0.45)'); select gnomonic_inv(point '(5.05, -0.445)', spoint '(5, -0.45)'); select gnomonic_inv(point '(4.95, 0.045)', spoint '(5, 0.05)'); select gnomonic_inv(point '(4.95, 0.05)', spoint '(5, 0.05)'); select gnomonic_inv(point '(4.95, 0.055)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5, 0.045)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5, 0.05)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5, 0.055)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5.05, 0.045)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5.05, 0.05)', spoint '(5, 0.05)'); select gnomonic_inv(point '(5.05, 0.055)', spoint '(5, 0.05)'); select gnomonic_inv(point '(4.95, 0.545)', spoint '(5, 0.55)'); select gnomonic_inv(point '(4.95, 0.55)', spoint '(5, 0.55)'); select gnomonic_inv(point '(4.95, 0.555)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5, 0.545)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5, 0.55)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5, 0.555)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5.05, 0.545)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5.05, 0.55)', spoint '(5, 0.55)'); select gnomonic_inv(point '(5.05, 0.555)', spoint '(5, 0.55)'); pgsphere/sql/index.sql000066400000000000000000000026301332443031700153230ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- without idx SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp3 WHERE b && scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp3 WHERE spoint '(3.09 , 1.25)' @ b ; SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>'; -- create idx CREATE INDEX aaaidx ON spheretmp1 USING gist ( p ); CREATE INDEX bbbidx ON spheretmp2 USING gist ( c ); CREATE INDEX cccidx ON spheretmp3 USING gist ( b ); CREATE INDEX dddidx ON spheretmp4 USING gist ( l ); --with idx SET enable_seqscan = OFF ; SELECT count(*) FROM spheretmp1 WHERE p @ scircle '<(1,1),0.3>' ; SELECT count(*) FROM spheretmp1 WHERE p = spoint '(3.09 , 1.25)' ; SELECT count(*) FROM spheretmp2 WHERE c @ scircle '<(1,1),0.3>' ; SELECT count(*) FROM spheretmp2 WHERE c && scircle '<(1,1),0.3>' ; SELECT count(*) FROM spheretmp3 WHERE b && scircle '<(1,1),0.3>'; SELECT count(*) FROM spheretmp3 WHERE spoint '(3.09 , 1.25)' @ b ; SELECT count(*) FROM spheretmp4 WHERE l @ scircle '<(1,1),0.3>' ; SELECT count(*) FROM spheretmp4 WHERE l && scircle '<(1,1),0.3>' ; pgsphere/sql/init.sql000066400000000000000000000002321332443031700151530ustar00rootroot00000000000000-- -- first, define the datatype. Turn off echoing so that expected file -- does not depend on contents of pg_sphere.sql. -- CREATE EXTENSION pg_sphere; pgsphere/sql/init_extended.sql000066400000000000000000000006101332443031700170330ustar00rootroot00000000000000-- indexed operations..... -- spoint_data and scircle_data tables have to be created and indexed using \! testsuite/gen_point.pl 1 > results/gen_point_1.sql \i results/gen_point_1.sql -- and \! testsuite/gen_circle.pl 1 0.1 > results/gen_circle_1_0.1.sql \i results/gen_circle_1_0.1.sql -- \! testsuite/gen_poly.pl 1 0.1 4 > results/gen_poly_1_0.1_4.sql \i results/gen_poly_1_0.1_4.sql pgsphere/sql/line.sql000066400000000000000000000050301332443031700151400ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- checking spherical line operators SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) = sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) ; SELECT sline ( spoint '(0, 90d)', spoint '(0, -89d)' ) <> sline ( spoint '(0, -89d)', spoint '(0, 90d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(5d, 5d)', spoint '(5d, -5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 5d)', spoint '(10d, -5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(15d, 5d)', spoint '(15d, -5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 0d)', spoint '(10d, -5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(5d, -5d)', spoint '(5d, 5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, -5d)', spoint '(10d, 5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(15d, -5d)', spoint '(15d, 5d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(10d, 0d)' ) # sline ( spoint '(10d, 0d)', spoint '(10d, 5d)' ) ; -- check small lines SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000005d, 0.0000005d)', spoint '(0.0000005d, -0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0.0000005d)', spoint '(0.000001d, -0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000015d, 0.0000005d)', spoint '(0.0000015d, -0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0d)', spoint '(0.000001d, -0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000005d, -0.0000005d)', spoint '(0.0000005d, 0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, -0.0000005d)', spoint '(0.000001d, 0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.0000015d, -0.0000005d)', spoint '(0.0000015d, 0.0000005d)' ) ; SELECT sline ( spoint '(0, 0d)', spoint '(0.000001d, 0d)' ) # sline ( spoint '(0.000001d, 0d)', spoint '(0.000001d, 0.0000005d)' ) ; pgsphere/sql/path.sql000066400000000000000000000125541332443031700151560ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- -- ellipse and path -- -- negators , commutator @,&& SELECT spath '{(280d, -9d),(280d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d,-11d),(280d,-12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d,-11d),(280d,-12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d,-11d),(280d,-12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -9d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d,-11d),(280d,-12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d, -9d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spath '{(280d,-11d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d, -9d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spath '{(280d,-11d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d, -9d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spath '{(280d,-11d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d, -9d),(280d,-12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spath '{(280d,-11d),(280d,-12d)}'; -- path is a line , ellipse is point SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{0d,0d},(280d, -8d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{0d,0d},(280d, -8d),90d>'; -- path is a line , ellipse is circle SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,5d},(280d, -8d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,5d},(280d, -8d),90d>'; -- path is a line , ellipse is path SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{5d,0d},(280d, -8d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{5d,0d},(280d, -8d),90d>'; -- path is a line , ellipse is a real ellipse SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' @ sellipse '<{10d,5d},(280d, -8d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spath '{(280d, -8d),(280d, -9d)}' && sellipse '<{10d,5d},(280d, -8d),90d>'; -- create path as aggregate SELECT spath(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; -- -- checking path other operators -- \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path1 'spath \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' \set path2 'spath \'{(0,0),(1,0),(2,0),(3,0)}\'' \set path3 'spath \'{(0,0),(0,1),(0,1.5)}\'' SELECT @-@ spath '{(0,0),(1,0),(2,0),(3,0)}'; SELECT :path1 = :path2; SELECT :path1 = :path1; SELECT :path1 <> :path2; SELECT :path1 <> :path1; SELECT :poly && :path1; SELECT :path1 && :poly ; SELECT :path1 @ :poly ; SELECT :path2 @ :poly ; SELECT :path1 && :path1; SELECT :path1 && :path1; SELECT :poly && :path2; SELECT :path2 && :poly ; SELECT :path2 && :path1; SELECT :poly && :path3; SELECT :path3 && :poly ; SELECT :path3 && :path1; SELECT :path3 && :path2; SELECT :path1 @ scircle '<(0,1),1>'; SELECT :path3 @ scircle '<(0,1),1>'; SELECT :path3 @ scircle '<(0,1),0.7>'; SELECT :path1 && scircle '<(0,1),1>'; SELECT :path3 && scircle '<(0,1),1>'; SELECT :path3 && scircle '<(0,1),0.7>'; SELECT :path3 && scircle '<(0,-1),0.7>'; SELECT :path3 @ scircle '<(0,-1),0.7>'; SELECT :path3 && sline ( spoint '(0,-1)', spoint '(0,1)' ); SELECT :path3 && sline ( spoint '(-1,0)', spoint '(1,0)' ); SELECT :path3 && sline ( spoint '(-1,0)', spoint '(-0.3,0)' ); SELECT spath '{(0.11,0.15),(0.12,0.15),(0.13,0.15)}' @ :poly; -- create path SELECT spath(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; SELECT set_sphere_output( 'DEG' ); -- test stored data SELECT spoint(p,2) FROM spheretmp6 WHERE id=2; pgsphere/sql/points.sql000066400000000000000000000147511332443031700155370ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); SET extra_float_digits TO -2; \set ECHO all -- operators SELECT spoint '(0, 90d)' = spoint '(0, 90d)'; SELECT spoint '(0, 90d)' = spoint '(0,-90d)'; SELECT spoint '(0,-90d)' = spoint '(0,-90d)'; SELECT spoint '(0, 90d)' != spoint '(0, 90d)'; SELECT spoint '(0, 90d)' != spoint '(0,-90d)'; SELECT spoint '(0,-90d)' != spoint '(0,-90d)'; SELECT spoint '(0d, 0)' = spoint '(360d,0)'; -- I/O test -- -- Output --- SELECT set_sphere_output( 'DEG' ); SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 1h 3m 30s , -1d 3m 3.6s)'::spoint; SELECT '( 0h 3m 30s , -0d 3m 3.6s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT set_sphere_output( 'DMS' ); SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT set_sphere_output( 'HMS' ); SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT set_sphere_output( 'RAD' ); SELECT '( 0h 0m 0s , 0d 0m 0s)'::spoint; -- "incorrect dec. values" SELECT set_sphere_output( 'DEG' ); SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 5d 0m 0s)'::spoint; SELECT '( -0h 2m 30s , -5d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -95d 0m 0s)'::spoint; -- Input -- SELECT '( 0.625d , -0.04166666667d)'::spoint; SELECT '(0.0109083078249646 , -0.000727220521664407)'::spoint; -- functions for point -------------- -- spoint(float8, float8) SELECT spoint(0.0109083078249646 , -0.000727220521664407); SELECT set_sphere_output( 'RAD' ); SELECT spoint(7.28318530717958623 , 0.00); SELECT spoint(0.0 , 2.141592653589793116); -- dist(spoint,spoint) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 0m 30s , 0d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , 10d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 95d 0m 0s)'::spoint,'( 12h 2m 30s , 85d 0m 0s)'::spoint); SELECT dist('( 24h 2m 30s , 10d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 90d 0m 0s)'::spoint,'( 12h 2m 30s , 90d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , -90d 0m 0s)'::spoint,'( 12h 2m 30s , -90d 0m 0s)'::spoint); -- long(spoint) SELECT long('( 0h 2m 30s , 0d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,95d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,85d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-95d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-85d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,90d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-90d 0m 0s)'::spoint); SELECT long('(24h 2m 30s , 0d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,95d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,85d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-95d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-85d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,90d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-90d 0m 0s)'::spoint); -- lat(spoint) SELECT lat('( 0h 2m 30s , 0d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,95d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,85d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-95d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-85d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,90d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-90d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s , 0d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,95d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,85d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-95d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-85d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,90d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-90d 0m 0s)'::spoint); -- operators for points ------------- -- = operator ----------------------- SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 24h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 24h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint='( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint='( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint='( 12h 2m 30s , 45d 0m 0s)'::spoint; -- <> operator ----------------------- SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 24h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 24h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<>'( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<>'( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<>'( 12h 2m 30s , 45d 0m 0s)'::spoint; -- <-> operator --------------------- SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 0m 30s , 0d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<->'( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<->'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<->'( 12h 2m 30s , -90d 0m 0s)'::spoint; pgsphere/sql/poly.sql000066400000000000000000000636571332443031700152170ustar00rootroot00000000000000\set ECHO none SELECT set_sphere_output_precision(8); \set ECHO all -- checking polygon operators \set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\'' SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon SELECT scircle '<(0.25,0.00),0.05>' @ :poly; -- circle overlaps polygon SELECT scircle '<(0.25,0.00),0.10>' @ :poly; -- circle overlaps polygon SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon SELECT scircle '<(0.25,0.00),0.05>' && :poly; -- circle overlaps polygon SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polygon SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line touches polygon SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line inside polygon SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line touches polygon SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) && :poly; -- line inside polygon \unset poly \set poly1 'spoly \'{(0,0),(1,0),(0,1)}\'' \set poly2 'spoly \'{(1,0),(0,0),(0,1)}\'' \set poly3 'spoly \'{(0,1),(0,0),(1,0)}\'' \set poly4 'spoly \'{(0.1,0.9),(0.1,0.1),(0.9,0.1)}\'' \set poly5 'spoly \'{(0.2,0.0),(1.2,0.0),(0.2,1)}\'' SELECT :poly1 = :poly2; SELECT :poly2 = :poly3; SELECT :poly3 = :poly1; SELECT :poly1 && :poly2; SELECT :poly2 && :poly3; SELECT :poly3 && :poly1; SELECT :poly1 @ :poly2; SELECT :poly2 @ :poly3; SELECT :poly3 @ :poly1; SELECT :poly1 @ :poly4; SELECT :poly4 @ :poly1; SELECT :poly1 && :poly4; SELECT :poly4 && :poly1; SELECT :poly1 @ :poly5; SELECT :poly5 @ :poly1; SELECT :poly1 && :poly5; SELECT :poly5 && :poly1; \unset poly1 \unset poly2 \unset poly3 \unset poly4 \unset poly5 -- From testsuite/poly_test.sql SELECT set_sphere_output('DEG'); SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; SELECT spoly '{(359d,0d),(359d,1d),(4d,0d)}'; SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; -- incorrect input ----- SELECT spoly '{(10d,0d),(10d,1d)}'; --- self-crossing input ----- SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; --- functions SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d),(5d,-5d)}'); --SELECT npoints( spoly '{(0d,0d),(0d,90d),(15d,90d),(15d,0d)}'); SELECT area(spoly '{(0d,0d),(0d,90d),(1,0d)}'); SELECT area(spoly '{(0d,0d),(0d,90d),(90d,0d)}')/(4.0*pi()); --- operations --- = operator --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(2d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(2d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; --- should be false SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(3d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; --- <> operator --- should be false SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(2d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(2d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; --- spoint @ spoly --- should be true SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; --- spoint @ spoly --- should be true SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0d,0d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0d,89.9d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '(0d,90d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '(0d,-89.9d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '(0d,-90d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; --- should be false SELECT '(0.1d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(45d,-89d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '(0d,1d)'::spoint @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; --- spoly ~ spoint --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0d)'::spoint; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,89.9d)'::spoint; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,90d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-89.9d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-90d)'::spoint; --- should be false SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.1d,0.5d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(45d,-89d)'::spoint; SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '(0d,1d)'::spoint; --- scircle @ spoly --- should be true SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,89.9d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,-89.9d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-90d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; --- should be false SELECT '<(0.1d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(45d,-89d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,1d),0.1d>'::scircle @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; --- spoly ~ scircle --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,89.9d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,90d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-89.9d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-90d),0.1d>'::scircle; --- should be false SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(45d,-89d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '<(0d,1d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.1d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.6d,0.5d),0.1d>'::scircle; --- spoly @ scircle --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),2.0d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' @ '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; --- should be false SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),0.99d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(60d,0d),0.99d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}' @ '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}' @ '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(2d,0d)}' @ '<(0d,0d),1.0d>'::scircle; --- scircle ~ spoly --- should be true SELECT '<(0d,0d),2.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; --- should be false SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(60d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}'; SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(2d,0d)}'; --- scircle && spoly --- should be true SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,89.9d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-89.9d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-90d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0d,0d),2.0d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' && '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(0d,2d),1.0d>'::scircle; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(2d,0d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; --- should be false SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(1.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,88.0d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.3d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-87d),0.1d>'::scircle; --- spoly && scircle --- should be true SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,89.9d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,-89.9d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-90d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,0d),2.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,90d),1.0d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(180d,-90d),1.0d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT '<(0d,2d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT '<(2d,0d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; --- should be false SELECT '<(1.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,88.0d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0.3d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,-87d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; --- spoly @ spoly --- should be true SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; --- should be false --SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; --- spoly ~ spoly --- should be true SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; --- should be false SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}'; SELECT spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; --- spoly && spoly --- should be true SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; --- should be false SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(3d,-1d),(3d,1d),(5d,1d),(5d,-1d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-1d,3d),(-1d,5d),(1d,5d),(1d,3d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d,1d),(181d,1d),(181d,-1d)}'; -- -- ellipse and polygon -- -- negators , commutator @,&& SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' && sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !@ sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}' !&& sellipse '<{10d,5d},(280d,-20d),90d>'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' ~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !~ spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d,-12d),(279d, -8d)}'; SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}'; -- ellipse is point SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>'; SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}'; -- ellipse is circle SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,2d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,5d},(280d,-20d),90d>'; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{2d,2d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{5d,5d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; -- ellipse is line SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,0d},(280d,-20d),90d>'; SELECT sellipse '<{5d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{2d,0d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{5d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; -- ellipse is a real ellipse SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,2d},(280d,-20d),90d>'; SELECT spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}' @ sellipse '<{2d,1d},(280d,-20d),90d>'; SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{5d,2d},(280d,-20d),90d>'; SELECT sellipse '<{5d,2d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{2d,1d},(280d,-20d),90d>' @ spoly '{(280d,-10d),(290d,-30d),(270d, -30d)}'; SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ; SELECT sellipse '<{5d,2d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-18d),(279d, -12d)}'; -- create polygon as aggregate SELECT spoly(data.p) FROM ( SELECT spoint '(0,1)' as p UNION ALL SELECT spoint '(1,1)' UNION ALL SELECT '(1,0)' ) AS data ; -- test stored data SELECT count(id) FROM spheretmp5 WHERE id=2 AND area(p) BETWEEN 5.735555 AND 5.735556 ; -- check to create this small polygon without errors SELECT area( spoly '{ (3.09472232280407 , 1.47261266025223), (3.0947320190777 , 1.47261266025223), (3.0947320190777 , 1.47262235652586), (3.09472232280407 , 1.47262235652586) }') >= 0 ; SELECT npoints( spoly '{ (1.51214841579108 , -2.90888208684947e-05), (1.5121581120647 , -2.90888208684947e-05), (1.5121581120647 , -1.93925472462553e-05), (1.51214841579108 , -1.93925472462553e-05) }'); pgsphere/sql/tables.sql000066400000000000000000000024431332443031700154700ustar00rootroot00000000000000-- Create tables SET client_min_messages = 'warning'; CREATE TABLE spheretmp1 (p spoint); \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' \copy spheretmp1 from 'data/test_spherepoint.data' CREATE TABLE spheretmp2 (c scircle); \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' \copy spheretmp2 from 'data/test_spherecircle.data' CREATE TABLE spheretmp3 (b sbox); \copy spheretmp3 from 'data/test_spherebox.data' CREATE TABLE spheretmp4 AS SELECT sline ( p , p - strans '-15d,-15d,-15d,ZXZ' ) AS l FROM spheretmp1; CREATE TABLE spheretmp5 (id int PRIMARY KEY , p spoly ); \copy spheretmp5 from 'data/test_spherepolygon.data' CREATE TABLE spheretmp6 (id int PRIMARY KEY , p spath ); \copy spheretmp6 from 'data/test_spherepath.data' -- Aggregate data from tables SELECT set_sphere_output_precision(12); CREATE TABLE spheretmp7 (p spoint); \copy spheretmp7 from 'data/test_spherepolygon_aggregate.data' SELECT spoly(p) FROM spheretmp7; CREATE TABLE spheretmp8 (p spoint); \copy spheretmp8 from 'data/test_spherepoint.data' SELECT spath(p) FROM spheretmp8 WHERE p IS NOT NULL; pgsphere/sscan.c000066400000000000000000001307041332443031700141530ustar00rootroot00000000000000#line 2 "sscan.c" #line 4 "sscan.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer sphere_create_buffer #define yy_delete_buffer sphere_delete_buffer #define yy_flex_debug sphere_flex_debug #define yy_init_buffer sphere_init_buffer #define yy_flush_buffer sphere_flush_buffer #define yy_load_buffer_state sphere_load_buffer_state #define yy_switch_to_buffer sphere_switch_to_buffer #define yyin spherein #define yyleng sphereleng #define yylex spherelex #define yylineno spherelineno #define yyout sphereout #define yyrestart sphererestart #define yytext spheretext #define yywrap spherewrap #define yyalloc spherealloc #define yyrealloc sphererealloc #define yyfree spherefree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 37 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE sphererestart(spherein ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t sphereleng; extern FILE *spherein, *sphereout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up spheretext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up spheretext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* * Size of input buffer in bytes, not including room for EOB characters. */ yy_size_t yy_buf_size; /* * Number of characters read into yy_ch_buf, not including EOB characters. */ yy_size_t yy_n_chars; /* * Whether we "own" the buffer - i.e., we know we created it, and can * realloc() it to grow it, and should free() it to delete it. */ int yy_is_our_buffer; /* * Whether this is an "interactive" input source; if so, and if we're * using stdio for input, then we want to use getc() instead of fread(), * to make sure we stop fetching input after each newline. */ int yy_is_interactive; /* * Whether we're considered to be at the beginning of a line. If so, '^' * rules will be active on the next match, otherwise not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* * Whether to try to fill the input buffer when we reach the end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* * When an EOF's been seen but there's still some text to process then we * mark the buffer as YY_EOF_PENDING, to indicate that we shouldn't try * reading from the input source any more. We might still have a bunch of * tokens to match, though, because of possible backing-up. * * When we actually see the EOF, we change the status to "new" (via * sphererestart()), so that the user can continue scanning by just * pointing spherein at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE *yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when spheretext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t sphereleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow spherewrap()'s to do buffer switches * instead of setting up a fresh spherein. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void sphererestart(FILE *input_file); void sphere_switch_to_buffer(YY_BUFFER_STATE new_buffer); YY_BUFFER_STATE sphere_create_buffer(FILE *file, int size); void sphere_delete_buffer(YY_BUFFER_STATE b); void sphere_flush_buffer(YY_BUFFER_STATE b); void spherepush_buffer_state(YY_BUFFER_STATE new_buffer); void spherepop_buffer_state(void); static void sphereensure_buffer_stack(void); static void sphere_load_buffer_state(void); static void sphere_init_buffer(YY_BUFFER_STATE b, FILE *file); #define YY_FLUSH_BUFFER sphere_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE sphere_scan_buffer(char *base, yy_size_t size); YY_BUFFER_STATE sphere_scan_string(yyconst char *yy_str); YY_BUFFER_STATE sphere_scan_bytes(yyconst char *bytes, yy_size_t len); void *spherealloc(yy_size_t); void *sphererealloc(void *, yy_size_t); void spherefree(void *); #define yy_new_buffer sphere_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ sphereensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ sphere_create_buffer(spherein,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ sphereensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ sphere_create_buffer(spherein,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define spherewrap() 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *spherein = (FILE *) 0, *sphereout = (FILE *) 0; typedef int yy_state_type; extern int spherelineno; int spherelineno = 1; extern char *spheretext; #define yytext_ptr spheretext static yy_state_type yy_get_previous_state(void); static yy_state_type yy_try_NUL_trans(yy_state_type current_state); static int yy_get_next_buffer(void); static void yy_fatal_error(yyconst char msg[]); /* Done after the current pattern has been matched and before the * corresponding action - sets up spheretext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ sphereleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 20 #define YY_END_OF_BUFFER 21 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[34] = {0, 0, 0, 21, 19, 18, 18, 9, 7, 14, 15, 1, 11, 19, 2, 12, 13, 19, 6, 5, 8, 10, 16, 17, 18, 3, 0, 2, 0, 0, 0, 4, 3, 0 }; static yyconst flex_int32_t yy_ec[256] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 1, 5, 6, 7, 1, 8, 9, 8, 10, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 1, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 15, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 14, 1, 1, 17, 1, 1, 1, 1, 18, 1, 1, 1, 1, 1, 19, 1, 1, 1, 1, 15, 15, 15, 20, 1, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static yyconst flex_int32_t yy_meta[22] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static yyconst flex_int16_t yy_base[34] = {0, 0, 0, 43, 44, 20, 22, 44, 44, 44, 44, 44, 44, 31, 16, 44, 44, 26, 44, 44, 44, 44, 44, 44, 26, 20, 29, 22, 31, 23, 26, 44, 24, 44 }; static yyconst flex_int16_t yy_def[34] = {0, 33, 1, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0 }; static yyconst flex_int16_t yy_nxt[66] = {0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 4, 17, 18, 19, 20, 21, 22, 23, 24, 24, 24, 24, 26, 27, 24, 24, 28, 25, 26, 27, 28, 32, 28, 32, 31, 30, 25, 29, 25, 33, 3, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; static yyconst flex_int16_t yy_chk[66] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 6, 6, 14, 14, 24, 24, 14, 25, 27, 27, 25, 32, 27, 30, 29, 28, 26, 17, 13, 3, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int sphere_flex_debug; int sphere_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *spheretext; #line 1 "sscan.l" #line 2 "sscan.l" #include #include "string.h" #include "sparse.h" #include "sbuffer.h" #define YY_DECL int sphere_yylex( void ) YY_DECL; #define yylval sphere_yylval #undef YY_INPUT #define YY_NO_INPUT #define YY_INPUT(buf,result,max_size) \ { \ result = get_buffer( buf, max_size ); \ result = ( result > 0 )?( result ):(YY_NULL); \ } void sphere_flush_scanner_buffer(void) { YY_FLUSH_BUFFER; } #line 519 "sscan.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals(void); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int spherelex_destroy(void); int sphereget_debug(void); void sphereset_debug(int debug_flag); YY_EXTRA_TYPE sphereget_extra(void); void sphereset_extra(YY_EXTRA_TYPE user_defined); FILE *sphereget_in(void); void sphereset_in(FILE *in_str); FILE *sphereget_out(void); void sphereset_out(FILE *out_str); yy_size_t sphereget_leng(void); char *sphereget_text(void); int sphereget_lineno(void); void sphereset_lineno(int line_number); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int spherewrap(void); #else extern int spherewrap(void); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy(char *, yyconst char *, int); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen(yyconst char *); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput(void); #else static int input(void); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( spheretext, sphereleng, 1, sphereout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( spherein )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( spherein ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, spherein))==0 && ferror(spherein)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(spherein); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int spherelex(void); #define YY_DECL int spherelex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after spheretext and sphereleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 36 "sscan.l" #line 701 "sscan.c" if (!(yy_init)) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if (!(yy_start)) (yy_start) = 1; /* first start state */ if (!spherein) spherein = stdin; if (!sphereout) sphereout = stdout; if (!YY_CURRENT_BUFFER) { sphereensure_buffer_stack(); YY_CURRENT_BUFFER_LVALUE = sphere_create_buffer(spherein, YY_BUF_SIZE); } sphere_load_buffer_state(); } while (1) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of spheretext. */ *yy_cp = (yy_hold_char); /* * yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if (yy_accept[yy_current_state]) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; if (yy_current_state >= 34) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while (yy_current_state != 33); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF * actions. */ switch (yy_act) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 37 "sscan.l" sphere_yylval.i = (strcmp("-", spheretext)) ? (1) : (-1); return SIGN; YY_BREAK case 2: YY_RULE_SETUP #line 38 "sscan.l" sphere_yylval.i = atoi(spheretext); return INT; YY_BREAK case 3: YY_RULE_SETUP #line 39 "sscan.l" sphere_yylval.d = atof(spheretext); return FLOAT; YY_BREAK case 4: YY_RULE_SETUP #line 40 "sscan.l" memcpy((void *) &sphere_yylval.c[0], (void *) spheretext, 3); return EULERAXIS; YY_BREAK case 5: YY_RULE_SETUP #line 41 "sscan.l" return HOUR; YY_BREAK case 6: YY_RULE_SETUP #line 42 "sscan.l" return DEG; YY_BREAK case 7: YY_RULE_SETUP #line 43 "sscan.l" return MIN; YY_BREAK case 8: YY_RULE_SETUP #line 44 "sscan.l" return MIN; YY_BREAK case 9: YY_RULE_SETUP #line 45 "sscan.l" return SEC; YY_BREAK case 10: YY_RULE_SETUP #line 46 "sscan.l" return SEC; YY_BREAK case 11: YY_RULE_SETUP #line 47 "sscan.l" return COMMA; YY_BREAK case 12: YY_RULE_SETUP #line 48 "sscan.l" return OPENCIRC; YY_BREAK case 13: YY_RULE_SETUP #line 49 "sscan.l" return CLOSECIRC; YY_BREAK case 14: YY_RULE_SETUP #line 50 "sscan.l" return OPENPOINT; YY_BREAK case 15: YY_RULE_SETUP #line 51 "sscan.l" return CLOSEPOINT; YY_BREAK case 16: YY_RULE_SETUP #line 52 "sscan.l" return OPENARR; YY_BREAK case 17: YY_RULE_SETUP #line 53 "sscan.l" return CLOSEARR; YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP #line 54 "sscan.l" /* discard spaces */ YY_BREAK case 19: YY_RULE_SETUP #line 55 "sscan.l" /* alert parser of the garbage */ YY_BREAK case 20: YY_RULE_SETUP #line 56 "sscan.l" ECHO; YY_BREAK #line 881 "sscan.c" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW) { /* * We're scanning a new file or input source. It's * possible that this happened because the user just * pointed spherein at a new source and called * spherelex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = spherein; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* * Note that here we test for yy_c_buf_p "<=" to the * position of the first EOB in the buffer, since * yy_c_buf_p will already have been incremented past the * NUL character (since all states make transitions on EOB * to the end-of-buffer state). Contrast this with the * test in input(). */ if ((yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* * Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it for us * because it doesn't know how to deal with the * possibility of jamming (and we don't want to build * jamming into it because then it will run more * slowly). */ yy_next_state = yy_try_NUL_trans(yy_current_state); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if (yy_next_state) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch (yy_get_next_buffer()) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if (spherewrap()) { /* * Note: because we've taken care in * yy_get_next_buffer() to have set up * spheretext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return * the YY_NULL, it'll still work - * another YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if (!(yy_did_buffer_switch_on_eof)) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state(); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found"); } /* end of action switch */ } /* end of scanning one token */ } /* end of spherelex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer(void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ((yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1]) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed"); if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) { /* Don't try to fill the buffer, so this is an * EOF. */ if ((yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1) { /* * We matched a single character, the EOB, so treat this as a * final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* * We matched some text prior to the EOB, first process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for (i = 0; i < number_to_move; ++i) *(dest++) = *(source++); if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) /* * don't do the read, it's not guaranteed to return an EOF, just force * an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while (num_to_read <= 0) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if (b->yy_is_our_buffer) { yy_size_t new_size = b->yy_buf_size * 2; if (new_size <= 0) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ sphererealloc((void *) b->yy_ch_buf, b->yy_buf_size + 2); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if (!b->yy_ch_buf) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow"); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if (num_to_read > YY_READ_BUF_SIZE) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ((yy_n_chars) == 0) { if (number_to_move == YY_MORE_ADJ) { ret_val = EOB_ACT_END_OF_FILE; sphererestart(spherein); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) sphererealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, new_size); if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state(void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for (yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if (yy_accept[yy_current_state]) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; if (yy_current_state >= 34) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans(yy_state_type yy_current_state) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if (yy_accept[yy_current_state]) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; if (yy_current_state >= 34) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 33); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput(void) #else static int input(void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if (*(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR) { /* * yy_c_buf_p now points to the character we want to return. If this * occurs *before* the EOB characters, then it's a valid NUL; if not, * then we've hit the end of the buffer. */ if ((yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch (yy_get_next_buffer()) { case EOB_ACT_LAST_MATCH: /* * This happens because yy_g_n_b() sees that we've * accumulated a token and flags that we need to try * matching the token before proceeding. But for input(), * there's no matching to consider. So convert the * EOB_ACT_LAST_MATCH to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ sphererestart(spherein); /* FALLTHROUGH */ case EOB_ACT_END_OF_FILE: { if (spherewrap()) return EOF; if (!(yy_did_buffer_switch_on_eof)) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve spheretext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void sphererestart(FILE *input_file) { if (!YY_CURRENT_BUFFER) { sphereensure_buffer_stack(); YY_CURRENT_BUFFER_LVALUE = sphere_create_buffer(spherein, YY_BUF_SIZE); } sphere_init_buffer(YY_CURRENT_BUFFER, input_file); sphere_load_buffer_state(); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void sphere_switch_to_buffer(YY_BUFFER_STATE new_buffer) { /* * TODO. We should be able to replace this entire function body with * spherepop_buffer_state(); spherepush_buffer_state(new_buffer); */ sphereensure_buffer_stack(); if (YY_CURRENT_BUFFER == new_buffer) return; if (YY_CURRENT_BUFFER) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; sphere_load_buffer_state(); /* * We don't actually know whether we did this switch during EOF * (spherewrap()) processing, but the only time this flag is looked at is * after spherewrap() is called, so it's safe to go ahead and always set * it. */ (yy_did_buffer_switch_on_eof) = 1; } static void sphere_load_buffer_state(void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; spherein = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE sphere_create_buffer(FILE *file, int size) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) spherealloc(sizeof(struct yy_buffer_state)); if (!b) YY_FATAL_ERROR("out of dynamic memory in sphere_create_buffer()"); b->yy_buf_size = size; /* * yy_ch_buf has to be 2 characters longer than the size given because we * need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) spherealloc(b->yy_buf_size + 2); if (!b->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in sphere_create_buffer()"); b->yy_is_our_buffer = 1; sphere_init_buffer(b, file); return b; } /** Destroy the buffer. * @param b a buffer created with sphere_create_buffer() * */ void sphere_delete_buffer(YY_BUFFER_STATE b) { if (!b) return; if (b == YY_CURRENT_BUFFER) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if (b->yy_is_our_buffer) spherefree((void *) b->yy_ch_buf); spherefree((void *) b); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a sphererestart() or at EOF. */ static void sphere_init_buffer(YY_BUFFER_STATE b, FILE *file) { int oerrno = errno; sphere_flush_buffer(b); b->yy_input_file = file; b->yy_fill_buffer = 1; /* * If b is the current buffer, then sphere_init_buffer was _probably_ * called from sphererestart() or through yy_get_next_buffer. In that * case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER) { b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void sphere_flush_buffer(YY_BUFFER_STATE b) { if (!b) return; b->yy_n_chars = 0; /* * We always need two end-of-buffer characters. The first causes a * transition to the end-of-buffer state. The second causes a jam in that * state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if (b == YY_CURRENT_BUFFER) sphere_load_buffer_state(); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void spherepush_buffer_state(YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; sphereensure_buffer_stack(); /* This block is copied from sphere_switch_to_buffer. */ if (YY_CURRENT_BUFFER) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from sphere_switch_to_buffer. */ sphere_load_buffer_state(); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void spherepop_buffer_state(void) { if (!YY_CURRENT_BUFFER) return; sphere_delete_buffer(YY_CURRENT_BUFFER); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { sphere_load_buffer_state(); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void sphereensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* * First allocation is just for 2 elements, since we don't know if * this scanner will even need a stack. We use 2 instead of 1 to avoid * an immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state **) spherealloc (num_to_alloc * sizeof(struct yy_buffer_state *) ); if (!(yy_buffer_stack)) YY_FATAL_ERROR("out of dynamic memory in sphereensure_buffer_stack()"); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state *)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) { /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */ ; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state **) sphererealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state *) ); if (!(yy_buffer_stack)) YY_FATAL_ERROR("out of dynamic memory in sphereensure_buffer_stack()"); /* zero only the new slots. */ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state *)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE sphere_scan_buffer(char *base, yy_size_t size) { YY_BUFFER_STATE b; if (size < 2 || base[size - 2] != YY_END_OF_BUFFER_CHAR || base[size - 1] != YY_END_OF_BUFFER_CHAR) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) spherealloc(sizeof(struct yy_buffer_state)); if (!b) YY_FATAL_ERROR("out of dynamic memory in sphere_scan_buffer()"); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; sphere_switch_to_buffer(b); return b; } /** Setup the input buffer state to scan a string. The next call to spherelex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * sphere_scan_bytes() instead. */ YY_BUFFER_STATE sphere_scan_string(yyconst char *yystr) { return sphere_scan_bytes(yystr, strlen(yystr)); } /** Setup the input buffer state to scan the given bytes. The next call to spherelex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE sphere_scan_bytes(yyconst char *yybytes, yy_size_t _yybytes_len) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) spherealloc(n); if (!buf) YY_FATAL_ERROR("out of dynamic memory in sphere_scan_bytes()"); for (i = 0; i < _yybytes_len; ++i) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR; b = sphere_scan_buffer(buf, n); if (!b) YY_FATAL_ERROR("bad buffer in sphere_scan_bytes()"); /* * It's okay to grow etc. this buffer, and we should throw it away when * we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error(yyconst char *msg) { (void) fprintf(stderr, "%s\n", msg); exit(YY_EXIT_FAILURE); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up spheretext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ spheretext[sphereleng] = (yy_hold_char); \ (yy_c_buf_p) = spheretext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ sphereleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int sphereget_lineno(void) { return spherelineno; } /** Get the input stream. * */ FILE * sphereget_in(void) { return spherein; } /** Get the output stream. * */ FILE * sphereget_out(void) { return sphereout; } /** Get the length of the current token. * */ yy_size_t sphereget_leng(void) { return sphereleng; } /** Get the current token. * */ char * sphereget_text(void) { return spheretext; } /** Set the current line number. * @param line_number * */ void sphereset_lineno(int line_number) { spherelineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see sphere_switch_to_buffer */ void sphereset_in(FILE *in_str) { spherein = in_str; } void sphereset_out(FILE *out_str) { sphereout = out_str; } int sphereget_debug(void) { return sphere_flex_debug; } void sphereset_debug(int bdebug) { sphere_flex_debug = bdebug; } static int yy_init_globals(void) { /* * Initialization is the same as for the non-reentrant scanner. This * function is called from spherelex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT spherein = stdin; sphereout = stdout; #else spherein = (FILE *) 0; sphereout = (FILE *) 0; #endif /* * For future reference: Set errno on error, since we are called by * spherelex_init() */ return 0; } /* spherelex_destroy is for both reentrant and non-reentrant scanners. */ int spherelex_destroy(void) { /* Pop the buffer stack, destroying each element. */ while (YY_CURRENT_BUFFER) { sphere_delete_buffer(YY_CURRENT_BUFFER); YY_CURRENT_BUFFER_LVALUE = NULL; spherepop_buffer_state(); } /* Destroy the stack itself. */ spherefree((yy_buffer_stack)); (yy_buffer_stack) = NULL; /* * Reset the globals. This is important in a non-reentrant scanner so the * next time spherelex() is called, initialization will occur. */ yy_init_globals(); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy(char *s1, yyconst char *s2, int n) { register int i; for (i = 0; i < n; ++i) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen(yyconst char *s) { register int n; for (n = 0; s[n]; ++n) ; return n; } #endif void * spherealloc(yy_size_t size) { return (void *) malloc(size); } void * sphererealloc(void *ptr, yy_size_t size) { /* * The cast to (char *) in the following accommodates both implementations * that use char* generic pointers, and those that use void* generic * pointers. It works with the latter because both ANSI C and C++ allow * castless assignment from any pointer type to void*, and deal with * argument conversions as though doing an assignment. */ return (void *) realloc((char *) ptr, size); } void spherefree(void *ptr) { free((char *) ptr); /* see sphererealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 56 "sscan.l" pgsphere/sscan.l000066400000000000000000000022111332443031700141530ustar00rootroot00000000000000%{ #include #include "string.h" #include "sparse.h" #include "sbuffer.h" #define YY_DECL int sphere_yylex(void) YY_DECL; #define yylval sphere_yylval #undef YY_INPUT #define YY_NO_INPUT #define YY_INPUT(buf, result, max_size) \ { \ result = get_buffer(buf, max_size); \ result = (result > 0) ? (result) : (YY_NULL); \ } void sphere_flush_scanner_buffer(void) { YY_FLUSH_BUFFER; } %} %option 8bit %option never-interactive %option nounput %option noyywrap int [0-9]+ sign [+-] real ({int})?\.({int}) float ({int}|{real})([eE]{sign}{int})? %% {sign} sphere_yylval.i = (strcmp("-", yytext)) ? (1) : (-1); return SIGN; {int} sphere_yylval.i = atoi(yytext); return INT; {float} sphere_yylval.d = atof(yytext); return FLOAT; [x-zX-Z]{3} memcpy(&sphere_yylval.c[0], yytext, 3); return EULERAXIS; h return HOUR; d return DEG; ' return MIN; m return MIN; \" return SEC; s return SEC; , return COMMA; \< return OPENCIRC; \> return CLOSECIRC; \( return OPENPOINT; \) return CLOSEPOINT; \{ return OPENARR; \} return CLOSEARR; [ \n\t]+ /* discard spaces */ . /* alert parser of the garbage */ %% pgsphere/testsuite/000077500000000000000000000000001332443031700147245ustar00rootroot00000000000000pgsphere/testsuite/circle_test.expected000066400000000000000000000440051332443031700207520ustar00rootroot00000000000000-- Input/Output --- SELECT set_sphere_output( RAD ); set_sphere_output ------------------- SET RAD (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1.0d > scircle ----------------------------------------------------------------- <(0.272707695624114 , 0.0181805130416076) , 0.0174532925199433> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1d 30m > scircle ----------------------------------------------------------------- <(0.272707695624114 , 0.0181805130416076) , 0.0261799387799149> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 0.1 > scircle -------------------------------------------------- <(0.272707695624114 , 0.0181805130416076) , 0.1> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 90d > scircle -------------------------------------------------------------- <(0.272707695624114 , 0.0181805130416076) , 1.5707963267949> (1 row) SELECT set_sphere_output( DEG ); set_sphere_output ------------------- SET DEG (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1.0d > scircle -------------------------------------- <(15.625d , 1.04166666666667d) , 1d> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1d 30m > scircle ---------------------------------------- <(15.625d , 1.04166666666667d) , 1.5d> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 0.1 > scircle ----------------------------------------------------- <(15.625d , 1.04166666666667d) , 5.72957795130823d> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 90d > scircle --------------------------------------- <(15.625d , 1.04166666666667d) , 90d> (1 row) SELECT set_sphere_output( DMS ); set_sphere_output ------------------- SET DMS (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1.0d > scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 1d 0m 0s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1d 30m > scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 1d 30m 0s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 0.1 > scircle ------------------------------------------------------ <( 15d 37m 30s , + 1d 2m 30s) , 5d 43m 46.480625s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 90d > scircle ---------------------------------------------- <( 15d 37m 30s , + 1d 2m 30s) , 90d 0m 0s> (1 row) SELECT set_sphere_output( HMS ); set_sphere_output ------------------- SET HMS (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1.0d > scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 1d 0m 0s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 1d 30m > scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 1d 30m 0s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 0.1 > scircle ------------------------------------------------------ <( 1h 2m 30s , + 1d 2m 30s) , 5d 43m 46.480625s> (1 row) SELECT < (1h 2m 30s , +1d 2m 30s), 90d > scircle ---------------------------------------------- <( 1h 2m 30s , + 1d 2m 30s) , 90d 0m 0s> (1 row) SELECT set_sphere_output( DMS ); set_sphere_output ------------------- SET DMS (1 row) -- Functions -- float8 dist(scircle,scircle) SELECT 180.0*dist('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle,'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); ?column? ---------- 19.8 (1 row) SELECT 180.0*dist('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 13 (1 row) SELECT 180.0*dist('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 20 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ------------------- 0.499999999999953 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 0 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 87 (1 row) SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 178 (1 row) -- spoint spoint(scircle) SELECT spoint('< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle); spoint ------------------------------- ( 15d 37m 30s , + 1d 2m 30s) (1 row) SELECT spoint('< (1h 2m 30s , +90d 0m 0s), 1.0d >'::scircle); spoint ------------------------------ ( 15d 37m 30s , +90d 0m 0s) (1 row) -- scircle scircle(spoint) SELECT scircle('(0d,0d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , + 0d 0m 0s) , 0d 0m 0s> (1 row) SELECT scircle('(0d,90d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , +90d 0m 0s) , 0d 0m 0s> (1 row) SELECT scircle('(0d,-90d)'::spoint); scircle -------------------------------------------- <( 0d 0m 0s , -90d 0m 0s) , 0d 0m 0s> (1 row) -- Operators -- = operator -- should be "true" SELECT < (1h 0m 0s,+1d), 1.5d > (1h 0m 0s,+1d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > (25h 0m 0s,+1d), 1d 30m >'::scircle ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+95d), 1.5d > (13h 0m 0s,+85d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-95d), 1.5d > (13h 0m 0s,-85d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+90d), 1.5d > (2h 0m 0s,+90d), 1.5d >'::scircle ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-90d), 1.5d > (2h 0m 0s,-90d), 1.5d >'::scircle ; ?column? ---------- t (1 row) -- should be "false" SELECT < (1h 0m 0s,+1d), 1.5d > (1h 0m 0s,-1d), 1.5d >'::scircle ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > (1h 0m 0s,+1d), 2.5d >'::scircle ; ?column? ---------- f (1 row) -- <> operator -- should be "false" SELECT < (1h 0m 0s,+1d), 1.5d > <> < (1h 0m 0s,+1d), 1.5d > ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > <> < (25h 0m 0s,+1d), 1d 30m > ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+95d), 1.5d > <> < (13h 0m 0s,+85d), 1.5d > ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,-95d), 1.5d > <> < (13h 0m 0s,-85d), 1.5d > ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+90d), 1.5d > <> < (2h 0m 0s,+90d), 1.5d > ; ?column? ---------- f (1 row) SELECT < (1h 0m 0s,-90d), 1.5d > <> < (2h 0m 0s,-90d), 1.5d > ; ?column? ---------- f (1 row) -- should be "true" SELECT < (1h 0m 0s,+1d), 1.5d > <> < (1h 0m 0s,-1d), 1.5d > ; ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > <> < (1h 0m 0s,+1d), 2.5d > ; ?column? ---------- t (1 row) -- && operator -- should be "true" SELECT < (1h 0m 0s,+1d), 1.5d > && < (1h 0m 0s,+1d), 1.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > && < (1h 0m 0s,+1d), 0.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+1d), 1.5d > && < (1h 0m 0s,-1d), 1.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,0d), 15d > && < (0h 0m 0s,0d), 15d > ?column? ---------- t (1 row) SELECT < (2h 0m 0s,0d), 15d > && < (0h 0m 0.1s,0d), 15d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,0d), 15d > && < (23h 0m 0.1s,0d), 15d > ?column? ---------- t (1 row) -- should be "false" SELECT < (1h 0m 0s,+1d), 0.5d > && < (1h 0m 0s,-1d), 0.5d > ?column? ---------- f (1 row) SELECT < (1d 0m 0s,+1d), 1.0d > && < (0d 0m 0s,0d), 0.1d > ?column? ---------- f (1 row) -- @@ operator SELECT @@ < (1h 2m 3s , +1d 2m 3s), 1.0d > ?column? ------------------------------ ( 15d 30m 45s , + 1d 2m 3s) (1 row) SELECT @@ < (1h 2m 3s , +90d 0m 0s), 1.0d > ?column? ------------------------------ ( 15d 30m 45s , +90d 0m 0s) (1 row) -- <-> operator SELECT 180.0*('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle<->'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); ?column? ---------- 19.8 (1 row) SELECT 180.0*('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 13 (1 row) SELECT 180.0*('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 20 (1 row) SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); ?column? ------------------- 0.499999999999953 (1 row) SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 0 (1 row) SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); ?column? ---------- 87 (1 row) SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); ?column? ---------- 178 (1 row) -- scircle @ scircle operator -- should be "true" SELECT < (1h 0m 0s,+1d), 0.5d > @ < (1h 0m 0s,+1d), 1.5d > ?column? ---------- t (1 row) SELECT < (2d 0m 0s,+1d), 0.5d > @ < (1d 0m 0s,0d), 3.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+89d), 0.5d > @ < (1h 0m 0s,+90d), 1.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-89d), 0.5d > @ < (1h 0m 0s,-90d), 1.5d > ?column? ---------- t (1 row) -- should be "false" SELECT < (1h 0m 0s,+1d), 0.5d > @ < (2h 0m 0s,+1d), 1.5d > ?column? ---------- f (1 row) SELECT < (2d 0m 0s,+1d), 1.5d > @ < (0d 0m 0s, 0d), 3.5d > ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+89d), 0.5d > @ < (1h 0m 0s,+90d), 1.0d > ?column? ---------- f (1 row) SELECT < (1h 0m 0s,-89d), 0.5d > @ < (1h 0m 0s,-90d), 1.0d > ?column? ---------- f (1 row) -- scircle ~ scircle operator -- should be "true" SELECT < (1h 0m 0s,+1d), 1.5d > ~ < (1h 0m 0s,+1d), 0.5d > ?column? ---------- t (1 row) SELECT < (1d 0m 0s,0d), 3.5d > ~ < (2d 0m 0s,+1d), 0.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+90d), 1.5d > ~ < (1h 0m 0s,+89d), 0.5d > ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-90d), 1.5d > ~ < (1h 0m 0s,-89d), 0.5d > ?column? ---------- t (1 row) -- should be "false" SELECT < (2h 0m 0s,+1d), 1.5d > ~ < (1h 0m 0s,+1d), 0.5d > ?column? ---------- f (1 row) SELECT < (0d 0m 0s, 0d), 3.5d > ~ < (2d 0m 0s,+1d), 1.5d > ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+90d), 1.0d > ~ < (1h 0m 0s,+89d), 0.5d > ?column? ---------- f (1 row) SELECT < (1h 0m 0s,-90d), 1.0d > ~ < (1h 0m 0s,-89d), 0.5d > ?column? ---------- f (1 row) -- spoint @ scircle operator -- should be "true" SELECT (1h 0m 0s,+1d) @ < (1h 0m 0s,+1d), 1.5d > ?column? ---------- t (1 row) SELECT (2d 0m 0s,+1d) @ < (1d 0m 0s, 0d), 3.5d > ?column? ---------- t (1 row) SELECT (1h 0m 0s,+89d) @ < (1h 0m 0s,+90d), 1.5d > ?column? ---------- t (1 row) SELECT (1h 0m 0s,-89d) @ < (1h 0m 0s,-90d), 1.5d > ?column? ---------- t (1 row) SELECT (1h 0m 0s,+89d) @ < (1h 0m 0s,+90d), 1.0d > ?column? ---------- t (1 row) SELECT (1h 0m 0s,-89d) @ < (1h 0m 0s,-90d), 1.0d > ?column? ---------- t (1 row) -- should be "false" SELECT (1h 0m 0s,+1d ) @ < (2h 0m 0s,-1d), 1.5d > ?column? ---------- f (1 row) SELECT (3d 30m 0s,+1d ) @ < (0d 0m 0s, 0d), 3.5d > ?column? ---------- f (1 row) SELECT (1h 0m 0s,+88.99d) @ < (1h 0m 0s,+90d), 1.0d > ?column? ---------- f (1 row) SELECT (1h 0m 0s,-88.99d) @ < (1h 0m 0s,-90d), 1.0d > ?column? ---------- f (1 row) -- spoint ~ scircle operator -- should be "true" SELECT < (1h 0m 0s,+1d), 1.5d > ~ (1h 0m 0s,+1d) ?column? ---------- t (1 row) SELECT < (1d 0m 0s, 0d), 3.5d > ~ (2d 0m 0s,+1d) ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+90d), 1.5d > ~ (1h 0m 0s,+89d) ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-90d), 1.5d > ~ (1h 0m 0s,-89d) ?column? ---------- t (1 row) SELECT < (1h 0m 0s,+90d), 1.0d > ~ (1h 0m 0s,+89d) ?column? ---------- t (1 row) SELECT < (1h 0m 0s,-90d), 1.0d > ~ (1h 0m 0s,-89d) ?column? ---------- t (1 row) -- should be "false" SELECT < (2h 0m 0s,-1d), 1.5d > ~ (1h 0m 0s,+1d ) ?column? ---------- f (1 row) SELECT < (0d 0m 0s, 0d), 3.5d > ~ (3d 30m 0s,+1d ) ?column? ---------- f (1 row) SELECT < (1h 0m 0s,+90d), 1.0d > ~ (1h 0m 0s,+88.99d) ?column? ---------- f (1 row) SELECT < (1h 0m 0s,-90d), 1.0d > ~ (1h 0m 0s,-88.99d) ?column? ---------- f (1 row) -- indexed operations..... -- spoint_data and scircle_data tables have to be created and indexed using -- ./gen_point.pl 1 | psql pgsphere_test -- and -- ./gen_circle.pl 1 0.1 | psql pgsphere_test -- scripts SET enable_indexscan=off; SET select count(sp) from spoint_data where sp @ <(0d,90d),1.0d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,90d),1.0d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,90d),1.1d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,90d),1.1d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,-90d),1.0d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,-90d),1.0d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,-90d),1.1d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,-90d),1.1d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,0d),2.1d> count ------- 13 (1 row) select count(sp) from spoint_data where <(0d,0d),2.1d> ~ sp; count ------- 13 (1 row) select count(sc) from scircle_data where sc && <(0d,90d),1.0d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,90d),1.0d> ; count ------- 1 (1 row) select count(sc) from scircle_data where <(0d,90d),1.0d> ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && <(0d,90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where <(0d,90d),1.1d> ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && <(0d,-90d),1.0d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,-90d),1.0d> ; count ------- 1 (1 row) select count(sc) from scircle_data where <(0d,-90d),1.0d> ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && <(0d,-90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,-90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where <(0d,-90d),1.1d> ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && <(0d,0d),2.1d> count ------- 13 (1 row) select count(sc) from scircle_data where sc @ <(0d,0d),2.1d> count ------- 13 (1 row) select count(sc) from scircle_data where <(0d,0d),2.1d> ~ sc; count ------- 13 (1 row) SET enable_indexscan=on; SET select count(sp) from spoint_data where sp @ <(0d,90d),1.0d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,90d),1.0d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,90d),1.1d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,90d),1.1d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,-90d),1.0d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,-90d),1.0d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,-90d),1.1d> count ------- 361 (1 row) select count(sp) from spoint_data where <(0d,-90d),1.1d> ~ sp; count ------- 361 (1 row) select count(sp) from spoint_data where sp @ <(0d,0d),2.1d> count ------- 13 (1 row) select count(sp) from spoint_data where <(0d,0d),2.1d> ~ sp; count ------- 13 (1 row) select count(sc) from scircle_data where sc && <(0d,90d),1.0d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,90d),1.0d> ; count ------- 1 (1 row) select count(sc) from scircle_data where <(0d,90d),1.0d> ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && <(0d,90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where <(0d,90d),1.1d> ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && <(0d,-90d),1.0d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,-90d),1.0d> ; count ------- 1 (1 row) select count(sc) from scircle_data where <(0d,-90d),1.0d> ~ sc; count ------- 1 (1 row) select count(sc) from scircle_data where sc && <(0d,-90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where sc @ <(0d,-90d),1.1d> ; count ------- 361 (1 row) select count(sc) from scircle_data where <(0d,-90d),1.1d> ~ sc; count ------- 361 (1 row) select count(sc) from scircle_data where sc && <(0d,0d),2.1d> count ------- 13 (1 row) select count(sc) from scircle_data where sc @ <(0d,0d),2.1d> count ------- 13 (1 row) select count(sc) from scircle_data where <(0d,0d),2.1d> ~ sc; count ------- 13 (1 row) pgsphere/testsuite/circle_test.sql000066400000000000000000000623561332443031700177610ustar00rootroot00000000000000\echo -- Input/Output --- -- Input/Output --- \echo SELECT set_sphere_output( 'RAD' ); SELECT set_sphere_output( 'RAD' ); \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; \echo SELECT set_sphere_output( 'DEG' ); SELECT set_sphere_output( 'DEG' ); \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; \echo SELECT set_sphere_output( 'DMS' ); SELECT set_sphere_output( 'DMS' ); \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; \echo SELECT set_sphere_output( 'HMS' ); SELECT set_sphere_output( 'HMS' ); \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 1d 30m >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 0.1 >'::scircle; \echo SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; SELECT '< (1h 2m 30s , +1d 2m 30s), 90d >'::scircle; \echo SELECT set_sphere_output( 'DMS' ); SELECT set_sphere_output( 'DMS' ); \echo \echo -- Functions -- Functions \echo \echo -- float8 dist(scircle,scircle) -- float8 dist(scircle,scircle) \echo SELECT 180.0*dist('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle,'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle,'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle,'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*dist('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle,'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); \echo \echo -- spoint spoint(scircle) -- spoint spoint(scircle) \echo SELECT spoint('< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle); SELECT spoint('< (1h 2m 30s , +1d 2m 30s), 1.0d >'::scircle); \echo SELECT spoint('< (1h 2m 30s , +90d 0m 0s), 1.0d >'::scircle); SELECT spoint('< (1h 2m 30s , +90d 0m 0s), 1.0d >'::scircle); \echo \echo -- scircle scircle(spoint) -- scircle scircle(spoint) \echo SELECT scircle('(0d,0d)'::spoint); SELECT scircle('(0d,0d)'::spoint); \echo SELECT scircle('(0d,90d)'::spoint); SELECT scircle('(0d,90d)'::spoint); \echo SELECT scircle('(0d,-90d)'::spoint); SELECT scircle('(0d,-90d)'::spoint); \echo \echo -- Operators -- Operators \echo -- = operator -- = operator \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (25h 0m 0s,+1d), 1d 30m >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (25h 0m 0s,+1d), 1d 30m >'::scircle ; \echo SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle='< (13h 0m 0s,+85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle='< (13h 0m 0s,+85d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle='< (13h 0m 0s,-85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle='< (13h 0m 0s,-85d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle='< (2h 0m 0s,+90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle='< (2h 0m 0s,+90d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle='< (2h 0m 0s,-90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle='< (2h 0m 0s,-90d), 1.5d >'::scircle ; \echo -- should be "false" -- should be "false" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,-1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,-1d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 2.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle='< (1h 0m 0s,+1d), 2.5d >'::scircle ; \echo \echo -- <> operator -- <> operator \echo -- should be "false" -- should be "false" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (25h 0m 0s,+1d), 1d 30m >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (25h 0m 0s,+1d), 1d 30m >'::scircle ; \echo SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle <> '< (13h 0m 0s,+85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+95d), 1.5d >'::scircle <> '< (13h 0m 0s,+85d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle <> '< (13h 0m 0s,-85d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-95d), 1.5d >'::scircle <> '< (13h 0m 0s,-85d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle <> '< (2h 0m 0s,+90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle <> '< (2h 0m 0s,+90d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle <> '< (2h 0m 0s,-90d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle <> '< (2h 0m 0s,-90d), 1.5d >'::scircle ; \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,-1d), 1.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,-1d), 1.5d >'::scircle ; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 2.5d >'::scircle ; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle <> '< (1h 0m 0s,+1d), 2.5d >'::scircle ; \echo \echo -- && operator -- && operator \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 1.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,+1d), 0.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,-1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle && '< (1h 0m 0s,-1d), 1.5d >'::scircle; \echo SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0s,0d), 15d >'::scircle; SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0s,0d), 15d >'::scircle; \echo SELECT '< (2h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0.1s,0d), 15d >'::scircle; SELECT '< (2h 0m 0s,0d), 15d >'::scircle && '< (0h 0m 0.1s,0d), 15d >'::scircle; \echo SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (23h 0m 0.1s,0d), 15d >'::scircle; SELECT '< (1h 0m 0s,0d), 15d >'::scircle && '< (23h 0m 0.1s,0d), 15d >'::scircle; \echo -- should be "false" -- should be "false" \echo SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle && '< (1h 0m 0s,-1d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle && '< (1h 0m 0s,-1d), 0.5d >'::scircle; \echo SELECT '< (1d 0m 0s,+1d), 1.0d >'::scircle && '< (0d 0m 0s,0d), 0.1d >'::scircle; SELECT '< (1d 0m 0s,+1d), 1.0d >'::scircle && '< (0d 0m 0s,0d), 0.1d >'::scircle; \echo \echo -- @@ operator -- @@ operator \echo SELECT @@ '< (1h 2m 3s , +1d 2m 3s), 1.0d >'::scircle; SELECT @@ '< (1h 2m 3s , +1d 2m 3s), 1.0d >'::scircle; \echo SELECT @@ '< (1h 2m 3s , +90d 0m 0s), 1.0d >'::scircle; SELECT @@ '< (1h 2m 3s , +90d 0m 0s), 1.0d >'::scircle; \echo \echo -- <-> operator -- <-> operator \echo SELECT 180.0*('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle<->'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); SELECT 180.0*('<( 0h 2m 30s , 10d 0m 0s), 0.1d>'::scircle<->'<( 0h 2m 30s , -10d 0m 0s),0.1d>'::scircle)/pi(); \echo SELECT 180.0*('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*('<( 0h 0m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); \echo SELECT 180.0*('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 23h 30m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 1h 0m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.0d>'::scircle)/pi(); \echo SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 0d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.5d>'::scircle<->'<( 0h 50m 00s , 0d 0m 0s),1.5d>'::scircle)/pi(); \echo SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); SELECT 180.0*('<( 0h 40m 00s , 90d 0m 0s), 1.0d>'::scircle<->'<( 0h 50m 00s , -90d 0m 0s),1.0d>'::scircle)/pi(); \echo \echo -- scircle @ scircle operator -- scircle @ scircle operator \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; \echo SELECT '< (2d 0m 0s,+1d), 0.5d >'::scircle @ '< (1d 0m 0s,0d), 3.5d >'::scircle; SELECT '< (2d 0m 0s,+1d), 0.5d >'::scircle @ '< (1d 0m 0s,0d), 3.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; \echo SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; \echo -- should be "false" -- should be "false" \echo SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (2h 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 0.5d >'::scircle @ '< (2h 0m 0s,+1d), 1.5d >'::scircle; \echo SELECT '< (2d 0m 0s,+1d), 1.5d >'::scircle @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; SELECT '< (2d 0m 0s,+1d), 1.5d >'::scircle @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '< (1h 0m 0s,+89d), 0.5d >'::scircle @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; \echo SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; SELECT '< (1h 0m 0s,-89d), 0.5d >'::scircle @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; \echo \echo -- scircle ~ scircle operator -- scircle ~ scircle operator \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; \echo SELECT '< (1d 0m 0s,0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (1d 0m 0s,0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 0.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; \echo SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; \echo -- should be "false" -- should be "false" \echo SELECT '< (2h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; SELECT '< (2h 0m 0s,+1d), 1.5d >'::scircle ~ '< (1h 0m 0s,+1d), 0.5d >'::scircle; \echo SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 1.5d >'::scircle; SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '< (2d 0m 0s,+1d), 1.5d >'::scircle; \echo SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '< (1h 0m 0s,+89d), 0.5d >'::scircle; \echo SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '< (1h 0m 0s,-89d), 0.5d >'::scircle; \echo \echo -- spoint @ scircle operator -- spoint @ scircle operator \echo -- should be "true" -- should be "true" \echo SELECT '(1h 0m 0s,+1d) '::spoint @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; SELECT '(1h 0m 0s,+1d) '::spoint @ '< (1h 0m 0s,+1d), 1.5d >'::scircle; \echo SELECT '(2d 0m 0s,+1d) '::spoint @ '< (1d 0m 0s, 0d), 3.5d >'::scircle; SELECT '(2d 0m 0s,+1d) '::spoint @ '< (1d 0m 0s, 0d), 3.5d >'::scircle; \echo SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.5d >'::scircle; \echo SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.5d >'::scircle; \echo SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,+89d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; \echo SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,-89d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; \echo -- should be "false" -- should be "false" \echo SELECT '(1h 0m 0s,+1d )'::spoint @ '< (2h 0m 0s,-1d), 1.5d >'::scircle; SELECT '(1h 0m 0s,+1d )'::spoint @ '< (2h 0m 0s,-1d), 1.5d >'::scircle; \echo SELECT '(3d 30m 0s,+1d )'::spoint @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; SELECT '(3d 30m 0s,+1d )'::spoint @ '< (0d 0m 0s, 0d), 3.5d >'::scircle; \echo SELECT '(1h 0m 0s,+88.99d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,+88.99d)'::spoint @ '< (1h 0m 0s,+90d), 1.0d >'::scircle; \echo SELECT '(1h 0m 0s,-88.99d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; SELECT '(1h 0m 0s,-88.99d)'::spoint @ '< (1h 0m 0s,-90d), 1.0d >'::scircle; \echo \echo -- spoint ~ scircle operator -- spoint ~ scircle operator \echo -- should be "true" -- should be "true" \echo SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d) '::spoint; SELECT '< (1h 0m 0s,+1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d) '::spoint; \echo SELECT '< (1d 0m 0s, 0d), 3.5d >'::scircle ~ '(2d 0m 0s,+1d) '::spoint; SELECT '< (1d 0m 0s, 0d), 3.5d >'::scircle ~ '(2d 0m 0s,+1d) '::spoint; \echo SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; SELECT '< (1h 0m 0s,+90d), 1.5d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; \echo SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.5d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; \echo SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+89d)'::spoint; \echo SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-89d)'::spoint; \echo -- should be "false" -- should be "false" \echo SELECT '< (2h 0m 0s,-1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d )'::spoint; SELECT '< (2h 0m 0s,-1d), 1.5d >'::scircle ~ '(1h 0m 0s,+1d )'::spoint; \echo SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '(3d 30m 0s,+1d )'::spoint; SELECT '< (0d 0m 0s, 0d), 3.5d >'::scircle ~ '(3d 30m 0s,+1d )'::spoint; \echo SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+88.99d)'::spoint; SELECT '< (1h 0m 0s,+90d), 1.0d >'::scircle ~ '(1h 0m 0s,+88.99d)'::spoint; \echo SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-88.99d)'::spoint; SELECT '< (1h 0m 0s,-90d), 1.0d >'::scircle ~ '(1h 0m 0s,-88.99d)'::spoint; \echo \echo -- indexed operations..... -- indexed operations..... \echo -- spoint_data and scircle_data tables have to be created and indexed using -- spoint_data and scircle_data tables have to be created and indexed using \echo -- ./gen_point.pl 1 | psql pgsphere_test -- ./gen_point.pl 1 | psql pgsphere_test \echo -- and -- and \echo -- ./gen_circle.pl 1 0.1 | psql pgsphere_test -- ./gen_circle.pl 1 0.1 | psql pgsphere_test \echo -- scripts -- scripts \echo \echo SET enable_indexscan=off; SET enable_indexscan=off; \echo select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; \echo \echo select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; \echo select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; \echo select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; \echo select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; \echo select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; \echo select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; \echo select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; \echo \echo SET enable_indexscan=on; SET enable_indexscan=on; \echo select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,90d),1.0d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,90d),1.0d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,90d),1.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,90d),1.1d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.0d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,-90d),1.0d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,-90d),1.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,-90d),1.1d>'::scircle ~ sp; \echo select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; select count(sp) from spoint_data where sp @ '<(0d,0d),2.1d>'::scircle; \echo select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; select count(sp) from spoint_data where '<(0d,0d),2.1d>'::scircle ~ sp; \echo \echo select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc && '<(0d,90d),1.0d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.0d>'; \echo select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; select count(sc) from scircle_data where '<(0d,90d),1.0d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc && '<(0d,90d),1.1d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,90d),1.1d>'; \echo select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; select count(sc) from scircle_data where '<(0d,90d),1.1d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc && '<(0d,-90d),1.0d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.0d>'; \echo select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; select count(sc) from scircle_data where '<(0d,-90d),1.0d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc && '<(0d,-90d),1.1d>'; \echo select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; select count(sc) from scircle_data where sc @ '<(0d,-90d),1.1d>'; \echo select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; select count(sc) from scircle_data where '<(0d,-90d),1.1d>' ~ sc; \echo select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc && '<(0d,0d),2.1d>'::scircle; \echo select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; select count(sc) from scircle_data where sc @ '<(0d,0d),2.1d>'::scircle; \echo select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; select count(sc) from scircle_data where '<(0d,0d),2.1d>'::scircle ~ sc; \echo pgsphere/testsuite/gen_box.pl000077500000000000000000000014101332443031700167010ustar00rootroot00000000000000#!/usr/bin/perl my $diff=$ARGV[0]; if ($#ARGV < 0) { print "gen_box.pl: Generic pg_sphere \"sbox\" data generator\n"; print "usage:\n\tgen_box.pl | psql pgsphere_db\n\n"; print "Program generates not overlapping spherical boxes.\n"; print "Each box has a size of degrees in longitude and\n"; print "latitude\n"; exit(0); } print < | psql pgsphere_db\n\n"; print "Program generates spherical circles located in the\n"; print "intersections of parallels and meridians and SQL script\n"; print "to load them into existing database. Distance\n"; print "between meridians is chosen equal to \"step\" in degrees\n"; print "radii of circles are set equal to \"radius\" in degrees\n"; print "The modulus of 360 and step should be equal to zero.\n"; print "The radius should be between 0 and 90\n\n"; print "Example: \"gen_circle.pl 1 0.1\" generates dataset containing\n"; print "64442 spherical circles with integer spherical coordinate\n"; print "values when written in degrees and radii of 6 arcmins.\n\n"; print "Program automatically creates \"scircle_data\" table\n"; print "but does not DROP an table with this name.\n\n"; print "Program attempts to create index \"sc_idx\" on this table\n"; exit(0); } my $pi=3.1415926535897932; my $degra=$pi/180.0; if ($dist <= 0) {$dist = 1;} if ((180 % $dist)!=0) { print STDERR "incorrect step, using 1 degree instead.\n"; $dist = 1; } if (($radius > 90)||($radius<0)) { print STDERR "incorrect radius, using 6 arcmins instead.\n"; $radius = 0.1; } print <\n"; for (my $i=-90+$dist;$i<=90-$dist;$i+=$dist) { for (my $j=0; $j<360; $j+=$dist) { print "<(${j}d, ${i}d), ${radius}d>\n"; } } print "<(0, 90d), ${radius}d>\n"; print "\\.\n\n"; print "CREATE INDEX sc_idx ON scircle_data USING gist (sc);\n"; pgsphere/testsuite/gen_point.pl000077500000000000000000000026011332443031700172450ustar00rootroot00000000000000#!/usr/bin/perl my $dist=$ARGV[0]; if ($#ARGV == -1) { print "gen_point.pl: Generic pg_sphere \"spoint\" data generator\n"; print "usage:\n\tgen_point.pl | psql pgsphere_db\n\n"; print "Program generates spherical points located in the\n"; print "intersections of parallels and meridians and SQL script\n"; print "to load them into existing database. Distance\n"; print "between meridians is chosen equal to \"step\" in degrees\n"; print "The modulus of 360 and step should be equal to zero.\n\n"; print "Example: \"gen_point.pl 1\" generates dataset containing 64442\n"; print "spherical points with integer spherical coordinate values\n"; print "when written in degrees.\n\n"; print "Program automatically creates \"spoint_data\" table\n"; print "but does not DROP an existing table with this name.\n\n"; print "Program attempts to create index \"sp_idx\" on this table\n"; exit(0); } my $pi=3.1415926535897932; my $degra=$pi/180.0; if ((180 % $dist)!=0) { print STDERR "incorrect step, using 1 degree instead.\n"; $dist = 1; } print < | psql pgsphere_db\n\n"; print "Program generates spherical N-side polygons located near the\n"; print "intersections of parallels and meridians and SQL script\n"; print "to load them into existing database. N have to be >=3. Distance\n"; print "between meridians is chosen equal to \"step\" in degrees\n"; print "The modulus of 360 and step should be equal to zero.\n\n"; print "Example: \"gen_poly.pl 1 0.1 3\" generates dataset containing 64442\n"; print "spherical triangles with integer spherical coordinate values\n"; print "when written in degrees.\n\n"; print "Program automatically creates \"spoly_data\" table\n"; print "but does not DROP an existing table with this name.\n\n"; print "Program attempts to create index \"spl_idx\" on this table\n"; exit(0); } my $pi=3.1415926535897932; my $degra=$pi/180.0; if ((180 % $dist)!=0) { print STDERR "incorrect step, using 1 degree instead.\n"; $dist = 1; } if ($r < 0) { print STDERR "incorrect size, using 0.1 degree instead.\n"; $r = 0.1; } if ($N < 3) { print STDERR "incorrect N, using 3 degree instead.\n"; $N = 3; } my @x; my @y; for ($i=0.0;$i<$N;$i+=1.0) { push @x,$r*sin(2.0*$pi*$i/$N); push @y,$r*cos(2.0*$pi*$i/$N); } print <[$nn],$i+$y->[$nn]); $spoly.="," unless ($nn>=($N-1)); } $spoly.="}"; return $spoly; } pgsphere/testsuite/point_test.expected000066400000000000000000000314131332443031700206410ustar00rootroot00000000000000-- I/O test -- -- Output --- SELECT set_sphere_output( DEG ); set_sphere_output ------------------- SET DEG (1 row) SELECT ( 1h 2m 30s , +1d 2m 30s) spoint ------------------------------- (15.625d , 1.04166666666667d) (1 row) SELECT ( 0h 2m 30s , +0d 2m 30s) spoint -------------------------------- (0.625d , 0.0416666666666667d) (1 row) SELECT ( 1h 2m 30s , -1d 2m 30s) spoint -------------------------------- (15.625d , -1.04166666666666d) (1 row) SELECT ( 0h 2m 30s , -0d 2m 30s) spoint --------------------------------- (0.625d , -0.0416666666666726d) (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) spoint ---------------- (0.625d , 90d) (1 row) SELECT ( 0h 2m 30s ,-90d 0m 0s) spoint ----------------- (0.625d , -90d) (1 row) SELECT set_sphere_output( DMS ); set_sphere_output ------------------- SET DMS (1 row) SELECT ( 1h 2m 30s , +1d 2m 30s) spoint ------------------------------- ( 15d 37m 30s , + 1d 2m 30s) (1 row) SELECT ( 0h 2m 30s , +0d 2m 30s) spoint ------------------------------- ( 0d 37m 30s , + 0d 2m 30s) (1 row) SELECT ( 1h 2m 30s , -1d 2m 30s) spoint ------------------------------- ( 15d 37m 30s , - 1d 2m 30s) (1 row) SELECT ( 0h 2m 30s , -0d 2m 30s) spoint ------------------------------- ( 0d 37m 30s , - 0d 2m 30s) (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) spoint ------------------------------ ( 0d 37m 30s , +90d 0m 0s) (1 row) SELECT ( 0h 2m 30s ,-90d 0m 0s) spoint ------------------------------ ( 0d 37m 30s , -90d 0m 0s) (1 row) SELECT set_sphere_output( HMS ); set_sphere_output ------------------- SET HMS (1 row) SELECT ( 1h 2m 30s , +1d 2m 30s) spoint ------------------------------- ( 1h 2m 30s , + 1d 2m 30s) (1 row) SELECT ( 0h 2m 30s , +0d 2m 30s) spoint ------------------------------- ( 0h 2m 30s , + 0d 2m 30s) (1 row) SELECT ( 1h 2m 30s , -1d 2m 30s) spoint ------------------------------- ( 1h 2m 30s , - 1d 2m 30s) (1 row) SELECT ( 0h 2m 30s , -0d 2m 30s) spoint ------------------------------- ( 0h 2m 30s , - 0d 2m 30s) (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) spoint ------------------------------ ( 0h 2m 30s , +90d 0m 0s) (1 row) SELECT ( 0h 2m 30s ,-90d 0m 0s) spoint ------------------------------ ( 0h 2m 30s , -90d 0m 0s) (1 row) SELECT set_sphere_output( RAD ); set_sphere_output ------------------- SET RAD (1 row) SELECT ( 1h 2m 30s , +1d 2m 30s) spoint ------------------------------------------ (0.272707695624114 , 0.0181805130416076) (1 row) SELECT ( 0h 2m 30s , +0d 2m 30s) spoint --------------------------------------------- (0.0109083078249646 , 0.000727220521664304) (1 row) SELECT ( 1h 2m 30s , -1d 2m 30s) spoint ------------------------------------------- (0.272707695624114 , -0.0181805130416075) (1 row) SELECT ( 0h 2m 30s , -0d 2m 30s) spoint ---------------------------------------------- (0.0109083078249646 , -0.000727220521664407) (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) spoint ---------------------------------------- (0.0109083078249646 , 1.5707963267949) (1 row) SELECT ( 0h 2m 30s ,-90d 0m 0s) spoint ----------------------------------------- (0.0109083078249646 , -1.5707963267949) (1 row) -- "incorrect dec. values" SELECT set_sphere_output( DEG ); set_sphere_output ------------------- SET DEG (1 row) SELECT ( 0h 2m 30s , 95d 0m 0s) spoint ------------------ (180.625d , 85d) (1 row) SELECT ( 24h 2m 30s , 5d 0m 0s) spoint --------------------------- (0.624999999999987d , 5d) (1 row) SELECT ( -0h 2m 30s , -5d 0m 0s) spoint --------------------------------- (359.375d , -4.99999999999999d) (1 row) SELECT ( 0h 2m 30s , -95d 0m 0s) spoint ------------------- (180.625d , -85d) (1 row) -- Input -- SELECT ( 0h 2m 30s , -0d 2m 30s) spoint --------------------------------- (0.625d , -0.0416666666666726d) (1 row) SELECT ( 0d 37m 30s , -0d 2m 30s) spoint --------------------------------- (0.625d , -0.0416666666666726d) (1 row) SELECT ( 0.625d , -0.04166666666666667d) spoint --------------------------------- (0.625d , -0.0416666666666726d) (1 row) SELECT (0.0109083078249646 , -0.000727220521664407) spoint --------------------------------------------- (0.625000000000002d , -0.0416666666666726d) (1 row) -- functions for point -------------- -- spoint(float8, float8) SELECT spoint(0.0109083078249646 , -0.000727220521664407); spoint --------------------------------------------- (0.625000000000002d , -0.0416666666666726d) (1 row) SELECT set_sphere_output( RAD ); set_sphere_output ------------------- SET RAD (1 row) SELECT spoint(7.28318530717958623 , 0.00); spoint --------- (1 , 0) (1 row) SELECT spoint(0.0 , 2.141592653589793116); spoint ------------------------ (3.14159265358979 , 1) (1 row) -- dist(spoint,spoint) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 0m 30s , 0d 0m 0s)'::spoint); dist --------------------- 0.00872664625996925 (1 row) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , 10d 0m 0s)'::spoint); dist ------------------- 0.174532925199433 (1 row) SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); dist ------------------- 0.174532925199433 (1 row) SELECT dist('( 0h 2m 30s , 95d 0m 0s)'::spoint,'( 12h 2m 30s , 85d 0m 0s)'::spoint); dist ------ 0 (1 row) SELECT dist('( 24h 2m 30s , 10d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); dist ------------------- 0.349065850398866 (1 row) SELECT dist('( 0h 2m 30s , 90d 0m 0s)'::spoint,'( 12h 2m 30s , 90d 0m 0s)'::spoint); dist ------ 0 (1 row) SELECT dist('( 0h 2m 30s , -90d 0m 0s)'::spoint,'( 12h 2m 30s , -90d 0m 0s)'::spoint); dist ------ 0 (1 row) -- long(spoint) SELECT long('( 0h 2m 30s , 0d 0m 0s)'::spoint); long -------------------- 0.0109083078249646 (1 row) SELECT long('( 0h 2m 30s ,95d 0m 0s)'::spoint); long ------------------ 3.15250096141476 (1 row) SELECT long('( 0h 2m 30s ,85d 0m 0s)'::spoint); long -------------------- 0.0109083078249646 (1 row) SELECT long('( 0h 2m 30s ,-95d 0m 0s)'::spoint); long ------------------ 3.15250096141476 (1 row) SELECT long('( 0h 2m 30s ,-85d 0m 0s)'::spoint); long -------------------- 0.0109083078249646 (1 row) SELECT long('( 0h 2m 30s ,90d 0m 0s)'::spoint); long -------------------- 0.0109083078249646 (1 row) SELECT long('( 0h 2m 30s ,-90d 0m 0s)'::spoint); long -------------------- 0.0109083078249646 (1 row) SELECT long('(24h 2m 30s , 0d 0m 0s)'::spoint); long -------------------- 0.0109083078249643 (1 row) SELECT long('(24h 2m 30s ,95d 0m 0s)'::spoint); long ------------------ 3.15250096141476 (1 row) SELECT long('(24h 2m 30s ,85d 0m 0s)'::spoint); long -------------------- 0.0109083078249643 (1 row) SELECT long('(24h 2m 30s ,-95d 0m 0s)'::spoint); long ------------------ 3.15250096141476 (1 row) SELECT long('(24h 2m 30s ,-85d 0m 0s)'::spoint); long -------------------- 0.0109083078249643 (1 row) SELECT long('(24h 2m 30s ,90d 0m 0s)'::spoint); long -------------------- 0.0109083078249643 (1 row) SELECT long('(24h 2m 30s ,-90d 0m 0s)'::spoint); long -------------------- 0.0109083078249643 (1 row) -- lat(spoint) SELECT lat('( 0h 2m 30s , 0d 0m 0s)'::spoint); lat ----- 0 (1 row) SELECT lat('( 0h 2m 30s ,95d 0m 0s)'::spoint); lat ------------------ 1.48352986419518 (1 row) SELECT lat('( 0h 2m 30s ,85d 0m 0s)'::spoint); lat ------------------ 1.48352986419518 (1 row) SELECT lat('( 0h 2m 30s ,-95d 0m 0s)'::spoint); lat ------------------- -1.48352986419518 (1 row) SELECT lat('( 0h 2m 30s ,-85d 0m 0s)'::spoint); lat ------------------- -1.48352986419518 (1 row) SELECT lat('( 0h 2m 30s ,90d 0m 0s)'::spoint); lat ----------------- 1.5707963267949 (1 row) SELECT lat('( 0h 2m 30s ,-90d 0m 0s)'::spoint); lat ------------------ -1.5707963267949 (1 row) SELECT lat('(24h 2m 30s , 0d 0m 0s)'::spoint); lat ----- 0 (1 row) SELECT lat('(24h 2m 30s ,95d 0m 0s)'::spoint); lat ------------------ 1.48352986419518 (1 row) SELECT lat('(24h 2m 30s ,85d 0m 0s)'::spoint); lat ------------------ 1.48352986419518 (1 row) SELECT lat('(24h 2m 30s ,-95d 0m 0s)'::spoint); lat ------------------- -1.48352986419518 (1 row) SELECT lat('(24h 2m 30s ,-85d 0m 0s)'::spoint); lat ------------------- -1.48352986419518 (1 row) SELECT lat('(24h 2m 30s ,90d 0m 0s)'::spoint); lat ----------------- 1.5707963267949 (1 row) SELECT lat('(24h 2m 30s ,-90d 0m 0s)'::spoint); lat ------------------ -1.5707963267949 (1 row) -- operators for points ------------- -- = operator ----------------------- SELECT ( 0h 2m 30s , 90d 0m 0s) 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 12h 2m 30s , 90d 0m 0s) 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) 24h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , -90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 12h 2m 30s , -90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , -90d 0m 0s) 24h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , 95d 0m 0s) 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 24h 2m 30s , 10d 0m 0s) 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 12h 2m 30s , 90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 0h 2m 30s , 0d 0m 0s) 12h 2m 30s , 45d 0m 0s)'::spoint; ?column? ---------- f (1 row) -- <> operator ----------------------- SELECT ( 0h 2m 30s , 90d 0m 0s) 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 12h 2m 30s , 90d 0m 0s) 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) 24h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 0h 2m 30s , -90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 12h 2m 30s , -90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 0h 2m 30s , -90d 0m 0s) 24h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 0h 2m 30s , 95d 0m 0s) 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- f (1 row) SELECT ( 24h 2m 30s , 10d 0m 0s) 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ---------- f (1 row) -- SELECT ( 0h 2m 30s , 90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 12h 2m 30s , 90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- t (1 row) SELECT ( 0h 2m 30s , 0d 0m 0s) 12h 2m 30s , 45d 0m 0s)'::spoint; ?column? ---------- t (1 row) -- <-> operator --------------------- SELECT ( 0h 2m 30s , 0d 0m 0s) 0h 0m 30s , 0d 0m 0s)'::spoint; ?column? --------------------- 0.00872664625996925 (1 row) SELECT ( 0h 2m 30s , 0d 0m 0s) 0h 2m 30s , 10d 0m 0s)'::spoint; ?column? ------------------- 0.174532925199433 (1 row) SELECT ( 0h 2m 30s , 0d 0m 0s) 0h 2m 30s , -10d 0m 0s)'::spoint; ?column? ------------------- 0.174532925199433 (1 row) SELECT ( 0h 2m 30s , 95d 0m 0s) 12h 2m 30s , 85d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) SELECT ( 24h 2m 30s , 10d 0m 0s) 0h 2m 30s , -10d 0m 0s)'::spoint; ?column? ------------------- 0.349065850398866 (1 row) SELECT ( 0h 2m 30s , 90d 0m 0s) 12h 2m 30s , 90d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) SELECT ( 0h 2m 30s , -90d 0m 0s) 12h 2m 30s , -90d 0m 0s)'::spoint; ?column? ---------- 0 (1 row) pgsphere/testsuite/point_test.sql000066400000000000000000000326311332443031700176420ustar00rootroot00000000000000\echo -- I/O test -- -- I/O test -- \echo \echo -- Output --- -- Output --- \echo SELECT set_sphere_output( 'DEG' ); SELECT set_sphere_output( 'DEG' ); \echo SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; \echo SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; \echo SELECT set_sphere_output( 'DMS' ); SELECT set_sphere_output( 'DMS' ); \echo SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; \echo SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; \echo SELECT set_sphere_output( 'HMS' ); SELECT set_sphere_output( 'HMS' ); \echo SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; \echo SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; \echo SELECT set_sphere_output( 'RAD' ); SELECT set_sphere_output( 'RAD' ); \echo SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , +1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , +0d 2m 30s)'::spoint; \echo SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; SELECT '( 1h 2m 30s , -1d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s ,-90d 0m 0s)'::spoint; \echo \echo -- "incorrect dec. values" -- "incorrect dec. values" \echo SELECT set_sphere_output( 'DEG' ); SELECT set_sphere_output( 'DEG' ); \echo SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint; \echo SELECT '( 24h 2m 30s , 5d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 5d 0m 0s)'::spoint; \echo SELECT '( -0h 2m 30s , -5d 0m 0s)'::spoint; SELECT '( -0h 2m 30s , -5d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -95d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -95d 0m 0s)'::spoint; \echo \echo -- Input -- -- Input -- \echo SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; SELECT '( 0h 2m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0d 37m 30s , -0d 2m 30s)'::spoint; SELECT '( 0d 37m 30s , -0d 2m 30s)'::spoint; \echo SELECT '( 0.625d , -0.04166666666666667d)'::spoint; SELECT '( 0.625d , -0.04166666666666667d)'::spoint; \echo SELECT '(0.0109083078249646 , -0.000727220521664407)'::spoint; SELECT '(0.0109083078249646 , -0.000727220521664407)'::spoint; \echo \echo \echo -- functions for point -------------- -- functions for point -------------- \echo -- spoint(float8, float8) -- spoint(float8, float8) \echo SELECT spoint(0.0109083078249646 , -0.000727220521664407); SELECT spoint(0.0109083078249646 , -0.000727220521664407); \echo SELECT set_sphere_output( 'RAD' ); SELECT set_sphere_output( 'RAD' ); \echo SELECT spoint(7.28318530717958623 , 0.00); SELECT spoint(7.28318530717958623 , 0.00); \echo SELECT spoint(0.0 , 2.141592653589793116); SELECT spoint(0.0 , 2.141592653589793116); \echo \echo -- dist(spoint,spoint) -- dist(spoint,spoint) \echo SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 0m 30s , 0d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 0m 30s , 0d 0m 0s)'::spoint); \echo SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , 10d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , 10d 0m 0s)'::spoint); \echo SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 0d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); \echo SELECT dist('( 0h 2m 30s , 95d 0m 0s)'::spoint,'( 12h 2m 30s , 85d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 95d 0m 0s)'::spoint,'( 12h 2m 30s , 85d 0m 0s)'::spoint); \echo SELECT dist('( 24h 2m 30s , 10d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); SELECT dist('( 24h 2m 30s , 10d 0m 0s)'::spoint,'( 0h 2m 30s , -10d 0m 0s)'::spoint); \echo SELECT dist('( 0h 2m 30s , 90d 0m 0s)'::spoint,'( 12h 2m 30s , 90d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , 90d 0m 0s)'::spoint,'( 12h 2m 30s , 90d 0m 0s)'::spoint); \echo SELECT dist('( 0h 2m 30s , -90d 0m 0s)'::spoint,'( 12h 2m 30s , -90d 0m 0s)'::spoint); SELECT dist('( 0h 2m 30s , -90d 0m 0s)'::spoint,'( 12h 2m 30s , -90d 0m 0s)'::spoint); \echo \echo -- long(spoint) -- long(spoint) \echo SELECT long('( 0h 2m 30s , 0d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s , 0d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,95d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,95d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,85d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,85d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,-95d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-95d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,-85d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-85d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,90d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,90d 0m 0s)'::spoint); \echo SELECT long('( 0h 2m 30s ,-90d 0m 0s)'::spoint); SELECT long('( 0h 2m 30s ,-90d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s , 0d 0m 0s)'::spoint); SELECT long('(24h 2m 30s , 0d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,95d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,95d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,85d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,85d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,-95d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-95d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,-85d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-85d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,90d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,90d 0m 0s)'::spoint); \echo SELECT long('(24h 2m 30s ,-90d 0m 0s)'::spoint); SELECT long('(24h 2m 30s ,-90d 0m 0s)'::spoint); \echo \echo -- lat(spoint) -- lat(spoint) \echo SELECT lat('( 0h 2m 30s , 0d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s , 0d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,95d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,95d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,85d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,85d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,-95d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-95d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,-85d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-85d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,90d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,90d 0m 0s)'::spoint); \echo SELECT lat('( 0h 2m 30s ,-90d 0m 0s)'::spoint); SELECT lat('( 0h 2m 30s ,-90d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s , 0d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s , 0d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,95d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,95d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,85d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,85d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,-95d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-95d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,-85d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-85d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,90d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,90d 0m 0s)'::spoint); \echo SELECT lat('(24h 2m 30s ,-90d 0m 0s)'::spoint); SELECT lat('(24h 2m 30s ,-90d 0m 0s)'::spoint); \echo \echo -- operators for points ------------- -- operators for points ------------- \echo -- = operator ----------------------- -- = operator ----------------------- \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 24h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 24h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 24h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint='( 24h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint='( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint='( 12h 2m 30s , 85d 0m 0s)'::spoint; \echo SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint='( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint='( 0h 2m 30s , 10d 0m 0s)'::spoint; \echo \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint='( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint='( 12h 2m 30s , 45d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint='( 12h 2m 30s , 45d 0m 0s)'::spoint; \echo \echo -- <> operator ----------------------- -- <> operator ----------------------- \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 24h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 24h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , -90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 24h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<>'( 24h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<>'( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<>'( 12h 2m 30s , 85d 0m 0s)'::spoint; \echo SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<>'( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<>'( 0h 2m 30s , 10d 0m 0s)'::spoint; \echo -- -- \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 12h 2m 30s , 90d 0m 0s)'::spoint<>'( 12h 2m 30s , -90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<>'( 12h 2m 30s , 45d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<>'( 12h 2m 30s , 45d 0m 0s)'::spoint; \echo \echo -- <-> operator --------------------- -- <-> operator --------------------- \echo SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 0m 30s , 0d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 0m 30s , 0d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , 10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , 10d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 0d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<->'( 12h 2m 30s , 85d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 95d 0m 0s)'::spoint<->'( 12h 2m 30s , 85d 0m 0s)'::spoint; \echo SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; SELECT '( 24h 2m 30s , 10d 0m 0s)'::spoint<->'( 0h 2m 30s , -10d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<->'( 12h 2m 30s , 90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , 90d 0m 0s)'::spoint<->'( 12h 2m 30s , 90d 0m 0s)'::spoint; \echo SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<->'( 12h 2m 30s , -90d 0m 0s)'::spoint; SELECT '( 0h 2m 30s , -90d 0m 0s)'::spoint<->'( 12h 2m 30s , -90d 0m 0s)'::spoint; pgsphere/testsuite/poly_test.expected000066400000000000000000000500451332443031700204750ustar00rootroot00000000000000SELECT set_sphere_output('DEG'); set_sphere_output ------------------- SET DEG (1 row) SELECT spoly {(10d,0d),(10d,1d),(15d,0d)} ; spoly ------------------------------------ {(10d , 0d),(10d , 1d),(15d , 0d)} (1 row) SELECT spoly {(359d,0d),(359d,1d),(4d,0d)} ; spoly ------------------------------------- {(359d , 0d),(359d , 1d),(4d , 0d)} (1 row) SELECT spoly {(10d,0d),(10d,1d),(15d,0d)} ; spoly ------------------------------------ {(10d , 0d),(10d , 1d),(15d , 0d)} (1 row) -- incorrect input ----- SELECT spoly {(10d,0d),(10d,1d)} ; --- self-crossing input ----- SELECT spoly {(0d,0d),(10d,10d),(0d,10d),(10d,0d)} ; --- functions SELECT npoints( spoly {(10d,0d),(10d,1d),(15d,0d)} ); npoints --------- 3 (1 row) SELECT npoints( spoly {(10d,0d),(10d,1d),(15d,0d),(5d,-5d)} ); npoints --------- 4 (1 row) --SELECT npoints( spoly {(0d,0d),(0d,90d),(15d,90d),(15d,0d)} ); SELECT area(spoly {(0d,0d),(0d,90d),(1,0d)} ); area ------ 1 (1 row) SELECT area(spoly {(0d,0d),(0d,90d),(90d,0d)} )/(4.0*pi()); ?column? ---------- 0.125 (1 row) --- operations --- = operator --- should be true SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} = spoly {(1d,1d),(2d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} = spoly {(2d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} = spoly {(1d,0d),(0d,0d),(0d,1d),(1d,1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} = spoly {(0d,0d),(1d,0d),(1d,1d),(0d,1d)} ; ?column? ---------- f (1 row) --- should be false SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} = spoly {(1d,1d),(3d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} = spoly {(1d,0d),(0d,0d),(0d,1d),(2d,2d)} ; ?column? ---------- f (1 row) --- <> operator --- should be false SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} <> spoly {(1d,1d),(2d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} <> spoly {(2d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} <> spoly {(1d,0d),(0d,0d),(0d,1d),(1d,1d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} <> spoly {(0d,0d),(1d,0d),(1d,1d),(0d,1d)} ; ?column? ---------- t (1 row) --- should be true SELECT spoly {(1d,0d),(1d,1d),(2d,1d)} <> spoly {(1d,1d),(3d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} <> spoly {(1d,0d),(0d,0d),(0d,1d),(2d,2d)} ; ?column? ---------- t (1 row) --- spoint @ spoly --- should be true SELECT (0.5d,0.5d) @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT (0d,0.5d) @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT (0d,0d) @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT (0.5d,0.5d) @ spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT (0d,89.9d) @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT (0d,90d) @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT (0d,-89.9d) @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT (0d,-90d) @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) --- should be false SELECT (0.1d,0.5d) @ spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT (45d,-89d) @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- f (1 row) SELECT (0d,1d) @ spoly {(0d,0d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) --- spoly ~ spoint --- should be true SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ (0.5d,0.5d) ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ (0d,0.5d) ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ (0d,0d) ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ~ (0.5d,0.5d) ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ (0d,89.9d) ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ (0d,90d) ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ (0d,-89.9d) ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ (0d,-90d) ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ~ (0.1d,0.5d) ?column? ---------- f (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ (45d,-89d) ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(1d,1d),(1d,0d)} ~ (0d,1d) ?column? ---------- f (1 row) --- scircle @ spoly --- should be true SELECT <(0.5d,0.5d),0.1d> @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT <(0d,89.9d),0.1d> @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(0d,90d),0.1d> @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(0d,-89.9d),0.1d> @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT <(0d,-90d),0.1d> @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) --- should be false SELECT <(0.1d,0.5d),0.1d> @ spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(45d,-89d),0.1d> @ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- f (1 row) SELECT <(0d,1d),0.1d> @ spoly {(0d,0d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0d,0.5d),0.1d> @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0d,0d),0.1d> @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0.5d,0.5d),0.1d> @ spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) --- spoly ~ scircle --- should be true SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0.5d,0.5d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ <(0d,89.9d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ <(0d,90d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ <(0d,-89.9d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ <(0d,-90d),0.1d> ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0.1d,0.5d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ~ <(45d,-89d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(1d,1d),(1d,0d)} ~ <(0d,1d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0d,0.5d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0d,0d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0.1d,0.5d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0.1d,0.1d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ~ <(0.6d,0.5d),0.1d> ?column? ---------- f (1 row) --- spoly @ scircle --- should be true SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} @ <(0d,0d),2.0d> ?column? ---------- t (1 row) SELECT spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} @ <(0d,0d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} @ <(0d,90d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} @ <(180d,-90d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} @ <(0d,0d),1.0d> ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} @ <(0d,0d),1.0d> ?column? ---------- f (1 row) SELECT spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} @ <(0d,0d),0.99d> ?column? ---------- f (1 row) SELECT spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} @ <(60d,0d),0.99d> ?column? ---------- f (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,88d)} @ <(0d,90d),1.0d> ?column? ---------- f (1 row) SELECT spoly {(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)} @ <(180d,-90d),1.0d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(2d,0d)} @ <(0d,0d),1.0d> ?column? ---------- f (1 row) --- scircle ~ spoly --- should be true SELECT <(0d,0d),2.0d> ~ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT <(0d,0d),1.0d> ~ spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} ; ?column? ---------- t (1 row) SELECT <(0d,90d),1.0d> ~ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(180d,-90d),1.0d> ~ spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT <(0d,0d),1.0d> ~ spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) --- should be false SELECT <(0d,0d),1.0d> ~ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0d,0d),0.99d> ~ spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} ; ?column? ---------- f (1 row) SELECT <(60d,0d),0.99d> ~ spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} ; ?column? ---------- f (1 row) SELECT <(0d,90d),1.0d> ~ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,88d)} ; ?column? ---------- f (1 row) SELECT <(180d,-90d),1.0d> ~ spoly {(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)} ; ?column? ---------- f (1 row) SELECT <(0d,0d),1.0d> ~ spoly {(0d,0d),(0d,1d),(2d,0d)} ; ?column? ---------- f (1 row) --- scircle && spoly --- should be true SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} && <(0.5d,0.5d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && <(0d,89.9d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && <(0d,90d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} && <(0d,-89.9d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} && <(0d,-90d),0.1d> ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} && <(0d,0d),2.0d> ?column? ---------- t (1 row) SELECT spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} && <(0d,0d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && <(0d,90d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} && <(180d,-90d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} && <(0d,0d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && <(0d,2d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && <(2d,0d),1.0d> ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} && <(0.5d,0.5d),0.1d> ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} && <(1.5d,0.5d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && <(0d,88.0d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} && <(0.3d,0.5d),0.1d> ?column? ---------- f (1 row) SELECT spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} && <(0d,-87d),0.1d> ?column? ---------- f (1 row) --- spoly && scircle --- should be true SELECT <(0.5d,0.5d),0.1d> && spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT <(0d,89.9d),0.1d> && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(0d,90d),0.1d> && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(0d,-89.9d),0.1d> && spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT <(0d,-90d),0.1d> && spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT <(0d,0d),2.0d> && spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT <(0d,0d),1.0d> && spoly {(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)} ; ?column? ---------- t (1 row) SELECT <(0d,90d),1.0d> && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT <(180d,-90d),1.0d> && spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- t (1 row) SELECT <(0d,0d),1.0d> && spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT <(0d,2d),1.0d> && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT <(2d,0d),1.0d> && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT <(0.5d,0.5d),0.1d> && spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) --- should be false SELECT <(1.5d,0.5d),0.1d> && spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0d,88.0d),0.1d> && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- f (1 row) SELECT <(0.3d,0.5d),0.1d> && spoly {(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT <(0d,-87d),0.1d> && spoly {(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)} ; ?column? ---------- f (1 row) --- spoly @ spoly --- should be true SELECT spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} @ spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)} @ spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} @ spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} @ spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} @ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)} @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) --- should be false --SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} @ spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; SELECT spoly {(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)} @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} @ spoly {(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,88d),(90d,88d),(180d,88d),(270d,88d)} @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)} @ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- f (1 row) --- spoly ~ spoly --- should be true SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ~ spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ~ spoly {(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ~ spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ~ spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ~ spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ spoly {(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)} ; ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ spoly {(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)} ; ?column? ---------- f (1 row) SELECT spoly {(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)} ~ spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ spoly {(0d,88d),(90d,88d),(180d,88d),(270d,88d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ~ spoly {(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)} ; ?column? ---------- f (1 row) --- spoly && spoly --- should be true SELECT spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)} && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} && spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,0d)} && spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} && spoly {(0d,0d),(0d,1d),(1d,0d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && spoly {(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)} ; ?column? ---------- t (1 row) SELECT spoly {(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,0d),(0d,1d),(1d,1d),(1d,0d)} && spoly {(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)} ; ?column? ---------- t (1 row) SELECT spoly {(0d,88d),(90d,88d),(180d,88d),(270d,88d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- t (1 row) --- should be false SELECT spoly {(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)} && spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} ; ?column? ---------- f (1 row) SELECT spoly {(0d,89d),(90d,89d),(180d,89d),(270d,89d)} && spoly {(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)} ; ?column? ---------- f (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(3d,-1d),(3d,1d),(5d,1d),(5d,-1d)} ; ?column? ---------- f (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(-1d,3d),(-1d,5d),(1d,5d),(1d,3d)} ; ?column? ---------- f (1 row) SELECT spoly {(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)} && spoly {(179d,-1d),(179d,1d),(181d,1d),(181d,-1d)} ; ?column? ---------- f (1 row) pgsphere/testsuite/poly_test.sql000066400000000000000000001025311332443031700174710ustar00rootroot00000000000000\echo SELECT set_sphere_output('DEG'); SELECT set_sphere_output('DEG'); \echo \echo SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; \echo SELECT spoly '{(359d,0d),(359d,1d),(4d,0d)}'; SELECT spoly '{(359d,0d),(359d,1d),(4d,0d)}'; \echo SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; SELECT spoly '{(10d,0d),(10d,1d),(15d,0d)}'; \echo \echo -- incorrect input ----- -- incorrect input ----- \echo SELECT spoly '{(10d,0d),(10d,1d)}'; SELECT spoly '{(10d,0d),(10d,1d)}'; \echo \echo --- self-crossing input ----- --- self-crossing input ----- \echo SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; \echo \echo --- functions --- functions \echo SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); \echo SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d),(5d,-5d)}'); SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d),(5d,-5d)}'); \echo --SELECT npoints( spoly '{(0d,0d),(0d,90d),(15d,90d),(15d,0d)}'); --SELECT npoints( spoly '{(0d,0d),(0d,90d),(15d,90d),(15d,0d)}'); \echo \echo SELECT area(spoly '{(0d,0d),(0d,90d),(1,0d)}'); SELECT area(spoly '{(0d,0d),(0d,90d),(1,0d)}'); \echo SELECT area(spoly '{(0d,0d),(0d,90d),(90d,0d)}')/(4.0*pi()); SELECT area(spoly '{(0d,0d),(0d,90d),(90d,0d)}')/(4.0*pi()); \echo \echo --- operations --- operations \echo --- = operator --- = operator \echo --- should be true --- should be true \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(2d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(2d,1d),(1d,0d)}'; \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(2d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(2d,1d),(1d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; \echo --- should be false --- should be false \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(3d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' = spoly '{(1d,1d),(3d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' = spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; \echo \echo --- <> operator --- <> operator \echo --- should be false --- should be false \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(2d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(2d,1d),(1d,0d)}'; \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(2d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(2d,1d),(1d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(1d,1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(0d,0d),(1d,0d),(1d,1d),(0d,1d)}'; \echo --- should be true --- should be true \echo SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; SELECT spoly '{(1d,0d),(1d,1d),(2d,1d)}' <> spoly '{(1d,1d),(3d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' <> spoly '{(1d,0d),(0d,0d),(0d,1d),(2d,2d)}'; \echo \echo --- spoint @ spoly --- spoint @ spoly \echo --- should be true --- should be true \echo SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '(0d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0d,0.5d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '(0d,0d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0d,0d)'::spoint @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0.5d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '(0d,89.9d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '(0d,89.9d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '(0d,90d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '(0d,90d)'::spoint @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '(0d,-89.9d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '(0d,-89.9d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '(0d,-90d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '(0d,-90d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo \echo --- should be false --- should be false \echo SELECT '(0.1d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '(0.1d,0.5d)'::spoint @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '(45d,-89d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '(45d,-89d)'::spoint @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '(0d,1d)'::spoint @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; SELECT '(0d,1d)'::spoint @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; \echo \echo --- spoly ~ spoint --- spoly ~ spoint \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0.5d)'::spoint; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0d)'::spoint; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0d,0d)'::spoint; \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.5d,0.5d)'::spoint; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,89.9d)'::spoint; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,89.9d)'::spoint; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,90d)'::spoint; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '(0d,90d)'::spoint; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-89.9d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-89.9d)'::spoint; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-90d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(0d,-90d)'::spoint; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.1d,0.5d)'::spoint; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '(0.1d,0.5d)'::spoint; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(45d,-89d)'::spoint; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '(45d,-89d)'::spoint; \echo SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '(0d,1d)'::spoint; SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '(0d,1d)'::spoint; \echo \echo --- scircle @ spoly --- scircle @ spoly \echo --- should be true --- should be true \echo SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,89.9d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,89.9d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(0d,90d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),0.1d>'::scircle @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(0d,-89.9d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-89.9d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,-90d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-90d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo \echo --- should be false --- should be false \echo SELECT '<(0.1d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.1d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(45d,-89d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(45d,-89d),0.1d>'::scircle @ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,1d),0.1d>'::scircle @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; SELECT '<(0d,1d),0.1d>'::scircle @ spoly '{(0d,0d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,0d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),0.1d>'::scircle @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle @ spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo \echo --- spoly ~ scircle --- spoly ~ scircle \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.5d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,89.9d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,89.9d),0.1d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,90d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ '<(0d,90d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-89.9d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-89.9d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-90d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(0d,-90d),0.1d>'::scircle; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(45d,-89d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' ~ '<(45d,-89d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '<(0d,1d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(1d,1d),(1d,0d)}' ~ '<(0d,1d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0d,0d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.1d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.1d,0.1d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.6d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' ~ '<(0.6d,0.5d),0.1d>'::scircle; \echo \echo --- spoly @ scircle --- spoly @ scircle \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),2.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),2.0d>'::scircle; \echo SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),1.0d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ '<(0d,90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' @ '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' @ '<(180d,-90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ '<(0d,0d),1.0d>'::scircle; \echo SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),0.99d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(0d,0d),0.99d>'::scircle; \echo SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(60d,0d),0.99d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' @ '<(60d,0d),0.99d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}' @ '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}' @ '<(0d,90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}' @ '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}' @ '<(180d,-90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(2d,0d)}' @ '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(2d,0d)}' @ '<(0d,0d),1.0d>'::scircle; \echo \echo --- scircle ~ spoly --- scircle ~ spoly \echo --- should be true --- should be true \echo SELECT '<(0d,0d),2.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),2.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; \echo SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo \echo --- should be false --- should be false \echo SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; \echo SELECT '<(60d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(60d,0d),0.99d>'::scircle ~ spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; \echo SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}'; SELECT '<(0d,90d),1.0d>'::scircle ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,88d)}'; \echo SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}'; SELECT '<(180d,-90d),1.0d>'::scircle ~ spoly '{(0d,-87d),(90d,-87d),(180d,-87d),(270d,-87d)}'; \echo SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(2d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle ~ spoly '{(0d,0d),(0d,1d),(2d,0d)}'; \echo \echo --- scircle && spoly --- scircle && spoly \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,89.9d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,89.9d),0.1d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-89.9d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-89.9d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-90d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-90d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0d,0d),2.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0d,0d),2.0d>'::scircle; \echo SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' && '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}' && '<(0d,0d),1.0d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),1.0d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(180d,-90d),1.0d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(180d,-90d),1.0d>'::scircle; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && '<(0d,0d),1.0d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && '<(0d,0d),1.0d>'::scircle; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(0d,2d),1.0d>'::scircle; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(0d,2d),1.0d>'::scircle; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(2d,0d),1.0d>'::scircle; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && '<(2d,0d),1.0d>'::scircle; \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.5d,0.5d),0.1d>'::scircle; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(1.5d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && '<(1.5d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,88.0d),0.1d>'::scircle; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && '<(0d,88.0d),0.1d>'::scircle; \echo SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.3d,0.5d),0.1d>'::scircle; SELECT spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}' && '<(0.3d,0.5d),0.1d>'::scircle; \echo SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-87d),0.1d>'::scircle; SELECT spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}' && '<(0d,-87d),0.1d>'::scircle; \echo \echo --- spoly && scircle --- spoly && scircle \echo --- should be true --- should be true \echo SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,89.9d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,89.9d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(0d,90d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(0d,-89.9d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-89.9d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,-90d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-90d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,0d),2.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0d,0d),2.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(-1d,0d),(0d,1d),(1d,0d),(0d,-1d)}'; \echo SELECT '<(0d,90d),1.0d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,90d),1.0d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(180d,-90d),1.0d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(180d,-90d),1.0d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT '<(0d,0d),1.0d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo SELECT '<(0d,2d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT '<(0d,2d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT '<(2d,0d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT '<(2d,0d),1.0d>'::scircle && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo \echo --- should be false --- should be false \echo SELECT '<(1.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(1.5d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,88.0d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT '<(0d,88.0d),0.1d>'::scircle && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT '<(0.3d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT '<(0.3d,0.5d),0.1d>'::scircle && spoly '{(0d,0d),(0.5d,0.5d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT '<(0d,-87d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; SELECT '<(0d,-87d),0.1d>'::scircle && spoly '{(0d,-89d),(90d,-89d),(180d,-89d),(270d,-89d)}'; \echo \echo --- spoly @ spoly --- spoly @ spoly \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' @ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo \echo --- should be false --- should be false \echo --SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; --SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' @ spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; \echo SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo \echo SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo \echo \echo --- spoly ~ spoly --- spoly ~ spoly \echo --- should be true --- should be true \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}'; \echo SELECT spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}' ~ spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}'; \echo \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; \echo \echo \echo --- spoly && spoly --- spoly && spoly \echo --- should be true --- should be true \echo SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-0.5d,-0.5d),(-0.5d,0.5d),(0.5d,0.5d),(0.5d,-0.5d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0d,0d),(0d,1d),(1d,0d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(45d,89.3d),(135d,89.3d),(225d,89.3d),(315d,89.3d)}'; \echo \echo SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(45d,89.2d),(135d,89.2d),(225d,89.2d),(315d,89.2d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; SELECT spoly '{(0d,0d),(0d,1d),(1d,1d),(1d,0d)}' && spoly '{(0.5d,0.5d),(0.5d,1.5d),(1.5d,1.5d),(1.5d,0.5d)}'; \echo SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,88d),(90d,88d),(180d,88d),(270d,88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo \echo --- should be false --- should be false \echo SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' && spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}'; \echo SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' && spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(3d,-1d),(3d,1d),(5d,1d),(5d,-1d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(3d,-1d),(3d,1d),(5d,1d),(5d,-1d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-1d,3d),(-1d,5d),(1d,5d),(1d,3d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(-1d,3d),(-1d,5d),(1d,5d),(1d,3d)}'; \echo SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d,1d),(181d,1d),(181d,-1d)}'; SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d,1d),(181d,1d),(181d,-1d)}'; \echo pgsphere/types.h000066400000000000000000000011011332443031700142010ustar00rootroot00000000000000#ifndef __PGS_TYPES_H__ #define __PGS_TYPES_H__ /* Include this file if you want to have access to all data types. */ /* * box was the last added data type */ #include "box.h" /* PGS_DATA_TYPES Data type IDs */ #define PGS_TYPE_SPoint 1 /* Spherical point */ #define PGS_TYPE_SCIRCLE 2 /* Spherical circle */ #define PGS_TYPE_SELLIPSE 3 /* Spherical ellipse */ #define PGS_TYPE_SLine 4 /* Spherical line */ #define PGS_TYPE_SPATH 5 /* Spherical path */ #define PGS_TYPE_SPOLY 6 /* Spherical polygon */ #define PGS_TYPE_SBOX 7 /* Spherical box */ #endif pgsphere/vector3d.c000066400000000000000000000012051332443031700145660ustar00rootroot00000000000000#include "vector3d.h" /* Vector functions */ bool vector3d_eq(const Vector3D *v1, const Vector3D *v2) { return (FPeq(v1->x, v2->x) && FPeq(v1->y, v2->y) && FPeq(v1->z, v2->z)); } void vector3d_cross(Vector3D *out, const Vector3D *v1, const Vector3D *v2) { out->x = v1->y * v2->z - v1->z * v2->y; out->y = v1->z * v2->x - v1->x * v2->z; out->z = v1->x * v2->y - v1->y * v2->x; } float8 vector3d_scalar(Vector3D *v1, Vector3D *v2) { float8 out = 0; out += v1->x * v2->x; out += v1->y * v2->y; out += v1->z * v2->z; return (out); } float8 vector3d_length(const Vector3D *v) { return sqrt(Sqr(v->x) + Sqr(v->y) + Sqr(v->z)); } pgsphere/vector3d.h000066400000000000000000000014401332443031700145740ustar00rootroot00000000000000#ifndef __PGS_VECTOR3D_H__ #define __PGS_VECTOR3D_H__ #include "pg_sphere.h" /* Vector declarations */ /* * The definition of a three dimensional vector data structure. */ typedef struct { float8 x; /* x (-1.0 .. 1.0) */ float8 y; /* y (-1.0 .. 1.0) */ float8 z; /* z (-1.0 .. 1.0) */ } Vector3D; /* * Calculate the cross product of two vectors. Puts * cross product of v1 and v2 into out and returns it. */ void vector3d_cross(Vector3D *out, const Vector3D *v1, const Vector3D *v2); /* * Checks equality of two vectors. */ bool vector3d_eq(const Vector3D *a, const Vector3D *b); /* * Calculate the scalar product of two vectors. */ float8 vector3d_scalar(Vector3D *v1, Vector3D *v2); /* * Calculate the length of a vector. */ float8 vector3d_length(const Vector3D *v); #endif